Search in sources :

Example 11 with ScratchRegister

use of org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister in project graal by oracle.

the class SPARCMove method const2stack.

public static void const2stack(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Register constantTableBase, SPARCDelayedControlTransfer delaySlotLir, JavaConstant constant) {
    if (constant.isDefaultForKind() || constant.isNull()) {
        SPARCAddress resultAddress = (SPARCAddress) crb.asAddress(result);
        emitStore(g0.asValue(LIRKind.combine(result)), resultAddress, result.getPlatformKind(), delaySlotLir, null, crb, masm);
    } else {
        try (ScratchRegister sc = masm.getScratchRegister()) {
            Value scratchRegisterValue = sc.getRegister().asValue(LIRKind.combine(result));
            const2reg(crb, masm, scratchRegisterValue, constantTableBase, constant, SPARCDelayedControlTransfer.DUMMY);
            SPARCAddress resultAddress = (SPARCAddress) crb.asAddress(result);
            emitStore(scratchRegisterValue, resultAddress, result.getPlatformKind(), delaySlotLir, null, crb, masm);
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister) Value(jdk.vm.ci.meta.Value) AllocatableValue(jdk.vm.ci.meta.AllocatableValue) SPARCAddress(org.graalvm.compiler.asm.sparc.SPARCAddress)

Example 12 with ScratchRegister

use of org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister in project graal by oracle.

the class SPARCMove method emitLoad.

public static void emitLoad(CompilationResultBuilder crb, SPARCMacroAssembler masm, SPARCAddress address, Value result, boolean signExtend, PlatformKind kind, SPARCDelayedControlTransfer delayedControlTransfer, LIRFrameState state) {
    try (ScratchRegister sc = masm.getScratchRegister()) {
        Register scratch = sc.getRegister();
        final SPARCAddress addr = generateSimm13OffsetLoad(address, masm, scratch);
        final Register dst = asRegister(result);
        delayedControlTransfer.emitControlTransfer(crb, masm);
        if (state != null) {
            crb.recordImplicitException(masm.position(), state);
        }
        int byteCount = kind.getSizeInBytes();
        masm.ld(addr, dst, byteCount, signExtend);
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister) SPARCAssembler.isSingleFloatRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isSingleFloatRegister) SPARCAssembler.isCPURegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isCPURegister) SPARCAssembler.isDoubleFloatRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isDoubleFloatRegister) 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.sparc.SPARCMacroAssembler.ScratchRegister) SPARCAddress(org.graalvm.compiler.asm.sparc.SPARCAddress)

Example 13 with ScratchRegister

use of org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister in project graal by oracle.

the class SPARCMove method emitStore.

public static void emitStore(Value input, SPARCAddress address, PlatformKind kind, SPARCDelayedControlTransfer delayedControlTransfer, LIRFrameState state, CompilationResultBuilder crb, SPARCMacroAssembler masm) {
    try (ScratchRegister sc = masm.getScratchRegister()) {
        Register scratch = sc.getRegister();
        SPARCAddress addr = generateSimm13OffsetLoad(address, masm, scratch);
        delayedControlTransfer.emitControlTransfer(crb, masm);
        if (state != null) {
            crb.recordImplicitException(masm.position(), state);
        }
        int byteCount = kind.getSizeInBytes();
        masm.st(asRegister(input), addr, byteCount);
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister) SPARCAssembler.isSingleFloatRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isSingleFloatRegister) SPARCAssembler.isCPURegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isCPURegister) SPARCAssembler.isDoubleFloatRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isDoubleFloatRegister) 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.sparc.SPARCMacroAssembler.ScratchRegister) SPARCAddress(org.graalvm.compiler.asm.sparc.SPARCAddress)

Example 14 with ScratchRegister

use of org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister in project graal by oracle.

the class SPARCMove method loadFromConstantTable.

/**
 * This method creates a load from the constant section. It automatically respects the different
 * patterns used for small constant sections (<8k) and large constant sections (>=8k). The
 * generated patterns by this method must be understood by
 * CodeInstaller::pd_patch_DataSectionReference (jvmciCodeInstaller_sparc.cpp).
 *
 * @return the number of bytes loaded from the constant table
 */
public static int loadFromConstantTable(CompilationResultBuilder crb, SPARCMacroAssembler masm, Register constantTableBase, Constant input, Register dest, SPARCDelayedControlTransfer delaySlotInstruction) {
    SPARCAddress address;
    ScratchRegister scratch = null;
    try {
        Data data = crb.createDataItem(input);
        int size = data.getSize();
        if (masm.isImmediateConstantLoad()) {
            address = new SPARCAddress(constantTableBase, 0);
            // Make delayed only, when using immediate constant load.
            delaySlotInstruction.emitControlTransfer(crb, masm);
            crb.recordDataReferenceInCode(data, size);
        } else {
            scratch = masm.getScratchRegister();
            Register sr = scratch.getRegister();
            crb.recordDataReferenceInCode(data, size);
            masm.sethix(0, sr, true);
            address = new SPARCAddress(sr, 0);
        }
        masm.ld(address, dest, size, false);
        return size;
    } finally {
        if (scratch != null) {
            scratch.close();
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister) SPARCAssembler.isSingleFloatRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isSingleFloatRegister) SPARCAssembler.isCPURegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isCPURegister) SPARCAssembler.isDoubleFloatRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isDoubleFloatRegister) 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.sparc.SPARCMacroAssembler.ScratchRegister) Data(org.graalvm.compiler.code.DataSection.Data) SPARCAddress(org.graalvm.compiler.asm.sparc.SPARCAddress)

Aggregations

ScratchRegister (org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister)14 Register (jdk.vm.ci.code.Register)12 SPARCAddress (org.graalvm.compiler.asm.sparc.SPARCAddress)11 ValueUtil.asRegister (jdk.vm.ci.code.ValueUtil.asRegister)10 ValueUtil.isRegister (jdk.vm.ci.code.ValueUtil.isRegister)6 SPARCAssembler.isCPURegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isCPURegister)4 SPARCAssembler.isDoubleFloatRegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isDoubleFloatRegister)4 SPARCAssembler.isSingleFloatRegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isSingleFloatRegister)4 SPARCMacroAssembler (org.graalvm.compiler.asm.sparc.SPARCMacroAssembler)4 AllocatableValue (jdk.vm.ci.meta.AllocatableValue)2 Value (jdk.vm.ci.meta.Value)2 Label (org.graalvm.compiler.asm.Label)2 SPARCAssembler.isGlobalRegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isGlobalRegister)2 CallingConvention (jdk.vm.ci.code.CallingConvention)1 RegisterConfig (jdk.vm.ci.code.RegisterConfig)1 TargetDescription (jdk.vm.ci.code.TargetDescription)1 SPARC (jdk.vm.ci.sparc.SPARC)1 CPUFeature (jdk.vm.ci.sparc.SPARC.CPUFeature)1 Data (org.graalvm.compiler.code.DataSection.Data)1 CompressEncoding (org.graalvm.compiler.core.common.CompressEncoding)1