Merge pull request #3563 from Sonicadvance1/fill_spill_pairs

JIT: Adds support for spilling/Filling GPRPair
This commit is contained in:
Mai authored and GitHub committed 2024-04-08 23:05:11 -04:00
commit eedb120fd0
1 file changed
+58 -1
@@ -771,7 +771,36 @@ DEF_OP(SpillRegister) {
LOGMAN_MSG_A_FMT("Unhandled SpillRegister size: {}", OpSize);
break;
}
} else {
} else if (Op->Class == FEXCore::IR::GPRPairClass) {
const auto Src = GetRegPair(Op->Value.ID());
switch (OpSize) {
case 8: {
if (SlotOffset <= 252 && (SlotOffset & 0b11) == 0) {
stp<ARMEmitter::IndexType::OFFSET>(Src.first.W(), Src.second.W(), ARMEmitter::Reg::rsp, SlotOffset);
}
else {
add(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Reg::rsp, SlotOffset);
stp<ARMEmitter::IndexType::OFFSET>(Src.first.W(), Src.second.W(), TMP1, 0);
}
break;
}
case 16: {
if (SlotOffset <= 504 && (SlotOffset & 0b111) == 0) {
stp<ARMEmitter::IndexType::OFFSET>(Src.first.X(), Src.second.X(), ARMEmitter::Reg::rsp, SlotOffset);
}
else {
add(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Reg::rsp, SlotOffset);
stp<ARMEmitter::IndexType::OFFSET>(Src.first.X(), Src.second.X(), TMP1, 0);
}
break;
}
default:
LOGMAN_MSG_A_FMT("Unhandled SpillRegister(GPRPair) size: {}", OpSize);
break;
}
}
else {
LOGMAN_MSG_A_FMT("Unhandled SpillRegister class: {}", Op->Class.Val);
}
}
@@ -871,6 +900,34 @@ DEF_OP(FillRegister) {
LOGMAN_MSG_A_FMT("Unhandled FillRegister size: {}", OpSize);
break;
}
} else if (Op->Class == FEXCore::IR::GPRPairClass) {
const auto Src = GetRegPair(Node);
switch (OpSize) {
case 8: {
if (SlotOffset <= 252 && (SlotOffset & 0b11) == 0) {
ldp<ARMEmitter::IndexType::OFFSET>(Src.first.W(), Src.second.W(), ARMEmitter::Reg::rsp, SlotOffset);
}
else {
add(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Reg::rsp, SlotOffset);
ldp<ARMEmitter::IndexType::OFFSET>(Src.first.W(), Src.second.W(), TMP1, 0);
}
break;
}
case 16: {
if (SlotOffset <= 504 && (SlotOffset & 0b111) == 0) {
ldp<ARMEmitter::IndexType::OFFSET>(Src.first.X(), Src.second.X(), ARMEmitter::Reg::rsp, SlotOffset);
}
else {
add(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Reg::rsp, SlotOffset);
ldp<ARMEmitter::IndexType::OFFSET>(Src.first.X(), Src.second.X(), TMP1, 0);
}
break;
}
default:
LOGMAN_MSG_A_FMT("Unhandled FillRegister(GPRPair) size: {}", OpSize);
break;
}
} else {
LOGMAN_MSG_A_FMT("Unhandled FillRegister class: {}", Op->Class.Val);
}