diff graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java @ 20003:422e60a2f4b9

Implement dynamic instruction counters on assembly level
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Mon, 23 Mar 2015 15:58:36 +0100
parents 268f56a8ce55
children b1a8928fc4b9
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Thu Mar 19 10:28:28 2015 +0100
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Mon Mar 23 15:58:36 2015 +0100
@@ -1741,4 +1741,20 @@
     public void casxa(Register rs1, Register rs2, Register rd, Asi asi) {
         ld(Casxa, new SPARCAddress(rs1, rs2), rd, asi);
     }
+
+    @Override
+    public InstructionCounter getInstructionCounter() {
+        return new SPARCInstructionCounter(this);
+    }
+
+    public void patchAddImmediate(int position, int simm13) {
+        int inst = getInt(position);
+        assert SPARCAssembler.isSimm13(simm13) : simm13;
+        assert (inst >>> 30) == 0b10 : String.format("0x%x", inst);
+        assert ((inst >>> 18) & 0b11_1111) == 0 : String.format("0x%x", inst);
+        assert (inst & (1 << 13)) != 0 : String.format("0x%x", inst);
+        inst = inst & (~((1 << 13) - 1));
+        inst |= simm13 & ((1 << 12) - 1);
+        emitInt(inst, position);
+    }
 }