blob: 4033d343331d55619ae4e8477cf17b51059b305a [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//
10// This file contains a pass that expand pseudo instructions into target
11// instructions to allow proper scheduling, if-conversion, and other late
12// optimizations. This pass should be run after register allocation but before
13// post- regalloc scheduling pass.
14//
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 Wilson01ba4612010-08-26 18:51:29 +000051 void ExpandVST(MachineBasicBlock::iterator &MBBI, unsigned Opc,
52 bool hasWriteBack, NEONRegSpacing RegSpc, unsigned NumRegs);
Evan Chengb9803a82009-11-06 23:52:48 +000053 };
54 char ARMExpandPseudo::ID = 0;
55}
56
Evan Cheng43130072010-05-12 23:13:12 +000057/// TransferImpOps - Transfer implicit operands on the pseudo instruction to
58/// the instructions created from the expansion.
59void ARMExpandPseudo::TransferImpOps(MachineInstr &OldMI,
60 MachineInstrBuilder &UseMI,
61 MachineInstrBuilder &DefMI) {
62 const TargetInstrDesc &Desc = OldMI.getDesc();
63 for (unsigned i = Desc.getNumOperands(), e = OldMI.getNumOperands();
64 i != e; ++i) {
65 const MachineOperand &MO = OldMI.getOperand(i);
66 assert(MO.isReg() && MO.getReg());
67 if (MO.isUse())
68 UseMI.addReg(MO.getReg(), getKillRegState(MO.isKill()));
69 else
70 DefMI.addReg(MO.getReg(),
71 getDefRegState(true) | getDeadRegState(MO.isDead()));
72 }
73}
74
Bob Wilson01ba4612010-08-26 18:51:29 +000075/// ExpandVST - Translate VST pseudo instructions with Q, QQ or QQQQ register
76/// operands to real VST instructions with D register operands.
77void ARMExpandPseudo::ExpandVST(MachineBasicBlock::iterator &MBBI,
78 unsigned Opc, bool hasWriteBack,
79 NEONRegSpacing RegSpc, unsigned NumRegs) {
Bob Wilson709d5922010-08-25 23:27:42 +000080 MachineInstr &MI = *MBBI;
81 MachineBasicBlock &MBB = *MI.getParent();
82
83 MachineInstrBuilder MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc));
84 unsigned OpIdx = 0;
85 if (hasWriteBack) {
86 bool DstIsDead = MI.getOperand(OpIdx).isDead();
87 unsigned DstReg = MI.getOperand(OpIdx++).getReg();
88 MIB.addReg(DstReg, getDefRegState(true) | getDeadRegState(DstIsDead));
89 }
90 // Copy the addrmode6 operands.
91 bool AddrIsKill = MI.getOperand(OpIdx).isKill();
92 MIB.addReg(MI.getOperand(OpIdx++).getReg(), getKillRegState(AddrIsKill));
93 MIB.addImm(MI.getOperand(OpIdx++).getImm());
94 if (hasWriteBack) {
95 // Copy the am6offset operand.
96 bool OffsetIsKill = MI.getOperand(OpIdx).isKill();
97 MIB.addReg(MI.getOperand(OpIdx++).getReg(), getKillRegState(OffsetIsKill));
98 }
99
100 bool SrcIsKill = MI.getOperand(OpIdx).isKill();
101 unsigned SrcReg = MI.getOperand(OpIdx).getReg();
102 unsigned D0, D1, D2, D3;
103 if (RegSpc == SingleSpc) {
104 D0 = TRI->getSubReg(SrcReg, ARM::dsub_0);
105 D1 = TRI->getSubReg(SrcReg, ARM::dsub_1);
106 D2 = TRI->getSubReg(SrcReg, ARM::dsub_2);
107 D3 = TRI->getSubReg(SrcReg, ARM::dsub_3);
108 } else if (RegSpc == EvenDblSpc) {
109 D0 = TRI->getSubReg(SrcReg, ARM::dsub_0);
110 D1 = TRI->getSubReg(SrcReg, ARM::dsub_2);
111 D2 = TRI->getSubReg(SrcReg, ARM::dsub_4);
112 D3 = TRI->getSubReg(SrcReg, ARM::dsub_6);
113 } else {
Bob Wilson01ba4612010-08-26 18:51:29 +0000114 assert(RegSpc == OddDblSpc && "unknown register spacing for VST");
Bob Wilson709d5922010-08-25 23:27:42 +0000115 D0 = TRI->getSubReg(SrcReg, ARM::dsub_1);
116 D1 = TRI->getSubReg(SrcReg, ARM::dsub_3);
117 D2 = TRI->getSubReg(SrcReg, ARM::dsub_5);
118 D3 = TRI->getSubReg(SrcReg, ARM::dsub_7);
119 }
120
Bob Wilson7e701972010-08-30 18:10:48 +0000121 MIB.addReg(D0).addReg(D1);
Bob Wilsone5ce4f62010-08-28 05:12:57 +0000122 if (NumRegs > 2)
Bob Wilson7e701972010-08-30 18:10:48 +0000123 MIB.addReg(D2);
Bob Wilson01ba4612010-08-26 18:51:29 +0000124 if (NumRegs > 3)
Bob Wilson7e701972010-08-30 18:10:48 +0000125 MIB.addReg(D3);
Bob Wilson709d5922010-08-25 23:27:42 +0000126 MIB = AddDefaultPred(MIB);
127 TransferImpOps(MI, MIB, MIB);
Bob Wilson7e701972010-08-30 18:10:48 +0000128 if (SrcIsKill)
129 // Add an implicit kill for the super-reg.
130 (*MIB).addRegisterKilled(SrcReg, TRI, true);
Bob Wilson709d5922010-08-25 23:27:42 +0000131 MI.eraseFromParent();
132}
133
Evan Chengb9803a82009-11-06 23:52:48 +0000134bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &MBB) {
135 bool Modified = false;
136
137 MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
138 while (MBBI != E) {
139 MachineInstr &MI = *MBBI;
Chris Lattner7896c9f2009-12-03 00:50:42 +0000140 MachineBasicBlock::iterator NMBBI = llvm::next(MBBI);
Evan Chengb9803a82009-11-06 23:52:48 +0000141
Bob Wilson709d5922010-08-25 23:27:42 +0000142 bool ModifiedOp = true;
Evan Chengb9803a82009-11-06 23:52:48 +0000143 unsigned Opcode = MI.getOpcode();
144 switch (Opcode) {
Bob Wilson709d5922010-08-25 23:27:42 +0000145 default:
146 ModifiedOp = false;
147 break;
148
Evan Chengb9803a82009-11-06 23:52:48 +0000149 case ARM::tLDRpci_pic:
150 case ARM::t2LDRpci_pic: {
151 unsigned NewLdOpc = (Opcode == ARM::tLDRpci_pic)
152 ? ARM::tLDRpci : ARM::t2LDRpci;
153 unsigned DstReg = MI.getOperand(0).getReg();
Evan Cheng43130072010-05-12 23:13:12 +0000154 bool DstIsDead = MI.getOperand(0).isDead();
155 MachineInstrBuilder MIB1 =
156 AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
157 TII->get(NewLdOpc), DstReg)
158 .addOperand(MI.getOperand(1)));
159 (*MIB1).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
160 MachineInstrBuilder MIB2 = BuildMI(MBB, MBBI, MI.getDebugLoc(),
161 TII->get(ARM::tPICADD))
162 .addReg(DstReg, getDefRegState(true) | getDeadRegState(DstIsDead))
163 .addReg(DstReg)
164 .addOperand(MI.getOperand(2));
165 TransferImpOps(MI, MIB1, MIB2);
Evan Chengb9803a82009-11-06 23:52:48 +0000166 MI.eraseFromParent();
Evan Chengb9803a82009-11-06 23:52:48 +0000167 break;
168 }
Evan Cheng43130072010-05-12 23:13:12 +0000169
Anton Korobeynikov6d1e29d2010-08-30 22:50:36 +0000170 case ARM::MOVi32imm:
Evan Chengb9803a82009-11-06 23:52:48 +0000171 case ARM::t2MOVi32imm: {
Evan Cheng43130072010-05-12 23:13:12 +0000172 unsigned PredReg = 0;
173 ARMCC::CondCodes Pred = llvm::getInstrPredicate(&MI, PredReg);
Evan Chengb9803a82009-11-06 23:52:48 +0000174 unsigned DstReg = MI.getOperand(0).getReg();
Evan Cheng43130072010-05-12 23:13:12 +0000175 bool DstIsDead = MI.getOperand(0).isDead();
176 const MachineOperand &MO = MI.getOperand(1);
177 MachineInstrBuilder LO16, HI16;
Anton Korobeynikov5cdc3a92009-11-24 00:44:37 +0000178
Anton Korobeynikov6d1e29d2010-08-30 22:50:36 +0000179 LO16 = BuildMI(MBB, MBBI, MI.getDebugLoc(),
180 TII->get(Opcode == ARM::MOVi32imm ?
181 ARM::MOVi16 : ARM::t2MOVi16),
Evan Cheng43130072010-05-12 23:13:12 +0000182 DstReg);
Anton Korobeynikov6d1e29d2010-08-30 22:50:36 +0000183 HI16 = BuildMI(MBB, MBBI, MI.getDebugLoc(),
184 TII->get(Opcode == ARM::MOVi32imm ?
185 ARM::MOVTi16 : ARM::t2MOVTi16))
Evan Cheng43130072010-05-12 23:13:12 +0000186 .addReg(DstReg, getDefRegState(true) | getDeadRegState(DstIsDead))
187 .addReg(DstReg);
Anton Korobeynikov5cdc3a92009-11-24 00:44:37 +0000188
Evan Cheng43130072010-05-12 23:13:12 +0000189 if (MO.isImm()) {
190 unsigned Imm = MO.getImm();
191 unsigned Lo16 = Imm & 0xffff;
192 unsigned Hi16 = (Imm >> 16) & 0xffff;
193 LO16 = LO16.addImm(Lo16);
194 HI16 = HI16.addImm(Hi16);
195 } else {
196 const GlobalValue *GV = MO.getGlobal();
197 unsigned TF = MO.getTargetFlags();
198 LO16 = LO16.addGlobalAddress(GV, MO.getOffset(), TF | ARMII::MO_LO16);
199 HI16 = HI16.addGlobalAddress(GV, MO.getOffset(), TF | ARMII::MO_HI16);
Evan Chengb9803a82009-11-06 23:52:48 +0000200 }
Evan Cheng43130072010-05-12 23:13:12 +0000201 (*LO16).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
202 (*HI16).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
203 LO16.addImm(Pred).addReg(PredReg);
204 HI16.addImm(Pred).addReg(PredReg);
205 TransferImpOps(MI, LO16, HI16);
Evan Chengb9803a82009-11-06 23:52:48 +0000206 MI.eraseFromParent();
Evan Chengd929f772010-05-13 00:17:02 +0000207 break;
208 }
209
210 case ARM::VMOVQQ: {
211 unsigned DstReg = MI.getOperand(0).getReg();
212 bool DstIsDead = MI.getOperand(0).isDead();
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +0000213 unsigned EvenDst = TRI->getSubReg(DstReg, ARM::qsub_0);
214 unsigned OddDst = TRI->getSubReg(DstReg, ARM::qsub_1);
Evan Chengd929f772010-05-13 00:17:02 +0000215 unsigned SrcReg = MI.getOperand(1).getReg();
216 bool SrcIsKill = MI.getOperand(1).isKill();
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +0000217 unsigned EvenSrc = TRI->getSubReg(SrcReg, ARM::qsub_0);
218 unsigned OddSrc = TRI->getSubReg(SrcReg, ARM::qsub_1);
Evan Chengd929f772010-05-13 00:17:02 +0000219 MachineInstrBuilder Even =
220 AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
221 TII->get(ARM::VMOVQ))
Jim Grosbach18f30e62010-06-02 21:53:11 +0000222 .addReg(EvenDst,
223 getDefRegState(true) | getDeadRegState(DstIsDead))
224 .addReg(EvenSrc, getKillRegState(SrcIsKill)));
Evan Chengd929f772010-05-13 00:17:02 +0000225 MachineInstrBuilder Odd =
226 AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
227 TII->get(ARM::VMOVQ))
Jim Grosbach18f30e62010-06-02 21:53:11 +0000228 .addReg(OddDst,
229 getDefRegState(true) | getDeadRegState(DstIsDead))
230 .addReg(OddSrc, getKillRegState(SrcIsKill)));
Evan Chengd929f772010-05-13 00:17:02 +0000231 TransferImpOps(MI, Even, Odd);
232 MI.eraseFromParent();
Bob Wilson709d5922010-08-25 23:27:42 +0000233 }
234
Bob Wilsone5ce4f62010-08-28 05:12:57 +0000235 case ARM::VST1q8Pseudo:
236 ExpandVST(MBBI, ARM::VST1q8, false, SingleSpc, 2); break;
237 case ARM::VST1q16Pseudo:
238 ExpandVST(MBBI, ARM::VST1q16, false, SingleSpc, 2); break;
239 case ARM::VST1q32Pseudo:
240 ExpandVST(MBBI, ARM::VST1q32, false, SingleSpc, 2); break;
241 case ARM::VST1q64Pseudo:
242 ExpandVST(MBBI, ARM::VST1q64, false, SingleSpc, 2); break;
243 case ARM::VST1q8Pseudo_UPD:
244 ExpandVST(MBBI, ARM::VST1q8_UPD, true, SingleSpc, 2); break;
245 case ARM::VST1q16Pseudo_UPD:
246 ExpandVST(MBBI, ARM::VST1q16_UPD, true, SingleSpc, 2); break;
247 case ARM::VST1q32Pseudo_UPD:
248 ExpandVST(MBBI, ARM::VST1q32_UPD, true, SingleSpc, 2); break;
249 case ARM::VST1q64Pseudo_UPD:
250 ExpandVST(MBBI, ARM::VST1q64_UPD, true, SingleSpc, 2); break;
251
252 case ARM::VST2d8Pseudo:
253 ExpandVST(MBBI, ARM::VST2d8, false, SingleSpc, 2); break;
254 case ARM::VST2d16Pseudo:
255 ExpandVST(MBBI, ARM::VST2d16, false, SingleSpc, 2); break;
256 case ARM::VST2d32Pseudo:
257 ExpandVST(MBBI, ARM::VST2d32, false, SingleSpc, 2); break;
258 case ARM::VST2q8Pseudo:
259 ExpandVST(MBBI, ARM::VST2q8, false, SingleSpc, 4); break;
260 case ARM::VST2q16Pseudo:
261 ExpandVST(MBBI, ARM::VST2q16, false, SingleSpc, 4); break;
262 case ARM::VST2q32Pseudo:
263 ExpandVST(MBBI, ARM::VST2q32, false, SingleSpc, 4); break;
264 case ARM::VST2d8Pseudo_UPD:
265 ExpandVST(MBBI, ARM::VST2d8_UPD, true, SingleSpc, 2); break;
266 case ARM::VST2d16Pseudo_UPD:
267 ExpandVST(MBBI, ARM::VST2d16_UPD, true, SingleSpc, 2); break;
268 case ARM::VST2d32Pseudo_UPD:
269 ExpandVST(MBBI, ARM::VST2d32_UPD, true, SingleSpc, 2); break;
270 case ARM::VST2q8Pseudo_UPD:
271 ExpandVST(MBBI, ARM::VST2q8_UPD, true, SingleSpc, 4); break;
272 case ARM::VST2q16Pseudo_UPD:
273 ExpandVST(MBBI, ARM::VST2q16_UPD, true, SingleSpc, 4); break;
274 case ARM::VST2q32Pseudo_UPD:
275 ExpandVST(MBBI, ARM::VST2q32_UPD, true, SingleSpc, 4); break;
276
Bob Wilson01ba4612010-08-26 18:51:29 +0000277 case ARM::VST3d8Pseudo:
278 ExpandVST(MBBI, ARM::VST3d8, false, SingleSpc, 3); break;
279 case ARM::VST3d16Pseudo:
280 ExpandVST(MBBI, ARM::VST3d16, false, SingleSpc, 3); break;
281 case ARM::VST3d32Pseudo:
282 ExpandVST(MBBI, ARM::VST3d32, false, SingleSpc, 3); break;
283 case ARM::VST1d64TPseudo:
284 ExpandVST(MBBI, ARM::VST1d64T, false, SingleSpc, 3); break;
285 case ARM::VST3d8Pseudo_UPD:
286 ExpandVST(MBBI, ARM::VST3d8_UPD, true, SingleSpc, 3); break;
287 case ARM::VST3d16Pseudo_UPD:
288 ExpandVST(MBBI, ARM::VST3d16_UPD, true, SingleSpc, 3); break;
289 case ARM::VST3d32Pseudo_UPD:
290 ExpandVST(MBBI, ARM::VST3d32_UPD, true, SingleSpc, 3); break;
291 case ARM::VST1d64TPseudo_UPD:
292 ExpandVST(MBBI, ARM::VST1d64T_UPD, true, SingleSpc, 3); break;
293 case ARM::VST3q8Pseudo_UPD:
294 ExpandVST(MBBI, ARM::VST3q8_UPD, true, EvenDblSpc, 3); break;
295 case ARM::VST3q16Pseudo_UPD:
296 ExpandVST(MBBI, ARM::VST3q16_UPD, true, EvenDblSpc, 3); break;
297 case ARM::VST3q32Pseudo_UPD:
298 ExpandVST(MBBI, ARM::VST3q32_UPD, true, EvenDblSpc, 3); break;
299 case ARM::VST3q8oddPseudo_UPD:
300 ExpandVST(MBBI, ARM::VST3q8_UPD, true, OddDblSpc, 3); break;
301 case ARM::VST3q16oddPseudo_UPD:
302 ExpandVST(MBBI, ARM::VST3q16_UPD, true, OddDblSpc, 3); break;
303 case ARM::VST3q32oddPseudo_UPD:
304 ExpandVST(MBBI, ARM::VST3q32_UPD, true, OddDblSpc, 3); break;
305
Bob Wilson709d5922010-08-25 23:27:42 +0000306 case ARM::VST4d8Pseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000307 ExpandVST(MBBI, ARM::VST4d8, false, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000308 case ARM::VST4d16Pseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000309 ExpandVST(MBBI, ARM::VST4d16, false, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000310 case ARM::VST4d32Pseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000311 ExpandVST(MBBI, ARM::VST4d32, false, SingleSpc, 4); break;
Bob Wilson70e48b22010-08-26 05:33:30 +0000312 case ARM::VST1d64QPseudo:
Bob Wilson01ba4612010-08-26 18:51:29 +0000313 ExpandVST(MBBI, ARM::VST1d64Q, false, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000314 case ARM::VST4d8Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000315 ExpandVST(MBBI, ARM::VST4d8_UPD, true, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000316 case ARM::VST4d16Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000317 ExpandVST(MBBI, ARM::VST4d16_UPD, true, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000318 case ARM::VST4d32Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000319 ExpandVST(MBBI, ARM::VST4d32_UPD, true, SingleSpc, 4); break;
Bob Wilson70e48b22010-08-26 05:33:30 +0000320 case ARM::VST1d64QPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000321 ExpandVST(MBBI, ARM::VST1d64Q_UPD, true, SingleSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000322 case ARM::VST4q8Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000323 ExpandVST(MBBI, ARM::VST4q8_UPD, true, EvenDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000324 case ARM::VST4q16Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000325 ExpandVST(MBBI, ARM::VST4q16_UPD, true, EvenDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000326 case ARM::VST4q32Pseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000327 ExpandVST(MBBI, ARM::VST4q32_UPD, true, EvenDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000328 case ARM::VST4q8oddPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000329 ExpandVST(MBBI, ARM::VST4q8_UPD, true, OddDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000330 case ARM::VST4q16oddPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000331 ExpandVST(MBBI, ARM::VST4q16_UPD, true, OddDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000332 case ARM::VST4q32oddPseudo_UPD:
Bob Wilson01ba4612010-08-26 18:51:29 +0000333 ExpandVST(MBBI, ARM::VST4q32_UPD, true, OddDblSpc, 4); break;
Bob Wilson709d5922010-08-25 23:27:42 +0000334 }
335
336 if (ModifiedOp)
Evan Chengd929f772010-05-13 00:17:02 +0000337 Modified = true;
Evan Chengb9803a82009-11-06 23:52:48 +0000338 MBBI = NMBBI;
339 }
340
341 return Modified;
342}
343
344bool ARMExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
345 TII = MF.getTarget().getInstrInfo();
Evan Chengd929f772010-05-13 00:17:02 +0000346 TRI = MF.getTarget().getRegisterInfo();
Evan Chengb9803a82009-11-06 23:52:48 +0000347
348 bool Modified = false;
349 for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E;
350 ++MFI)
351 Modified |= ExpandMBB(*MFI);
352 return Modified;
353}
354
355/// createARMExpandPseudoPass - returns an instance of the pseudo instruction
356/// expansion pass.
357FunctionPass *llvm::createARMExpandPseudoPass() {
358 return new ARMExpandPseudo();
359}