Mercurial > hg > graal-compiler
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);