src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeMatchRules.java
equal
deleted
inserted
replaced
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; |