use of jdk.vm.ci.code.RegisterValue in project graal by oracle.
the class AMD64VZeroUpper method initRegisterValues.
private static RegisterValue[] initRegisterValues(Value[] exclude) {
BitSet skippedRegs = new BitSet();
int numSkipped = 0;
if (exclude != null) {
for (Value value : exclude) {
if (isRegister(value) && asRegister(value).getRegisterCategory().equals(AMD64.XMM)) {
skippedRegs.set(asRegister(value).number);
numSkipped++;
}
}
}
RegisterValue[] regs = new RegisterValue[AMD64.xmmRegistersAVX512.length - numSkipped];
for (int i = 0, j = 0; i < AMD64.xmmRegistersAVX512.length; i++) {
Register reg = AMD64.xmmRegistersAVX512[i];
if (!skippedRegs.get(reg.number)) {
regs[j++] = reg.asValue();
}
}
return regs;
}
use of jdk.vm.ci.code.RegisterValue in project graal by oracle.
the class ShadowedRegisterValue method forEachComponent.
@Override
public CompositeValue forEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueProcedure proc) {
RegisterValue newRegister = (RegisterValue) proc.doValue(inst, register, mode, registerFlags);
AllocatableValue newStackSlot = (AllocatableValue) proc.doValue(inst, stackslot, mode, stackslotFlags);
if (register.equals(newRegister) || stackslot.equals(newStackSlot)) {
return this;
}
return new ShadowedRegisterValue(newRegister, newStackSlot);
}
use of jdk.vm.ci.code.RegisterValue in project graal by oracle.
the class TraceGlobalMoveResolutionPhase method addMappingToRegister.
private static void addMappingToRegister(MoveResolver moveResolver, Value from, RegisterValue register) {
if (isShadowedRegisterValue(from)) {
RegisterValue fromReg = asShadowedRegisterValue(from).getRegister();
AllocatableValue fromStack = asShadowedRegisterValue(from).getStackSlot();
checkAndAddMapping(moveResolver, fromReg, register, fromStack);
} else {
checkAndAddMapping(moveResolver, from, register, null);
}
}
use of jdk.vm.ci.code.RegisterValue in project graal by oracle.
the class TraceGlobalMoveResolutionPhase method addMappingToStackSlot.
private static void addMappingToStackSlot(MoveResolver moveResolver, Value from, AllocatableValue stack) {
if (isShadowedRegisterValue(from)) {
ShadowedRegisterValue shadowedFrom = asShadowedRegisterValue(from);
RegisterValue fromReg = shadowedFrom.getRegister();
AllocatableValue fromStack = shadowedFrom.getStackSlot();
if (!fromStack.equals(stack)) {
checkAndAddMapping(moveResolver, fromReg, stack, fromStack);
}
} else {
checkAndAddMapping(moveResolver, from, stack, null);
}
}
use of jdk.vm.ci.code.RegisterValue in project graal by oracle.
the class SaveCalleeSaveRegisters method saveAtEntry.
private static RegisterMap<Variable> saveAtEntry(LIR lir, LIRGeneratorTool lirGen, LIRGenerationResult lirGenRes, RegisterArray calleeSaveRegisters, Architecture arch) {
AbstractBlockBase<?> startBlock = lir.getControlFlowGraph().getStartBlock();
ArrayList<LIRInstruction> instructions = lir.getLIRforBlock(startBlock);
int insertionIndex = 1;
LIRInsertionBuffer buffer = new LIRInsertionBuffer();
buffer.init(instructions);
StandardOp.LabelOp entry = (StandardOp.LabelOp) instructions.get(insertionIndex - 1);
RegisterValue[] savedRegisterValues = new RegisterValue[calleeSaveRegisters.size()];
int savedRegisterValueIndex = 0;
RegisterMap<Variable> saveMap = new RegisterMap<>(arch);
for (Register register : calleeSaveRegisters) {
PlatformKind registerPlatformKind = arch.getLargestStorableKind(register.getRegisterCategory());
LIRKind lirKind = LIRKind.value(registerPlatformKind);
RegisterValue registerValue = register.asValue(lirKind);
Variable saveVariable = lirGen.newVariable(lirKind);
LIRInstruction save = lirGen.getSpillMoveFactory().createMove(saveVariable, registerValue);
buffer.append(insertionIndex, save);
save.setComment(lirGenRes, "SaveCalleeSavedRegisters: saveAtEntry");
saveMap.put(register, saveVariable);
savedRegisterValues[savedRegisterValueIndex++] = registerValue;
}
entry.addIncomingValues(savedRegisterValues);
buffer.finish();
return saveMap;
}
Aggregations