# HG changeset patch # User Stefan Anzinger # Date 1429116113 -7200 # Node ID d3b276db28b893234ef32487bf5374b71d640e54 # Parent f61ff7f01bc2e7039771d0081d9784ba7d16793e [SPARC] Use NOP only between CBcond diff -r f61ff7f01bc2 -r d3b276db28b8 graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java --- 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; + } } diff -r f61ff7f01bc2 -r d3b276db28b8 graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java --- 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; diff -r f61ff7f01bc2 -r d3b276db28b8 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java --- 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);