blob: 031ac7aa87cc5e5a0e931e0e73964f9911f73419 [file] [log] [blame]
Evan Chengb9803a82009-11-06 23:52:48 +00001//===-- ARMExpandPseudoInsts.cpp - Expand pseudo instructions -----*- C++ -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Bob Wilson656edcf2010-09-08 23:39:54 +000010// This file contains a pass that expands pseudo instructions into target
Evan Chengb9803a82009-11-06 23:52:48 +000011// instructions to allow proper scheduling, if-conversion, and other late
12// optimizations. This pass should be run after register allocation but before
Bob Wilson656edcf2010-09-08 23:39:54 +000013// the post-regalloc scheduling pass.
Evan Chengb9803a82009-11-06 23:52:48 +000014//
15//===----------------------------------------------------------------------===//
16
17#define DEBUG_TYPE "arm-pseudo"
18#include "ARM.h"
19#include "ARMBaseInstrInfo.h"
20#include "llvm/CodeGen/MachineFunctionPass.h"
21#include "llvm/CodeGen/MachineInstrBuilder.h"
Chris Lattner4dbbe342010-07-20 21:17:29 +000022#include "llvm/Target/TargetRegisterInfo.h"
Evan Chengb9803a82009-11-06 23:52:48 +000023using namespace llvm;
24
25namespace {
26 class ARMExpandPseudo : public MachineFunctionPass {
Bob Wilson709d5922010-08-25 23:27:42 +000027 // Constants for register spacing in NEON load/store instructions.
28 enum NEONRegSpacing {
29 SingleSpc,
30 EvenDblSpc,
31 OddDblSpc
32 };
33
Evan Chengb9803a82009-11-06 23:52:48 +000034 public:
35 static char ID;
Owen Anderson90c579d2010-08-06 18:33:48 +000036 ARMExpandPseudo() : MachineFunctionPass(ID) {}
Evan Chengb9803a82009-11-06 23:52:48 +000037
38 const TargetInstrInfo *TII;
Evan Chengd929f772010-05-13 00:17:02 +000039 const TargetRegisterInfo *TRI;
Evan Chengb9803a82009-11-06 23:52:48 +000040
41 virtual bool runOnMachineFunction(MachineFunction &Fn);
42
43 virtual const char *getPassName() const {
44 return "ARM pseudo instruction expansion pass";
45 }
46
47 private:
Evan Cheng43130072010-05-12 23:13:12 +000048 void TransferImpOps(MachineInstr &OldMI,
49 MachineInstrBuilder &UseMI, MachineInstrBuilder &DefMI);
Evan Chengb9803a82009-11-06 23:52:48 +000050 bool ExpandMBB(MachineBasicBlock &MBB);
Bob Wilsonffde0802010-09-02 16:00:54 +000051 void ExpandVLD(MachineBasicBlock::iterator &MBBI, unsigned Opc,
52 bool hasWriteBack, NEONRegSpacing RegSpc, unsigned NumRegs);
Bob Wilson01ba4612010-08-26 18:51:29 +000053 void ExpandVST(MachineBasicBlock::iterator &MBBI, unsigned Opc,
54 bool hasWriteBack, NEONRegSpacing RegSpc, unsigned NumRegs);
Evan Chengb9803a82009-11-06 23:52:48 +000055 };
56 char ARMExpandPseudo::ID = 0;
57}
58
Evan Cheng43130072010-05-12 23:13:12 +000059/// TransferImpOps - Transfer implicit operands on the pseudo instruction to
60/// the instructions created from the expansion.
61void ARMExpandPseudo::TransferImpOps(MachineInstr &OldMI,
62 MachineInstrBuilder &UseMI,
63 MachineInstrBuilder &DefMI) {
64 const TargetInstrDesc &Desc = OldMI.getDesc();
65 for (unsigned i = Desc.getNumOperands(), e = OldMI.getNumOperands();
66 i != e; ++i) {
67 const MachineOperand &MO = OldMI.getOperand(i);
68 assert(MO.isReg() && MO.getReg());
69 if (MO.isUse())
Bob Wilson63569c92010-09-09 00:15:32 +000070 UseMI.addOperand(MO);
Evan Cheng43130072010-05-12 23:13:12 +000071 else
Bob Wilson63569c92010-09-09 00:15:32 +000072 DefMI.addOperand(MO);
Evan Cheng43130072010-05-12 23:13:12 +000073 }
74}
75
Bob Wilson82a9c842010-09-02 16:17:29 +000076/// ExpandVLD - Translate VLD pseudo instructions with Q, QQ or QQQQ register
77/// operands to real VLD instructions with D register operands.
Bob Wilsonffde0802010-09-02 16:00:54 +000078void ARMExpandPseudo::ExpandVLD(MachineBasicBlock::iterator &MBBI,
79 unsigned Opc, bool hasWriteBack,
80 NEONRegSpacing RegSpc, unsigned NumRegs) {
81 MachineInstr &MI = *MBBI;
82 MachineBasicBlock &MBB = *MI.getParent();
83
84 MachineInstrBuilder MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc));
85 unsigned OpIdx = 0;
86
87 bool DstIsDead = MI.getOperand(OpIdx).isDead();
88 unsigned DstReg = MI.getOperand(OpIdx++).getReg();
89 unsigned D0, D1, D2, D3;
90 if (RegSpc == SingleSpc) {
91 D0 = TRI->getSubReg(DstReg, ARM::dsub_0);
92 D1 = TRI->getSubReg(DstReg, ARM::dsub_1);
93 D2 = TRI->getSubReg(DstReg, ARM::dsub_2);
94 D3 = TRI->getSubReg(DstReg, ARM::dsub_3);
95 } else if (RegSpc == EvenDblSpc) {
96 D0 = TRI->getSubReg(DstReg, ARM::dsub_0);
97 D1 = TRI->getSubReg(DstReg, ARM::dsub_2);
98 D2 = TRI->getSubReg(DstReg, ARM::dsub_4);
99 D3 = TRI->getSubReg(DstReg, ARM::dsub_6);
100 } else {
101 assert(RegSpc == OddDblSpc && "unknown register spacing for VLD");
102 D0 = TRI->getSubReg(DstReg, ARM::dsub_1);
103 D1 = TRI->getSubReg(DstReg, ARM::dsub_3);
104 D2 = TRI->getSubReg(DstReg, ARM::dsub_5);
105 D3 = TRI->getSubReg(DstReg, ARM::dsub_7);
106 }
Bob Wilsonf5721912010-09-03 18:16:02 +0000107 MIB.addReg(D0, RegState::Define | getDeadRegState(DstIsDead))
108 .addReg(D1, RegState::Define | getDeadRegState(DstIsDead));
Bob Wilsonffde0802010-09-02 16:00:54 +0000109 if (NumRegs > 2)
Bob Wilsonf5721912010-09-03 18:16:02 +0000110 MIB.addReg(D2, RegState::Define | getDeadRegState(DstIsDead));
Bob Wilsonffde0802010-09-02 16:00:54 +0000111 if (NumRegs > 3)
Bob Wilsonf5721912010-09-03 18:16:02 +0000112 MIB.addReg(D3, RegState::Define | getDeadRegState(DstIsDead));
Bob Wilsonffde0802010-09-02 16:00:54 +0000113
Bob Wilson63569c92010-09-09 00:15:32 +0000114 if (hasWriteBack)
115 MIB.addOperand(MI.getOperand(OpIdx++));
116
Bob Wilsonffde0802010-09-02 16:00:54 +0000117 // Copy the addrmode6 operands.
Bob Wilson63569c92010-09-09 00:15:32 +0000118 MIB.addOperand(MI.getOperand(OpIdx++));
119 MIB.addOperand(MI.getOperand(OpIdx++));
120 // Copy the am6offset operand.
121 if (hasWriteBack)
122 MIB.addOperand(MI.getOperand(OpIdx++));
Bob Wilsonffde0802010-09-02 16:00:54 +0000123
124 MIB = AddDefaultPred(MIB);
125 TransferImpOps(MI, MIB, MIB);
Bob Wilsonf5721912010-09-03 18:16:02 +0000126 // For an instruction writing the odd subregs, add an implicit use of the
127 // super-register because the even subregs were loaded separately.
Bob Wilson63569c92010-09-09 00:15:32 +0000128 if (RegSpc == EvenDblSpc || RegSpc == OddDblSpc)
Bob Wilsonf5721912010-09-03 18:16:02 +0000129 MIB.addReg(DstReg, RegState::Implicit);
130 // Add an implicit def for the super-register.
131 MIB.addReg(DstReg, RegState::ImplicitDefine | getDeadRegState(DstIsDead));
Bob Wilsonffde0802010-09-02 16:00:54 +0000132 MI.eraseFromParent();
133}
134
Bob Wilson01ba4612010-08-26 18:51:29 +0000135/// ExpandVST - Translate VST pseudo instructions with Q, QQ or QQQQ register
136/// operands to real VST instructions with D register operands.
137void ARMExpandPseudo::ExpandVST(MachineBasicBlock::iterator &MBBI,
138 unsigned Opc, bool hasWriteBack,
139 NEONRegSpacing RegSpc, unsigned NumRegs) {
Bob Wilson709d5922010-08-25 23:27:42 +0000140 MachineInstr &MI = *MBBI;
141 MachineBasicBlock &MBB = *MI.getParent();
142
143 MachineInstrBuilder MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc));
144 unsigned OpIdx = 0;
Bob Wilson63569c92010-09-09 00:15:32 +0000145 if (hasWriteBack)
146 MIB.addOperand(MI.getOperand(OpIdx++));
147
Bob Wilson709d5922010-08-25 23:27:42 +0000148 // Copy the addrmode6 operands.
Bob Wilson63569c92010-09-09 00:15:32 +0000149 MIB.addOperand(MI.getOperand(OpIdx++));
150 MIB.addOperand(MI.getOperand(OpIdx++));
151 // Copy the am6offset operand.
152 if (hasWriteBack)
153 MIB.addOperand(MI.getOperand(OpIdx++));
Bob Wilson709d5922010-08-25 23:27:42 +0000154
155 bool SrcIsKill = MI.getOperand(OpIdx).isKill();
156 unsigned SrcReg = MI.getOperand(OpIdx).getReg();
157 unsigned D0, D1, D2, D3;
158 if (RegSpc == SingleSpc) {
159 D0 = TRI->getSubReg(SrcReg, ARM::dsub_0);
160 D1 = TRI->getSubReg(SrcReg, ARM::dsub_1);
161 D2 = TRI->getSubReg(SrcReg, ARM::dsub_2);
162 D3 = TRI->getSubReg(SrcReg, ARM::dsub_3);
163 } else if (RegSpc == EvenDblSpc) {
164 D0 = TRI->getSubReg(SrcReg, ARM::dsub_0);
165 D1 = TRI->getSubReg(SrcReg, ARM::dsub_2);
166 D2 = TRI->getSubReg(SrcReg, ARM::dsub_4);
167 D3 = TRI->getSubReg(SrcReg, ARM::dsub_6);
168 } else {
Bob Wilson01ba4612010-08-26 18:51:29 +0000169 assert(RegSpc == OddDblSpc && "unknown register spacing for VST");
Bob Wilson709d5922010-08-25 23:27:42 +0000170 D0 = TRI->getSubReg(SrcReg, ARM::dsub_1);
171 D1 = TRI->getSubReg(SrcReg, ARM::dsub_3);
172 D2 = TRI->getSubReg(SrcReg, ARM::dsub_5);
173 D3 = TRI->getSubReg(SrcReg, ARM::dsub_7);
174 }
175
Bob Wilson7e701972010-08-30 18:10:48 +0000176 MIB.addReg(D0).addReg(D1);
Bob Wilsone5ce4f62010-08-28 05:12:57 +0000177 if (NumRegs > 2)
Bob Wilson7e701972010-08-30 18:10:48 +0000178 MIB.addReg(D2);
Bob Wilson01ba4612010-08-26 18:51:29 +0000179 if (NumRegs > 3)
Bob Wilson7e701972010-08-30 18:10:48 +0000180 MIB.addReg(D3);
Bob Wilson709d5922010-08-25 23:27:42 +0000181 MIB = AddDefaultPred(MIB);
182 TransferImpOps(MI, MIB, MIB);
Bob Wilson7e701972010-08-30 18:10:48 +0000183 if (SrcIsKill)
184 // Add an implicit kill for the super-reg.
185 (*MIB).addRegisterKilled(SrcReg, TRI, true);
Bob Wilson709d5922010-08-25 23:27:42 +0000186 MI.eraseFromParent();
187}
188
Evan Chengb9803a82009-11-06 23:52:48 +0000189bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &MBB) {
190 bool Modified = false;
191
192 MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
193 while (MBBI != E) {
194 MachineInstr &MI = *MBBI;
Chris Lattner7896c9f2009-12-03 00:50:42 +0000195 MachineBasicBlock::iterator NMBBI = llvm::next(MBBI);
Evan Chengb9803a82009-11-06 23:52:48 +0000196
Bob Wilson709d5922010-08-25 23:27:42 +0000197 bool ModifiedOp = true;
Evan Chengb9803a82009-11-06 23:52:48 +0000198 unsigned Opcode = MI.getOpcode();
199 switch (Opcode) {
Bob Wilson709d5922010-08-25 23:27:42 +0000200 default:
201 ModifiedOp = false;
202 break;
203
Evan Chengb9803a82009-11-06 23:52:48 +0000204 case ARM::tLDRpci_pic:
205 case ARM::t2LDRpci_pic: {
206 unsigned NewLdOpc = (Opcode == ARM::tLDRpci_pic)
207 ? ARM::tLDRpci : ARM::t2LDRpci;
208 unsigned DstReg = MI.getOperand(0).getReg();
Evan Cheng43130072010-05-12 23:13:12 +0000209 bool DstIsDead = MI.getOperand(0).isDead();
210 MachineInstrBuilder MIB1 =
211 AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
212 TII->get(NewLdOpc), DstReg)
213 .addOperand(MI.getOperand(1)));
214 (*MIB1).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
215 MachineInstrBuilder MIB2 = BuildMI(MBB, MBBI, MI.getDebugLoc(),
216 TII->get(ARM::tPICADD))
217 .addReg(DstReg, getDefRegState(true) | getDeadRegState(DstIsDead))
218 .addReg(DstReg)
219 .addOperand(MI.getOperand(2));
220 TransferImpOps(MI, MIB1, MIB2);
Evan Chengb9803a82009-11-06 23:52:48 +0000221 MI.eraseFromParent();
Evan Chengb9803a82009-11-06 23:52:48 +0000222 break;
223 }
Evan Cheng43130072010-05-12 23:13:12 +0000224
Anton Korobeynikov6d1e29d2010-08-30 22:50:36 +0000225 case ARM::MOVi32imm:
Evan Chengb9803a82009-11-06 23:52:48 +0000226 case ARM::t2MOVi32imm: {
Evan Cheng43130072010-05-12 23:13:12 +0000227 unsigned PredReg = 0;
228 ARMCC::CondCodes Pred = llvm::getInstrPredicate(&MI, PredReg);
Evan Chengb9803a82009-11-06 23:52:48 +0000229 unsigned DstReg = MI.getOperand(0).getReg();
Evan Cheng43130072010-05-12 23:13:12 +0000230 bool DstIsDead = MI.getOperand(0).isDead();
231 const MachineOperand &MO = MI.getOperand(1);
232 MachineInstrBuilder LO16, HI16;
Anton Korobeynikov5cdc3a92009-11-24 00:44:37 +0000233
Anton Korobeynikov6d1e29d2010-08-30 22:50:36 +0000234 LO16 = BuildMI(MBB, MBBI, MI.getDebugLoc(),
235 TII->get(Opcode == ARM::MOVi32imm ?
236 ARM::MOVi16 : ARM::t2MOVi16),
Evan Cheng43130072010-05-12 23:13:12 +0000237 DstReg);
Anton Korobeynikov6d1e29d2010-08-30 22:50:36 +0000238 HI16 = BuildMI(MBB, MBBI, MI.getDebugLoc(),
239 TII->get(Opcode == ARM::MOVi32imm ?
240 ARM::MOVTi16 : ARM::t2MOVTi16))
Evan Cheng43130072010-05-12 23:13:12 +0000241 .addReg(DstReg, getDefRegState(true) | getDeadRegState(DstIsDead))
242 .addReg(DstReg);
Anton Korobeynikov5cdc3a92009-11-24 00:44:37 +0000243
Evan Cheng43130072010-05-12 23:13:12 +0000244 if (MO.isImm()) {
245 unsigned Imm = MO.getImm();
246 unsigned Lo16 = Imm & 0xffff;
247 unsigned Hi16 = (Imm >> 16) & 0xffff;
248 LO16 = LO16.addImm(Lo16);
249 HI16 = HI16.addImm(Hi16);
250 } else {
251 const GlobalValue *GV = MO.getGlobal();
252 unsigned TF = MO.getTargetFlags();
253 LO16 = LO16.addGlobalAddress(GV, MO.getOffset(), TF | ARMII::MO_LO16);
254 HI16 = HI16.addGlobalAddress(GV, MO.getOffset(), TF | ARMII::MO_HI16);
Evan Chengb9803a82009-11-06 23:52:48 +0000255 }
Evan Cheng43130072010-05-12 23:13:12 +0000256 (*LO16).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
257 (*HI16).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
258 LO16.addImm(Pred).addReg(PredReg);
259 HI16.addImm(Pred).addReg(PredReg);
260 TransferImpOps(MI, LO16, HI16);
Evan Chengb9803a82009-11-06 23:52:48 +0000261 MI.eraseFromParent();
Evan Chengd929f772010-05-13 00:17:02 +0000262 break;
263 }
264
265 case ARM::VMOVQQ: {
266 unsigned DstReg = MI.getOperand(0).getReg();
267 bool DstIsDead = MI.getOperand(0).isDead();
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +0000268 unsigned EvenDst = TRI->getSubReg(DstReg, ARM::qsub_0);
269 unsigned OddDst = TRI->getSubReg(DstReg, ARM::qsub_1);
Evan Chengd929f772010-05-13 00:17:02 +0000270 unsigned SrcReg = MI.getOperand(1).getReg();
271 bool SrcIsKill = MI.getOperand(1).isKill();
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +0000272 unsigned EvenSrc = TRI->getSubReg(SrcReg, ARM::qsub_0);
273 unsigned OddSrc = TRI->getSubReg(SrcReg, ARM::qsub_1);
Evan Chengd929f772010-05-13 00:17:02 +0000274 MachineInstrBuilder Even =
275 AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
276 TII->get(ARM::VMOVQ))
Jim Grosbach18f30e62010-06-02 21:53:11 +0000277 .addReg(EvenDst,
278 getDefRegState(true) | getDeadRegState(DstIsDead))
279 .addReg(EvenSrc, getKillRegState(SrcIsKill)));
Evan Chengd929f772010-05-13 00:17:02 +0000280 MachineInstrBuilder Odd =
281 AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
282 TII->get(ARM::VMOVQ))
Jim Grosbach18f30e62010-06-02 21:53:11 +0000283 .addReg(OddDst,
284 getDefRegState(true) | getDeadRegState(DstIsDead))
285 .addReg(OddSrc, getKillRegState(SrcIsKill)));
Evan Chengd929f772010-05-13 00:17:02 +0000286 TransferImpOps(MI, Even, Odd);
287 MI.eraseFromParent();
Bob Wilson709d5922010-08-25 23:27:42 +0000288 }
289
Bob Wilsonffde0802010-09-02 16:00:54 +0000290 case ARM::VLD1q8Pseudo:
291 ExpandVLD(MBBI, ARM::VLD1q8, false, SingleSpc, 2); break;
292 case ARM::VLD1q16Pseudo:
293 ExpandVLD(MBBI, ARM::VLD1q16, false, SingleSpc, 2); break;
294 case ARM::VLD1q32Pseudo:
295 ExpandVLD(MBBI, ARM::VLD1q32, false, SingleSpc, 2); break;
296 case ARM::VLD1q64Pseudo:
297 ExpandVLD(MBBI, ARM::VLD1q64, false, SingleSpc, 2); break;
298 case ARM::VLD1q8Pseudo_UPD:
299 ExpandVLD(MBBI, ARM::VLD1q8, true, SingleSpc, 2); break;
300 case ARM::VLD1q16Pseudo_UPD:
301 ExpandVLD(MBBI, ARM::VLD1q16, true, SingleSpc, 2); break;
302 case ARM::VLD1q32Pseudo_UPD:
303 ExpandVLD(MBBI, ARM::VLD1q32, true, SingleSpc, 2); break;
304 case ARM::VLD1q64Pseudo_UPD:
305 ExpandVLD(MBBI, ARM::VLD1q64, true, SingleSpc, 2); break;
306
307 case ARM::VLD2d8Pseudo:
308 ExpandVLD(MBBI, ARM::VLD2d8, false, SingleSpc, 2); break;
309 case ARM::VLD2d16Pseudo:
310 ExpandVLD(MBBI, ARM::VLD2d16, false, SingleSpc, 2); break;
311 case ARM::VLD2d32Pseudo:
312 ExpandVLD(MBBI, ARM::VLD2d32, false, SingleSpc, 2); break;
313 case ARM::VLD2q8Pseudo:
314 ExpandVLD(MBBI, ARM::VLD2q8, false, SingleSpc, 4); break;
315 case ARM::VLD2q16Pseudo:
316 ExpandVLD(MBBI, ARM::VLD2q16, false, SingleSpc, 4); break;
317 case ARM::VLD2q32Pseudo:
318 ExpandVLD(MBBI, ARM::VLD2q32, false, SingleSpc, 4); break;
319 case ARM::VLD2d8Pseudo_UPD:
320 ExpandVLD(MBBI, ARM::VLD2d8, true, SingleSpc, 2); break;
321 case ARM::VLD2d16Pseudo_UPD:
322 ExpandVLD(MBBI, ARM::VLD2d16, true, SingleSpc, 2); break;
323 case ARM::VLD2d32Pseudo_UPD:
324 ExpandVLD(MBBI, ARM::VLD2d32, true, SingleSpc, 2); break;
325 case ARM::VLD2q8Pseudo_UPD:
326 ExpandVLD(MBBI, ARM::VLD2q8, true, SingleSpc, 4); break;
327 case ARM::VLD2q16Pseudo_UPD:
328 ExpandVLD(MBBI, ARM::VLD2q16, true, SingleSpc, 4); break;
329 case ARM::VLD2q32Pseudo_UPD:
330 ExpandVLD(MBBI, ARM::VLD2q32, true, SingleSpc, 4); break;
331
Bob Wilsonf5721912010-09-03 18:16:02 +0000332 case ARM::VLD3d8Pseudo:
333 ExpandVLD(MBBI, ARM::VLD3d8, false, SingleSpc, 3); break;
334 case ARM::VLD3d16Pseudo:
335 ExpandVLD(MBBI, ARM::VLD3d16, false, SingleSpc, 3); break;
336 case ARM::VLD3d32Pseudo:
337 ExpandVLD(MBBI, ARM::VLD3d32, false, SingleSpc, 3); break;
Bob Wilsonffde0802010-09-02 16:00:54 +0000338 case ARM::VLD1d64TPseudo:
339 ExpandVLD(MBBI, ARM::VLD1d64T, false, SingleSpc, 3); break;
Bob Wilsonf5721912010-09-03 18:16:02 +0000340 case ARM::VLD3d8Pseudo_UPD:
341 ExpandVLD(MBBI, ARM::VLD3d8_UPD, true, SingleSpc, 3); break;
342 case ARM::VLD3d16Pseudo_UPD:
343 ExpandVLD(MBBI, ARM::VLD3d16_UPD, true, SingleSpc, 3); break;
344 case ARM::VLD3d32Pseudo_UPD:
345 ExpandVLD(MBBI, ARM::VLD3d32_UPD, true, SingleSpc, 3); break;
Bob Wilsonffde0802010-09-02 16:00:54 +0000346 case ARM::VLD1d64TPseudo_UPD:
Bob Wilsonf5721912010-09-03 18:16:02 +0000347 ExpandVLD(MBBI, ARM::VLD1d64T_UPD, true, SingleSpc, 3); break;
348 case ARM::VLD3q8Pseudo_UPD:
349 ExpandVLD(MBBI, ARM::VLD3q8_UPD, true, EvenDblSpc, 3); break;
350 case ARM::VLD3q16Pseudo_UPD:
351 ExpandVLD(MBBI, ARM::VLD3q16_UPD, true, EvenDblSpc, 3); break;
352 case ARM::VLD3q32Pseudo_UPD:
353 ExpandVLD(MBBI, ARM::VLD3q32_UPD, true, EvenDblSpc, 3); break;
354 case ARM::VLD3q8oddPseudo_UPD:
355 ExpandVLD(MBBI, ARM::VLD3q8_UPD, true, OddDblSpc, 3); break;
356 case ARM::VLD3q16oddPseudo_UPD:
357 ExpandVLD(MBBI, ARM::VLD3q16_UPD, true, OddDblSpc, 3); break;
358 case ARM::VLD3q32oddPseudo_UPD:
359 ExpandVLD(MBBI, ARM::VLD3q32_UPD, true, OddDblSpc, 3); break;
Bob Wilsonffde0802010-09-02 16:00:54 +0000360
Bob Wilsonf5721912010-09-03 18:16:02 +0000361 case ARM::VLD4d8Pseudo:
362 ExpandVLD(MBBI, ARM::VLD4d8, false, SingleSpc, 4); break;
363 case ARM::VLD4d16Pseudo:
364 ExpandVLD(MBBI, ARM::VLD4d16, false, SingleSpc, 4); break;
365 case ARM::VLD4d32Pseudo:
366 ExpandVLD(MBBI, ARM::VLD4d32, false, SingleSpc, 4); break;
Bob Wilsonffde0802010-09-02 16:00:54 +0000367 case ARM::VLD1d64QPseudo:
368 ExpandVLD(MBBI, ARM::VLD1d64Q, false, SingleSpc, 4); break;
Bob Wilsonf5721912010-09-03 18:16:02 +0000369 case ARM::VLD4d8Pseudo_UPD:
370 ExpandVLD(MBBI, ARM::VLD4d8_UPD, true, SingleSpc, 4); break;
371 case ARM::VLD4d16Pseudo_UPD:
372 ExpandVLD(MBBI, ARM::VLD4d16_UPD, true, SingleSpc, 4); break;
373 case ARM::VLD4d32Pseudo_UPD:
374 ExpandVLD(MBBI, ARM::VLD4d32_UPD, true, SingleSpc, 4); break;
Bob Wilsonffde0802010-09-02 16:00:54 +0000375 case ARM::VLD1d64QPseudo_UPD:
Bob Wilsonf5721912010-09-03 18:16:02 +0000376 ExpandVLD(MBBI, ARM::VLD1d64Q_UPD, true, SingleSpc, 4); break;
377 case ARM::VLD4q8Pseudo_UPD:
378 ExpandVLD(MBBI, ARM::VLD4q8_UPD, true, EvenDblSpc, 4); break;
379 case ARM::VLD4q16Pseudo_UPD:
380 ExpandVLD(MBBI, ARM::VLD4q16_UPD, true, EvenDblSpc, 4); break;
381 case ARM::VLD4q32Pseudo_UPD:
382 ExpandVLD(MBBI, ARM::VLD4q32_UPD, true, EvenDblSpc, 4); break;
383 case ARM::VLD4q8oddPseudo_UPD:
384 ExpandVLD(MBBI, ARM::VLD4q8_UPD, true, OddDblSpc, 4); break;
385 case ARM::VLD4q16oddPseudo_UPD:
386 ExpandVLD(MBBI, ARM::VLD4q16_UPD, true, OddDblSpc, 4); break;
387 case ARM::VLD4q32oddPseudo_UPD:
388 ExpandVLD(MBBI, ARM::VLD4q32_UPD, true, OddDblSpc, 4); break;
Bob Wilsonffde0802010-09-02 16:00:54 +0000389
Bob Wilsone5ce4f62010-08-28 05:12:57 +0000390 case ARM::VST1q8Pseudo:
391 ExpandVST(MBBI, ARM::VST1q8, false, SingleSpc, 2); break;
392 case ARM::VST1q16Pseudo:
393 ExpandVST(MBBI, ARM::VST1q16, false, SingleSpc, 2); break;
394 case ARM::VST1q32Pseudo:
395 ExpandVST(MBBI, ARM::VST1q32, false, SingleSpc, 2); break;
396 case ARM::VST1q64Pseudo:
397 ExpandVST(MBBI, ARM::VST1q64, false, SingleSpc, 2); break;
398 case ARM::VST1q8Pseudo_UPD:
399 ExpandVST(MBBI, ARM::VST1q8_UPD, true, SingleSpc, 2); break;
400 case ARM::VST1q16Pseudo_UPD:
401 ExpandVST(MBBI, ARM::VST1q16_UPD, true, SingleSpc, 2); break;
402 case ARM::VST1q32Pseudo_UPD:
403 ExpandVST(MBBI, ARM::VST1q32_UPD, true, SingleSpc, 2); break;
404 case ARM::VST1q64Pseudo_UPD:
405 ExpandVST(MBBI, ARM::VST1q64_UPD, true, SingleSpc, 2); break;
406
407 case ARM::VST2d8Pseudo:
408 ExpandVST(MBBI, ARM::VST2d8, false, SingleSpc, 2); break;
409 case ARM::VST2d16Pseudo:
410 ExpandVST(MBBI, ARM::VST2d16, false, SingleSpc, 2); break;
411 case ARM::VST2d32Pseudo:
412 ExpandVST(MBBI, ARM::VST2d32, false, SingleSpc, 2); break;
413 case ARM::VST2q8Pseudo:
414 ExpandVST(MBBI, ARM::VST2q8, false, SingleSpc, 4); break;
415 case ARM::VST2q16Pseudo:
416 ExpandVST(MBBI, ARM::VST2q16, false, SingleSpc, 4); break;
417 case ARM::VST2q32Pseudo:
418 ExpandVST(MBBI, ARM::VST2q32, false, SingleSpc, 4); break;
419 case ARM::VST2d8Pseudo_UPD:
420 ExpandVST(MBBI, ARM::VST2d8_UPD, true, SingleSpc, 2); break;
421 case ARM::VST2d16Pseudo_UPD:
422 ExpandVST(MBBI, ARM::VST2d16_UPD, true, SingleSpc, 2); break;
423 case ARM::VST2d32Pseudo_UPD:
424 ExpandVST(MBBI, ARM::VST2d32_UPD, true, SingleSpc, 2); break;
425 case ARM::VST2q8Pseudo_UPD:
426 ExpandVST(MBBI, ARM::VST2q8_UPD, true, SingleSpc, 4); break;
427 case ARM::VST2q16Pseudo_UPD:
428 ExpandVST(MBBI, ARM::VST2q16_UPD, true, SingleSpc, 4); break;
429 case ARM::VST2q32Pseudo_UPD:
430 ExpandVST(MBBI, ARM::VST2q32_UPD, true, SingleSpc, 4); break;
431
Bob Wilson01ba4612010-08-26 18:51:29 +0000432 case ARM::VST3d8Pseudo:
433 ExpandVST(MBBI, ARM::VST3d8, false, SingleSpc, 3); break;
434 case ARM::VST3d16Pseudo:
435 ExpandVST(MBBI, ARM::VST3d16, false, SingleSpc, 3); break;
436 case ARM::VST3d32Pseudo:
437 ExpandVST(MBBI, ARM::VST3d32, false, SingleSpc, 3); break;
438 case ARM::VST1d64TPseudo:
439 ExpandVST(MBBI, ARM::VST1d64T, false, SingleSpc, 3); break;
440 case ARM::VST3d8Pseudo_UPD:
441 ExpandVST(MBBI, ARM::VST3d8_UPD, true, SingleSpc, 3); break;
442 case ARM::VST3d16Pseudo_UPD:
443 ExpandVST(MBBI, ARM::VST3d16_UPD, true, SingleSpc, 3); break;
444 case ARM::VST3d32Pseudo_UPD:
445 ExpandVST(MBBI, ARM::VST3d32_UPD, true, SingleSpc, 3); break;
446 case ARM::VST1d64TPseudo_UPD:
447 ExpandVST(MBBI, ARM::VST1d64T_UPD, true, SingleSpc, 3); break;
448 case ARM::VST3q8Pseudo_UPD:
449 ExpandVST(MBBI, ARM::VST3q8_UPD, true, EvenDblSpc, 3); break;
450 case ARM::VST3q16Pseudo_UPD:
451 ExpandVST(MBBI, ARM::VST3q16_UPD, true, EvenDblSpc, 3); break;
452 case ARM::VST3q32Pseudo_UPD:
453 ExpandVST(MBBI, ARM::VST3q32_UPD, true, EvenDblSpc, 3); break;
454 case ARM::VST3q8oddPseudo_UPD:
455 ExpandVST(MBBI, ARM::VST3q8_UPD, true, OddDblSpc, 3); break;
456 case ARM::VST3q16oddPseudo_UPD:
457 ExpandVST(MBBI, ARM::VST3q16_UPD, true, OddDblSpc, 3); break;
458 case ARM::VST3q32oddPseudo_UPD:
459 ExpandVST(MBBI, ARM::VST3q32_UPD, true, OddDblSpc, 3); break;
460
Bob Wilson709d5922010-08-25 23:27:42 +0000461 case ARM::VST4d8Pseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000462 ExpandVST(MBBI, ARM::VST4d8, false, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000463 case ARM::VST4d16Pseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000464 ExpandVST(MBBI, ARM::VST4d16, false, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000465 case ARM::VST4d32Pseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000466 ExpandVST(MBBI, ARM::VST4d32, false, SingleSpc, 4); break;
Bob Wilson70e48b22010-08-26 05:33:30 +0000467 case ARM::VST1d64QPseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000468 ExpandVST(MBBI, ARM::VST1d64Q, false, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000469 case ARM::VST4d8Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000470 ExpandVST(MBBI, ARM::VST4d8_UPD, true, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000471 case ARM::VST4d16Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000472 ExpandVST(MBBI, ARM::VST4d16_UPD, true, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000473 case ARM::VST4d32Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000474 ExpandVST(MBBI, ARM::VST4d32_UPD, true, SingleSpc, 4); break;
Bob Wilson70e48b22010-08-26 05:33:30 +0000475 case ARM::VST1d64QPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000476 ExpandVST(MBBI, ARM::VST1d64Q_UPD, true, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000477 case ARM::VST4q8Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000478 ExpandVST(MBBI, ARM::VST4q8_UPD, true, EvenDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000479 case ARM::VST4q16Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000480 ExpandVST(MBBI, ARM::VST4q16_UPD, true, EvenDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000481 case ARM::VST4q32Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000482 ExpandVST(MBBI, ARM::VST4q32_UPD, true, EvenDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000483 case ARM::VST4q8oddPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000484 ExpandVST(MBBI, ARM::VST4q8_UPD, true, OddDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000485 case ARM::VST4q16oddPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000486 ExpandVST(MBBI, ARM::VST4q16_UPD, true, OddDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000487 case ARM::VST4q32oddPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000488 ExpandVST(MBBI, ARM::VST4q32_UPD, true, OddDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000489 }
490
491 if (ModifiedOp)
Evan Chengd929f772010-05-13 00:17:02 +0000492 Modified = true;
Evan Chengb9803a82009-11-06 23:52:48 +0000493 MBBI = NMBBI;
494 }
495
496 return Modified;
497}
498
499bool ARMExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
500 TII = MF.getTarget().getInstrInfo();
Evan Chengd929f772010-05-13 00:17:02 +0000501 TRI = MF.getTarget().getRegisterInfo();
Evan Chengb9803a82009-11-06 23:52:48 +0000502
503 bool Modified = false;
504 for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E;
505 ++MFI)
506 Modified |= ExpandMBB(*MFI);
507 return Modified;
508}
509
510/// createARMExpandPseudoPass - returns an instance of the pseudo instruction
511/// expansion pass.
512FunctionPass *llvm::createARMExpandPseudoPass() {
513 return new ARMExpandPseudo();
514}