< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRGenerator.java
Print this page
*** 162,172 ****
@Override
public Variable emitValueCompareAndSwap(LIRKind accessKind, Value address, Value expectedValue, Value newValue) {
Variable result = newVariable(newValue.getValueKind());
Variable scratch = newVariable(LIRKind.value(AArch64Kind.WORD));
! append(new CompareAndSwapOp(result, loadNonCompareConst(expectedValue), loadReg(newValue), asAllocatable(address), scratch));
return result;
}
@Override
public Value emitAtomicReadAndWrite(Value address, ValueKind<?> kind, Value newValue) {
--- 162,172 ----
@Override
public Variable emitValueCompareAndSwap(LIRKind accessKind, Value address, Value expectedValue, Value newValue) {
Variable result = newVariable(newValue.getValueKind());
Variable scratch = newVariable(LIRKind.value(AArch64Kind.WORD));
! append(new CompareAndSwapOp(result, loadReg(expectedValue), loadReg(newValue), asAllocatable(address), scratch));
return result;
}
@Override
public Value emitAtomicReadAndWrite(Value address, ValueKind<?> kind, Value newValue) {
*** 236,247 ****
* @param falseValue arbitrary value same type as trueValue. Non null.
* @return value containing trueValue if cond + unorderedIsTrue is true, else falseValue. Non
* null.
*/
@Override
! public Variable emitConditionalMove(PlatformKind cmpKind, Value left, Value right, Condition cond, boolean unorderedIsTrue, Value trueValue, Value falseValue) {
! boolean mirrored = emitCompare(cmpKind, left, right, cond, unorderedIsTrue);
Condition finalCondition = mirrored ? cond.mirror() : cond;
boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue;
ConditionFlag cmpCondition = toConditionFlag(((AArch64Kind) cmpKind).isInteger(), finalCondition, finalUnorderedIsTrue);
Variable result = newVariable(trueValue.getValueKind());
--- 236,252 ----
* @param falseValue arbitrary value same type as trueValue. Non null.
* @return value containing trueValue if cond + unorderedIsTrue is true, else falseValue. Non
* null.
*/
@Override
! public Variable emitConditionalMove(PlatformKind cmpKind, Value left, final Value right, Condition cond, boolean unorderedIsTrue, Value trueValue, Value falseValue) {
! AArch64ArithmeticLIRGenerator arithLir = ((AArch64ArithmeticLIRGenerator) arithmeticLIRGen);
! Value actualRight = right;
! if (isJavaConstant(actualRight) && arithLir.mustReplaceNullWithNullRegister((asJavaConstant(actualRight)))) {
! actualRight = arithLir.getNullRegisterValue();
! }
! boolean mirrored = emitCompare(cmpKind, left, actualRight, cond, unorderedIsTrue);
Condition finalCondition = mirrored ? cond.mirror() : cond;
boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue;
ConditionFlag cmpCondition = toConditionFlag(((AArch64Kind) cmpKind).isInteger(), finalCondition, finalUnorderedIsTrue);
Variable result = newVariable(trueValue.getValueKind());
*** 254,287 ****
}
return result;
}
@Override
! public void emitCompareBranch(PlatformKind cmpKind, Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination,
double trueDestinationProbability) {
if (cond == Condition.EQ) {
// emit cbz instruction for IsNullNode.
assert !LIRValueUtil.isNullConstant(left) : "emitNullCheckBranch()'s null input should be in right.";
! if (LIRValueUtil.isNullConstant(right)) {
! append(new CompareBranchZeroOp(asAllocatable(left), trueDestination, falseDestination, trueDestinationProbability));
! return;
}
// emit cbz instruction for IntegerEquals when any of the inputs is zero.
AArch64Kind kind = (AArch64Kind) cmpKind;
if (kind.isInteger()) {
if (isIntConstant(left, 0)) {
! append(new CompareBranchZeroOp(asAllocatable(right), trueDestination, falseDestination, trueDestinationProbability));
return;
! } else if (isIntConstant(right, 0)) {
append(new CompareBranchZeroOp(asAllocatable(left), trueDestination, falseDestination, trueDestinationProbability));
return;
}
}
}
! boolean mirrored = emitCompare(cmpKind, left, right, cond, unorderedIsTrue);
Condition finalCondition = mirrored ? cond.mirror() : cond;
boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue;
ConditionFlag cmpCondition = toConditionFlag(((AArch64Kind) cmpKind).isInteger(), finalCondition, finalUnorderedIsTrue);
append(new BranchOp(cmpCondition, trueDestination, falseDestination, trueDestinationProbability));
}
--- 259,300 ----
}
return result;
}
@Override
! public void emitCompareBranch(PlatformKind cmpKind, Value left, final Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination,
double trueDestinationProbability) {
+ Value actualRight = right;
if (cond == Condition.EQ) {
// emit cbz instruction for IsNullNode.
assert !LIRValueUtil.isNullConstant(left) : "emitNullCheckBranch()'s null input should be in right.";
! AArch64ArithmeticLIRGenerator arithLir = ((AArch64ArithmeticLIRGenerator) arithmeticLIRGen);
! if (LIRValueUtil.isNullConstant(actualRight)) {
! JavaConstant rightConstant = asJavaConstant(actualRight);
! if (arithLir.mustReplaceNullWithNullRegister(rightConstant)) {
! actualRight = arithLir.getNullRegisterValue();
! } else {
! append(new CompareBranchZeroOp(asAllocatable(left), trueDestination, falseDestination,
! trueDestinationProbability));
! return;
! }
}
// emit cbz instruction for IntegerEquals when any of the inputs is zero.
AArch64Kind kind = (AArch64Kind) cmpKind;
if (kind.isInteger()) {
if (isIntConstant(left, 0)) {
! append(new CompareBranchZeroOp(asAllocatable(actualRight), trueDestination, falseDestination, trueDestinationProbability));
return;
! } else if (isIntConstant(actualRight, 0)) {
append(new CompareBranchZeroOp(asAllocatable(left), trueDestination, falseDestination, trueDestinationProbability));
return;
}
}
}
! boolean mirrored = emitCompare(cmpKind, left, actualRight, cond, unorderedIsTrue);
Condition finalCondition = mirrored ? cond.mirror() : cond;
boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue;
ConditionFlag cmpCondition = toConditionFlag(((AArch64Kind) cmpKind).isInteger(), finalCondition, finalUnorderedIsTrue);
append(new BranchOp(cmpCondition, trueDestination, falseDestination, trueDestinationProbability));
}
< prev index next >