use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.
the class AArch64HotSpotEpilogueOp method leaveFrame.
protected void leaveFrame(CompilationResultBuilder crb, AArch64MacroAssembler masm, boolean emitSafepoint) {
assert crb.frameContext != null : "We never elide frames in aarch64";
crb.frameContext.leave(crb);
if (emitSafepoint) {
try (ScratchRegister sc = masm.getScratchRegister()) {
Register scratch = sc.getRegister();
AArch64HotSpotSafepointOp.emitCode(crb, masm, config, true, thread, scratch, null);
}
}
}
use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.
the class AArch64Move method emitStackMove.
private static void emitStackMove(CompilationResultBuilder crb, AArch64MacroAssembler masm, AllocatableValue result, Value input) {
try (ScratchRegister r1 = masm.getScratchRegister()) {
try (ScratchRegister r2 = masm.getScratchRegister()) {
Register rscratch1 = r1.getRegister();
Register rscratch2 = r2.getRegister();
// use the slot kind to define the operand size
PlatformKind kind = input.getPlatformKind();
final int size = kind.getSizeInBytes() * Byte.SIZE;
// Always perform stack -> stack copies through integer registers
crb.blockComment("[stack -> stack copy]");
AArch64Address src = loadStackSlotAddress(crb, masm, asStackSlot(input), rscratch2);
masm.ldr(size, rscratch1, src);
AArch64Address dst = loadStackSlotAddress(crb, masm, asStackSlot(result), rscratch2);
masm.str(size, rscratch1, dst);
}
}
}
use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.
the class AArch64ArrayEqualsOp method emitCode.
@Override
public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
Register result = asRegister(resultValue);
Register array1 = asRegister(temp1);
Register array2 = asRegister(temp2);
Register length = asRegister(temp3);
Label breakLabel = new Label();
try (ScratchRegister sc1 = masm.getScratchRegister()) {
Register rscratch1 = sc1.getRegister();
// Load array base addresses.
masm.lea(array1, AArch64Address.createUnscaledImmediateAddress(asRegister(array1Value), arrayBaseOffset));
masm.lea(array2, AArch64Address.createUnscaledImmediateAddress(asRegister(array2Value), arrayBaseOffset));
// Get array length in bytes.
masm.mov(rscratch1, arrayIndexScale);
masm.smaddl(length, asRegister(lengthValue), rscratch1, zr);
// copy
masm.mov(64, result, length);
emit8ByteCompare(crb, masm, result, array1, array2, length, breakLabel, rscratch1);
emitTailCompares(masm, result, array1, array2, breakLabel, rscratch1);
// Return: rscratch1 is non-zero iff the arrays differ
masm.bind(breakLabel);
masm.cmp(64, rscratch1, zr);
masm.cset(result, ConditionFlag.EQ);
}
}
use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.
the class AArch64HotSpotJumpToExceptionHandlerInCallerOp method emitCode.
@Override
public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
leaveFrame(crb, masm, /* emitSafepoint */
false);
if (System.getProperty("java.specification.version").compareTo("1.8") < 0) {
// Restore sp from fp if the exception PC is a method handle call site.
try (ScratchRegister sc = masm.getScratchRegister()) {
Register scratch = sc.getRegister();
AArch64Address address = masm.makeAddress(thread, isMethodHandleReturnOffset, scratch, 4, /* allowOverwrite */
false);
masm.ldr(32, scratch, address);
Label noRestore = new Label();
masm.cbz(32, scratch, noRestore);
masm.mov(64, sp, fp);
masm.bind(noRestore);
}
}
masm.jmp(asRegister(handlerInCallerPc));
}
use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.
the class AArch64HotSpotBackend method emitCodeSuffix.
private void emitCodeSuffix(CompilationResultBuilder crb, AArch64MacroAssembler masm, FrameMap frameMap) {
HotSpotProviders providers = getProviders();
HotSpotFrameContext frameContext = (HotSpotFrameContext) crb.frameContext;
if (!frameContext.isStub) {
HotSpotForeignCallsProvider foreignCalls = providers.getForeignCalls();
try (ScratchRegister sc = masm.getScratchRegister()) {
Register scratch = sc.getRegister();
crb.recordMark(config.MARKID_EXCEPTION_HANDLER_ENTRY);
ForeignCallLinkage linkage = foreignCalls.lookupForeignCall(EXCEPTION_HANDLER);
Register helper = AArch64Call.isNearCall(linkage) ? null : scratch;
AArch64Call.directCall(crb, masm, linkage, helper, null);
}
crb.recordMark(config.MARKID_DEOPT_HANDLER_ENTRY);
ForeignCallLinkage linkage = foreignCalls.lookupForeignCall(DEOPTIMIZATION_HANDLER);
// Warning: the argument is an offset from the instruction!
masm.adr(lr, 0);
AArch64Call.directJmp(crb, masm, linkage);
} else {
// it has no calls that can cause such "return" entries
assert !frameMap.accessesCallerFrame();
}
}
Aggregations