src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java	Mon Mar 20 17:37:17 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java	Mon Mar 20 17:37:17 2017

*** 27,47 **** --- 27,57 ---- import static jdk.vm.ci.sparc.SPARCKind.HWORD; import static jdk.vm.ci.sparc.SPARCKind.WORD; import static jdk.vm.ci.sparc.SPARCKind.XWORD; import org.graalvm.compiler.core.common.LIRKind; + import org.graalvm.compiler.core.common.calc.Condition; import org.graalvm.compiler.core.gen.NodeMatchRules; import org.graalvm.compiler.core.match.ComplexMatchResult; import org.graalvm.compiler.core.match.MatchRule; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.lir.LIRFrameState; + import org.graalvm.compiler.lir.LabelRef; import org.graalvm.compiler.lir.gen.LIRGeneratorTool; + import org.graalvm.compiler.lir.sparc.SPARCAddressValue; import org.graalvm.compiler.nodes.DeoptimizingNode; + import org.graalvm.compiler.nodes.IfNode; + import org.graalvm.compiler.nodes.ValueNode; + import org.graalvm.compiler.nodes.calc.CompareNode; import org.graalvm.compiler.nodes.calc.SignExtendNode; import org.graalvm.compiler.nodes.calc.ZeroExtendNode; + import org.graalvm.compiler.nodes.java.LogicCompareAndSwapNode; import org.graalvm.compiler.nodes.memory.Access; + import org.graalvm.compiler.nodes.memory.LIRLowerableAccess; + import jdk.vm.ci.meta.JavaConstant; + import jdk.vm.ci.meta.Value; import jdk.vm.ci.sparc.SPARCKind; /** * This class implements the SPARC specific portion of the LIR generator. */
*** 56,65 **** --- 66,79 ---- return state((DeoptimizingNode) access); } return null; } + protected LIRKind getLirKind(LIRLowerableAccess access) { + return gen.getLIRKind(access.getAccessStamp()); + } + private ComplexMatchResult emitSignExtendMemory(Access access, int fromBits, int toBits) { assert fromBits <= toBits && toBits <= 64; SPARCKind toKind = null; SPARCKind fromKind = null; if (fromBits == toBits) {
*** 125,134 **** --- 139,183 ---- @MatchRule("(ZeroExtend FloatingRead=access)") public ComplexMatchResult zeroExtend(ZeroExtendNode root, Access access) { return emitZeroExtendMemory(access, root.getInputBits(), root.getResultBits()); } + @MatchRule("(If (ObjectEquals=compare value LogicCompareAndSwap=cas))") + @MatchRule("(If (PointerEquals=compare value LogicCompareAndSwap=cas))") + @MatchRule("(If (FloatEquals=compare value LogicCompareAndSwap=cas))") + @MatchRule("(If (IntegerEquals=compare value LogicCompareAndSwap=cas))") + public ComplexMatchResult ifCompareLogicCas(IfNode root, CompareNode compare, ValueNode value, LogicCompareAndSwapNode cas) { + JavaConstant constant = value.asJavaConstant(); + assert compare.condition() == Condition.EQ; + if (constant != null && cas.usages().count() == 1) { + long constantValue = constant.asLong(); + boolean successIsTrue; + if (constantValue == 0) { + successIsTrue = false; + } else if (constantValue == 1) { + successIsTrue = true; + } else { + return null; + } + return builder -> { + LIRKind kind = getLirKind(cas); + LabelRef trueLabel = getLIRBlock(root.trueSuccessor()); + LabelRef falseLabel = getLIRBlock(root.falseSuccessor()); + double trueLabelProbability = root.probability(root.trueSuccessor()); + Value expectedValue = operand(cas.getExpectedValue()); + Value newValue = operand(cas.getNewValue()); + SPARCAddressValue address = (SPARCAddressValue) operand(cas.getAddress()); + Condition condition = successIsTrue ? Condition.EQ : Condition.NE; + + Value result = getLIRGeneratorTool().emitValueCompareAndSwap(address, expectedValue, newValue); + getLIRGeneratorTool().emitCompareBranch(kind.getPlatformKind(), result, expectedValue, condition, false, trueLabel, falseLabel, trueLabelProbability); + return null; + }; + } + return null; + } + @Override public SPARCLIRGenerator getLIRGeneratorTool() { return (SPARCLIRGenerator) super.getLIRGeneratorTool(); }

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File