changeset 20968:d3b276db28b8

[SPARC] Use NOP only between CBcond
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Wed, 15 Apr 2015 18:41:53 +0200
parents f61ff7f01bc2
children 018c536858cc 1b6783efebc8
files graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java
diffstat 3 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Wed Apr 15 16:30:45 2015 +0200
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Wed Apr 15 18:41:53 2015 +0200
@@ -1790,4 +1790,8 @@
     public void fpadd32(Register rs1, Register rs2, Register rd) {
         op3(Impdep1, Fpadd32, rs1, rs2, rd);
     }
+
+    public boolean isCbcond(int i) {
+        return (i & 0xC1C00000) == 0xC00000;
+    }
 }
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java	Wed Apr 15 16:30:45 2015 +0200
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java	Wed Apr 15 18:41:53 2015 +0200
@@ -87,7 +87,7 @@
             case Bpr:
                 boolean isCBcond = (inst & CBCOND_MASK) != 0;
                 if (isCBcond) {
-                    assert isSimm10(disp);
+                    assert isSimm10(disp) : String.format("%d: instruction: 0x%x", disp, inst);
                     int d10Split = 0;
                     d10Split |= (disp & 0b11_0000_0000) << D10HI_SHIFT - 8;
                     d10Split |= (disp & 0b00_1111_1111) << D10LO_SHIFT;
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Wed Apr 15 16:30:45 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Wed Apr 15 18:41:53 2015 +0200
@@ -225,8 +225,12 @@
                     SPARCMove.move(crb, masm, scratchValue, actualY, SPARCDelayedControlTransfer.DUMMY);
                     actualY = scratchValue;
                 }
+                // Test if the previous instruction was cbcond, if so, put a nop inbetween (See
+                // SPARC Architecture 2011 manual)
+                if (masm.isCbcond(masm.getInt(masm.position() - 1))) {
+                    masm.nop();
+                }
                 emitCBCond(masm, actualX, actualY, actualTrueTarget, actualConditionFlag);
-                masm.nop();
             }
             if (needJump) {
                 masm.jmp(actualFalseTarget);