Mercurial > hg > graal-compiler
changeset 22652:3a68d50004d8
Support inline null comparisons in SPARC backend.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Thu, 17 Sep 2015 16:48:47 +0200 |
parents | 00ee7def5b54 |
children | 9ca1a782b6c7 |
files | graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java |
diffstat | 4 files changed, 23 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Thu Sep 17 15:05:54 2015 +0200 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Thu Sep 17 16:48:47 2015 +0200 @@ -1562,7 +1562,7 @@ bits = Float.floatToRawIntBits(constant.asFloat()); break; case Object: - return JavaConstant.NULL_POINTER.equals(constant); + return constant.isNull(); default: bits = constant.asLong(); break;
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Thu Sep 17 15:05:54 2015 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Thu Sep 17 16:48:47 2015 +0200 @@ -361,18 +361,9 @@ default: throw JVMCIError.shouldNotReachHere(actualCmpKind.toString()); } - right = toDefaultConstantOfKind(cmpKind, right); append(new SPARCControlFlow.CompareBranchOp(opcode, left, right, actualCondition, trueDestination, falseDestination, actualCmpKind, unorderedIsTrue, trueDestinationProbability)); } - private static Value toDefaultConstantOfKind(PlatformKind forKind, Value value) { - if (isJavaConstant(value) && asJavaConstant(value).isDefaultForKind()) { - return new ConstantValue(LIRKind.value(forKind), forKind.getDefaultValue()); - } else { - return value; - } - } - @Override public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, LIRKind cmpLIRKind, double overflowProbability) { JavaKind cmpKind = (JavaKind) cmpLIRKind.getPlatformKind(); @@ -463,7 +454,6 @@ right = loadNonConst(b); mirrored = false; } - right = toDefaultConstantOfKind(cmpKind, right); switch ((JavaKind) cmpKind) { case Short: case Char:
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java Thu Sep 17 15:05:54 2015 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java Thu Sep 17 16:48:47 2015 +0200 @@ -29,13 +29,14 @@ import static com.oracle.graal.lir.LIRInstruction.OperandFlag.CONST; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.REG; import static com.oracle.graal.lir.LIRValueUtil.asJavaConstant; -import static com.oracle.graal.lir.LIRValueUtil.isJavaConstant; import static jdk.internal.jvmci.code.ValueUtil.asRegister; import static jdk.internal.jvmci.code.ValueUtil.isRegister; import jdk.internal.jvmci.common.JVMCIError; +import jdk.internal.jvmci.meta.JavaConstant; import jdk.internal.jvmci.meta.JavaKind; import jdk.internal.jvmci.meta.Value; +import com.oracle.graal.asm.NumUtil; import com.oracle.graal.asm.sparc.SPARCMacroAssembler; import com.oracle.graal.lir.LIRInstructionClass; import com.oracle.graal.lir.Opcode; @@ -108,28 +109,27 @@ throw JVMCIError.shouldNotReachHere(); } } else { - assert isJavaConstant(y); + JavaConstant c = asJavaConstant(y); + int imm; + if (c.isNull()) { + imm = 0; + } else { + assert NumUtil.isInt(c.asLong()); + imm = (int) c.asLong(); + } + switch (opcode) { case LCMP: - assert isSimm13(crb.asLongConst(y)); - masm.cmp(asRegister(x, JavaKind.Long), (int) crb.asLongConst(y)); + assert isSimm13(imm); + masm.cmp(asRegister(x, JavaKind.Long), imm); break; case ICMP: assert isSimm13(crb.asIntConst(y)); - masm.cmp(asRegister(x, JavaKind.Int), crb.asIntConst(y)); + masm.cmp(asRegister(x, JavaKind.Int), imm); break; case ACMP: - if (asJavaConstant(y).isNull()) { - masm.cmp(asRegister(x), 0); - break; - } else { - throw JVMCIError.shouldNotReachHere("Only null object constants are allowed in comparisons"); - } - case FCMP: - masm.fcmp(Fcc0, Fcmps, asRegister(x, JavaKind.Float), asRegister(y, JavaKind.Float)); - break; - case DCMP: - masm.fcmp(Fcc0, Fcmpd, asRegister(x, JavaKind.Double), asRegister(y, JavaKind.Double)); + assert imm == 0 : "Only null object constants are allowed in comparisons"; + masm.cmp(asRegister(x), 0); break; default: throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Thu Sep 17 15:05:54 2015 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Thu Sep 17 16:48:47 2015 +0200 @@ -83,6 +83,7 @@ import com.oracle.graal.asm.Assembler; import com.oracle.graal.asm.Assembler.LabelHint; import com.oracle.graal.asm.Label; +import com.oracle.graal.asm.NumUtil; import com.oracle.graal.asm.sparc.SPARCAssembler; import com.oracle.graal.asm.sparc.SPARCAssembler.BranchPredict; import com.oracle.graal.asm.sparc.SPARCAssembler.CC; @@ -284,7 +285,8 @@ switch ((JavaKind) actualX.getLIRKind().getPlatformKind()) { case Int: if (isJavaConstant(actualY)) { - int constantY = asJavaConstant(actualY).asInt(); + JavaConstant c = asJavaConstant(actualY); + int constantY = c.isNull() ? 0 : c.asInt(); CBCOND.emit(masm, conditionFlag, false, asRegister(actualX, JavaKind.Int), constantY, actualTrueTarget); } else { CBCOND.emit(masm, conditionFlag, false, asRegister(actualX, JavaKind.Int), asRegister(actualY, JavaKind.Int), actualTrueTarget); @@ -292,7 +294,9 @@ break; case Long: if (isJavaConstant(actualY)) { - int constantY = (int) asJavaConstant(actualY).asLong(); + JavaConstant c = asJavaConstant(actualY); + assert NumUtil.is32bit(c.asLong()); + int constantY = c.isNull() ? 0 : (int) c.asLong(); CBCOND.emit(masm, conditionFlag, true, asRegister(actualX, JavaKind.Long), constantY, actualTrueTarget); } else { CBCOND.emit(masm, conditionFlag, true, asRegister(actualX, JavaKind.Long), asRegister(actualY, JavaKind.Long), actualTrueTarget);