src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeMatchRules.java
changeset 48861 47f19ff9903c
parent 48190 25cfedf27edc
child 50858 2d3e99a72541
equal deleted inserted replaced
48860:5bce1b7e7800 48861:47f19ff9903c
    42 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AVXOp;
    42 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AVXOp;
    43 import org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize;
    43 import org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize;
    44 import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
    44 import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
    45 import org.graalvm.compiler.core.common.LIRKind;
    45 import org.graalvm.compiler.core.common.LIRKind;
    46 import org.graalvm.compiler.core.common.NumUtil;
    46 import org.graalvm.compiler.core.common.NumUtil;
       
    47 import org.graalvm.compiler.core.common.calc.CanonicalCondition;
    47 import org.graalvm.compiler.core.common.calc.Condition;
    48 import org.graalvm.compiler.core.common.calc.Condition;
    48 import org.graalvm.compiler.core.gen.NodeLIRBuilder;
    49 import org.graalvm.compiler.core.gen.NodeLIRBuilder;
    49 import org.graalvm.compiler.core.gen.NodeMatchRules;
    50 import org.graalvm.compiler.core.gen.NodeMatchRules;
    50 import org.graalvm.compiler.core.match.ComplexMatchResult;
    51 import org.graalvm.compiler.core.match.ComplexMatchResult;
    51 import org.graalvm.compiler.core.match.MatchRule;
    52 import org.graalvm.compiler.core.match.MatchRule;
   126                 throw GraalError.shouldNotReachHere("unsupported memory access type " + getMemoryKind(access));
   127                 throw GraalError.shouldNotReachHere("unsupported memory access type " + getMemoryKind(access));
   127         }
   128         }
   128     }
   129     }
   129 
   130 
   130     protected ComplexMatchResult emitCompareBranchMemory(IfNode ifNode, CompareNode compare, ValueNode value, LIRLowerableAccess access) {
   131     protected ComplexMatchResult emitCompareBranchMemory(IfNode ifNode, CompareNode compare, ValueNode value, LIRLowerableAccess access) {
   131         Condition cond = compare.condition();
   132         Condition cond = compare.condition().asCondition();
   132         AMD64Kind kind = getMemoryKind(access);
   133         AMD64Kind kind = getMemoryKind(access);
   133         boolean matchedAsConstant = false; // For assertion checking
   134         boolean matchedAsConstant = false; // For assertion checking
   134 
   135 
   135         if (value.isConstant()) {
   136         if (value.isConstant()) {
   136             JavaConstant constant = value.asJavaConstant();
   137             JavaConstant constant = value.asJavaConstant();
   301     @MatchRule("(If (ObjectEquals=compare value ValueCompareAndSwap=cas))")
   302     @MatchRule("(If (ObjectEquals=compare value ValueCompareAndSwap=cas))")
   302     @MatchRule("(If (PointerEquals=compare value ValueCompareAndSwap=cas))")
   303     @MatchRule("(If (PointerEquals=compare value ValueCompareAndSwap=cas))")
   303     @MatchRule("(If (FloatEquals=compare value ValueCompareAndSwap=cas))")
   304     @MatchRule("(If (FloatEquals=compare value ValueCompareAndSwap=cas))")
   304     @MatchRule("(If (IntegerEquals=compare value ValueCompareAndSwap=cas))")
   305     @MatchRule("(If (IntegerEquals=compare value ValueCompareAndSwap=cas))")
   305     public ComplexMatchResult ifCompareValueCas(IfNode root, CompareNode compare, ValueNode value, ValueCompareAndSwapNode cas) {
   306     public ComplexMatchResult ifCompareValueCas(IfNode root, CompareNode compare, ValueNode value, ValueCompareAndSwapNode cas) {
   306         assert compare.condition() == Condition.EQ;
   307         assert compare.condition() == CanonicalCondition.EQ;
   307         if (value == cas.getExpectedValue() && cas.usages().count() == 1) {
   308         if (value == cas.getExpectedValue() && cas.usages().count() == 1) {
   308             return builder -> {
   309             return builder -> {
   309                 LIRKind kind = getLirKind(cas);
   310                 LIRKind kind = getLirKind(cas);
   310                 LabelRef trueLabel = getLIRBlock(root.trueSuccessor());
   311                 LabelRef trueLabel = getLIRBlock(root.trueSuccessor());
   311                 LabelRef falseLabel = getLIRBlock(root.falseSuccessor());
   312                 LabelRef falseLabel = getLIRBlock(root.falseSuccessor());
   324     @MatchRule("(If (PointerEquals=compare value LogicCompareAndSwap=cas))")
   325     @MatchRule("(If (PointerEquals=compare value LogicCompareAndSwap=cas))")
   325     @MatchRule("(If (FloatEquals=compare value LogicCompareAndSwap=cas))")
   326     @MatchRule("(If (FloatEquals=compare value LogicCompareAndSwap=cas))")
   326     @MatchRule("(If (IntegerEquals=compare value LogicCompareAndSwap=cas))")
   327     @MatchRule("(If (IntegerEquals=compare value LogicCompareAndSwap=cas))")
   327     public ComplexMatchResult ifCompareLogicCas(IfNode root, CompareNode compare, ValueNode value, LogicCompareAndSwapNode cas) {
   328     public ComplexMatchResult ifCompareLogicCas(IfNode root, CompareNode compare, ValueNode value, LogicCompareAndSwapNode cas) {
   328         JavaConstant constant = value.asJavaConstant();
   329         JavaConstant constant = value.asJavaConstant();
   329         assert compare.condition() == Condition.EQ;
   330         assert compare.condition() == CanonicalCondition.EQ;
   330         if (constant != null && cas.usages().count() == 1) {
   331         if (constant != null && cas.usages().count() == 1) {
   331             long constantValue = constant.asLong();
   332             long constantValue = constant.asLong();
   332             boolean successIsTrue;
   333             boolean successIsTrue;
   333             if (constantValue == 0) {
   334             if (constantValue == 0) {
   334                 successIsTrue = false;
   335                 successIsTrue = false;