Search in sources :

Example 1 with CPUFeature

use of jdk.vm.ci.sparc.SPARC.CPUFeature in project graal by oracle.

the class SPARCMove method const2reg.

public static void const2reg(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Register constantTableBase, JavaConstant input, SPARCDelayedControlTransfer delaySlotLir) {
    try (ScratchRegister sc = masm.getScratchRegister()) {
        Register scratch = sc.getRegister();
        Set<CPUFeature> cpuFeatures = ((SPARC) masm.target.arch).getFeatures();
        boolean hasVIS1 = cpuFeatures.contains(CPUFeature.VIS1);
        boolean hasVIS3 = cpuFeatures.contains(CPUFeature.VIS3);
        Register resultRegister = asRegister(result);
        switch(input.getJavaKind().getStackKind()) {
            case Int:
                if (input.isDefaultForKind()) {
                    delaySlotLir.emitControlTransfer(crb, masm);
                    masm.clr(resultRegister);
                } else if (isSimm13(input.asInt())) {
                    delaySlotLir.emitControlTransfer(crb, masm);
                    masm.or(g0, input.asInt(), resultRegister);
                } else {
                    if (constantTableBase.equals(g0)) {
                        throw GraalError.shouldNotReachHere();
                    } else {
                        loadFromConstantTable(crb, masm, constantTableBase, input, resultRegister, delaySlotLir);
                    }
                }
                break;
            case Long:
                if (input.isDefaultForKind()) {
                    delaySlotLir.emitControlTransfer(crb, masm);
                    masm.clr(resultRegister);
                } else if (isSimm13(input.asLong())) {
                    delaySlotLir.emitControlTransfer(crb, masm);
                    masm.or(g0, (int) input.asLong(), resultRegister);
                } else {
                    loadFromConstantTable(crb, masm, constantTableBase, input, resultRegister, delaySlotLir);
                }
                break;
            case Float:
                {
                    float constant = input.asFloat();
                    int constantBits = java.lang.Float.floatToIntBits(constant);
                    if (hasVIS1 && constantBits == 0) {
                        delaySlotLir.emitControlTransfer(crb, masm);
                        masm.fzeros(resultRegister);
                    } else {
                        if (hasVIS3 && isSimm13(constantBits)) {
                            masm.or(g0, constantBits, scratch);
                            delaySlotLir.emitControlTransfer(crb, masm);
                            masm.movwtos(scratch, resultRegister);
                        } else {
                            // First load the address into the scratch register
                            loadFromConstantTable(crb, masm, constantTableBase, input, resultRegister, delaySlotLir);
                        }
                    }
                    break;
                }
            case Double:
                {
                    double constant = input.asDouble();
                    long constantBits = java.lang.Double.doubleToRawLongBits(constant);
                    if (hasVIS1 && constantBits == 0) {
                        delaySlotLir.emitControlTransfer(crb, masm);
                        masm.fzerod(resultRegister);
                    } else {
                        if (hasVIS3 && isSimm13(constantBits)) {
                            masm.or(g0, (int) constantBits, scratch);
                            delaySlotLir.emitControlTransfer(crb, masm);
                            masm.movxtod(scratch, resultRegister);
                        } else {
                            loadFromConstantTable(crb, masm, constantTableBase, input, resultRegister, delaySlotLir);
                        }
                    }
                    break;
                }
            case Object:
                if (input.isNull()) {
                    delaySlotLir.emitControlTransfer(crb, masm);
                    masm.clr(resultRegister);
                } else {
                    loadFromConstantTable(crb, masm, constantTableBase, input, resultRegister, delaySlotLir);
                }
                break;
            default:
                throw GraalError.shouldNotReachHere("missing: " + input.getJavaKind());
        }
    }
}
Also used : ScratchRegister(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister) SPARC(jdk.vm.ci.sparc.SPARC) CPUFeature(jdk.vm.ci.sparc.SPARC.CPUFeature) 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)

Aggregations

Register (jdk.vm.ci.code.Register)1 ValueUtil.asRegister (jdk.vm.ci.code.ValueUtil.asRegister)1 ValueUtil.isRegister (jdk.vm.ci.code.ValueUtil.isRegister)1 SPARC (jdk.vm.ci.sparc.SPARC)1 CPUFeature (jdk.vm.ci.sparc.SPARC.CPUFeature)1 SPARCAssembler.isCPURegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isCPURegister)1 SPARCAssembler.isDoubleFloatRegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isDoubleFloatRegister)1 SPARCAssembler.isSingleFloatRegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isSingleFloatRegister)1 ScratchRegister (org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister)1