@@ -37,7 +37,6 @@ public class HvmCompiler {
3737
3838 public ChipmunkModule compileModule (BinaryModule module ){
3939 var builder = Executable .builder ();
40- var operands = new Operands ();
4140
4241 // For now assume we have a single method with no arguments
4342 module .getNamespace ().getEntries ().forEach (e -> {
@@ -47,9 +46,13 @@ public ChipmunkModule compileModule(BinaryModule module){
4746 var method = module .getNamespace ().getEntries ().get (2 ).getBinaryMethod ();
4847 var constants = method .getConstantPool ();
4948 var code = method .getCode ();
49+
50+ var operands = new Operands (method .getArgCount () + method .getLocalCount ());
51+
5052 var ip = 0 ;
5153 while (ip < code .length ){
5254 switch (code [ip ]){
55+ // Arithmetic
5356 case PUSH -> ip = push (builder , constants , operands , code , ip );
5457 case ADD -> ip = add (builder , operands , ip );
5558 case MUL -> ip = mul (builder , operands , ip );
@@ -61,6 +64,17 @@ public ChipmunkModule compileModule(BinaryModule module){
6164 case DEC -> ip = dec (builder , operands , ip );
6265 case POS -> ip = pos (builder , operands , ip );
6366 case NEG -> ip = neg (builder , operands , ip );
67+
68+ // Bitwise
69+ case BXOR -> ip = bxor (builder , operands , ip );
70+ case BAND -> ip = band (builder , operands , ip );
71+ case BOR -> ip = bor (builder , operands , ip );
72+ case BNEG -> ip = bneg (builder , operands , ip );
73+ case LSHIFT -> ip = lshift (builder , operands , ip );
74+ case RSHIFT -> ip = rshift (builder , operands , ip );
75+ case URSHIFT -> ip = urshift (builder , operands , ip );
76+
77+ // Flow control
6478 case RETURN -> ip = _return (builder , operands , ip );
6579 default -> {
6680 throw new IllegalArgumentException ("Unknown opcode 0x%02X" .formatted (code [ip ]));
@@ -274,6 +288,82 @@ private int neg(Executable.Builder builder, Operands operands, int ip){
274288 return ip + 1 ;
275289 }
276290
291+ private int bxor (Executable .Builder builder , Operands operands , int ip ){
292+ var b = operands .pop ();
293+ var a = operands .pop ();
294+
295+ // Disregard operand types - treat everything as a long
296+ builder .appendOpcode (Opcodes .BXOR (a .register (), a .register (), b .register ()));
297+ operands .push (LONG );
298+
299+ return ip + 1 ;
300+ }
301+
302+ private int band (Executable .Builder builder , Operands operands , int ip ){
303+ var b = operands .pop ();
304+ var a = operands .pop ();
305+
306+ // Disregard operand types - treat everything as a long
307+ builder .appendOpcode (Opcodes .BAND (a .register (), a .register (), b .register ()));
308+ operands .push (LONG );
309+
310+ return ip + 1 ;
311+ }
312+
313+ private int bor (Executable .Builder builder , Operands operands , int ip ){
314+ var b = operands .pop ();
315+ var a = operands .pop ();
316+
317+ // Disregard operand types - treat everything as a long
318+ builder .appendOpcode (Opcodes .BOR (a .register (), a .register (), b .register ()));
319+ operands .push (LONG );
320+
321+ return ip + 1 ;
322+ }
323+
324+ private int bneg (Executable .Builder builder , Operands operands , int ip ){
325+ var a = operands .pop ();
326+
327+ // Disregard operand types - treat everything as a long
328+ builder .appendOpcode (Opcodes .BNOT (a .register (), a .register ()));
329+ operands .push (LONG );
330+
331+ return ip + 1 ;
332+ }
333+
334+ private int lshift (Executable .Builder builder , Operands operands , int ip ){
335+ var b = operands .pop ();
336+ var a = operands .pop ();
337+
338+ // Disregard operand types - treat everything as a long
339+ builder .appendOpcode (Opcodes .BLSHIFT (a .register (), a .register (), b .register ()));
340+ operands .push (LONG );
341+
342+ return ip + 1 ;
343+ }
344+
345+ private int rshift (Executable .Builder builder , Operands operands , int ip ){
346+ var b = operands .pop ();
347+ var a = operands .pop ();
348+
349+ // Disregard operand types - treat everything as a long
350+ builder .appendOpcode (Opcodes .BSRSHIFT (a .register (), a .register (), b .register ()));
351+ operands .push (LONG );
352+
353+ return ip + 1 ;
354+ }
355+
356+ private int urshift (Executable .Builder builder , Operands operands , int ip ){
357+ var b = operands .pop ();
358+ var a = operands .pop ();
359+
360+ // Disregard operand types - treat everything as a long
361+ builder .appendOpcode (Opcodes .BURSHIFT (a .register (), a .register (), b .register ()));
362+ operands .push (LONG );
363+
364+ return ip + 1 ;
365+ }
366+
277367 private int _return (Executable .Builder builder , Operands operands , int ip ){
278368 var op = operands .pop ();
279369 builder .appendOpcode (Opcodes .RETURN (op .register ()));
0 commit comments