use of jdk.vm.ci.code.RegisterSaveLayout in project graal by oracle.
the class AMD64HotSpotLeaveCurrentStackFrameOp method emitCode.
@Override
public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
FrameMap frameMap = crb.frameMap;
RegisterConfig registerConfig = frameMap.getRegisterConfig();
RegisterSaveLayout registerSaveLayout = saveRegisterOp.getMap(frameMap);
Register stackPointer = registerConfig.getFrameRegister();
// Restore integer result register.
final int stackSlotSize = frameMap.getTarget().wordSize;
Register integerResultRegister = registerConfig.getReturnRegister(JavaKind.Long);
masm.movptr(integerResultRegister, new AMD64Address(stackPointer, registerSaveLayout.registerToSlot(integerResultRegister) * stackSlotSize));
masm.movptr(rdx, new AMD64Address(stackPointer, registerSaveLayout.registerToSlot(rdx) * stackSlotSize));
// Restore float result register.
Register floatResultRegister = registerConfig.getReturnRegister(JavaKind.Double);
masm.movdbl(floatResultRegister, new AMD64Address(stackPointer, registerSaveLayout.registerToSlot(floatResultRegister) * stackSlotSize));
/*
* All of the register save area will be popped of the stack. Only the return address
* remains.
*/
leaveFrameAndRestoreRbp(crb, masm);
// Remove return address.
masm.addq(stackPointer, crb.target.arch.getReturnAddressSize());
}
use of jdk.vm.ci.code.RegisterSaveLayout in project graal by oracle.
the class SPARCSaveRegistersOp method getMap.
@Override
public RegisterSaveLayout getMap(FrameMap frameMap) {
int total = 0;
for (int i = 0; i < savedRegisters.length; i++) {
if (savedRegisters[i] != null) {
total++;
}
}
Register[] keys = new Register[total];
int[] values = new int[total];
if (total != 0) {
int mapIndex = 0;
for (int i = 0; i < savedRegisters.length; i++) {
if (savedRegisters[i] != null) {
keys[mapIndex] = savedRegisters[i];
assert isStackSlot(slots[i]) : "not a StackSlot: " + slots[i];
StackSlot slot = asStackSlot(slots[i]);
values[mapIndex] = indexForStackSlot(frameMap, slot);
mapIndex++;
}
}
assert mapIndex == total;
}
return new RegisterSaveLayout(keys, values);
}
use of jdk.vm.ci.code.RegisterSaveLayout in project graal by oracle.
the class AMD64SaveRegistersOp method getMap.
@Override
public RegisterSaveLayout getMap(FrameMap frameMap) {
int total = 0;
for (int i = 0; i < savedRegisters.length; i++) {
if (savedRegisters[i] != null) {
total++;
}
}
Register[] keys = new Register[total];
int[] values = new int[total];
if (total != 0) {
int mapIndex = 0;
for (int i = 0; i < savedRegisters.length; i++) {
if (savedRegisters[i] != null) {
keys[mapIndex] = savedRegisters[i];
assert isStackSlot(slots[i]) : "not a StackSlot: " + slots[i];
StackSlot slot = asStackSlot(slots[i]);
values[mapIndex] = indexForStackSlot(frameMap, slot);
mapIndex++;
}
}
assert mapIndex == total;
}
return new RegisterSaveLayout(keys, values);
}
Aggregations