|
20 | 20 | #include "Z80Subtarget.h"
|
21 | 21 | #include "llvm/CodeGen/Analysis.h"
|
22 | 22 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
|
| 23 | +#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" |
23 | 24 | #include "llvm/Support/Debug.h"
|
24 | 25 | #include "llvm/Target/TargetMachine.h"
|
25 | 26 | using namespace llvm;
|
| 27 | +using namespace MIPatternMatch; |
26 | 28 |
|
27 | 29 | #define DEBUG_TYPE "z80-call-lowering"
|
28 | 30 |
|
@@ -128,46 +130,31 @@ struct CallArgHandler : public Z80OutgoingValueHandler {
|
128 | 130 | Register getStackAddress(uint64_t Size, int64_t Offset,
|
129 | 131 | MachinePointerInfo &MPO,
|
130 | 132 | ISD::ArgFlagsTy Flags) override {
|
131 |
| - return Z80OutgoingValueHandler::getStackAddress(Size, Offset, MPO, Flags); |
| 133 | + return Z80OutgoingValueHandler::getStackAddress( |
| 134 | + Size, Offset - SetupFrameAdjustment, MPO, Flags); |
132 | 135 | }
|
133 | 136 |
|
134 | 137 | void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy,
|
135 | 138 | MachinePointerInfo &MPO, CCValAssign &VA) override {
|
136 |
| - if (MachineInstr *AddrMI = MRI.getVRegDef(Addr)) { |
137 |
| - LLT SlotTy = LLT::scalar(DL.getIndexSizeInBits(0)); |
138 |
| - if (VA.getLocVT().getStoreSize() == SlotTy.getSizeInBytes() && |
139 |
| - AddrMI->getOpcode() == TargetOpcode::G_PTR_ADD) { |
140 |
| - if (MachineInstr *BaseMI = |
141 |
| - getDefIgnoringCopies(AddrMI->getOperand(1).getReg(), MRI)) { |
142 |
| - if (auto OffConst = getIConstantVRegValWithLookThrough( |
143 |
| - AddrMI->getOperand(2).getReg(), MRI)) { |
144 |
| - if (BaseMI->getOpcode() == TargetOpcode::COPY && |
145 |
| - BaseMI->getOperand(1).getReg() == |
146 |
| - STI.getRegisterInfo()->getStackRegister() && |
147 |
| - OffConst->Value == SetupFrameAdjustment) { |
148 |
| - auto SaveInsertPt = std::prev(MIRBuilder.getInsertPt()); |
149 |
| - MIRBuilder.setInsertPt(MIRBuilder.getMBB(), StackPushes); |
150 |
| - --StackPushes; |
151 |
| - if (MemTy.getSizeInBits() < SlotTy.getSizeInBits()) |
152 |
| - ValVReg = MIRBuilder.buildAnyExt(SlotTy, ValVReg).getReg(0); |
153 |
| - MIRBuilder.buildInstr(STI.is24Bit() ? Z80::PUSH24r : Z80::PUSH16r, |
154 |
| - {}, {ValVReg}); |
155 |
| - ++StackPushes; |
156 |
| - MIRBuilder.setInsertPt(MIRBuilder.getMBB(), |
157 |
| - std::next(SaveInsertPt)); |
158 |
| - SetupFrameAdjustment += SlotTy.getSizeInBytes(); |
159 |
| - return; |
160 |
| - } |
161 |
| - } |
162 |
| - } |
163 |
| - } |
| 139 | + LLT SlotTy = LLT::scalar(DL.getIndexSizeInBits(0)); |
| 140 | + if (VA.getLocVT().getStoreSize() != SlotTy.getSizeInBytes() || |
| 141 | + !mi_match(Addr, MRI, |
| 142 | + m_GPtrAdd(m_SpecificReg(SPRegCopy), m_ZeroInt()))) { |
| 143 | + Z80OutgoingValueHandler::assignValueToAddress(ValVReg, Addr, MemTy, MPO, |
| 144 | + VA); |
| 145 | + return; |
164 | 146 | }
|
165 |
| - LLT PtrTy = LLT::pointer(0, DL.getPointerSizeInBits(0)); |
166 |
| - LLT OffTy = LLT::scalar(DL.getIndexSizeInBits(0)); |
167 |
| - auto OffI = MIRBuilder.buildConstant(OffTy, -SetupFrameAdjustment); |
168 |
| - Addr = MIRBuilder.buildPtrAdd(PtrTy, Addr, OffI).getReg(0); |
169 |
| - Z80OutgoingValueHandler::assignValueToAddress(ValVReg, Addr, MemTy, MPO, |
170 |
| - VA); |
| 147 | + |
| 148 | + auto SaveInsertPt = std::prev(MIRBuilder.getInsertPt()); |
| 149 | + MIRBuilder.setInsertPt(MIRBuilder.getMBB(), StackPushes); |
| 150 | + --StackPushes; |
| 151 | + if (MemTy.getSizeInBits() < SlotTy.getSizeInBits()) |
| 152 | + ValVReg = MIRBuilder.buildAnyExt(SlotTy, ValVReg).getReg(0); |
| 153 | + MIRBuilder.buildInstr(STI.is24Bit() ? Z80::PUSH24r : Z80::PUSH16r, {}, |
| 154 | + {ValVReg}); |
| 155 | + ++StackPushes; |
| 156 | + MIRBuilder.setInsertPt(MIRBuilder.getMBB(), std::next(SaveInsertPt)); |
| 157 | + SetupFrameAdjustment += SlotTy.getSizeInBytes(); |
171 | 158 | }
|
172 | 159 |
|
173 | 160 | bool finalize(CCState &State) override {
|
|
0 commit comments