#ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef M_E #define M_E 2.71828182845904523536 #endif #include #include #include using namespace spider; void check(const char* name, double result, double expected, double tolerance = 1e-9) { bool ok = std::abs(result - expected) <= tolerance; std::cout << (ok ? "[PASS] " : "[FAIL] ") << name << " = " << result << " (expected " << expected << ")\n"; } int main() { std::cout << "=== Spider VM Instruction Test: 0x068-0x079 ===\n\n"; CPU cpu; cpu._post = &CPU::imp; std::cout << "-- Cast Instructions --\n"; cpu.RA._f64 = 3.9; cpu._dst = &cpu.RA; cpu.D2I(); check("D2I (3.9 -> 3)", cpu.RA._u32, 3.0); cpu.RA._f64 = 1e12; cpu._dst = &cpu.RA; cpu.D2L(); check("D2L (1e12)", (double)cpu.RA._u64, 1e12); std::cout << "\n-- Trigonometric Instructions --\n"; cpu.RA._f64 = M_PI / 2.0; cpu._dst = &cpu.RA; cpu.SIN(); check("SIN(pi/2)", cpu.RA._f64, 1.0); cpu.RA._f64 = 0.0; cpu._dst = &cpu.RA; cpu.COS(); check("COS(0)", cpu.RA._f64, 1.0); cpu.RA._f64 = M_PI / 4.0; cpu._dst = &cpu.RA; cpu.TAN(); check("TAN(pi/4)", cpu.RA._f64, 1.0); cpu.RA._f64 = 1.0; cpu._dst = &cpu.RA; cpu.ASIN(); check("ASIN(1.0)", cpu.RA._f64, M_PI / 2.0); cpu.RA._f64 = 1.0; cpu._dst = &cpu.RA; cpu.ACOS(); check("ACOS(1.0)", cpu.RA._f64, 0.0); cpu.RA._f64 = 1.0; cpu._dst = &cpu.RA; cpu.ATAN(); check("ATAN(1.0)", cpu.RA._f64, M_PI / 4.0); cpu.RA._f64 = 1.0; cpu.RB._f64 = 1.0; cpu._dst = &cpu.RA; cpu._src = &cpu.RB; cpu.ATAN2(); check("ATAN2(1,1)", cpu.RA._f64, M_PI / 4.0); std::cout << "\n-- Exponential Instructions --\n"; cpu.RA._f64 = 1.0; cpu._dst = &cpu.RA; cpu.EXP(); check("EXP(1)", cpu.RA._f64, M_E); cpu.RA._f64 = M_E; cpu._dst = &cpu.RA; cpu.LOG(); check("LOG(e)", cpu.RA._f64, 1.0); cpu.RA._f64 = 100.0; cpu.RB._f64 = 10.0; cpu._dst = &cpu.RA; cpu._src = &cpu.RB; cpu.LOGAB(); check("LOGAB(100,10)", cpu.RA._f64, 2.0); cpu.RA._f64 = 2.0; cpu.RB._f64 = 10.0; cpu._dst = &cpu.RA; cpu._src = &cpu.RB; cpu.POW(); check("POW(2,10)", cpu.RA._f64, 1024.0); cpu.RA._f64 = 9.0; cpu._dst = &cpu.RA; cpu.SQRT(); check("SQRT(9)", cpu.RA._f64, 3.0); cpu.RA._f64 = 27.0; cpu.RB._f64 = 3.0; cpu._dst = &cpu.RA; cpu._src = &cpu.RB; cpu.ROOT(); check("ROOT(27,3)", cpu.RA._f64, 3.0); std::cout << "\n=== Tests complete ===\n"; return 0; }