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());
}
}
}
Aggregations