# HG changeset patch # User Gilles Duboscq # Date 1311774294 -7200 # Node ID 28071fae857729e2f97868868fc895ee606cc8b7 # Parent e3d3fd5b638a7337415f2bf281390a1ebe4a06fa canonicalize Netgate(Negate(x)) for floating point too. No not use a GlobalStub for floating point negate diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/globalstub/GlobalStub.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/globalstub/GlobalStub.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/globalstub/GlobalStub.java Wed Jul 27 15:44:54 2011 +0200 @@ -40,9 +40,6 @@ public class GlobalStub { public enum Id { - - fneg(Float, Float), - dneg(Double, Double), f2i(Int, Float), f2l(Long, Float), d2i(Int, Double), diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Negate.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Negate.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Negate.java Wed Jul 27 15:44:54 2011 +0200 @@ -128,7 +128,7 @@ case Double: return Constant.forDouble(-x.asConstant().asDouble(), graph); } } - if (x instanceof Negate && x.kind == CiKind.Int || x.kind == CiKind.Long) { + if (x instanceof Negate) { return ((Negate) x).x(); } return negate; diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRList.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRList.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRList.java Wed Jul 27 15:44:54 2011 +0200 @@ -104,9 +104,8 @@ append(new LIRLabel(lbl)); } - public void negate(CiValue src, CiValue dst, GlobalStub globalStub) { + public void negate(CiValue src, CiValue dst) { LIRNegate op = new LIRNegate(src, dst); - op.globalStub = globalStub; append(op); } diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRNegate.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRNegate.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRNegate.java Wed Jul 27 15:44:54 2011 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.max.graal.compiler.lir; -import com.oracle.max.graal.compiler.globalstub.*; import com.sun.cri.ci.*; /** @@ -33,8 +32,6 @@ */ public class LIRNegate extends LIROp1 { - public GlobalStub globalStub; - /** * Constructs a new instruction LIRNegate for a given operand. * diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64GlobalStubEmitter.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64GlobalStubEmitter.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64GlobalStubEmitter.java Wed Jul 27 15:44:54 2011 +0200 @@ -46,8 +46,6 @@ private static final long DoubleSignFlip = 0x8000000000000000L; private static final CiRegister convertArgument = AMD64.xmm0; private static final CiRegister convertResult = AMD64.rax; - private static final CiRegister negateArgument = AMD64.xmm0; - private static final CiRegister negateTemp = AMD64.xmm1; private TargetMethodAssembler tasm; private AMD64MacroAssembler asm; @@ -118,12 +116,6 @@ case d2l: emitD2L(); break; - case fneg: - emitFNEG(); - break; - case dneg: - emitDNEG(); - break; } String name = "stub-" + stub; @@ -251,30 +243,6 @@ return result; } - private void negatePrologue() { - partialSavePrologue(negateArgument, negateTemp); - loadArgument(0, negateArgument); - } - - private void negateEpilogue() { - storeArgument(0, negateArgument); - epilogue(); - } - - private void emitDNEG() { - negatePrologue(); - asm.movsd(negateTemp, tasm.recordDataReferenceInCode(CiConstant.forLong(DoubleSignFlip))); - asm.xorpd(negateArgument, negateTemp); - negateEpilogue(); - } - - private void emitFNEG() { - negatePrologue(); - asm.movsd(negateTemp, tasm.recordDataReferenceInCode(CiConstant.forLong(FloatSignFlip))); - asm.xorps(negateArgument, negateTemp); - negateEpilogue(); - } - private void convertPrologue() { partialSavePrologue(convertArgument, convertResult); loadArgument(0, convertArgument); diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java Wed Jul 27 15:44:54 2011 +0200 @@ -1517,14 +1517,12 @@ if (asXmmFloatReg(left) != asXmmFloatReg(dest)) { masm.movflt(asXmmFloatReg(dest), asXmmFloatReg(left)); } - callGlobalStub(op.globalStub, null, asXmmFloatReg(dest), dest); - + masm.xorps(asXmmFloatReg(dest), tasm.recordDataReferenceInCode(CiConstant.forLong(0x8000000080000000L))); } else if (dest.kind.isDouble()) { if (asXmmDoubleReg(left) != asXmmDoubleReg(dest)) { masm.movdbl(asXmmDoubleReg(dest), asXmmDoubleReg(left)); } - - callGlobalStub(op.globalStub, null, asXmmDoubleReg(dest), dest); + masm.xorpd(asXmmDoubleReg(dest), tasm.recordDataReferenceInCode(CiConstant.forLong(0x8000000000000000L))); } else { CiRegister lreg = left.asRegister(); CiRegister dreg = dest.asRegister(); diff -r e3d3fd5b638a -r 28071fae8577 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Wed Jul 27 11:53:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Wed Jul 27 15:44:54 2011 +0200 @@ -126,13 +126,7 @@ value.setDestroysRegister(); value.loadItem(); CiVariable reg = newVariable(x.kind); - GlobalStub globalStub = null; - if (x.kind == CiKind.Float) { - globalStub = stubFor(GlobalStub.Id.fneg); - } else if (x.kind == CiKind.Double) { - globalStub = stubFor(GlobalStub.Id.dneg); - } - lir.negate(value.result(), reg, globalStub); + lir.negate(value.result(), reg); setResult(x, reg); }