changeset 22930:33c69b58ff65

Move emitCompareOp to AMD64ArithmeticLIRGeneratorTool.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 03 Nov 2015 11:01:20 +0100
parents 098c285cc3b8
children d7df89bcc764
files graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64ArithmeticLIRGenerator.java graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java
diffstat 3 files changed, 73 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64ArithmeticLIRGenerator.java	Mon Nov 02 18:25:48 2015 +0100
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64ArithmeticLIRGenerator.java	Tue Nov 03 11:01:20 2015 +0100
@@ -25,6 +25,7 @@
 
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.ADD;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.AND;
+import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.CMP;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.OR;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.SUB;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.XOR;
@@ -42,6 +43,8 @@
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.MOVZX;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.MOVZXB;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.POPCNT;
+import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.TEST;
+import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.TESTB;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.TZCNT;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64Shift.ROL;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64Shift.ROR;
@@ -92,9 +95,11 @@
 import com.oracle.graal.asm.amd64.AMD64Assembler.AMD64Shift;
 import com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize;
 import com.oracle.graal.asm.amd64.AMD64Assembler.SSEOp;
+import com.oracle.graal.compiler.common.GraalOptions;
 import com.oracle.graal.compiler.common.calc.FloatConvert;
 import com.oracle.graal.lir.ConstantValue;
 import com.oracle.graal.lir.LIRFrameState;
+import com.oracle.graal.lir.LIRValueUtil;
 import com.oracle.graal.lir.Variable;
 import com.oracle.graal.lir.amd64.AMD64AddressValue;
 import com.oracle.graal.lir.amd64.AMD64Arithmetic.FPDivRemOp;
@@ -1037,4 +1042,63 @@
             emitStore(kind, storeAddress, getLIRGen().asAllocatable(input), state);
         }
     }
+
+    @Override
+    public void emitCompareOp(AMD64Kind cmpKind, Variable left, Value right) {
+        OperandSize size;
+        switch (cmpKind) {
+            case BYTE:
+                size = BYTE;
+                break;
+            case WORD:
+                size = WORD;
+                break;
+            case DWORD:
+                size = DWORD;
+                break;
+            case QWORD:
+                size = QWORD;
+                break;
+            case SINGLE:
+                getLIRGen().append(new AMD64BinaryConsumer.Op(SSEOp.UCOMIS, PS, left, getLIRGen().asAllocatable(right)));
+                return;
+            case DOUBLE:
+                getLIRGen().append(new AMD64BinaryConsumer.Op(SSEOp.UCOMIS, PD, left, getLIRGen().asAllocatable(right)));
+                return;
+            default:
+                throw JVMCIError.shouldNotReachHere("unexpected kind: " + cmpKind);
+        }
+
+        if (isConstantValue(right)) {
+            Constant c = LIRValueUtil.asConstant(right);
+            if (JavaConstant.isNull(c)) {
+                getLIRGen().append(new AMD64BinaryConsumer.Op(TEST, DWORD, left, left));
+                return;
+            } else if (c instanceof VMConstant) {
+                VMConstant vc = (VMConstant) c;
+                boolean isImmutable = GraalOptions.ImmutableCode.getValue();
+                boolean generatePIC = GraalOptions.GeneratePIC.getValue();
+                if (size == DWORD && !(isImmutable && generatePIC)) {
+                    getLIRGen().append(new AMD64BinaryConsumer.VMConstOp(CMP.getMIOpcode(DWORD, false), left, vc));
+                } else {
+                    getLIRGen().append(new AMD64BinaryConsumer.DataOp(CMP.getRMOpcode(size), size, left, vc));
+                }
+                return;
+            } else if (c instanceof JavaConstant) {
+                JavaConstant jc = (JavaConstant) c;
+                if (jc.isDefaultForKind()) {
+                    AMD64RMOp op = size == BYTE ? TESTB : TEST;
+                    getLIRGen().append(new AMD64BinaryConsumer.Op(op, size, left, left));
+                    return;
+                } else if (NumUtil.is32bit(jc.asLong())) {
+                    getLIRGen().append(new AMD64BinaryConsumer.ConstOp(CMP, size, left, (int) jc.asLong()));
+                    return;
+                }
+            }
+        }
+
+        // fallback: load, then compare
+        getLIRGen().append(new AMD64BinaryConsumer.Op(CMP.getRMOpcode(size), size, left, getLIRGen().asAllocatable(right)));
+    }
+
 }
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java	Mon Nov 02 18:25:48 2015 +0100
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java	Tue Nov 03 11:01:20 2015 +0100
@@ -24,17 +24,12 @@
 package com.oracle.graal.compiler.amd64;
 
 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.CMP;
-import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.TEST;
-import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.TESTB;
-import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.BYTE;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.DWORD;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.PD;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.PS;
 import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.QWORD;
-import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.WORD;
 import static com.oracle.graal.lir.LIRValueUtil.asConstantValue;
 import static com.oracle.graal.lir.LIRValueUtil.asJavaConstant;
-import static com.oracle.graal.lir.LIRValueUtil.isConstantValue;
 import static com.oracle.graal.lir.LIRValueUtil.isJavaConstant;
 import static jdk.vm.ci.code.ValueUtil.isAllocatableValue;
 import jdk.vm.ci.amd64.AMD64;
