Search in sources :

Example 1 with AMD64SaveRegistersOp

use of org.graalvm.compiler.lir.amd64.AMD64SaveRegistersOp in project graal by oracle.

the class AMD64HotSpotLIRGenerator method emitSaveRegisters.

/**
 * @param savedRegisters the registers saved by this operation which may be subject to pruning
 * @param savedRegisterLocations the slots to which the registers are saved
 * @param supportsRemove determines if registers can be pruned
 */
protected AMD64SaveRegistersOp emitSaveRegisters(Register[] savedRegisters, AllocatableValue[] savedRegisterLocations, boolean supportsRemove) {
    AMD64SaveRegistersOp save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations, supportsRemove);
    append(save);
    return save;
}
Also used : AMD64SaveRegistersOp(org.graalvm.compiler.lir.amd64.AMD64SaveRegistersOp)

Example 2 with AMD64SaveRegistersOp

use of org.graalvm.compiler.lir.amd64.AMD64SaveRegistersOp in project graal by oracle.

the class AMD64HotSpotLIRGenerator method emitForeignCall.

@Override
public Variable emitForeignCall(ForeignCallLinkage linkage, LIRFrameState state, Value... args) {
    HotSpotForeignCallLinkage hotspotLinkage = (HotSpotForeignCallLinkage) linkage;
    boolean destroysRegisters = hotspotLinkage.destroysRegisters();
    AMD64SaveRegistersOp save = null;
    Stub stub = getStub();
    if (destroysRegisters) {
        if (stub != null && stub.preservesRegisters()) {
            Register[] savedRegisters = getRegisterConfig().getAllocatableRegisters().toArray();
            save = emitSaveAllRegisters(savedRegisters, true);
        }
    }
    Variable result;
    LIRFrameState debugInfo = null;
    if (hotspotLinkage.needsDebugInfo()) {
        debugInfo = state;
        assert debugInfo != null || stub != null;
    }
    if (hotspotLinkage.needsJavaFrameAnchor()) {
        Register thread = getProviders().getRegisters().getThreadRegister();
        append(new AMD64HotSpotCRuntimeCallPrologueOp(config.threadLastJavaSpOffset(), thread));
        result = super.emitForeignCall(hotspotLinkage, debugInfo, args);
        append(new AMD64HotSpotCRuntimeCallEpilogueOp(config.threadLastJavaSpOffset(), config.threadLastJavaFpOffset(), config.threadLastJavaPcOffset(), thread));
    } else {
        result = super.emitForeignCall(hotspotLinkage, debugInfo, args);
    }
    if (destroysRegisters) {
        if (stub != null) {
            if (stub.preservesRegisters()) {
                HotSpotLIRGenerationResult generationResult = getResult();
                LIRFrameState key = currentRuntimeCallInfo;
                if (key == null) {
                    key = LIRFrameState.NO_STATE;
                }
                assert !generationResult.getCalleeSaveInfo().containsKey(key);
                generationResult.getCalleeSaveInfo().put(key, save);
                emitRestoreRegisters(save);
            }
        }
    }
    return result;
}
Also used : LIRFrameState(org.graalvm.compiler.lir.LIRFrameState) Variable(org.graalvm.compiler.lir.Variable) Register(jdk.vm.ci.code.Register) HotSpotLIRGenerationResult(org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult) HotSpotForeignCallLinkage(org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage) AMD64SaveRegistersOp(org.graalvm.compiler.lir.amd64.AMD64SaveRegistersOp) Stub(org.graalvm.compiler.hotspot.stubs.Stub)

Aggregations

AMD64SaveRegistersOp (org.graalvm.compiler.lir.amd64.AMD64SaveRegistersOp)2 Register (jdk.vm.ci.code.Register)1 HotSpotForeignCallLinkage (org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage)1 HotSpotLIRGenerationResult (org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult)1 Stub (org.graalvm.compiler.hotspot.stubs.Stub)1 LIRFrameState (org.graalvm.compiler.lir.LIRFrameState)1 Variable (org.graalvm.compiler.lir.Variable)1