diff --git a/src/main/java/org/jcnc/snow/vm/factories/CommandFactory.java b/src/main/java/org/jcnc/snow/vm/factories/CommandFactory.java index a548fe4..8c36413 100644 --- a/src/main/java/org/jcnc/snow/vm/factories/CommandFactory.java +++ b/src/main/java/org/jcnc/snow/vm/factories/CommandFactory.java @@ -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; *

This class uses an array for fast, constant-time access to corresponding command instances.

*/ 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 (1–80) - // 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 (81–90) - // 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 (91–110) - // 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 (111–150) - // 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 (151–200) - // 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 (201–205) - 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.