# HG changeset patch # User Christian Wimmer # Date 1327598232 28800 # Node ID 0d122ed933b655ce7c70c3f3d985954cb6532dff # Parent b0aa4a52b89c68fa8a949341e17bf1cf8623d1d2 Bugfix diff -r b0aa4a52b89c -r 0d122ed933b6 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64Arithmetic.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64Arithmetic.java Thu Jan 26 10:54:23 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64Arithmetic.java Thu Jan 26 09:17:12 2012 -0800 @@ -135,6 +135,45 @@ } } + public static class Op2Reg extends AMD64LIRInstruction { + public Op2Reg(AMD64Arithmetic opcode, CiValue result, CiValue x, CiValue y) { + super(opcode, new CiValue[] {result}, null, new CiValue[] {x}, new CiValue[] {y}, LIRInstruction.NO_OPERANDS); + } + + @Override + public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { + CiValue result = output(0); + CiValue x = input(0); + CiValue y = alive(0); + + AMD64Move.move(tasm, masm, result, x); + emit(tasm, masm, (AMD64Arithmetic) code, result, y, null); + } + + @Override + protected EnumSet flagsFor(OperandMode mode, int index) { + if (mode == OperandMode.Input && index == 0) { + return EnumSet.of(OperandFlag.Register, OperandFlag.Stack, OperandFlag.Constant); + } else if (mode == OperandMode.Alive && index == 0) { + return EnumSet.of(OperandFlag.Register, OperandFlag.Constant); + } else if (mode == OperandMode.Output && index == 0) { + return EnumSet.of(OperandFlag.Register, OperandFlag.RegisterHint); + } + throw Util.shouldNotReachHere(); + } + + @Override + public void verify() { + CiValue result = output(0); + CiValue x = input(0); + CiValue y = alive(0); + + super.verify(); + assert differentRegisters(result, y) || sameRegister(x, y); + verifyKind((AMD64Arithmetic) code, result, x, y); + } + } + public static class Op2RegCommutative extends AMD64LIRInstruction { public Op2RegCommutative(AMD64Arithmetic opcode, CiValue result, CiValue x, CiValue y) { super(opcode, new CiValue[] {result}, null, new CiValue[] {x, y}, LIRInstruction.NO_OPERANDS, LIRInstruction.NO_OPERANDS); @@ -173,7 +212,6 @@ CiValue y = input(1); super.verify(); - assert differentRegisters(result, y) || sameRegister(x, y); verifyKind((AMD64Arithmetic) code, result, x, y); } } diff -r b0aa4a52b89c -r 0d122ed933b6 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 Thu Jan 26 10:54:23 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Thu Jan 26 09:17:12 2012 -0800 @@ -23,33 +23,49 @@ package com.oracle.max.graal.compiler.target.amd64; -import com.oracle.max.graal.compiler.target.amd64.AMD64Call.*; import static com.oracle.max.cri.ci.CiValueUtil.*; import static com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.*; import static com.oracle.max.graal.compiler.target.amd64.AMD64Compare.*; import static com.oracle.max.graal.compiler.target.amd64.AMD64CompareToIntOpcode.*; -import static com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.*; import java.util.*; import com.oracle.max.asm.*; import com.oracle.max.asm.target.amd64.*; import com.oracle.max.cri.ci.*; -import com.oracle.max.cri.ci.CiTargetMethod.*; +import com.oracle.max.cri.ci.CiTargetMethod.Mark; import com.oracle.max.cri.ri.*; +import com.oracle.max.cri.xir.CiXirAssembler.XirMark; import com.oracle.max.cri.xir.*; -import com.oracle.max.cri.xir.CiXirAssembler.*; import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.compiler.lir.*; import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.DivOp; import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op1Reg; import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op1Stack; -import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op2RegCommutative; +import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op2Reg; import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op2Stack; import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.ShiftOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Call.DirectCallOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Call.IndirectCallOp; import com.oracle.max.graal.compiler.target.amd64.AMD64Compare.CompareOp; -import com.oracle.max.graal.compiler.target.amd64.AMD64Move.*; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.BranchOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.CondMoveOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.FloatBranchOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.FloatCondMoveOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.JumpOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.LabelOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.ReturnOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64ControlFlow.TableSwitchOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.CompareAndSwapOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.LeaOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.LoadOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.MembarOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.MoveFromRegOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.MoveToRegOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.NullCheckOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.SpillMoveOp; +import com.oracle.max.graal.compiler.target.amd64.AMD64Move.StoreOp; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; import com.oracle.max.graal.nodes.DeoptimizeNode.DeoptAction; @@ -248,8 +264,8 @@ switch (input.kind) { case Int: append(new Op1Stack(INEG, result, input)); break; case Long: append(new Op1Stack(LNEG, result, input)); break; - case Float: append(new Op2RegCommutative(FXOR, result, input, CiConstant.forFloat(Float.intBitsToFloat(0x80000000)))); break; - case Double: append(new Op2RegCommutative(DXOR, result, input, CiConstant.forDouble(Double.longBitsToDouble(0x8000000000000000L)))); break; + case Float: append(new Op2Reg(FXOR, result, input, CiConstant.forFloat(Float.intBitsToFloat(0x80000000)))); break; + case Double: append(new Op2Reg(DXOR, result, input, CiConstant.forDouble(Double.longBitsToDouble(0x8000000000000000L)))); break; default: throw Util.shouldNotReachHere(); } return result; @@ -285,8 +301,8 @@ public Variable emitMul(CiValue a, CiValue b) { Variable result = newVariable(a.kind); switch(a.kind) { - case Int: append(new Op2RegCommutative(IMUL, result, a, loadNonConst(b))); break; - case Long: append(new Op2RegCommutative(LMUL, result, a, loadNonConst(b))); break; + case Int: append(new Op2Reg(IMUL, result, a, loadNonConst(b))); break; + case Long: append(new Op2Reg(LMUL, result, a, loadNonConst(b))); break; case Float: append(new Op2Stack(FMUL, result, a, loadNonConst(b))); break; case Double: append(new Op2Stack(DMUL, result, a, loadNonConst(b))); break; default: throw Util.shouldNotReachHere(); diff -r b0aa4a52b89c -r 0d122ed933b6 graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/nodes/MathIntrinsicNode.java --- a/graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/nodes/MathIntrinsicNode.java Thu Jan 26 10:54:23 2012 +0100 +++ b/graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/nodes/MathIntrinsicNode.java Thu Jan 26 09:17:12 2012 -0800 @@ -26,7 +26,7 @@ import com.oracle.max.cri.ci.*; import com.oracle.max.graal.compiler.lir.*; -import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op2RegCommutative; +import com.oracle.max.graal.compiler.target.amd64.AMD64Arithmetic.Op2Reg; import com.oracle.max.graal.compiler.target.amd64.*; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.nodes.*; @@ -64,7 +64,7 @@ Variable input = gen.load(gen.operand(x())); Variable result = gen.newVariable(kind()); switch (operation()) { - case ABS: gen.append(new Op2RegCommutative(DAND, result, input, CiConstant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL)))); break; + case ABS: gen.append(new Op2Reg(DAND, result, input, CiConstant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL)))); break; case SQRT: gen.append(new AMD64MathIntrinsicOp(AMD64MathIntrinsicOp.Opcode.SQRT, result, input)); break; case LOG: gen.append(new AMD64MathIntrinsicOp(AMD64MathIntrinsicOp.Opcode.LOG, result, input)); break; case LOG10: gen.append(new AMD64MathIntrinsicOp(AMD64MathIntrinsicOp.Opcode.LOG10, result, input)); break;