Add inl and del opcodes.
authorDavid Given <dg@cowlark.com>
Sun, 2 Oct 2016 12:44:21 +0000 (14:44 +0200)
committerDavid Given <dg@cowlark.com>
Sun, 2 Oct 2016 12:44:21 +0000 (14:44 +0200)
mach/proto/mcg/treebuilder.c

index f4c4814..e8675e6 100644 (file)
@@ -340,6 +340,24 @@ static struct ir* extract_block_refs(struct basicblock* bb)
     return outir;
 }
 
+static void change_by(struct ir* address, int amount)
+{
+    appendir(
+        new_ir2(
+            IR_STORE, EM_wordsize,
+            address,
+            new_ir2(
+                IR_ADD, EM_wordsize,
+                new_ir1(
+                    IR_LOAD, EM_wordsize,
+                    address
+                ),
+                new_wordir(amount)
+            )
+        )
+    );
+}
+
 static void insn_ivalue(int opcode, arith value)
 {
     switch (opcode)
@@ -387,6 +405,14 @@ static void insn_ivalue(int opcode, arith value)
             );
             break;
 
+        case op_inl:
+            change_by(new_localir(value), 1);
+            break;
+
+        case op_del:
+            change_by(new_localir(value), -1);
+            break;
+
         case op_loc:
             push(
                 new_wordir(value)