Search in sources :

Example 1 with Register

use of jdk.vm.ci.code.Register in project graal by oracle.

the class AMD64HotSpotBackend method emitCodePrefix.

/**
 * Emits the code prior to the verified entry point.
 *
 * @param installedCodeOwner see {@link Backend#emitCode}
 */
public void emitCodePrefix(ResolvedJavaMethod installedCodeOwner, CompilationResultBuilder crb, AMD64MacroAssembler asm, RegisterConfig regConfig, Label verifiedEntry) {
    HotSpotProviders providers = getProviders();
    if (installedCodeOwner != null && !installedCodeOwner.isStatic()) {
        crb.recordMark(config.MARKID_UNVERIFIED_ENTRY);
        CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, new JavaType[] { providers.getMetaAccess().lookupJavaType(Object.class) }, this);
        // see definition of IC_Klass in
        Register inlineCacheKlass = rax;
        // c1_LIRAssembler_x86.cpp
        Register receiver = asRegister(cc.getArgument(0));
        AMD64Address src = new AMD64Address(receiver, config.hubOffset);
        if (config.useCompressedClassPointers) {
            Register register = r10;
            AMD64HotSpotMove.decodeKlassPointer(crb, asm, register, providers.getRegisters().getHeapBaseRegister(), src, config);
            if (GeneratePIC.getValue(crb.getOptions())) {
                asm.movq(providers.getRegisters().getHeapBaseRegister(), asm.getPlaceholder(-1));
                crb.recordMark(config.MARKID_NARROW_OOP_BASE_ADDRESS);
            } else {
                if (config.narrowKlassBase != 0) {
                    // The heap base register was destroyed above, so restore it
                    asm.movq(providers.getRegisters().getHeapBaseRegister(), config.narrowOopBase);
                }
            }
            asm.cmpq(inlineCacheKlass, register);
        } else {
            asm.cmpq(inlineCacheKlass, src);
        }
        AMD64Call.directConditionalJmp(crb, asm, getForeignCalls().lookupForeignCall(IC_MISS_HANDLER), ConditionFlag.NotEqual);
    }
    asm.align(config.codeEntryAlignment);
    crb.recordMark(config.MARKID_OSR_ENTRY);
    asm.bind(verifiedEntry);
    crb.recordMark(config.MARKID_VERIFIED_ENTRY);
    if (GeneratePIC.getValue(crb.getOptions())) {
        // Check for method state
        HotSpotFrameContext frameContext = (HotSpotFrameContext) crb.frameContext;
        if (!frameContext.isStub) {
            crb.recordInlineDataInCodeWithNote(new HotSpotSentinelConstant(LIRKind.value(AMD64Kind.QWORD), JavaKind.Long), HotSpotConstantLoadAction.MAKE_NOT_ENTRANT);
            asm.movq(AMD64.rax, asm.getPlaceholder(-1));
            asm.testq(AMD64.rax, AMD64.rax);
            AMD64Call.directConditionalJmp(crb, asm, getForeignCalls().lookupForeignCall(WRONG_METHOD_HANDLER), ConditionFlag.NotZero);
        }
    }
}
Also used : CallingConvention(jdk.vm.ci.code.CallingConvention) Register(jdk.vm.ci.code.Register) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) HotSpotProviders(org.graalvm.compiler.hotspot.meta.HotSpotProviders) HotSpotSentinelConstant(jdk.vm.ci.hotspot.HotSpotSentinelConstant) AMD64Address(org.graalvm.compiler.asm.amd64.AMD64Address)

Example 2 with Register

use of jdk.vm.ci.code.Register in project graal by oracle.

the class AMD64HotSpotCounterOp method emitCode.

@Override
public void emitCode(CompilationResultBuilder crb) {
    AMD64MacroAssembler masm = (AMD64MacroAssembler) crb.asm;
    TargetDescription target = crb.target;
    Register scratch;
    // want to spill it to the stack.
    if (!contains(increments, rax)) {
        scratch = rax;
    } else if (!contains(increments, rbx)) {
        scratch = rbx;
    } else {
        // emitIncrement().
        throw GraalError.unimplemented("RAX and RBX are increment registers at the same time, spilling over the scratch register is not supported right now");
    }
    // address for counters array
    AMD64Address countersArrayAddr = new AMD64Address(thread, config.jvmciCountersThreadOffset);
    Register countersArrayReg = scratch;
    // backup scratch register
    masm.movq((AMD64Address) crb.asAddress(backupSlot), scratch);
    // load counters array
    masm.movptr(countersArrayReg, countersArrayAddr);
    CounterProcedure emitProcedure = (counterIndex, increment, displacement) -> emitIncrement(masm, countersArrayReg, increment, displacement);
    forEachCounter(emitProcedure, target);
    // restore scratch register
    masm.movq(scratch, (AMD64Address) crb.asAddress(backupSlot));
}
Also used : HotSpotCounterOp(org.graalvm.compiler.hotspot.HotSpotCounterOp) AMD64.rax(jdk.vm.ci.amd64.AMD64.rax) AMD64.rbx(jdk.vm.ci.amd64.AMD64.rbx) LIRValueUtil.asJavaConstant(org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant) CompilationResultBuilder(org.graalvm.compiler.lir.asm.CompilationResultBuilder) Register(jdk.vm.ci.code.Register) LIRValueUtil.isJavaConstant(org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant) TargetDescription(jdk.vm.ci.code.TargetDescription) Value(jdk.vm.ci.meta.Value) AMD64Address(org.graalvm.compiler.asm.amd64.AMD64Address) HotSpotRegistersProvider(org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) Opcode(org.graalvm.compiler.lir.Opcode) GraalError(org.graalvm.compiler.debug.GraalError) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) GraalHotSpotVMConfig(org.graalvm.compiler.hotspot.GraalHotSpotVMConfig) AMD64MacroAssembler(org.graalvm.compiler.asm.amd64.AMD64MacroAssembler) LIRInstructionClass(org.graalvm.compiler.lir.LIRInstructionClass) AllocatableValue(jdk.vm.ci.meta.AllocatableValue) Register(jdk.vm.ci.code.Register) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) AMD64MacroAssembler(org.graalvm.compiler.asm.amd64.AMD64MacroAssembler) TargetDescription(jdk.vm.ci.code.TargetDescription) AMD64Address(org.graalvm.compiler.asm.amd64.AMD64Address)