@@ -43,7 +38,6 @@
 import jdk.vm.ci.code.RegisterValue;
 import jdk.vm.ci.common.JVMCIError;
 import jdk.vm.ci.meta.AllocatableValue;
-import jdk.vm.ci.meta.Constant;
 import jdk.vm.ci.meta.JavaConstant;
 import jdk.vm.ci.meta.JavaKind;
 import jdk.vm.ci.meta.LIRKind;
@@ -57,7 +51,6 @@
 import com.oracle.graal.asm.amd64.AMD64Assembler.ConditionFlag;
 import com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize;
 import com.oracle.graal.asm.amd64.AMD64Assembler.SSEOp;
-import com.oracle.graal.compiler.common.GraalOptions;
 import com.oracle.graal.compiler.common.calc.Condition;
 import com.oracle.graal.compiler.common.spi.ForeignCallLinkage;
 import com.oracle.graal.compiler.common.spi.LIRKindTool;
@@ -70,6 +63,7 @@
 import com.oracle.graal.lir.SwitchStrategy;
 import com.oracle.graal.lir.Variable;
 import com.oracle.graal.lir.amd64.AMD64AddressValue;
+import com.oracle.graal.lir.amd64.AMD64ArithmeticLIRGeneratorTool;
 import com.oracle.graal.lir.amd64.AMD64ArrayEqualsOp;
 import com.oracle.graal.lir.amd64.AMD64BinaryConsumer;
 import com.oracle.graal.lir.amd64.AMD64ByteSwapOp;
@@ -297,63 +291,6 @@
         }
     }
 
-    protected void emitCompareOp(PlatformKind cmpKind, Variable left, Value right) {
-        OperandSize size;
-        switch ((AMD64Kind) cmpKind) {
-            case BYTE:
-                size = BYTE;
-                break;
-            case WORD:
-                size = WORD;
-                break;
-            case DWORD:
-                size = DWORD;
-                break;
-            case QWORD:
-                size = QWORD;
-                break;
-            case SINGLE:
-                append(new AMD64BinaryConsumer.Op(SSEOp.UCOMIS, PS, left, asAllocatable(right)));
-                return;
-            case DOUBLE:
-                append(new AMD64BinaryConsumer.Op(SSEOp.UCOMIS, PD, left, asAllocatable(right)));
-                return;
-            default:
-                throw JVMCIError.shouldNotReachHere("unexpected kind: " + cmpKind);
-        }
-
-        if (isConstantValue(right)) {
-            Constant c = LIRValueUtil.asConstant(right);
-            if (JavaConstant.isNull(c)) {
-                append(new AMD64BinaryConsumer.Op(TEST, DWORD, left, left));
-                return;
-            } else if (c instanceof VMConstant) {
-                VMConstant vc = (VMConstant) c;
-                boolean isImmutable = GraalOptions.ImmutableCode.getValue();
-                boolean generatePIC = GraalOptions.GeneratePIC.getValue();
-                if (size == DWORD && !(isImmutable && generatePIC)) {
-                    append(new AMD64BinaryConsumer.VMConstOp(CMP.getMIOpcode(DWORD, false), left, vc));
-                } else {
-                    append(new AMD64BinaryConsumer.DataOp(CMP.getRMOpcode(size), size, left, vc));
-                }
-                return;
-            } else if (c instanceof JavaConstant) {
-                JavaConstant jc = (JavaConstant) c;
-                if (jc.isDefaultForKind()) {
-                    AMD64RMOp op = size == BYTE ? TESTB : TEST;
-                    append(new AMD64BinaryConsumer.Op(op, size, left, left));
-                    return;
-                } else if (NumUtil.is32bit(jc.asLong())) {
-                    append(new AMD64BinaryConsumer.ConstOp(CMP, size, left, (int) jc.asLong()));
-                    return;
-                }
-            }
-        }
-
-        // fallback: load, then compare
-        append(new AMD64BinaryConsumer.Op(CMP.getRMOpcode(size), size, left, asAllocatable(right)));
-    }
-
     /**
      * This method emits the compare against memory instruction, and may reorder the operands. It
      * returns true if it did so.
@@ -439,7 +376,7 @@
             right = loadNonConst(b);
             mirrored = false;
         }
-        emitCompareOp(cmpKind, left, right);
+        ((AMD64ArithmeticLIRGeneratorTool) arithmeticLIRGen).emitCompareOp((AMD64Kind) cmpKind, left, right);
         return mirrored;
     }
 
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java	Mon Nov 02 18:25:48 2015 +0100
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java	Tue Nov 03 11:01:20 2015 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,9 +22,11 @@
  */
 package com.oracle.graal.lir.amd64;
 
-import com.oracle.graal.lir.gen.ArithmeticLIRGeneratorTool;
+import jdk.vm.ci.amd64.AMD64Kind;
+import jdk.vm.ci.meta.Value;
 
-import jdk.vm.ci.meta.Value;
+import com.oracle.graal.lir.Variable;
+import com.oracle.graal.lir.gen.ArithmeticLIRGeneratorTool;
 
 /**
  * This interface can be used to generate AMD64 LIR for arithmetic operations.
@@ -42,4 +44,6 @@
     Value emitCountLeadingZeros(Value value);
 
     Value emitCountTrailingZeros(Value value);
+
+    void emitCompareOp(AMD64Kind cmpKind, Variable left, Value right);
 }