changeset 8141:73536049fa29

Use int instead of Register for opcode extensions that are encoded in the ModR/M byte.
author Roland Schatz <roland.schatz@oracle.com>
date Wed, 06 Mar 2013 15:20:21 +0100
parents 22bbd34705ed
children d413770c6dd0
files graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java
diffstat 1 files changed, 22 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java	Wed Mar 06 13:24:11 2013 +0100
+++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java	Wed Mar 06 15:20:21 2013 +0100
@@ -203,16 +203,16 @@
     }
 
     // immediate-to-memory forms
-    private void emitArithOperand(int op1, Register rm, AMD64Address adr, int imm32) {
+    private void emitArithOperand(int op1, int op2, AMD64Address adr, int imm32) {
         assert (op1 & 0x01) == 1 : "should be 32bit operation";
         assert (op1 & 0x02) == 0 : "sign-extension bit should not be set";
         if (isByte(imm32)) {
             emitByte(op1 | 0x02); // set sign bit
-            emitOperandHelper(rm, adr);
+            emitOperandHelper(op2, adr);
             emitByte(imm32 & 0xFF);
         } else {
             emitByte(op1);
-            emitOperandHelper(rm, adr);
+            emitOperandHelper(op2, adr);
             emitInt(imm32);
         }
     }
@@ -224,6 +224,14 @@
     }
 
     protected void emitOperandHelper(Register reg, AMD64Address addr) {
+        assert reg != Register.None;
+        emitOperandHelper(encode(reg), addr);
+    }
+
+    protected void emitOperandHelper(int reg, AMD64Address addr) {
+        assert (reg & 0x07) == reg;
+        int regenc = reg << 3;
+
         Register base = isLegal(addr.getBase()) ? asRegister(addr.getBase()) : Register.None;
         Register index = isLegal(addr.getIndex()) ? asRegister(addr.getIndex()) : Register.None;
 
@@ -235,11 +243,6 @@
             base = frameRegister;
         }
 
-        // Encode the registers as needed in the fields they are used in
-
-        assert reg != Register.None;
-        int regenc = encode(reg) << 3;
-
         if (base == AMD64.rip) { // also matches Placeholder
             // [00 000 101] disp32
             assert index == Register.None : "cannot use RIP relative addressing with index register";
@@ -331,7 +334,7 @@
 
     public final void addl(AMD64Address dst, int imm32) {
         prefix(dst);
-        emitArithOperand(0x81, rax, dst, imm32);
+        emitArithOperand(0x81, 0, dst, imm32);
     }
 
     public final void addl(Register dst, int imm32) {
@@ -600,7 +603,7 @@
     protected final void decl(AMD64Address dst) {
         prefix(dst);
         emitByte(0xFF);
-        emitOperandHelper(rcx, dst);
+        emitOperandHelper(1, dst);
     }
 
     public final void divsd(Register dst, AMD64Address src) {
@@ -687,7 +690,7 @@
     protected final void incl(AMD64Address dst) {
         prefix(dst);
         emitByte(0xFF);
-        emitOperandHelper(rax, dst);
+        emitOperandHelper(0, dst);
     }
 
     private void jcc(ConditionFlag cc, int jumpTarget, boolean forceDisp32) {
@@ -863,7 +866,7 @@
     public final void movb(AMD64Address dst, int imm8) {
         prefix(dst);
         emitByte(0xC6);
-        emitOperandHelper(rax, dst);
+        emitOperandHelper(0, dst);
         emitByte(imm8);
     }
 
@@ -914,7 +917,7 @@
     public final void movl(AMD64Address dst, int imm32) {
         prefix(dst);
         emitByte(0xC7);
-        emitOperandHelper(rax, dst);
+        emitOperandHelper(0, dst);
         emitInt(imm32);
     }
 
@@ -1061,7 +1064,7 @@
         emitByte(0x66); // switch to 16-bit mode
         prefix(dst);
         emitByte(0xC7);
-        emitOperandHelper(rax, dst);
+        emitOperandHelper(0, dst);
         emitShort(imm16);
     }
 
@@ -1468,15 +1471,7 @@
 
     public final void subl(AMD64Address dst, int imm32) {
         prefix(dst);
-        if (isByte(imm32)) {
-            emitByte(0x83);
-            emitOperandHelper(rbp, dst);
-            emitByte(imm32 & 0xFF);
-        } else {
-            emitByte(0x81);
-            emitOperandHelper(rbp, dst);
-            emitInt(imm32);
-        }
+        emitArithOperand(0x81, 5, dst, imm32);
     }
 
     public final void subl(Register dst, int imm32) {
@@ -2010,7 +2005,7 @@
     protected final void decq(AMD64Address dst) {
         prefixq(dst);
         emitByte(0xFF);
-        emitOperandHelper(rcx, dst);
+        emitOperandHelper(1, dst);
     }
 
     public final void divq(Register src) {
@@ -2092,7 +2087,7 @@
     public final void movslq(AMD64Address dst, int imm32) {
         prefixq(dst);
         emitByte(0xC7);
-        emitOperandHelper(rax, dst);
+        emitOperandHelper(0, dst);
         emitInt(imm32);
     }
 
@@ -2333,7 +2328,7 @@
 
     public final void fld(AMD64Address src) {
         emitByte(0xDD);
-        emitOperandHelper(rax, src);
+        emitOperandHelper(0, src);
     }
 
     public final void fldln2() {
@@ -2353,7 +2348,7 @@
 
     public final void fstp(AMD64Address src) {
         emitByte(0xDD);
-        emitOperandHelper(rbx, src);
+        emitOperandHelper(3, src);
     }
 
     public final void fsin() {