Example 3 with Register

use of jdk.vm.ci.code.Register in project graal by oracle.

the class AArch64HotSpotLIRGenerator method emitReturn.

@Override
public void emitReturn(JavaKind kind, Value input) {
    AllocatableValue operand = Value.ILLEGAL;
    if (input != null) {
        operand = resultOperandFor(kind, input.getValueKind());
        emitMove(operand, input);
    }
    Register thread = getProviders().getRegisters().getThreadRegister();
    append(new AArch64HotSpotReturnOp(operand, getStub() != null, config, thread));
}
Also used : Register(jdk.vm.ci.code.Register) AllocatableValue(jdk.vm.ci.meta.AllocatableValue)

Example 4 with Register

use of jdk.vm.ci.code.Register in project graal by oracle.

the class AArch64HotSpotNodeLIRBuilder method visitSafepointNode.

@Override
public void visitSafepointNode(SafepointNode i) {
    LIRFrameState info = state(i);
    Register thread = getGen().getProviders().getRegisters().getThreadRegister();
    Variable scratch = gen.newVariable(LIRKind.value(getGen().target().arch.getWordKind()));
    append(new AArch64HotSpotSafepointOp(info, getGen().config, thread, scratch));
}
Also used : LIRFrameState(org.graalvm.compiler.lir.LIRFrameState) Variable(org.graalvm.compiler.lir.Variable) AArch64HotSpotRegisterConfig.inlineCacheRegister(jdk.vm.ci.hotspot.aarch64.AArch64HotSpotRegisterConfig.inlineCacheRegister) Register(jdk.vm.ci.code.Register) AArch64HotSpotRegisterConfig.metaspaceMethodRegister(jdk.vm.ci.hotspot.aarch64.AArch64HotSpotRegisterConfig.metaspaceMethodRegister)

Example 5 with Register

use of jdk.vm.ci.code.Register in project graal by oracle.

the class AArch64HotSpotNodeLIRBuilder method emitJumpToExceptionHandlerInCaller.

@Override
public void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc) {
    Variable handler = gen.load(operand(handlerInCallerPc));
    ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(EXCEPTION_HANDLER_IN_CALLER);
    CallingConvention outgoingCc = linkage.getOutgoingCallingConvention();
    assert outgoingCc.getArgumentCount() == 2;
    RegisterValue exceptionFixed = (RegisterValue) outgoingCc.getArgument(0);
    RegisterValue exceptionPcFixed = (RegisterValue) outgoingCc.getArgument(1);
    gen.emitMove(exceptionFixed, operand(exception));
    gen.emitMove(exceptionPcFixed, operand(exceptionPc));
    Register thread = getGen().getProviders().getRegisters().getThreadRegister();
    AArch64HotSpotJumpToExceptionHandlerInCallerOp op = new AArch64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed, getGen().config.threadIsMethodHandleReturnOffset, thread, getGen().config);
    append(op);
}
Also used : CallingConvention(jdk.vm.ci.code.CallingConvention) RegisterValue(jdk.vm.ci.code.RegisterValue) Variable(org.graalvm.compiler.lir.Variable) AArch64HotSpotRegisterConfig.inlineCacheRegister(jdk.vm.ci.hotspot.aarch64.AArch64HotSpotRegisterConfig.inlineCacheRegister) Register(jdk.vm.ci.code.Register) AArch64HotSpotRegisterConfig.metaspaceMethodRegister(jdk.vm.ci.hotspot.aarch64.AArch64HotSpotRegisterConfig.metaspaceMethodRegister) ForeignCallLinkage(org.graalvm.compiler.core.common.spi.ForeignCallLinkage)

Aggregations

Register (jdk.vm.ci.code.Register)152 ValueUtil.asRegister (jdk.vm.ci.code.ValueUtil.asRegister)92 ValueUtil.isRegister (jdk.vm.ci.code.ValueUtil.isRegister)28 Label (org.graalvm.compiler.asm.Label)27 AMD64Address (org.graalvm.compiler.asm.amd64.AMD64Address)25 Test (org.junit.Test)21 CallingConvention (jdk.vm.ci.code.CallingConvention)20 TargetDescription (jdk.vm.ci.code.TargetDescription)15 AArch64Address (org.graalvm.compiler.asm.aarch64.AArch64Address)15 RegisterConfig (jdk.vm.ci.code.RegisterConfig)14 ScratchRegister (org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister)14 SPARCAddress (org.graalvm.compiler.asm.sparc.SPARCAddress)14 ScratchRegister (org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister)14 AssemblerTest (org.graalvm.compiler.asm.test.AssemblerTest)11 CompilationResult (org.graalvm.compiler.code.CompilationResult)11 Variable (org.graalvm.compiler.lir.Variable)11 Value (jdk.vm.ci.meta.Value)9 AMD64Assembler (org.graalvm.compiler.asm.amd64.AMD64Assembler)9 DebugContext (org.graalvm.compiler.debug.DebugContext)9 Indent (org.graalvm.compiler.debug.Indent)9