Search in sources :

Example 6 with ScratchRegister

use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.

the class AArch64HotSpotBackend method bangStackWithOffset.

@Override
protected void bangStackWithOffset(CompilationResultBuilder crb, int bangOffset) {
    AArch64MacroAssembler masm = (AArch64MacroAssembler) crb.asm;
    try (ScratchRegister sc = masm.getScratchRegister()) {
        Register scratch = sc.getRegister();
        AArch64Address address = masm.makeAddress(sp, -bangOffset, scratch, 8, /* allowOverwrite */
        false);
        masm.str(64, zr, address);
    }
}
Also used : AArch64MacroAssembler(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler) 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) AArch64Address(org.graalvm.compiler.asm.aarch64.AArch64Address)

Example 7 with ScratchRegister

use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.

the class AArch64TruffleCallBoundaryInstumentationFactory method createBuilder.

@Override
public CompilationResultBuilder createBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, DataBuilder dataBuilder, FrameContext frameContext, OptionValues options, DebugContext debug, CompilationResult compilationResult) {
    return new TruffleCallBoundaryInstrumentation(metaAccess, codeCache, foreignCalls, frameMap, asm, dataBuilder, frameContext, options, debug, compilationResult, config, registers) {

        @Override
        protected void injectTailCallCode(int installedCodeOffset, int entryPointOffset) {
            AArch64MacroAssembler masm = (AArch64MacroAssembler) this.asm;
            AArch64HotSpotBackend.emitInvalidatePlaceholder(this, masm);
            try (ScratchRegister scratch = masm.getScratchRegister()) {
                Register thisRegister = codeCache.getRegisterConfig().getCallingConventionRegisters(JavaCall, Object).get(0);
                Register spillRegister = scratch.getRegister();
                Label doProlog = new Label();
                if (config.useCompressedOops) {
                    CompressEncoding encoding = config.getOopEncoding();
                    masm.ldr(32, spillRegister, AArch64Address.createPairUnscaledImmediateAddress(thisRegister, installedCodeOffset));
                    Register base = encoding.hasBase() ? registers.getHeapBaseRegister() : null;
                    AArch64HotSpotMove.UncompressPointer.emitUncompressCode(masm, spillRegister, spillRegister, base, encoding.getShift(), true);
                } else {
                    masm.ldr(64, spillRegister, AArch64Address.createPairUnscaledImmediateAddress(thisRegister, installedCodeOffset));
                }
                masm.ldr(64, spillRegister, AArch64Address.createPairUnscaledImmediateAddress(spillRegister, entryPointOffset));
                masm.cbz(64, spillRegister, doProlog);
                masm.jmp(spillRegister);
                masm.nop();
                masm.bind(doProlog);
            }
        }
    };
}
Also used : AArch64MacroAssembler(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler) TruffleCallBoundaryInstrumentation(org.graalvm.compiler.truffle.compiler.hotspot.TruffleCallBoundaryInstrumentation) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) Register(jdk.vm.ci.code.Register) Label(org.graalvm.compiler.asm.Label) CompressEncoding(org.graalvm.compiler.core.common.CompressEncoding)

Example 8 with ScratchRegister

use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.

the class AArch64Move method stack2reg.

private static void stack2reg(CompilationResultBuilder crb, AArch64MacroAssembler masm, AllocatableValue result, AllocatableValue input) {
    AArch64Kind kind = (AArch64Kind) input.getPlatformKind();
    // use the slot kind to define the operand size
    final int size = kind.getSizeInBytes() * Byte.SIZE;
    if (kind.isInteger()) {
        AArch64Address src = loadStackSlotAddress(crb, masm, asStackSlot(input), result);
        masm.ldr(size, asRegister(result), src);
    } else {
        try (ScratchRegister sc = masm.getScratchRegister()) {
            AllocatableValue scratchRegisterValue = sc.getRegister().asValue(LIRKind.combine(input));
            AArch64Address src = loadStackSlotAddress(crb, masm, asStackSlot(input), scratchRegisterValue);
            masm.fldr(size, asRegister(result), src);
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) AArch64Kind(jdk.vm.ci.aarch64.AArch64Kind) AArch64Address(org.graalvm.compiler.asm.aarch64.AArch64Address) ValueUtil.asAllocatableValue(jdk.vm.ci.code.ValueUtil.asAllocatableValue) AllocatableValue(jdk.vm.ci.meta.AllocatableValue)

Example 9 with ScratchRegister

use of org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister in project graal by oracle.

the class AArch64Move method const2stack.

private static void const2stack(CompilationResultBuilder crb, AArch64MacroAssembler masm, Value result, JavaConstant constant) {
    try (ScratchRegister addrReg = masm.getScratchRegister()) {
        StackSlot slot = (StackSlot) result;
        AArch64Address resultAddress = loadStackSlotAddress(crb, masm, slot, addrReg.getRegister());
        if (constant.isDefaultForKind() || constant.isNull()) {
            emitStore(crb, masm, (AArch64Kind) result.getPlatformKind(), resultAddress, zr.asValue(LIRKind.combine(result)));
        } else {
            try (ScratchRegister sc = masm.getScratchRegister()) {
                Value scratchRegisterValue = sc.getRegister().asValue(LIRKind.combine(result));
                const2reg(crb, masm, scratchRegisterValue, constant);
                emitStore(crb, masm, (AArch64Kind) result.getPlatformKind(), resultAddress, scratchRegisterValue);
            }
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister) ValueUtil.asAllocatableValue(jdk.vm.ci.code.ValueUtil.asAllocatableValue) Value(jdk.vm.ci.meta.Value) AllocatableValue(jdk.vm.ci.meta.AllocatableValue) ValueUtil.asStackSlot(jdk.vm.ci.code.ValueUtil.asStackSlot) VirtualStackSlot(org.graalvm.compiler.lir.VirtualStackSlot) ValueUtil.isStackSlot(jdk.vm.ci.code.ValueUtil.isStackSlot) StackSlot(jdk.vm.ci.code.StackSlot) AArch64Address(org.graalvm.compiler.asm.aarch64.AArch64Address)

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