src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java
Print this page
*** 21,42 ****
* questions.
*/
package org.graalvm.compiler.core.amd64;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.CMP;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.DWORD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.PD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.PS;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.QWORD;
import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
import static org.graalvm.compiler.lir.LIRValueUtil.asConstantValue;
import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant;
import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
- import static jdk.vm.ci.code.ValueUtil.isAllocatableValue;
! import org.graalvm.compiler.asm.NumUtil;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MIOp;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
--- 21,43 ----
* questions.
*/
package org.graalvm.compiler.core.amd64;
+ import static jdk.vm.ci.code.ValueUtil.isAllocatableValue;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.CMP;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.DWORD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.PD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.PS;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.QWORD;
import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
import static org.graalvm.compiler.lir.LIRValueUtil.asConstantValue;
import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant;
+ import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
! import org.graalvm.compiler.core.common.NumUtil;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MIOp;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize;
import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
*** 70,79 ****
--- 71,81 ----
import org.graalvm.compiler.lir.amd64.AMD64Move;
import org.graalvm.compiler.lir.amd64.AMD64Move.CompareAndSwapOp;
import org.graalvm.compiler.lir.amd64.AMD64Move.MembarOp;
import org.graalvm.compiler.lir.amd64.AMD64Move.StackLeaOp;
import org.graalvm.compiler.lir.amd64.AMD64PauseOp;
+ import org.graalvm.compiler.lir.amd64.AMD64StringIndexOfOp;
import org.graalvm.compiler.lir.amd64.AMD64ZapRegistersOp;
import org.graalvm.compiler.lir.amd64.AMD64ZapStackOp;
import org.graalvm.compiler.lir.gen.LIRGenerationResult;
import org.graalvm.compiler.lir.gen.LIRGenerator;
import org.graalvm.compiler.phases.util.Providers;
*** 110,123 ****
* register.
*/
protected static final boolean canStoreConstant(JavaConstant c) {
// there is no immediate move of 64-bit constants on Intel
switch (c.getJavaKind()) {
! case Long: {
! long l = c.asLong();
! return (int) l == l;
! }
case Double:
return false;
case Object:
return c.isNull();
default:
--- 112,123 ----
* register.
*/
protected static final boolean canStoreConstant(JavaConstant c) {
// there is no immediate move of 64-bit constants on Intel
switch (c.getJavaKind()) {
! case Long:
! return NumUtil.isInt(c.asLong());
case Double:
return false;
case Object:
return c.isNull();
default:
*** 181,191 ****
return kind;
}
}
@Override
! public Variable emitCompareAndSwap(Value address, Value expectedValue, Value newValue, Value trueValue, Value falseValue) {
ValueKind<?> kind = newValue.getValueKind();
assert kind.equals(expectedValue.getValueKind());
AMD64Kind memKind = (AMD64Kind) kind.getPlatformKind();
AMD64AddressValue addressValue = asAddressValue(address);
--- 181,191 ----
return kind;
}
}
@Override
! public Variable emitLogicCompareAndSwap(Value address, Value expectedValue, Value newValue, Value trueValue, Value falseValue) {
ValueKind<?> kind = newValue.getValueKind();
assert kind.equals(expectedValue.getValueKind());
AMD64Kind memKind = (AMD64Kind) kind.getPlatformKind();
AMD64AddressValue addressValue = asAddressValue(address);
*** 198,207 ****
--- 198,234 ----
append(new CondMoveOp(result, Condition.EQ, asAllocatable(trueValue), falseValue));
return result;
}
@Override
+ public Value emitValueCompareAndSwap(Value address, Value expectedValue, Value newValue) {
+ ValueKind<?> kind = newValue.getValueKind();
+ assert kind.equals(expectedValue.getValueKind());
+ AMD64Kind memKind = (AMD64Kind) kind.getPlatformKind();
+
+ AMD64AddressValue addressValue = asAddressValue(address);
+ RegisterValue raxRes = AMD64.rax.asValue(kind);
+ emitMove(raxRes, expectedValue);
+ append(new CompareAndSwapOp(memKind, raxRes, addressValue, raxRes, asAllocatable(newValue)));
+ Variable result = newVariable(kind);
+ emitMove(result, raxRes);
+ return result;
+ }
+
+ public void emitCompareAndSwapBranch(ValueKind<?> kind, AMD64AddressValue address, Value expectedValue, Value newValue, Condition condition, LabelRef trueLabel, LabelRef falseLabel,
+ double trueLabelProbability) {
+ assert kind.equals(expectedValue.getValueKind());
+ assert kind.equals(newValue.getValueKind());
+ assert condition == Condition.EQ || condition == Condition.NE;
+ AMD64Kind memKind = (AMD64Kind) kind.getPlatformKind();
+ RegisterValue raxValue = AMD64.rax.asValue(kind);
+ emitMove(raxValue, expectedValue);
+ append(new CompareAndSwapOp(memKind, raxValue, address, raxValue, asAllocatable(newValue)));
+ append(new BranchOp(condition, trueLabel, falseLabel, trueLabelProbability));
+ }
+
+ @Override
public Value emitAtomicReadAndAdd(Value address, Value delta) {
ValueKind<?> kind = delta.getValueKind();
Variable result = newVariable(kind);
AMD64AddressValue addressValue = asAddressValue(address);
append(new AMD64Move.AtomicReadAndAddOp((AMD64Kind) kind.getPlatformKind(), result, addressValue, asAllocatable(delta)));
*** 327,337 ****
return false;
default:
throw GraalError.shouldNotReachHere("unexpected kind: " + cmpKind);
}
! if (isJavaConstant(a)) {
return emitCompareMemoryConOp(size, asConstantValue(a), b, state);
} else {
return emitCompareRegMemoryOp(size, asAllocatable(a), b, state);
}
}
--- 354,364 ----
return false;
default:
throw GraalError.shouldNotReachHere("unexpected kind: " + cmpKind);
}
! if (isConstantValue(a)) {
return emitCompareMemoryConOp(size, asConstantValue(a), b, state);
} else {
return emitCompareRegMemoryOp(size, asAllocatable(a), b, state);
}
}
*** 397,407 ****
public abstract void emitCCall(long address, CallingConvention nativeCallingConvention, Value[] args, int numberOfFloatingPointArguments);
@Override
protected void emitForeignCallOp(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info) {
long maxOffset = linkage.getMaxCallTargetOffset();
! if (maxOffset != (int) maxOffset && !GeneratePIC.getValue()) {
append(new AMD64Call.DirectFarForeignCallOp(linkage, result, arguments, temps, info));
} else {
append(new AMD64Call.DirectNearForeignCallOp(linkage, result, arguments, temps, info));
}
}
--- 424,434 ----
public abstract void emitCCall(long address, CallingConvention nativeCallingConvention, Value[] args, int numberOfFloatingPointArguments);
@Override
protected void emitForeignCallOp(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info) {
long maxOffset = linkage.getMaxCallTargetOffset();
! if (maxOffset != (int) maxOffset && !GeneratePIC.getValue(getResult().getLIR().getOptions())) {
append(new AMD64Call.DirectFarForeignCallOp(linkage, result, arguments, temps, info));
} else {
append(new AMD64Call.DirectNearForeignCallOp(linkage, result, arguments, temps, info));
}
}
*** 418,427 ****
--- 445,472 ----
Variable result = newVariable(LIRKind.value(AMD64Kind.DWORD));
append(new AMD64ArrayEqualsOp(this, kind, result, array1, array2, asAllocatable(length)));
return result;
}
+ /**
+ * Return a conservative estimate of the page size for use by the String.indexOf intrinsic.
+ */
+ protected int getVMPageSize() {
+ return 4096;
+ }
+
+ @Override
+ public Variable emitStringIndexOf(Value source, Value sourceCount, Value target, Value targetCount, int constantTargetCount) {
+ Variable result = newVariable(LIRKind.value(AMD64Kind.DWORD));
+ RegisterValue cnt1 = AMD64.rdx.asValue(sourceCount.getValueKind());
+ emitMove(cnt1, sourceCount);
+ RegisterValue cnt2 = AMD64.rax.asValue(targetCount.getValueKind());
+ emitMove(cnt2, targetCount);
+ append(new AMD64StringIndexOfOp(this, result, source, target, cnt1, cnt2, AMD64.rcx.asValue(), AMD64.xmm0.asValue(), constantTargetCount, getVMPageSize()));
+ return result;
+ }
+
@Override
public void emitReturn(JavaKind kind, Value input) {
AllocatableValue operand = Value.ILLEGAL;
if (input != null) {
operand = resultOperandFor(kind, input.getValueKind());
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File