749 lines
33 KiB
C++
749 lines
33 KiB
C++
/**
|
|
* @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 <spider/runtime/cpu/CPU.hpp>
|
|
|
|
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
|
|
&CPU::LLGS, // 0x0F1 — Spider ASCII art (LLGS easter egg)
|
|
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;
|
|
case 0x0F1: LLGS(); break;
|
|
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
} // namespace spider
|