changeset 4333:ca48212b7681

Merge
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 26 Jan 2012 19:12:12 +0100
parents 9dbcdd6f1464 (current diff) 0d122ed933b6 (diff)
children 0893aef10ed4
files
diffstat 3 files changed, 67 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64Arithmetic.java	Thu Jan 26 19:12:00 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64Arithmetic.java	Thu Jan 26 19:12:12 2012 +0100
@@ -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<OperandFlag> 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);
         }
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Thu Jan 26 19:12:00 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Thu Jan 26 19:12:12 2012 +0100
@@ -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();
--- a/graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/nodes/MathIntrinsicNode.java	Thu Jan 26 19:12:00 2012 +0100
+++ b/graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/nodes/MathIntrinsicNode.java	Thu Jan 26 19:12:12 2012 +0100
@@ -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;