feat: SnowVM 支持更多指令

This commit is contained in:
Luke 2025-06-28 00:19:27 +08:00
parent de6df61960
commit fa91550ad7

View File

@ -1,22 +1,31 @@
package org.jcnc.snow.vm.factories;
import org.jcnc.snow.vm.commands.arithmetic.conversion.*;
import org.jcnc.snow.vm.interfaces.Command;
import org.jcnc.snow.vm.commands.arithmetic.byte8.*;
import org.jcnc.snow.vm.commands.arithmetic.conversion.*;
import org.jcnc.snow.vm.commands.arithmetic.double64.*;
import org.jcnc.snow.vm.commands.arithmetic.float32.*;
import org.jcnc.snow.vm.commands.arithmetic.int32.*;
import org.jcnc.snow.vm.commands.arithmetic.long64.*;
import org.jcnc.snow.vm.commands.arithmetic.short16.*;
import org.jcnc.snow.vm.commands.bitwise.byte8.BAndCommand;
import org.jcnc.snow.vm.commands.bitwise.byte8.BOrCommand;
import org.jcnc.snow.vm.commands.bitwise.byte8.BXorCommand;
import org.jcnc.snow.vm.commands.bitwise.int32.IAndCommand;
import org.jcnc.snow.vm.commands.bitwise.int32.IOrCommand;
import org.jcnc.snow.vm.commands.bitwise.int32.IXorCommand;
import org.jcnc.snow.vm.commands.bitwise.long64.LAndCommand;
import org.jcnc.snow.vm.commands.bitwise.long64.LOrCommand;
import org.jcnc.snow.vm.commands.bitwise.long64.LXorCommand;
import org.jcnc.snow.vm.commands.bitwise.short16.SAndCommand;
import org.jcnc.snow.vm.commands.bitwise.short16.SOrCommand;
import org.jcnc.snow.vm.commands.bitwise.short16.SXorCommand;
import org.jcnc.snow.vm.commands.control.all.JumpCommand;
import org.jcnc.snow.vm.commands.control.byte8.*;
import org.jcnc.snow.vm.commands.control.double64.*;
import org.jcnc.snow.vm.commands.control.float32.*;
import org.jcnc.snow.vm.commands.control.int32.*;
import org.jcnc.snow.vm.commands.control.long64.*;
import org.jcnc.snow.vm.commands.control.short16.*;
import org.jcnc.snow.vm.commands.function.CallCommand;
import org.jcnc.snow.vm.commands.function.RetCommand;
import org.jcnc.snow.vm.commands.memory.all.MovCommand;
@ -43,6 +52,7 @@ import org.jcnc.snow.vm.commands.stack.long64.LPushCommand;
import org.jcnc.snow.vm.commands.stack.short16.SPushCommand;
import org.jcnc.snow.vm.commands.vm.HaltCommand;
import org.jcnc.snow.vm.engine.VMOpCode;
import org.jcnc.snow.vm.interfaces.Command;
import java.util.Optional;
@ -52,160 +62,211 @@ import java.util.Optional;
* <p>This class uses an array for fast, constant-time access to corresponding command instances.</p>
*/
public class CommandFactory {
private static final Command[] COMMANDS = new Command[0x04FF];
/** Complete command table. 0x0000 0x04FF (inclusive). */
private static final Command[] COMMANDS = new Command[0x0500];
static {
// Initialize the array with corresponding commands based on opCode values
// 1 Arithmetic Operations (180)
// 1.1 int32 (1-10)
COMMANDS[VMOpCode.I_ADD] = new IAddCommand(); // 1
COMMANDS[VMOpCode.I_SUB] = new ISubCommand(); // 2
COMMANDS[VMOpCode.I_MUL] = new IMulCommand(); // 3
COMMANDS[VMOpCode.I_DIV] = new IDivCommand(); // 4
COMMANDS[VMOpCode.I_MOD] = new IModCommand(); // 5
COMMANDS[VMOpCode.I_INC] = new IIncCommand(); // 6
COMMANDS[VMOpCode.I_NEG] = new INegCommand(); // 7
// 1.2 long64 (11-20)
COMMANDS[VMOpCode.L_ADD] = new LAddCommand(); // 11
COMMANDS[VMOpCode.L_SUB] = new LSubCommand(); // 12
COMMANDS[VMOpCode.L_MUL] = new LMulCommand(); // 13
COMMANDS[VMOpCode.L_DIV] = new LDivCommand(); // 14
COMMANDS[VMOpCode.L_MOD] = new LModCommand(); // 15
COMMANDS[VMOpCode.L_INC] = new LIncCommand(); // 16
COMMANDS[VMOpCode.L_NEG] = new LNegCommand(); // 17
// 1.3 short16 (21-30)
COMMANDS[VMOpCode.S_ADD] = new SAddCommand(); // 21
COMMANDS[VMOpCode.S_SUB] = new SSubCommand(); // 22
COMMANDS[VMOpCode.S_MUL] = new SMulCommand(); // 23
COMMANDS[VMOpCode.S_DIV] = new SDivCommand(); // 24
COMMANDS[VMOpCode.S_MOD] = new SModCommand(); // 25
COMMANDS[VMOpCode.S_INC] = new SIncCommand(); // 26
COMMANDS[VMOpCode.S_NEG] = new SNegCommand(); // 27
// 1.4 byte8 (31-40)
COMMANDS[VMOpCode.B_ADD] = new BAddCommand(); // 31
COMMANDS[VMOpCode.B_SUB] = new BSubCommand(); // 32
COMMANDS[VMOpCode.B_MUL] = new BMulCommand(); // 33
COMMANDS[VMOpCode.B_DIV] = new BDivCommand(); // 34
COMMANDS[VMOpCode.B_MOD] = new BModCommand(); // 35
COMMANDS[VMOpCode.B_INC] = new BIncCommand(); // 36
COMMANDS[VMOpCode.B_NEG] = new BNegCommand(); // 37
// 1.5 double64 (41-50)
COMMANDS[VMOpCode.D_ADD] = new DAddCommand(); // 41
COMMANDS[VMOpCode.D_SUB] = new DSubCommand(); // 42
COMMANDS[VMOpCode.D_MUL] = new DMulCommand(); // 43
COMMANDS[VMOpCode.D_DIV] = new DDivCommand(); // 44
COMMANDS[VMOpCode.D_MOD] = new DModCommand(); // 45
COMMANDS[VMOpCode.D_INC] = new DIncCommand(); // 46
COMMANDS[VMOpCode.D_NEG] = new DNegCommand(); // 47
// 1.6 float32 (51-60)
COMMANDS[VMOpCode.F_ADD] = new FAddCommand(); // 51
COMMANDS[VMOpCode.F_SUB] = new FSubCommand(); // 52
COMMANDS[VMOpCode.F_MUL] = new FMulCommand(); // 53
COMMANDS[VMOpCode.F_DIV] = new FDivCommand(); // 54
COMMANDS[VMOpCode.F_MOD] = new FModCommand(); // 55
COMMANDS[VMOpCode.F_INC] = new FIncCommand(); // 56
COMMANDS[VMOpCode.F_NEG] = new FNegCommand(); // 57
/* =====================================================
* 0x0000 0x001F BYTE (8-bit signed)
* ===================================================== */
COMMANDS[VMOpCode.B_ADD] = new BAddCommand();
COMMANDS[VMOpCode.B_SUB] = new BSubCommand();
COMMANDS[VMOpCode.B_MUL] = new BMulCommand();
COMMANDS[VMOpCode.B_DIV] = new BDivCommand();
COMMANDS[VMOpCode.B_MOD] = new BModCommand();
COMMANDS[VMOpCode.B_NEG] = new BNegCommand();
COMMANDS[VMOpCode.B_INC] = new BIncCommand();
// 1.7 Type Conversion (61-80)
COMMANDS[VMOpCode.I2L] = new I2LCommand(); // 61 int -> long
COMMANDS[VMOpCode.I2S] = new I2SCommand(); // 62 int -> short
COMMANDS[VMOpCode.I2B] = new I2BCommand(); // 63 int -> byte
COMMANDS[VMOpCode.I2D] = new I2DCommand(); // 64 int -> double
COMMANDS[VMOpCode.I2F] = new I2FCommand(); // 65 int -> float
COMMANDS[VMOpCode.B_AND] = new BAndCommand();
COMMANDS[VMOpCode.B_OR] = new BOrCommand();
COMMANDS[VMOpCode.B_XOR] = new BXorCommand();
COMMANDS[VMOpCode.L2I] = new L2ICommand(); // 66 long -> int
COMMANDS[VMOpCode.L2D] = new L2DCommand(); // 67 long -> double
COMMANDS[VMOpCode.L2F] = new L2FCommand(); // 68 long -> float
COMMANDS[VMOpCode.B_PUSH] = new BPushCommand();
COMMANDS[VMOpCode.B_LOAD] = new BLoadCommand();
COMMANDS[VMOpCode.B_STORE] = new BStoreCommand();
COMMANDS[VMOpCode.F2I] = new F2ICommand(); // 69 float -> int
COMMANDS[VMOpCode.F2L] = new F2LCommand(); // 70 float -> long
COMMANDS[VMOpCode.F2D] = new F2DCommand(); // 71 float -> double
COMMANDS[VMOpCode.B_CE] = new BCECommand();
COMMANDS[VMOpCode.B_CNE] = new BCNECommand();
COMMANDS[VMOpCode.B_CG] = new BCGCommand();
COMMANDS[VMOpCode.B_CGE] = new BCGECommand();
COMMANDS[VMOpCode.B_CL] = new BCLCommand();
COMMANDS[VMOpCode.B_CLE] = new BCLECommand();
COMMANDS[VMOpCode.D2I] = new D2ICommand(); // 72 double -> int
COMMANDS[VMOpCode.D2L] = new D2LCommand(); // 73 double -> long
COMMANDS[VMOpCode.D2F] = new D2FCommand(); // 74 double -> float
/* =====================================================
* 0x0020 0x003F SHORT (16-bit signed)
* ===================================================== */
COMMANDS[VMOpCode.S_ADD] = new SAddCommand();
COMMANDS[VMOpCode.S_SUB] = new SSubCommand();
COMMANDS[VMOpCode.S_MUL] = new SMulCommand();
COMMANDS[VMOpCode.S_DIV] = new SDivCommand();
COMMANDS[VMOpCode.S_MOD] = new SModCommand();
COMMANDS[VMOpCode.S_NEG] = new SNegCommand();
COMMANDS[VMOpCode.S_INC] = new SIncCommand();
COMMANDS[VMOpCode.S2I] = new S2ICommand(); // 75 short -> int
COMMANDS[VMOpCode.S_AND] = new SAndCommand();
COMMANDS[VMOpCode.S_OR] = new SOrCommand();
COMMANDS[VMOpCode.S_XOR] = new SXorCommand();
COMMANDS[VMOpCode.B2I] = new B2ICommand(); // 76 byte -> int
COMMANDS[VMOpCode.S_PUSH] = new SPushCommand();
COMMANDS[VMOpCode.S_LOAD] = new SLoadCommand();
COMMANDS[VMOpCode.S_STORE] = new SStoreCommand();
// 1.8 Other (77-80)
COMMANDS[VMOpCode.S_CE] = new SCECommand();
COMMANDS[VMOpCode.S_CNE] = new SCNECommand();
COMMANDS[VMOpCode.S_CG] = new SCGCommand();
COMMANDS[VMOpCode.S_CGE] = new SCGECommand();
COMMANDS[VMOpCode.S_CL] = new SCLCommand();
COMMANDS[VMOpCode.S_CLE] = new SCLECommand();
// 2. Bitwise Operations (8190)
// 2.1 int32 (81-85)
COMMANDS[VMOpCode.I_AND] = new IAndCommand(); // 81
COMMANDS[VMOpCode.I_OR] = new IOrCommand(); // 82
COMMANDS[VMOpCode.I_XOR] = new IXorCommand(); // 83
// 2.2 Long64 (86-90)
COMMANDS[VMOpCode.L_AND] = new LAndCommand(); // 86
COMMANDS[VMOpCode.L_OR] = new LOrCommand(); // 87
COMMANDS[VMOpCode.L_XOR] = new LXorCommand(); // 88
/* =====================================================
* 0x0040 0x005F INT (32-bit signed)
* ===================================================== */
COMMANDS[VMOpCode.I_ADD] = new IAddCommand();
COMMANDS[VMOpCode.I_SUB] = new ISubCommand();
COMMANDS[VMOpCode.I_MUL] = new IMulCommand();
COMMANDS[VMOpCode.I_DIV] = new IDivCommand();
COMMANDS[VMOpCode.I_MOD] = new IModCommand();
COMMANDS[VMOpCode.I_NEG] = new INegCommand();
COMMANDS[VMOpCode.I_INC] = new IIncCommand();
// 3. Control Flow Operations (91110)
// 3.1 JUMP (91-91)
COMMANDS[VMOpCode.JUMP] = new JumpCommand(); // 91
// 3.2 int32 (92-97)
COMMANDS[VMOpCode.I_CE] = new ICECommand(); // 92
COMMANDS[VMOpCode.I_CNE] = new ICNECommand(); // 93
COMMANDS[VMOpCode.I_CG] = new ICGCommand(); // 94
COMMANDS[VMOpCode.I_CGE] = new ICGECommand(); // 95
COMMANDS[VMOpCode.I_CL] = new ICLCommand(); // 96
COMMANDS[VMOpCode.I_CLE] = new ICLECommand(); // 97
// 3.3 long64 (98-103)
COMMANDS[VMOpCode.L_CE] = new LCECommand(); // 98
COMMANDS[VMOpCode.L_CNE] = new LCNECommand(); // 99
COMMANDS[VMOpCode.L_CG] = new LCGCommand(); // 100
COMMANDS[VMOpCode.L_CGE] = new LCGECommand(); // 101
COMMANDS[VMOpCode.L_CL] = new LCLCommand(); // 102
COMMANDS[VMOpCode.L_CLE] = new LCLECommand(); // 103
COMMANDS[VMOpCode.I_AND] = new IAndCommand();
COMMANDS[VMOpCode.I_OR] = new IOrCommand();
COMMANDS[VMOpCode.I_XOR] = new IXorCommand();
// 4. Stack Operations (111150)
// 4.1 PUSH (111-120)
COMMANDS[VMOpCode.I_PUSH] = new IPushCommand(); // 111
COMMANDS[VMOpCode.L_PUSH] = new LPushCommand(); // 112
COMMANDS[VMOpCode.S_PUSH] = new SPushCommand(); // 113
COMMANDS[VMOpCode.B_PUSH] = new BPushCommand(); // 114
COMMANDS[VMOpCode.D_PUSH] = new DPushCommand(); // 115
COMMANDS[VMOpCode.F_PUSH] = new FPushCommand(); // 116
// 4.2 POP (121-125)
COMMANDS[VMOpCode.POP] = new PopCommand(); // 121
// 4.3 DUP (126-130)
COMMANDS[VMOpCode.DUP] = new DupCommand(); // 126
// 4.4 SWAP (131-135)
COMMANDS[VMOpCode.SWAP] = new SwapCommand(); // 131
COMMANDS[VMOpCode.I_PUSH] = new IPushCommand();
COMMANDS[VMOpCode.I_LOAD] = new ILoadCommand();
COMMANDS[VMOpCode.I_STORE] = new IStoreCommand();
// 4.5 Other (136-150)
COMMANDS[VMOpCode.I_CE] = new ICECommand();
COMMANDS[VMOpCode.I_CNE] = new ICNECommand();
COMMANDS[VMOpCode.I_CG] = new ICGCommand();
COMMANDS[VMOpCode.I_CGE] = new ICGECommand();
COMMANDS[VMOpCode.I_CL] = new ICLCommand();
COMMANDS[VMOpCode.I_CLE] = new ICLECommand();
// 5. Memory Operations (151200)
// 5.1 STORE (151-160)
COMMANDS[VMOpCode.I_STORE] = new IStoreCommand(); // 151
COMMANDS[VMOpCode.L_STORE] = new LStoreCommand(); // 152
COMMANDS[VMOpCode.S_STORE] = new SStoreCommand(); // 153
COMMANDS[VMOpCode.B_STORE] = new BStoreCommand(); // 154
COMMANDS[VMOpCode.D_STORE] = new DStoreCommand(); // 155
COMMANDS[VMOpCode.F_STORE] = new FStoreCommand(); // 156
// 5.2 LOAD (161-170)
COMMANDS[VMOpCode.I_LOAD] = new ILoadCommand(); // 161
COMMANDS[VMOpCode.L_LOAD] = new LLoadCommand(); // 162
COMMANDS[VMOpCode.S_LOAD] = new SLoadCommand(); // 163
COMMANDS[VMOpCode.B_LOAD] = new BLoadCommand(); // 164
COMMANDS[VMOpCode.D_LOAD] = new DLoadCommand(); // 165
COMMANDS[VMOpCode.F_LOAD] = new FLoadCommand(); // 166
/* =====================================================
* 0x0060 0x007F LONG (64-bit signed)
* ===================================================== */
COMMANDS[VMOpCode.L_ADD] = new LAddCommand();
COMMANDS[VMOpCode.L_SUB] = new LSubCommand();
COMMANDS[VMOpCode.L_MUL] = new LMulCommand();
COMMANDS[VMOpCode.L_DIV] = new LDivCommand();
COMMANDS[VMOpCode.L_MOD] = new LModCommand();
COMMANDS[VMOpCode.L_NEG] = new LNegCommand();
COMMANDS[VMOpCode.L_INC] = new LIncCommand();
// 5.3 MOV (171-176)
COMMANDS[VMOpCode.MOV] = new MovCommand(); // 171
COMMANDS[VMOpCode.L_AND] = new LAndCommand();
COMMANDS[VMOpCode.L_OR] = new LOrCommand();
COMMANDS[VMOpCode.L_XOR] = new LXorCommand();
// 5.4 Other (176-200)
COMMANDS[VMOpCode.L_PUSH] = new LPushCommand();
COMMANDS[VMOpCode.L_LOAD] = new LLoadCommand();
COMMANDS[VMOpCode.L_STORE] = new LStoreCommand();
// 6. Function Operations (201205)
COMMANDS[VMOpCode.CALL] = new CallCommand(); // 201
COMMANDS[VMOpCode.RET] = new RetCommand(); // 202
COMMANDS[VMOpCode.L_CE] = new LCECommand();
COMMANDS[VMOpCode.L_CNE] = new LCNECommand();
COMMANDS[VMOpCode.L_CG] = new LCGCommand();
COMMANDS[VMOpCode.L_CGE] = new LCGECommand();
COMMANDS[VMOpCode.L_CL] = new LCLCommand();
COMMANDS[VMOpCode.L_CLE] = new LCLECommand();
// 7. Virtual Machine Operations(241-255)
COMMANDS[VMOpCode.HALT] = new HaltCommand(); // 255
/* =====================================================
* 0x0080 0x009F FLOAT (32-bit signed)
* ===================================================== */
COMMANDS[VMOpCode.F_ADD] = new FAddCommand();
COMMANDS[VMOpCode.F_SUB] = new FSubCommand();
COMMANDS[VMOpCode.F_MUL] = new FMulCommand();
COMMANDS[VMOpCode.F_DIV] = new FDivCommand();
COMMANDS[VMOpCode.F_MOD] = new FModCommand();
COMMANDS[VMOpCode.F_NEG] = new FNegCommand();
COMMANDS[VMOpCode.F_INC] = new FIncCommand();
COMMANDS[VMOpCode.F_PUSH] = new FPushCommand();
COMMANDS[VMOpCode.F_LOAD] = new FLoadCommand();
COMMANDS[VMOpCode.F_STORE] = new FStoreCommand();
COMMANDS[VMOpCode.F_CE] = new FCECommand();
COMMANDS[VMOpCode.F_CNE] = new FCNECommand();
COMMANDS[VMOpCode.F_CG] = new FCGCommand();
COMMANDS[VMOpCode.F_CGE] = new FCGECommand();
COMMANDS[VMOpCode.F_CL] = new FCLCommand();
COMMANDS[VMOpCode.F_CLE] = new FCLECommand();
/* =====================================================
* 0x00A0 0x00BF DOUBLE (64-bit IEEE-754)
* ===================================================== */
COMMANDS[VMOpCode.D_ADD] = new DAddCommand();
COMMANDS[VMOpCode.D_SUB] = new DSubCommand();
COMMANDS[VMOpCode.D_MUL] = new DMulCommand();
COMMANDS[VMOpCode.D_DIV] = new DDivCommand();
COMMANDS[VMOpCode.D_MOD] = new DModCommand();
COMMANDS[VMOpCode.D_NEG] = new DNegCommand();
COMMANDS[VMOpCode.D_INC] = new DIncCommand();
COMMANDS[VMOpCode.D_PUSH] = new DPushCommand();
COMMANDS[VMOpCode.D_LOAD] = new DLoadCommand();
COMMANDS[VMOpCode.D_STORE] = new DStoreCommand();
COMMANDS[VMOpCode.D_CE] = new DCECommand();
COMMANDS[VMOpCode.D_CNE] = new DCNECommand();
COMMANDS[VMOpCode.D_CG] = new DCGCommand();
COMMANDS[VMOpCode.D_CGE] = new DCGECommand();
COMMANDS[VMOpCode.D_CL] = new DCLCommand();
COMMANDS[VMOpCode.D_CLE] = new DCLECommand();
/* =====================================================
* 0x00C0 0x00DF TYPE CONVERSIONS
* ===================================================== */
COMMANDS[VMOpCode.I2L] = new I2LCommand();
COMMANDS[VMOpCode.I2S] = new I2SCommand();
COMMANDS[VMOpCode.I2B] = new I2BCommand();
COMMANDS[VMOpCode.I2D] = new I2DCommand();
COMMANDS[VMOpCode.I2F] = new I2FCommand();
COMMANDS[VMOpCode.L2I] = new L2ICommand();
COMMANDS[VMOpCode.L2D] = new L2DCommand();
COMMANDS[VMOpCode.L2F] = new L2FCommand();
COMMANDS[VMOpCode.F2I] = new F2ICommand();
COMMANDS[VMOpCode.F2L] = new F2LCommand();
COMMANDS[VMOpCode.F2D] = new F2DCommand();
COMMANDS[VMOpCode.D2I] = new D2ICommand();
COMMANDS[VMOpCode.D2L] = new D2LCommand();
COMMANDS[VMOpCode.D2F] = new D2FCommand();
COMMANDS[VMOpCode.S2I] = new S2ICommand();
COMMANDS[VMOpCode.B2I] = new B2ICommand();
/* =====================================================
* 0x0100 0x01FF GENERIC STACK OPS
* ===================================================== */
COMMANDS[VMOpCode.POP] = new PopCommand();
COMMANDS[VMOpCode.DUP] = new DupCommand();
COMMANDS[VMOpCode.SWAP] = new SwapCommand();
/* =====================================================
* 0x0200 0x02FF CONTROL FLOW | FUNCTION CALLS
* ===================================================== */
COMMANDS[VMOpCode.JUMP] = new JumpCommand();
COMMANDS[VMOpCode.CALL] = new CallCommand();
COMMANDS[VMOpCode.RET] = new RetCommand();
/* =====================================================
* 0x0300 0x03FF MEMORY / REGISTER MOVE
* ===================================================== */
COMMANDS[VMOpCode.MOV] = new MovCommand();
/* =====================================================
* 0x0400 0x04FF SYSTEM / DEBUG
* ===================================================== */
COMMANDS[VMOpCode.HALT] = new HaltCommand();
// COMMANDS[VMOpCode.SYSCALL] = new SyscallCommand();
// COMMANDS[VMOpCode.DEBUG_TRAP] = new DebugTrapCommand();
}
/**
* Default constructor for creating an instance of CommandFactory.
* This constructor is empty as no specific initialization is required.