/** * @file InstrMap.cpp * @brief Spider VM instruction dispatch — array and switch implementations. * * AUTO-GENERATED by pygen.ipynb — DO NOT EDIT BY HAND. * * This file provides two equivalent dispatch mechanisms: * * 1. InstrMap[] — A lookup table of member-function pointers indexed by * opcode. O(1) dispatch; suitable for platforms where * indirect calls through function pointers are efficient. * * 2. CPU::execute(u16) — A switch/case over every opcode. Lets the * compiler emit a jump table or branch tree; may be * preferable on microcontrollers or when link-time * optimisation can inline the handlers. * */ #include namespace spider { // ============================================================= // Version 1 — Lookup table of member-function pointers // ============================================================= /** * Instruction dispatch table (512 entries, 9-bit opcode space). * * Usage: * u16 opcode = fetch(); * CPU::Fn fn = InstrMap[opcode]; * if (fn) (cpu.*fn)(); */ CPU::Fn CPU::instrMap[] = { &CPU::NOP, // 0x000 — No Operation &CPU::SPDR, // 0x001 — Will place the Spider version of the interpreter in RA &CPU::MMODE, // 0x002 — Set Memory Mode &CPU::INT, // 0x003 — Interrupt &CPU::LRV, // 0x004 — Load Interrupt Vector Register &CPU::FSR, // 0x005 — Fetch System Register &CPU::FIR, // 0x006 — Fetch Instruction Register &CPU::FZR, // 0x007 — Fetch Stack Base Register &CPU::LSR, // 0x008 — Load System Register &CPU::FVR, // 0x009 — Fetch Interrupt Vector Register &CPU::MOV, // 0x00A — Moves values &CPU::MOR, // 0x00B — Moves registers &CPU::AMOV, // 0x00C — Array Move, uses X and Y as ptrs, A as amount &CPU::SWP, // 0x00D — Swap registers &CPU::AHM, // 0x00E — Ask Host for Memory nullptr, // 0x00F (reserved) &CPU::COM, // 0x010 — One's complement &CPU::NEG, // 0x011 — Two's complement &CPU::EXS, // 0x012 — Extend Sign &CPU::INC, // 0x013 — Increment &CPU::DEC, // 0x014 — Decrement &CPU::ADD, // 0x015 — Addition &CPU::SUB, // 0x016 — Subtraction &CPU::MUL, // 0x017 — Multiplication &CPU::UMUL, // 0x018 — Unsigned Multiplication &CPU::DIV, // 0x019 — Division &CPU::UDIV, // 0x01A — Unsigned Division &CPU::MOD, // 0x01B — Modulus &CPU::UMOD, // 0x01C — Unsigned Modulus &CPU::DMOD, // 0x01D — Division and Modulus &CPU::UDMD, // 0x01E — Unsigned Division and Modulus &CPU::FBT, // 0x01F — Test and update Flag Register (Integer) Bits &CPU::STB, // 0x020 — Set Bit &CPU::CRB, // 0x021 — Clear Bit &CPU::TSB, // 0x022 — Test Bit &CPU::BOOL, // 0x023 — Sets the booleaness of a value &CPU::NOT, // 0x024 — Sets the inverse booleaness of a value (! BOOL) &CPU::AND, // 0x025 — Boolean AND operation &CPU::OR, // 0x026 — Boolean OR operation &CPU::XOR, // 0x027 — Boolean XOR operation &CPU::SHL, // 0x028 — Arithmetic Shift Left &CPU::SHR, // 0x029 — Arithmetic Shift Right &CPU::SSR, // 0x02A — Signed Shift Right &CPU::ROL, // 0x02B — Rotate Left &CPU::ROR, // 0x02C — Rotate Right &CPU::CNT, // 0x02D — Counts bits nullptr, // 0x02E (reserved) nullptr, // 0x02F (reserved) &CPU::EQ, // 0x030 — Equal &CPU::NE, // 0x031 — Not Equal &CPU::GT, // 0x032 — Greater Than &CPU::GE, // 0x033 — Greater or Equal Than &CPU::LT, // 0x034 — Lower Than &CPU::LE, // 0x035 — Lower or Equal Than nullptr, // 0x036 (reserved) nullptr, // 0x037 (reserved) &CPU::JMP, // 0x038 — Jump to absolute position &CPU::JEQ, // 0x039 — Jumps to position if EQ flag is set &CPU::JNE, // 0x03A — Jumps to position if EQ flag is cleared &CPU::JIF, // 0x03B — Jumps if value provided is booleanly true &CPU::JMR, // 0x03C — Jump Relative &CPU::JER, // 0x03D — Jumps to relative position if EQ flag is set &CPU::JNR, // 0x03E — Jumps to relative position if EQ flag is cleared &CPU::JIR, // 0x03F — Jumps to relative position if value provided is booleanly true &CPU::SFB, // 0x040 — Store (User) Flag Bit &CPU::LFB, // 0x041 — Load (User) Flag Bit &CPU::JUF, // 0x042 — Jump to absolute position, if user flag is true &CPU::JUR, // 0x043 — Jump to relative position, if user flag is true &CPU::PUSH, // 0x044 — Push to stack &CPU::POP, // 0x045 — Pop from stack &CPU::ALLOC, // 0x046 — Allocate to heap &CPU::HFREE, // 0x047 — Delete from heap nullptr, // 0x048 (reserved) nullptr, // 0x049 (reserved) &CPU::CALL, // 0x04A — Call function at instruction index &CPU::RET, // 0x04B — Return from a function &CPU::EDI, // 0x04C — Enable/Disable External Interrupts &CPU::SHSS, // 0x04D — Set Hotswap Signal Bit nullptr, // 0x04E (reserved) nullptr, // 0x04F (reserved) &CPU::FLI, // 0x050 — Float Load Immediate &CPU::FNEG, // 0x051 — Float negate &CPU::FADD, // 0x052 — Float add &CPU::FSUB, // 0x053 — Float subtract &CPU::FMUL, // 0x054 — Float multiplication &CPU::FDIV, // 0x055 — Float division &CPU::FMOD, // 0x056 — Float modulus &CPU::FDMOD, // 0x057 — Float division and modulus &CPU::FEPS, // 0x058 — Sets the float epsilon value, for comparison &CPU::FEEP, // 0x059 — Float Enable/Disable Epsilon &CPU::FEQ, // 0x05A — Float Equal &CPU::FNE, // 0x05B — Float Not Equal &CPU::FGT, // 0x05C — Float Greater Than &CPU::FGE, // 0x05D — Float Greater or Equal Than &CPU::FLT, // 0x05E — Float Lower Than &CPU::FLE, // 0x05F — Float Lower or Equal Than &CPU::F2D, // 0x060 — F32 (Float) to F64 (Double) &CPU::D2F, // 0x061 — F64 (Double) to F32 (Float) &CPU::I2F, // 0x062 — I32 (Integer) to F32 (Float) &CPU::I2D, // 0x063 — I32 (Integer) to F64 (Double) &CPU::L2F, // 0x064 — I64 (Long) to F32 (Float) &CPU::L2D, // 0x065 — I64 (Long) to F64 (Double) &CPU::F2I, // 0x066 — F32 (Float) to I32 (Integer) &CPU::F2L, // 0x067 — F32 (Float) to I64 (Long) &CPU::D2I, // 0x068 — F64 (Double) to I32 (Integer) &CPU::D2L, // 0x069 — F64 (Double) to I64 (Long) nullptr, // 0x06A (reserved) nullptr, // 0x06B (reserved) &CPU::SIN, // 0x06C — Sine Function &CPU::COS, // 0x06D — Cosine Function &CPU::TAN, // 0x06E — Tangent Function &CPU::ASIN, // 0x06F — Arc Sine Function &CPU::ACOS, // 0x070 — Arc Cosine Function &CPU::ATAN, // 0x071 — Arc Tangent Function &CPU::ATAN2, // 0x072 — Arc Tangent Function with 2 Arguments nullptr, // 0x073 (reserved) &CPU::EXP, // 0x074 — Exponential Function &CPU::LOG, // 0x075 — Natural Logarithm &CPU::LOGAB, // 0x076 — Logarithm A of B &CPU::POW, // 0x077 — Power Function &CPU::SQRT, // 0x078 — Square Root &CPU::ROOT, // 0x079 — General Root nullptr, // 0x07A (reserved) nullptr, // 0x07B (reserved) &CPU::ADC, // 0x07C — Add with Carry &CPU::SWC, // 0x07D — Subtract with Carry (Borrow) &CPU::MWO, // 0x07E — Multiply with Overflow &CPU::UMO, // 0x07F — Unsigned Multiply with Overflow &CPU::MADD, // 0x080 — Matrix Addition &CPU::MSUB, // 0x081 — Matrix Subtraction &CPU::MMUL, // 0x082 — Matrix Multiply &CPU::MINV, // 0x083 — Matrix Inverse &CPU::MTRA, // 0x084 — Matrix Transpose &CPU::MDET, // 0x085 — Matrix Determinant &CPU::QMKA, // 0x086 — Quaternion Make from Angles &CPU::QMUL, // 0x087 — Quaternion Multiply nullptr, // 0x088 nullptr, // 0x089 &CPU::XADD, // 0x08A — SIMD Addition &CPU::XSUB, // 0x08B — SIMD Subtract &CPU::XAMA, // 0x08C — SIMD Alternate Multiply-Add &CPU::XMUL, // 0x08D — SIMD Multiply &CPU::XDIV, // 0x08E — SIMD Divide nullptr, // 0x08F nullptr, // 0x090 nullptr, // 0x091 nullptr, // 0x092 nullptr, // 0x093 nullptr, // 0x094 nullptr, // 0x095 nullptr, // 0x096 nullptr, // 0x097 nullptr, // 0x098 nullptr, // 0x099 nullptr, // 0x09A nullptr, // 0x09B nullptr, // 0x09C nullptr, // 0x09D nullptr, // 0x09E nullptr, // 0x09F nullptr, // 0x0A0 nullptr, // 0x0A1 nullptr, // 0x0A2 nullptr, // 0x0A3 nullptr, // 0x0A4 nullptr, // 0x0A5 nullptr, // 0x0A6 nullptr, // 0x0A7 nullptr, // 0x0A8 nullptr, // 0x0A9 nullptr, // 0x0AA nullptr, // 0x0AB nullptr, // 0x0AC nullptr, // 0x0AD nullptr, // 0x0AE nullptr, // 0x0AF nullptr, // 0x0B0 nullptr, // 0x0B1 nullptr, // 0x0B2 nullptr, // 0x0B3 nullptr, // 0x0B4 nullptr, // 0x0B5 nullptr, // 0x0B6 nullptr, // 0x0B7 nullptr, // 0x0B8 nullptr, // 0x0B9 nullptr, // 0x0BA nullptr, // 0x0BB nullptr, // 0x0BC nullptr, // 0x0BD nullptr, // 0x0BE nullptr, // 0x0BF nullptr, // 0x0C0 nullptr, // 0x0C1 nullptr, // 0x0C2 nullptr, // 0x0C3 nullptr, // 0x0C4 nullptr, // 0x0C5 nullptr, // 0x0C6 nullptr, // 0x0C7 nullptr, // 0x0C8 nullptr, // 0x0C9 nullptr, // 0x0CA nullptr, // 0x0CB nullptr, // 0x0CC nullptr, // 0x0CD nullptr, // 0x0CE nullptr, // 0x0CF nullptr, // 0x0D0 nullptr, // 0x0D1 nullptr, // 0x0D2 nullptr, // 0x0D3 nullptr, // 0x0D4 nullptr, // 0x0D5 nullptr, // 0x0D6 nullptr, // 0x0D7 nullptr, // 0x0D8 nullptr, // 0x0D9 nullptr, // 0x0DA nullptr, // 0x0DB nullptr, // 0x0DC nullptr, // 0x0DD nullptr, // 0x0DE nullptr, // 0x0DF nullptr, // 0x0E0 nullptr, // 0x0E1 nullptr, // 0x0E2 nullptr, // 0x0E3 nullptr, // 0x0E4 nullptr, // 0x0E5 nullptr, // 0x0E6 nullptr, // 0x0E7 nullptr, // 0x0E8 nullptr, // 0x0E9 nullptr, // 0x0EA nullptr, // 0x0EB nullptr, // 0x0EC nullptr, // 0x0ED nullptr, // 0x0EE nullptr, // 0x0EF &CPU::UPY, // 0x0F0 — Will place "YUPI" in memory nullptr, // 0x0F1 nullptr, // 0x0F2 nullptr, // 0x0F3 nullptr, // 0x0F4 nullptr, // 0x0F5 nullptr, // 0x0F6 nullptr, // 0x0F7 nullptr, // 0x0F8 nullptr, // 0x0F9 nullptr, // 0x0FA nullptr, // 0x0FB nullptr, // 0x0FC nullptr, // 0x0FD nullptr, // 0x0FE nullptr, // 0x0FF nullptr, // 0x100 nullptr, // 0x101 nullptr, // 0x102 nullptr, // 0x103 nullptr, // 0x104 nullptr, // 0x105 nullptr, // 0x106 nullptr, // 0x107 nullptr, // 0x108 nullptr, // 0x109 nullptr, // 0x10A nullptr, // 0x10B nullptr, // 0x10C nullptr, // 0x10D nullptr, // 0x10E nullptr, // 0x10F nullptr, // 0x110 nullptr, // 0x111 nullptr, // 0x112 nullptr, // 0x113 nullptr, // 0x114 nullptr, // 0x115 nullptr, // 0x116 nullptr, // 0x117 nullptr, // 0x118 nullptr, // 0x119 nullptr, // 0x11A nullptr, // 0x11B nullptr, // 0x11C nullptr, // 0x11D nullptr, // 0x11E nullptr, // 0x11F nullptr, // 0x120 nullptr, // 0x121 nullptr, // 0x122 nullptr, // 0x123 nullptr, // 0x124 nullptr, // 0x125 nullptr, // 0x126 nullptr, // 0x127 nullptr, // 0x128 nullptr, // 0x129 nullptr, // 0x12A nullptr, // 0x12B nullptr, // 0x12C nullptr, // 0x12D nullptr, // 0x12E nullptr, // 0x12F nullptr, // 0x130 nullptr, // 0x131 nullptr, // 0x132 nullptr, // 0x133 nullptr, // 0x134 nullptr, // 0x135 nullptr, // 0x136 nullptr, // 0x137 nullptr, // 0x138 nullptr, // 0x139 nullptr, // 0x13A nullptr, // 0x13B nullptr, // 0x13C nullptr, // 0x13D nullptr, // 0x13E nullptr, // 0x13F nullptr, // 0x140 nullptr, // 0x141 nullptr, // 0x142 nullptr, // 0x143 nullptr, // 0x144 nullptr, // 0x145 nullptr, // 0x146 nullptr, // 0x147 nullptr, // 0x148 nullptr, // 0x149 nullptr, // 0x14A nullptr, // 0x14B nullptr, // 0x14C nullptr, // 0x14D nullptr, // 0x14E nullptr, // 0x14F nullptr, // 0x150 nullptr, // 0x151 nullptr, // 0x152 nullptr, // 0x153 nullptr, // 0x154 nullptr, // 0x155 nullptr, // 0x156 nullptr, // 0x157 nullptr, // 0x158 nullptr, // 0x159 nullptr, // 0x15A nullptr, // 0x15B nullptr, // 0x15C nullptr, // 0x15D nullptr, // 0x15E nullptr, // 0x15F nullptr, // 0x160 nullptr, // 0x161 nullptr, // 0x162 nullptr, // 0x163 nullptr, // 0x164 nullptr, // 0x165 nullptr, // 0x166 nullptr, // 0x167 nullptr, // 0x168 nullptr, // 0x169 nullptr, // 0x16A nullptr, // 0x16B nullptr, // 0x16C nullptr, // 0x16D nullptr, // 0x16E nullptr, // 0x16F nullptr, // 0x170 nullptr, // 0x171 nullptr, // 0x172 nullptr, // 0x173 nullptr, // 0x174 nullptr, // 0x175 nullptr, // 0x176 nullptr, // 0x177 nullptr, // 0x178 nullptr, // 0x179 nullptr, // 0x17A nullptr, // 0x17B nullptr, // 0x17C nullptr, // 0x17D nullptr, // 0x17E nullptr, // 0x17F nullptr, // 0x180 nullptr, // 0x181 nullptr, // 0x182 nullptr, // 0x183 nullptr, // 0x184 nullptr, // 0x185 nullptr, // 0x186 nullptr, // 0x187 nullptr, // 0x188 nullptr, // 0x189 nullptr, // 0x18A nullptr, // 0x18B nullptr, // 0x18C nullptr, // 0x18D nullptr, // 0x18E nullptr, // 0x18F nullptr, // 0x190 nullptr, // 0x191 nullptr, // 0x192 nullptr, // 0x193 nullptr, // 0x194 nullptr, // 0x195 nullptr, // 0x196 nullptr, // 0x197 nullptr, // 0x198 nullptr, // 0x199 nullptr, // 0x19A nullptr, // 0x19B nullptr, // 0x19C nullptr, // 0x19D nullptr, // 0x19E nullptr, // 0x19F nullptr, // 0x1A0 nullptr, // 0x1A1 nullptr, // 0x1A2 nullptr, // 0x1A3 nullptr, // 0x1A4 nullptr, // 0x1A5 nullptr, // 0x1A6 nullptr, // 0x1A7 nullptr, // 0x1A8 nullptr, // 0x1A9 nullptr, // 0x1AA nullptr, // 0x1AB nullptr, // 0x1AC nullptr, // 0x1AD nullptr, // 0x1AE nullptr, // 0x1AF nullptr, // 0x1B0 nullptr, // 0x1B1 nullptr, // 0x1B2 nullptr, // 0x1B3 nullptr, // 0x1B4 nullptr, // 0x1B5 nullptr, // 0x1B6 nullptr, // 0x1B7 nullptr, // 0x1B8 nullptr, // 0x1B9 nullptr, // 0x1BA nullptr, // 0x1BB nullptr, // 0x1BC nullptr, // 0x1BD nullptr, // 0x1BE nullptr, // 0x1BF nullptr, // 0x1C0 nullptr, // 0x1C1 nullptr, // 0x1C2 nullptr, // 0x1C3 nullptr, // 0x1C4 nullptr, // 0x1C5 nullptr, // 0x1C6 nullptr, // 0x1C7 nullptr, // 0x1C8 nullptr, // 0x1C9 nullptr, // 0x1CA nullptr, // 0x1CB nullptr, // 0x1CC nullptr, // 0x1CD nullptr, // 0x1CE nullptr, // 0x1CF nullptr, // 0x1D0 nullptr, // 0x1D1 nullptr, // 0x1D2 nullptr, // 0x1D3 nullptr, // 0x1D4 nullptr, // 0x1D5 nullptr, // 0x1D6 nullptr, // 0x1D7 nullptr, // 0x1D8 nullptr, // 0x1D9 nullptr, // 0x1DA nullptr, // 0x1DB nullptr, // 0x1DC nullptr, // 0x1DD nullptr, // 0x1DE nullptr, // 0x1DF nullptr, // 0x1E0 nullptr, // 0x1E1 nullptr, // 0x1E2 nullptr, // 0x1E3 nullptr, // 0x1E4 nullptr, // 0x1E5 nullptr, // 0x1E6 nullptr, // 0x1E7 nullptr, // 0x1E8 nullptr, // 0x1E9 nullptr, // 0x1EA nullptr, // 0x1EB nullptr, // 0x1EC nullptr, // 0x1ED nullptr, // 0x1EE nullptr, // 0x1EF nullptr, // 0x1F0 nullptr, // 0x1F1 nullptr, // 0x1F2 nullptr, // 0x1F3 nullptr, // 0x1F4 nullptr, // 0x1F5 nullptr, // 0x1F6 nullptr, // 0x1F7 nullptr, // 0x1F8 nullptr, // 0x1F9 nullptr, // 0x1FA nullptr, // 0x1FB nullptr, // 0x1FC nullptr, // 0x1FD nullptr, // 0x1FE nullptr, // 0x1FF }; // ============================================================= // Version 2 — Switch dispatch // ============================================================= /** * Execute the instruction identified by @p opcode. * * This is functionally equivalent to the InstrMap[] table above * but expressed as a switch so the compiler can choose the best * lowering strategy (jump table, binary search, etc.). * * @param opcode 9-bit instruction opcode (0x000 - 0x1FF). */ void CPU::executeSwLk() { switch (_opcode) { // ── System ────────────────────────────────────── case 0x000: NOP(); break; case 0x001: SPDR(); break; case 0x002: MMODE(); break; case 0x003: INT(); break; case 0x004: LRV(); break; case 0x005: FSR(); break; case 0x006: FIR(); break; case 0x007: FZR(); break; case 0x008: LSR(); break; case 0x009: FVR(); break; // ── Memory ────────────────────────────────────── case 0x00A: MOV(); break; case 0x00B: MOR(); break; case 0x00C: AMOV(); break; case 0x00D: SWP(); break; case 0x00E: AHM(); break; // ── Integer ───────────────────────────────────── case 0x010: COM(); break; case 0x011: NEG(); break; case 0x012: EXS(); break; case 0x013: INC(); break; case 0x014: DEC(); break; case 0x015: ADD(); break; case 0x016: SUB(); break; case 0x017: MUL(); break; case 0x018: UMUL(); break; case 0x019: DIV(); break; case 0x01A: UDIV(); break; case 0x01B: MOD(); break; case 0x01C: UMOD(); break; case 0x01D: DMOD(); break; case 0x01E: UDMD(); break; // ── System ────────────────────────────────────── case 0x01F: FBT(); break; // ── Bit Wise ──────────────────────────────────── case 0x020: STB(); break; case 0x021: CRB(); break; case 0x022: TSB(); break; case 0x023: BOOL(); break; case 0x024: NOT(); break; case 0x025: AND(); break; case 0x026: OR(); break; case 0x027: XOR(); break; case 0x028: SHL(); break; case 0x029: SHR(); break; case 0x02A: SSR(); break; case 0x02B: ROL(); break; case 0x02C: ROR(); break; case 0x02D: CNT(); break; // ── Boolean ───────────────────────────────────── case 0x030: EQ(); break; case 0x031: NE(); break; case 0x032: GT(); break; case 0x033: GE(); break; case 0x034: LT(); break; case 0x035: LE(); break; // ── Branch ────────────────────────────────────── case 0x038: JMP(); break; case 0x039: JEQ(); break; case 0x03A: JNE(); break; case 0x03B: JIF(); break; case 0x03C: JMR(); break; case 0x03D: JER(); break; case 0x03E: JNR(); break; case 0x03F: JIR(); break; // ── System ────────────────────────────────────── case 0x040: SFB(); break; case 0x041: LFB(); break; // ── Branch ────────────────────────────────────── case 0x042: JUF(); break; case 0x043: JUR(); break; // ── Memory ────────────────────────────────────── case 0x044: PUSH(); break; case 0x045: POP(); break; case 0x046: ALLOC(); break; case 0x047: HFREE(); break; // ── Branch ────────────────────────────────────── case 0x04A: CALL(); break; case 0x04B: RET(); break; // ── System ────────────────────────────────────── case 0x04C: EDI(); break; case 0x04D: SHSS(); break; // ── Floating Point ────────────────────────────── case 0x050: FLI(); break; case 0x051: FNEG(); break; case 0x052: FADD(); break; case 0x053: FSUB(); break; case 0x054: FMUL(); break; case 0x055: FDIV(); break; case 0x056: FMOD(); break; case 0x057: FDMOD(); break; case 0x058: FEPS(); break; case 0x059: FEEP(); break; // ── Boolean ───────────────────────────────────── case 0x05A: FEQ(); break; case 0x05B: FNE(); break; case 0x05C: FGT(); break; case 0x05D: FGE(); break; case 0x05E: FLT(); break; case 0x05F: FLE(); break; // ── Casts ─────────────────────────────────────── case 0x060: F2D(); break; case 0x061: D2F(); break; case 0x062: I2F(); break; case 0x063: I2D(); break; case 0x064: L2F(); break; case 0x065: L2D(); break; case 0x066: F2I(); break; case 0x067: F2L(); break; case 0x068: D2I(); break; case 0x069: D2L(); break; // ── Trigonometric ─────────────────────────────── case 0x06C: SIN(); break; case 0x06D: COS(); break; case 0x06E: TAN(); break; case 0x06F: ASIN(); break; case 0x070: ACOS(); break; case 0x071: ATAN(); break; case 0x072: ATAN2(); break; // ── Exponential ───────────────────────────────── case 0x074: EXP(); break; case 0x075: LOG(); break; case 0x076: LOGAB(); break; case 0x077: POW(); break; case 0x078: SQRT(); break; case 0x079: ROOT(); break; // ── Integer ───────────────────────────────────── case 0x07C: ADC(); break; case 0x07D: SWC(); break; case 0x07E: MWO(); break; case 0x07F: UMO(); break; // ── Matrix ────────────────────────────────────── case 0x080: MADD(); break; case 0x081: MSUB(); break; case 0x082: MMUL(); break; case 0x083: MINV(); break; case 0x084: MTRA(); break; case 0x085: MDET(); break; // ── Quaternion ────────────────────────────────── case 0x086: QMKA(); break; case 0x087: QMUL(); break; // ── SIMD ──────────────────────────────────────── case 0x08A: XADD(); break; case 0x08B: XSUB(); break; case 0x08C: XAMA(); break; case 0x08D: XMUL(); break; case 0x08E: XDIV(); break; // ── Easter Eggs ───────────────────────────────── case 0x0F0: UPY(); break; default: break; } } } // namespace spider