39 import jdk.internal.vm.compiler.word.LocationIdentity;
40
41 import jdk.vm.ci.meta.JavaConstant;
42 import jdk.vm.ci.meta.JavaKind;
43 import jdk.vm.ci.meta.Value;
44
45 /**
46 * Represents the low-level version of an atomic compare-and-swap operation.
47 *
48 * This version returns a boolean indicating is the CAS was successful or not.
49 */
50 @NodeInfo(cycles = CYCLES_8, size = SIZE_8)
51 public final class LogicCompareAndSwapNode extends AbstractCompareAndSwapNode {
52 public static final NodeClass<LogicCompareAndSwapNode> TYPE = NodeClass.create(LogicCompareAndSwapNode.class);
53
54 public LogicCompareAndSwapNode(ValueNode address, ValueNode expectedValue, ValueNode newValue, LocationIdentity location) {
55 this((AddressNode) address, location, expectedValue, newValue, BarrierType.NONE);
56 }
57
58 public LogicCompareAndSwapNode(AddressNode address, LocationIdentity location, ValueNode expectedValue, ValueNode newValue, BarrierType barrierType) {
59 super(TYPE, address, location, expectedValue, newValue, barrierType, StampFactory.forKind(JavaKind.Boolean.getStackKind()));
60 }
61
62 @Override
63 public void generate(NodeLIRBuilderTool gen) {
64 assert getNewValue().stamp(NodeView.DEFAULT).isCompatible(getExpectedValue().stamp(NodeView.DEFAULT));
65 assert !this.canDeoptimize();
66 LIRGeneratorTool tool = gen.getLIRGeneratorTool();
67
68 LIRKind resultKind = tool.getLIRKind(stamp(NodeView.DEFAULT));
69 Value trueResult = tool.emitConstant(resultKind, JavaConstant.TRUE);
70 Value falseResult = tool.emitConstant(resultKind, JavaConstant.FALSE);
71 Value result = tool.emitLogicCompareAndSwap(tool.getLIRKind(getAccessStamp()), gen.operand(getAddress()), gen.operand(getExpectedValue()), gen.operand(getNewValue()), trueResult, falseResult);
72
73 gen.setResult(this, result);
74 }
75 }
|
39 import jdk.internal.vm.compiler.word.LocationIdentity;
40
41 import jdk.vm.ci.meta.JavaConstant;
42 import jdk.vm.ci.meta.JavaKind;
43 import jdk.vm.ci.meta.Value;
44
45 /**
46 * Represents the low-level version of an atomic compare-and-swap operation.
47 *
48 * This version returns a boolean indicating is the CAS was successful or not.
49 */
50 @NodeInfo(cycles = CYCLES_8, size = SIZE_8)
51 public final class LogicCompareAndSwapNode extends AbstractCompareAndSwapNode {
52 public static final NodeClass<LogicCompareAndSwapNode> TYPE = NodeClass.create(LogicCompareAndSwapNode.class);
53
54 public LogicCompareAndSwapNode(ValueNode address, ValueNode expectedValue, ValueNode newValue, LocationIdentity location) {
55 this((AddressNode) address, location, expectedValue, newValue, BarrierType.NONE);
56 }
57
58 public LogicCompareAndSwapNode(AddressNode address, LocationIdentity location, ValueNode expectedValue, ValueNode newValue, BarrierType barrierType) {
59 super(TYPE, address, location, expectedValue, newValue, barrierType, StampFactory.forInteger(JavaKind.Int, 0, 1));
60 }
61
62 @Override
63 public void generate(NodeLIRBuilderTool gen) {
64 assert getNewValue().stamp(NodeView.DEFAULT).isCompatible(getExpectedValue().stamp(NodeView.DEFAULT));
65 assert !this.canDeoptimize();
66 LIRGeneratorTool tool = gen.getLIRGeneratorTool();
67
68 LIRKind resultKind = tool.getLIRKind(stamp(NodeView.DEFAULT));
69 Value trueResult = tool.emitConstant(resultKind, JavaConstant.TRUE);
70 Value falseResult = tool.emitConstant(resultKind, JavaConstant.FALSE);
71 Value result = tool.emitLogicCompareAndSwap(tool.getLIRKind(getAccessStamp()), gen.operand(getAddress()), gen.operand(getExpectedValue()), gen.operand(getNewValue()), trueResult, falseResult);
72
73 gen.setResult(this, result);
74 }
75 }
|