Search in sources :

Example 1 with ScratchRegister

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);
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) Register(jdk.vm.ci.code.Register)

Example 2 with ScratchRegister

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);
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) Register(jdk.vm.ci.code.Register) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) PlatformKind(jdk.vm.ci.meta.PlatformKind) AArch64Address(org.graalvm.compiler.asm.aarch64.AArch64Address)

Example 3 with ScratchRegister

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);
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) Register(jdk.vm.ci.code.Register) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) Label(org.graalvm.compiler.asm.Label)

Example 4 with ScratchRegister

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));
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) Register(jdk.vm.ci.code.Register) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) Label(org.graalvm.compiler.asm.Label) AArch64Address(org.graalvm.compiler.asm.aarch64.AArch64Address)

Example 5 with ScratchRegister

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();
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) Register(jdk.vm.ci.code.Register) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) HotSpotProviders(org.graalvm.compiler.hotspot.meta.HotSpotProviders) ForeignCallLinkage(org.graalvm.compiler.core.common.spi.ForeignCallLinkage) HotSpotForeignCallsProvider(org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider)

Aggregations

ScratchRegister (org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister)9 Register (jdk.vm.ci.code.Register)7 ValueUtil.asRegister (jdk.vm.ci.code.ValueUtil.asRegister)5 AArch64Address (org.graalvm.compiler.asm.aarch64.AArch64Address)5 Label (org.graalvm.compiler.asm.Label)3 ValueUtil.asAllocatableValue (jdk.vm.ci.code.ValueUtil.asAllocatableValue)2 AllocatableValue (jdk.vm.ci.meta.AllocatableValue)2 AArch64MacroAssembler (org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler)2 AArch64Kind (jdk.vm.ci.aarch64.AArch64Kind)1 StackSlot (jdk.vm.ci.code.StackSlot)1 ValueUtil.asStackSlot (jdk.vm.ci.code.ValueUtil.asStackSlot)1 ValueUtil.isRegister (jdk.vm.ci.code.ValueUtil.isRegister)1 ValueUtil.isStackSlot (jdk.vm.ci.code.ValueUtil.isStackSlot)1 PlatformKind (jdk.vm.ci.meta.PlatformKind)1 Value (jdk.vm.ci.meta.Value)1 CompressEncoding (org.graalvm.compiler.core.common.CompressEncoding)1 ForeignCallLinkage (org.graalvm.compiler.core.common.spi.ForeignCallLinkage)1 HotSpotForeignCallsProvider (org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider)1 HotSpotProviders (org.graalvm.compiler.hotspot.meta.HotSpotProviders)1 VirtualStackSlot (org.graalvm.compiler.lir.VirtualStackSlot)1