0e6922128c37b32798d16fffbe0e1783faa9ba0e
[oota-llvm.git] / lib / Target / ARM / ARMMCCodeEmitter.cpp
1 //===-- ARM/ARMMCCodeEmitter.cpp - Convert ARM code to machine code -------===//
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 implements the ARMMCCodeEmitter class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "mccodeemitter"
15 #include "ARM.h"
16 #include "ARMAddressingModes.h"
17 #include "ARMFixupKinds.h"
18 #include "ARMInstrInfo.h"
19 #include "llvm/MC/MCCodeEmitter.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/MC/MCInst.h"
22 #include "llvm/ADT/Statistic.h"
23 #include "llvm/Support/raw_ostream.h"
24 using namespace llvm;
25
26 STATISTIC(MCNumEmitted, "Number of MC instructions emitted.");
27 STATISTIC(MCNumCPRelocations, "Number of constant pool relocations created.");
28
29 namespace {
30 class ARMMCCodeEmitter : public MCCodeEmitter {
31   ARMMCCodeEmitter(const ARMMCCodeEmitter &); // DO NOT IMPLEMENT
32   void operator=(const ARMMCCodeEmitter &); // DO NOT IMPLEMENT
33   const TargetMachine &TM;
34   const TargetInstrInfo &TII;
35   MCContext &Ctx;
36
37 public:
38   ARMMCCodeEmitter(TargetMachine &tm, MCContext &ctx)
39     : TM(tm), TII(*TM.getInstrInfo()), Ctx(ctx) {
40   }
41
42   ~ARMMCCodeEmitter() {}
43
44   unsigned getMachineSoImmOpValue(unsigned SoImm) const;
45
46   // getBinaryCodeForInstr - TableGen'erated function for getting the
47   // binary encoding for an instruction.
48   unsigned getBinaryCodeForInstr(const MCInst &MI,
49                                  SmallVectorImpl<MCFixup> &Fixups) const;
50
51   /// getMachineOpValue - Return binary encoding of operand. If the machine
52   /// operand requires relocation, record the relocation and return zero.
53   unsigned getMachineOpValue(const MCInst &MI,const MCOperand &MO,
54                              SmallVectorImpl<MCFixup> &Fixups) const;
55
56   /// getMovtImmOpValue - Return the encoding for the movw/movt pair
57   uint32_t getMovtImmOpValue(const MCInst &MI, unsigned OpIdx,
58                              SmallVectorImpl<MCFixup> &Fixups) const;
59
60   bool EncodeAddrModeOpValues(const MCInst &MI, unsigned OpIdx,
61                               unsigned &Reg, unsigned &Imm,
62                               SmallVectorImpl<MCFixup> &Fixups) const;
63
64   /// getThumbBLTargetOpValue - Return encoding info for Thumb immediate
65   /// BL branch target.
66   uint32_t getThumbBLTargetOpValue(const MCInst &MI, unsigned OpIdx,
67                                    SmallVectorImpl<MCFixup> &Fixups) const;
68
69   /// getThumbBLXTargetOpValue - Return encoding info for Thumb immediate
70   /// BLX branch target.
71   uint32_t getThumbBLXTargetOpValue(const MCInst &MI, unsigned OpIdx,
72                                     SmallVectorImpl<MCFixup> &Fixups) const;
73
74   /// getThumbBRTargetOpValue - Return encoding info for Thumb branch target.
75   uint32_t getThumbBRTargetOpValue(const MCInst &MI, unsigned OpIdx,
76                                    SmallVectorImpl<MCFixup> &Fixups) const;
77
78   /// getThumbBCCTargetOpValue - Return encoding info for Thumb branch target.
79   uint32_t getThumbBCCTargetOpValue(const MCInst &MI, unsigned OpIdx,
80                                     SmallVectorImpl<MCFixup> &Fixups) const;
81
82   /// getThumbCBTargetOpValue - Return encoding info for Thumb branch target.
83   uint32_t getThumbCBTargetOpValue(const MCInst &MI, unsigned OpIdx,
84                                    SmallVectorImpl<MCFixup> &Fixups) const;
85
86   /// getBranchTargetOpValue - Return encoding info for 24-bit immediate
87   /// branch target.
88   uint32_t getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
89                                   SmallVectorImpl<MCFixup> &Fixups) const;
90
91   /// getUnconditionalBranchTargetOpValue - Return encoding info for 24-bit
92   /// immediate Thumb2 direct branch target.
93   uint32_t getUnconditionalBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
94                                   SmallVectorImpl<MCFixup> &Fixups) const;
95   
96
97   /// getAdrLabelOpValue - Return encoding info for 12-bit immediate
98   /// ADR label target.
99   uint32_t getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
100                               SmallVectorImpl<MCFixup> &Fixups) const;
101   uint32_t getThumbAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
102                               SmallVectorImpl<MCFixup> &Fixups) const;
103   uint32_t getT2AdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
104                               SmallVectorImpl<MCFixup> &Fixups) const;
105   
106
107   /// getAddrModeImm12OpValue - Return encoding info for 'reg +/- imm12'
108   /// operand.
109   uint32_t getAddrModeImm12OpValue(const MCInst &MI, unsigned OpIdx,
110                                    SmallVectorImpl<MCFixup> &Fixups) const;
111
112   /// getThumbAddrModeRegRegOpValue - Return encoding for 'reg + reg' operand.
113   uint32_t getThumbAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx,
114                                          SmallVectorImpl<MCFixup> &Fixups)const;
115
116   /// getT2AddrModeImm8s4OpValue - Return encoding info for 'reg +/- imm8<<2'
117   /// operand.
118   uint32_t getT2AddrModeImm8s4OpValue(const MCInst &MI, unsigned OpIdx,
119                                    SmallVectorImpl<MCFixup> &Fixups) const;
120
121
122   /// getLdStSORegOpValue - Return encoding info for 'reg +/- reg shop imm'
123   /// operand as needed by load/store instructions.
124   uint32_t getLdStSORegOpValue(const MCInst &MI, unsigned OpIdx,
125                                SmallVectorImpl<MCFixup> &Fixups) const;
126
127   /// getLdStmModeOpValue - Return encoding for load/store multiple mode.
128   uint32_t getLdStmModeOpValue(const MCInst &MI, unsigned OpIdx,
129                                SmallVectorImpl<MCFixup> &Fixups) const {
130     ARM_AM::AMSubMode Mode = (ARM_AM::AMSubMode)MI.getOperand(OpIdx).getImm();
131     switch (Mode) {
132     default: assert(0 && "Unknown addressing sub-mode!");
133     case ARM_AM::da: return 0;
134     case ARM_AM::ia: return 1;
135     case ARM_AM::db: return 2;
136     case ARM_AM::ib: return 3;
137     }
138   }
139   /// getShiftOp - Return the shift opcode (bit[6:5]) of the immediate value.
140   ///
141   unsigned getShiftOp(ARM_AM::ShiftOpc ShOpc) const {
142     switch (ShOpc) {
143     default: llvm_unreachable("Unknown shift opc!");
144     case ARM_AM::no_shift:
145     case ARM_AM::lsl: return 0;
146     case ARM_AM::lsr: return 1;
147     case ARM_AM::asr: return 2;
148     case ARM_AM::ror:
149     case ARM_AM::rrx: return 3;
150     }
151     return 0;
152   }
153
154   /// getAddrMode2OpValue - Return encoding for addrmode2 operands.
155   uint32_t getAddrMode2OpValue(const MCInst &MI, unsigned OpIdx,
156                                SmallVectorImpl<MCFixup> &Fixups) const;
157
158   /// getAddrMode2OffsetOpValue - Return encoding for am2offset operands.
159   uint32_t getAddrMode2OffsetOpValue(const MCInst &MI, unsigned OpIdx,
160                                      SmallVectorImpl<MCFixup> &Fixups) const;
161
162   /// getAddrMode3OffsetOpValue - Return encoding for am3offset operands.
163   uint32_t getAddrMode3OffsetOpValue(const MCInst &MI, unsigned OpIdx,
164                                      SmallVectorImpl<MCFixup> &Fixups) const;
165
166   /// getAddrMode3OpValue - Return encoding for addrmode3 operands.
167   uint32_t getAddrMode3OpValue(const MCInst &MI, unsigned OpIdx,
168                                SmallVectorImpl<MCFixup> &Fixups) const;
169
170   /// getAddrModeThumbSPOpValue - Return encoding info for 'reg +/- imm12'
171   /// operand.
172   uint32_t getAddrModeThumbSPOpValue(const MCInst &MI, unsigned OpIdx,
173                                      SmallVectorImpl<MCFixup> &Fixups) const;
174
175   /// getAddrModeISOpValue - Encode the t_addrmode_is# operands.
176   uint32_t getAddrModeISOpValue(const MCInst &MI, unsigned OpIdx,
177                                 SmallVectorImpl<MCFixup> &Fixups) const;
178
179   /// getAddrModePCOpValue - Return encoding for t_addrmode_pc operands.
180   uint32_t getAddrModePCOpValue(const MCInst &MI, unsigned OpIdx,
181                                 SmallVectorImpl<MCFixup> &Fixups) const;
182
183   /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm8' operand.
184   uint32_t getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx,
185                                SmallVectorImpl<MCFixup> &Fixups) const;
186
187   /// getCCOutOpValue - Return encoding of the 's' bit.
188   unsigned getCCOutOpValue(const MCInst &MI, unsigned Op,
189                            SmallVectorImpl<MCFixup> &Fixups) const {
190     // The operand is either reg0 or CPSR. The 's' bit is encoded as '0' or
191     // '1' respectively.
192     return MI.getOperand(Op).getReg() == ARM::CPSR;
193   }
194
195   /// getSOImmOpValue - Return an encoded 12-bit shifted-immediate value.
196   unsigned getSOImmOpValue(const MCInst &MI, unsigned Op,
197                            SmallVectorImpl<MCFixup> &Fixups) const {
198     unsigned SoImm = MI.getOperand(Op).getImm();
199     int SoImmVal = ARM_AM::getSOImmVal(SoImm);
200     assert(SoImmVal != -1 && "Not a valid so_imm value!");
201
202     // Encode rotate_imm.
203     unsigned Binary = (ARM_AM::getSOImmValRot((unsigned)SoImmVal) >> 1)
204       << ARMII::SoRotImmShift;
205
206     // Encode immed_8.
207     Binary |= ARM_AM::getSOImmValImm((unsigned)SoImmVal);
208     return Binary;
209   }
210
211   /// getT2SOImmOpValue - Return an encoded 12-bit shifted-immediate value.
212   unsigned getT2SOImmOpValue(const MCInst &MI, unsigned Op,
213                            SmallVectorImpl<MCFixup> &Fixups) const {
214     unsigned SoImm = MI.getOperand(Op).getImm();
215     unsigned Encoded =  ARM_AM::getT2SOImmVal(SoImm);
216     assert(Encoded != ~0U && "Not a Thumb2 so_imm value?");
217     return Encoded;
218   }
219
220   unsigned getT2AddrModeSORegOpValue(const MCInst &MI, unsigned OpNum,
221     SmallVectorImpl<MCFixup> &Fixups) const;
222   unsigned getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum,
223     SmallVectorImpl<MCFixup> &Fixups) const;
224   unsigned getT2AddrModeImm8OffsetOpValue(const MCInst &MI, unsigned OpNum,
225     SmallVectorImpl<MCFixup> &Fixups) const;
226   unsigned getT2AddrModeImm12OffsetOpValue(const MCInst &MI, unsigned OpNum,
227     SmallVectorImpl<MCFixup> &Fixups) const;
228
229   /// getSORegOpValue - Return an encoded so_reg shifted register value.
230   unsigned getSORegOpValue(const MCInst &MI, unsigned Op,
231                            SmallVectorImpl<MCFixup> &Fixups) const;
232   unsigned getT2SORegOpValue(const MCInst &MI, unsigned Op,
233                              SmallVectorImpl<MCFixup> &Fixups) const;
234
235   unsigned getRotImmOpValue(const MCInst &MI, unsigned Op,
236                             SmallVectorImpl<MCFixup> &Fixups) const {
237     switch (MI.getOperand(Op).getImm()) {
238     default: assert (0 && "Not a valid rot_imm value!");
239     case 0:  return 0;
240     case 8:  return 1;
241     case 16: return 2;
242     case 24: return 3;
243     }
244   }
245
246   unsigned getImmMinusOneOpValue(const MCInst &MI, unsigned Op,
247                                  SmallVectorImpl<MCFixup> &Fixups) const {
248     return MI.getOperand(Op).getImm() - 1;
249   }
250
251   unsigned getNEONVcvtImm32OpValue(const MCInst &MI, unsigned Op,
252                                    SmallVectorImpl<MCFixup> &Fixups) const {
253     return 64 - MI.getOperand(Op).getImm();
254   }
255
256   unsigned getBitfieldInvertedMaskOpValue(const MCInst &MI, unsigned Op,
257                                       SmallVectorImpl<MCFixup> &Fixups) const;
258
259   unsigned getRegisterListOpValue(const MCInst &MI, unsigned Op,
260                                   SmallVectorImpl<MCFixup> &Fixups) const;
261   unsigned getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op,
262                                       SmallVectorImpl<MCFixup> &Fixups) const;
263   unsigned getAddrMode6DupAddressOpValue(const MCInst &MI, unsigned Op,
264                                         SmallVectorImpl<MCFixup> &Fixups) const;
265   unsigned getAddrMode6OffsetOpValue(const MCInst &MI, unsigned Op,
266                                      SmallVectorImpl<MCFixup> &Fixups) const;
267
268   unsigned NEONThumb2DataIPostEncoder(const MCInst &MI,
269                                       unsigned EncodedValue) const;
270   unsigned NEONThumb2LoadStorePostEncoder(const MCInst &MI,
271                                           unsigned EncodedValue) const;
272   unsigned NEONThumb2DupPostEncoder(const MCInst &MI,
273                                     unsigned EncodedValue) const;
274
275   unsigned VFPThumb2PostEncoder(const MCInst &MI,
276                                 unsigned EncodedValue) const;
277
278   void EmitByte(unsigned char C, raw_ostream &OS) const {
279     OS << (char)C;
280   }
281
282   void EmitConstant(uint64_t Val, unsigned Size, raw_ostream &OS) const {
283     // Output the constant in little endian byte order.
284     for (unsigned i = 0; i != Size; ++i) {
285       EmitByte(Val & 255, OS);
286       Val >>= 8;
287     }
288   }
289
290   void EncodeInstruction(const MCInst &MI, raw_ostream &OS,
291                          SmallVectorImpl<MCFixup> &Fixups) const;
292 };
293
294 } // end anonymous namespace
295
296 MCCodeEmitter *llvm::createARMMCCodeEmitter(const Target &, TargetMachine &TM,
297                                             MCContext &Ctx) {
298   return new ARMMCCodeEmitter(TM, Ctx);
299 }
300
301 /// NEONThumb2DataIPostEncoder - Post-process encoded NEON data-processing
302 /// instructions, and rewrite them to their Thumb2 form if we are currently in
303 /// Thumb2 mode.
304 unsigned ARMMCCodeEmitter::NEONThumb2DataIPostEncoder(const MCInst &MI,
305                                                  unsigned EncodedValue) const {
306   const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
307   if (Subtarget.isThumb2()) {
308     // NEON Thumb2 data-processsing encodings are very simple: bit 24 is moved
309     // to bit 12 of the high half-word (i.e. bit 28), and bits 27-24 are
310     // set to 1111.
311     unsigned Bit24 = EncodedValue & 0x01000000;
312     unsigned Bit28 = Bit24 << 4;
313     EncodedValue &= 0xEFFFFFFF;
314     EncodedValue |= Bit28;
315     EncodedValue |= 0x0F000000;
316   }
317
318   return EncodedValue;
319 }
320
321 /// NEONThumb2LoadStorePostEncoder - Post-process encoded NEON load/store
322 /// instructions, and rewrite them to their Thumb2 form if we are currently in
323 /// Thumb2 mode.
324 unsigned ARMMCCodeEmitter::NEONThumb2LoadStorePostEncoder(const MCInst &MI,
325                                                  unsigned EncodedValue) const {
326   const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
327   if (Subtarget.isThumb2()) {
328     EncodedValue &= 0xF0FFFFFF;
329     EncodedValue |= 0x09000000;
330   }
331
332   return EncodedValue;
333 }
334
335 /// NEONThumb2DupPostEncoder - Post-process encoded NEON vdup
336 /// instructions, and rewrite them to their Thumb2 form if we are currently in
337 /// Thumb2 mode.
338 unsigned ARMMCCodeEmitter::NEONThumb2DupPostEncoder(const MCInst &MI,
339                                                  unsigned EncodedValue) const {
340   const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
341   if (Subtarget.isThumb2()) {
342     EncodedValue &= 0x00FFFFFF;
343     EncodedValue |= 0xEE000000;
344   }
345
346   return EncodedValue;
347 }
348
349 /// VFPThumb2PostEncoder - Post-process encoded VFP instructions and rewrite
350 /// them to their Thumb2 form if we are currently in Thumb2 mode.
351 unsigned ARMMCCodeEmitter::
352 VFPThumb2PostEncoder(const MCInst &MI, unsigned EncodedValue) const {
353   if (TM.getSubtarget<ARMSubtarget>().isThumb2()) {
354     EncodedValue &= 0x0FFFFFFF;
355     EncodedValue |= 0xE0000000;
356   }
357   return EncodedValue;
358 }
359
360 /// getMachineOpValue - Return binary encoding of operand. If the machine
361 /// operand requires relocation, record the relocation and return zero.
362 unsigned ARMMCCodeEmitter::
363 getMachineOpValue(const MCInst &MI, const MCOperand &MO,
364                   SmallVectorImpl<MCFixup> &Fixups) const {
365   if (MO.isReg()) {
366     unsigned Reg = MO.getReg();
367     unsigned RegNo = getARMRegisterNumbering(Reg);
368
369     // Q registers are encoded as 2x their register number.
370     switch (Reg) {
371     default:
372       return RegNo;
373     case ARM::Q0:  case ARM::Q1:  case ARM::Q2:  case ARM::Q3:
374     case ARM::Q4:  case ARM::Q5:  case ARM::Q6:  case ARM::Q7:
375     case ARM::Q8:  case ARM::Q9:  case ARM::Q10: case ARM::Q11:
376     case ARM::Q12: case ARM::Q13: case ARM::Q14: case ARM::Q15:
377       return 2 * RegNo;
378     }
379   } else if (MO.isImm()) {
380     return static_cast<unsigned>(MO.getImm());
381   } else if (MO.isFPImm()) {
382     return static_cast<unsigned>(APFloat(MO.getFPImm())
383                      .bitcastToAPInt().getHiBits(32).getLimitedValue());
384   }
385
386   llvm_unreachable("Unable to encode MCOperand!");
387   return 0;
388 }
389
390 /// getAddrModeImmOpValue - Return encoding info for 'reg +/- imm' operand.
391 bool ARMMCCodeEmitter::
392 EncodeAddrModeOpValues(const MCInst &MI, unsigned OpIdx, unsigned &Reg,
393                        unsigned &Imm, SmallVectorImpl<MCFixup> &Fixups) const {
394   const MCOperand &MO  = MI.getOperand(OpIdx);
395   const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
396
397   Reg = getARMRegisterNumbering(MO.getReg());
398
399   int32_t SImm = MO1.getImm();
400   bool isAdd = true;
401
402   // Special value for #-0
403   if (SImm == INT32_MIN)
404     SImm = 0;
405
406   // Immediate is always encoded as positive. The 'U' bit controls add vs sub.
407   if (SImm < 0) {
408     SImm = -SImm;
409     isAdd = false;
410   }
411
412   Imm = SImm;
413   return isAdd;
414 }
415
416 /// getBranchTargetOpValue - Helper function to get the branch target operand,
417 /// which is either an immediate or requires a fixup.
418 static uint32_t getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
419                                        unsigned FixupKind,
420                                        SmallVectorImpl<MCFixup> &Fixups) {
421   const MCOperand &MO = MI.getOperand(OpIdx);
422
423   // If the destination is an immediate, we have nothing to do.
424   if (MO.isImm()) return MO.getImm();
425   assert(MO.isExpr() && "Unexpected branch target type!");
426   const MCExpr *Expr = MO.getExpr();
427   MCFixupKind Kind = MCFixupKind(FixupKind);
428   Fixups.push_back(MCFixup::Create(0, Expr, Kind));
429
430   // All of the information is in the fixup.
431   return 0;
432 }
433
434 /// getThumbBLTargetOpValue - Return encoding info for immediate branch target.
435 uint32_t ARMMCCodeEmitter::
436 getThumbBLTargetOpValue(const MCInst &MI, unsigned OpIdx,
437                         SmallVectorImpl<MCFixup> &Fixups) const {
438   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_thumb_bl, Fixups);
439 }
440
441 /// getThumbBLXTargetOpValue - Return encoding info for Thumb immediate
442 /// BLX branch target.
443 uint32_t ARMMCCodeEmitter::
444 getThumbBLXTargetOpValue(const MCInst &MI, unsigned OpIdx,
445                          SmallVectorImpl<MCFixup> &Fixups) const {
446   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_thumb_blx, Fixups);
447 }
448
449 /// getThumbBRTargetOpValue - Return encoding info for Thumb branch target.
450 uint32_t ARMMCCodeEmitter::
451 getThumbBRTargetOpValue(const MCInst &MI, unsigned OpIdx,
452                         SmallVectorImpl<MCFixup> &Fixups) const {
453   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_thumb_br, Fixups);
454 }
455
456 /// getThumbBCCTargetOpValue - Return encoding info for Thumb branch target.
457 uint32_t ARMMCCodeEmitter::
458 getThumbBCCTargetOpValue(const MCInst &MI, unsigned OpIdx,
459                          SmallVectorImpl<MCFixup> &Fixups) const {
460   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_thumb_bcc, Fixups);
461 }
462
463 /// getThumbCBTargetOpValue - Return encoding info for Thumb branch target.
464 uint32_t ARMMCCodeEmitter::
465 getThumbCBTargetOpValue(const MCInst &MI, unsigned OpIdx,
466                         SmallVectorImpl<MCFixup> &Fixups) const {
467   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_thumb_cb, Fixups);
468 }
469
470 /// getBranchTargetOpValue - Return encoding info for 24-bit immediate branch
471 /// target.
472 uint32_t ARMMCCodeEmitter::
473 getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
474                        SmallVectorImpl<MCFixup> &Fixups) const {
475   // FIXME: This really, really shouldn't use TargetMachine. We don't want
476   // coupling between MC and TM anywhere we can help it.
477   const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
478   if (Subtarget.isThumb2())
479     return
480       ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_condbranch, Fixups);
481   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_branch, Fixups);
482 }
483
484 /// getUnconditionalBranchTargetOpValue - Return encoding info for 24-bit
485 /// immediate branch target.
486 uint32_t ARMMCCodeEmitter::
487 getUnconditionalBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
488                        SmallVectorImpl<MCFixup> &Fixups) const {
489   unsigned Val =
490     ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_uncondbranch, Fixups);
491   bool I  = (Val & 0x800000);
492   bool J1 = (Val & 0x400000);
493   bool J2 = (Val & 0x200000);
494   if (I ^ J1)
495     Val &= ~0x400000;
496   else
497     Val |= 0x400000;
498     
499   if (I ^ J2)
500     Val &= ~0x200000;
501   else
502     Val |= 0x200000;
503   
504   return Val;
505 }
506
507 /// getAdrLabelOpValue - Return encoding info for 12-bit immediate ADR label
508 /// target.
509 uint32_t ARMMCCodeEmitter::
510 getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
511                    SmallVectorImpl<MCFixup> &Fixups) const {
512   assert(MI.getOperand(OpIdx).isExpr() && "Unexpected adr target type!");
513   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_adr_pcrel_12,
514                                   Fixups);
515 }
516
517 /// getAdrLabelOpValue - Return encoding info for 12-bit immediate ADR label
518 /// target.
519 uint32_t ARMMCCodeEmitter::
520 getT2AdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
521                    SmallVectorImpl<MCFixup> &Fixups) const {
522   assert(MI.getOperand(OpIdx).isExpr() && "Unexpected adr target type!");
523   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_adr_pcrel_12,
524                                   Fixups);
525 }
526
527 /// getAdrLabelOpValue - Return encoding info for 8-bit immediate ADR label
528 /// target.
529 uint32_t ARMMCCodeEmitter::
530 getThumbAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
531                    SmallVectorImpl<MCFixup> &Fixups) const {
532   assert(MI.getOperand(OpIdx).isExpr() && "Unexpected adr target type!");
533   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_thumb_adr_pcrel_10,
534                                   Fixups);
535 }
536
537 /// getThumbAddrModeRegRegOpValue - Return encoding info for 'reg + reg'
538 /// operand.
539 uint32_t ARMMCCodeEmitter::
540 getThumbAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx,
541                               SmallVectorImpl<MCFixup> &) const {
542   // [Rn, Rm]
543   //   {5-3} = Rm
544   //   {2-0} = Rn
545   const MCOperand &MO1 = MI.getOperand(OpIdx);
546   const MCOperand &MO2 = MI.getOperand(OpIdx + 1);
547   unsigned Rn = getARMRegisterNumbering(MO1.getReg());
548   unsigned Rm = getARMRegisterNumbering(MO2.getReg());
549   return (Rm << 3) | Rn;
550 }
551
552 /// getAddrModeImm12OpValue - Return encoding info for 'reg +/- imm12' operand.
553 uint32_t ARMMCCodeEmitter::
554 getAddrModeImm12OpValue(const MCInst &MI, unsigned OpIdx,
555                         SmallVectorImpl<MCFixup> &Fixups) const {
556   // {17-13} = reg
557   // {12}    = (U)nsigned (add == '1', sub == '0')
558   // {11-0}  = imm12
559   unsigned Reg, Imm12;
560   bool isAdd = true;
561   // If The first operand isn't a register, we have a label reference.
562   const MCOperand &MO = MI.getOperand(OpIdx);
563   const MCOperand &MO2 = MI.getOperand(OpIdx+1);
564   if (!MO.isReg() || (MO.getReg() == ARM::PC && MO2.isExpr())) {
565     Reg = getARMRegisterNumbering(ARM::PC);   // Rn is PC.
566     Imm12 = 0;
567     isAdd = false ; // 'U' bit is set as part of the fixup.
568
569     const MCExpr *Expr = 0;
570     if (!MO.isReg())
571       Expr = MO.getExpr();
572     else
573       Expr = MO2.getExpr();
574
575     const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
576     MCFixupKind Kind;
577     if (Subtarget.isThumb2())
578       Kind = MCFixupKind(ARM::fixup_t2_ldst_pcrel_12);
579     else
580       Kind = MCFixupKind(ARM::fixup_arm_ldst_pcrel_12);
581     Fixups.push_back(MCFixup::Create(0, Expr, Kind));
582
583     ++MCNumCPRelocations;
584   } else
585     isAdd = EncodeAddrModeOpValues(MI, OpIdx, Reg, Imm12, Fixups);
586
587   uint32_t Binary = Imm12 & 0xfff;
588   // Immediate is always encoded as positive. The 'U' bit controls add vs sub.
589   if (isAdd)
590     Binary |= (1 << 12);
591   Binary |= (Reg << 13);
592   return Binary;
593 }
594
595 /// getT2AddrModeImm8s4OpValue - Return encoding info for
596 /// 'reg +/- imm8<<2' operand.
597 uint32_t ARMMCCodeEmitter::
598 getT2AddrModeImm8s4OpValue(const MCInst &MI, unsigned OpIdx,
599                         SmallVectorImpl<MCFixup> &Fixups) const {
600   // {12-9} = reg
601   // {8}    = (U)nsigned (add == '1', sub == '0')
602   // {7-0}  = imm8
603   unsigned Reg, Imm8;
604   bool isAdd = true;
605   // If The first operand isn't a register, we have a label reference.
606   const MCOperand &MO = MI.getOperand(OpIdx);
607   if (!MO.isReg()) {
608     Reg = getARMRegisterNumbering(ARM::PC);   // Rn is PC.
609     Imm8 = 0;
610     isAdd = false ; // 'U' bit is set as part of the fixup.
611
612     assert(MO.isExpr() && "Unexpected machine operand type!");
613     const MCExpr *Expr = MO.getExpr();
614     MCFixupKind Kind = MCFixupKind(ARM::fixup_arm_pcrel_10);
615     Fixups.push_back(MCFixup::Create(0, Expr, Kind));
616
617     ++MCNumCPRelocations;
618   } else
619     isAdd = EncodeAddrModeOpValues(MI, OpIdx, Reg, Imm8, Fixups);
620
621   uint32_t Binary = (Imm8 >> 2) & 0xff;
622   // Immediate is always encoded as positive. The 'U' bit controls add vs sub.
623   if (isAdd)
624     Binary |= (1 << 8);
625   Binary |= (Reg << 9);
626   return Binary;
627 }
628
629 uint32_t ARMMCCodeEmitter::
630 getMovtImmOpValue(const MCInst &MI, unsigned OpIdx,
631                   SmallVectorImpl<MCFixup> &Fixups) const {
632   // {20-16} = imm{15-12}
633   // {11-0}  = imm{11-0}
634   const MCOperand &MO = MI.getOperand(OpIdx);
635   if (MO.isImm()) {
636     return static_cast<unsigned>(MO.getImm());
637   } else if (const MCSymbolRefExpr *Expr =
638              dyn_cast<MCSymbolRefExpr>(MO.getExpr())) {
639     MCFixupKind Kind;
640     switch (Expr->getKind()) {
641     default: assert(0 && "Unsupported ARMFixup");
642     case MCSymbolRefExpr::VK_ARM_HI16:
643       Kind = MCFixupKind(ARM::fixup_arm_movt_hi16);
644       break;
645     case MCSymbolRefExpr::VK_ARM_LO16:
646       Kind = MCFixupKind(ARM::fixup_arm_movw_lo16);
647       break;
648     }
649     Fixups.push_back(MCFixup::Create(0, Expr, Kind));
650     return 0;
651   };
652   llvm_unreachable("Unsupported MCExpr type in MCOperand!");
653   return 0;
654 }
655
656 uint32_t ARMMCCodeEmitter::
657 getLdStSORegOpValue(const MCInst &MI, unsigned OpIdx,
658                     SmallVectorImpl<MCFixup> &Fixups) const {
659   const MCOperand &MO = MI.getOperand(OpIdx);
660   const MCOperand &MO1 = MI.getOperand(OpIdx+1);
661   const MCOperand &MO2 = MI.getOperand(OpIdx+2);
662   unsigned Rn = getARMRegisterNumbering(MO.getReg());
663   unsigned Rm = getARMRegisterNumbering(MO1.getReg());
664   unsigned ShImm = ARM_AM::getAM2Offset(MO2.getImm());
665   bool isAdd = ARM_AM::getAM2Op(MO2.getImm()) == ARM_AM::add;
666   ARM_AM::ShiftOpc ShOp = ARM_AM::getAM2ShiftOpc(MO2.getImm());
667   unsigned SBits = getShiftOp(ShOp);
668
669   // {16-13} = Rn
670   // {12}    = isAdd
671   // {11-0}  = shifter
672   //  {3-0}  = Rm
673   //  {4}    = 0
674   //  {6-5}  = type
675   //  {11-7} = imm
676   uint32_t Binary = Rm;
677   Binary |= Rn << 13;
678   Binary |= SBits << 5;
679   Binary |= ShImm << 7;
680   if (isAdd)
681     Binary |= 1 << 12;
682   return Binary;
683 }
684
685 uint32_t ARMMCCodeEmitter::
686 getAddrMode2OpValue(const MCInst &MI, unsigned OpIdx,
687                     SmallVectorImpl<MCFixup> &Fixups) const {
688   // {17-14}  Rn
689   // {13}     1 == imm12, 0 == Rm
690   // {12}     isAdd
691   // {11-0}   imm12/Rm
692   const MCOperand &MO = MI.getOperand(OpIdx);
693   unsigned Rn = getARMRegisterNumbering(MO.getReg());
694   uint32_t Binary = getAddrMode2OffsetOpValue(MI, OpIdx + 1, Fixups);
695   Binary |= Rn << 14;
696   return Binary;
697 }
698
699 uint32_t ARMMCCodeEmitter::
700 getAddrMode2OffsetOpValue(const MCInst &MI, unsigned OpIdx,
701                           SmallVectorImpl<MCFixup> &Fixups) const {
702   // {13}     1 == imm12, 0 == Rm
703   // {12}     isAdd
704   // {11-0}   imm12/Rm
705   const MCOperand &MO = MI.getOperand(OpIdx);
706   const MCOperand &MO1 = MI.getOperand(OpIdx+1);
707   unsigned Imm = MO1.getImm();
708   bool isAdd = ARM_AM::getAM2Op(Imm) == ARM_AM::add;
709   bool isReg = MO.getReg() != 0;
710   uint32_t Binary = ARM_AM::getAM2Offset(Imm);
711   // if reg +/- reg, Rm will be non-zero. Otherwise, we have reg +/- imm12
712   if (isReg) {
713     ARM_AM::ShiftOpc ShOp = ARM_AM::getAM2ShiftOpc(Imm);
714     Binary <<= 7;                    // Shift amount is bits [11:7]
715     Binary |= getShiftOp(ShOp) << 5; // Shift type is bits [6:5]
716     Binary |= getARMRegisterNumbering(MO.getReg()); // Rm is bits [3:0]
717   }
718   return Binary | (isAdd << 12) | (isReg << 13);
719 }
720
721 uint32_t ARMMCCodeEmitter::
722 getAddrMode3OffsetOpValue(const MCInst &MI, unsigned OpIdx,
723                           SmallVectorImpl<MCFixup> &Fixups) const {
724   // {9}      1 == imm8, 0 == Rm
725   // {8}      isAdd
726   // {7-4}    imm7_4/zero
727   // {3-0}    imm3_0/Rm
728   const MCOperand &MO = MI.getOperand(OpIdx);
729   const MCOperand &MO1 = MI.getOperand(OpIdx+1);
730   unsigned Imm = MO1.getImm();
731   bool isAdd = ARM_AM::getAM3Op(Imm) == ARM_AM::add;
732   bool isImm = MO.getReg() == 0;
733   uint32_t Imm8 = ARM_AM::getAM3Offset(Imm);
734   // if reg +/- reg, Rm will be non-zero. Otherwise, we have reg +/- imm8
735   if (!isImm)
736     Imm8 = getARMRegisterNumbering(MO.getReg());
737   return Imm8 | (isAdd << 8) | (isImm << 9);
738 }
739
740 uint32_t ARMMCCodeEmitter::
741 getAddrMode3OpValue(const MCInst &MI, unsigned OpIdx,
742                     SmallVectorImpl<MCFixup> &Fixups) const {
743   // {13}     1 == imm8, 0 == Rm
744   // {12-9}   Rn
745   // {8}      isAdd
746   // {7-4}    imm7_4/zero
747   // {3-0}    imm3_0/Rm
748   const MCOperand &MO = MI.getOperand(OpIdx);
749   const MCOperand &MO1 = MI.getOperand(OpIdx+1);
750   const MCOperand &MO2 = MI.getOperand(OpIdx+2);
751   unsigned Rn = getARMRegisterNumbering(MO.getReg());
752   unsigned Imm = MO2.getImm();
753   bool isAdd = ARM_AM::getAM3Op(Imm) == ARM_AM::add;
754   bool isImm = MO1.getReg() == 0;
755   uint32_t Imm8 = ARM_AM::getAM3Offset(Imm);
756   // if reg +/- reg, Rm will be non-zero. Otherwise, we have reg +/- imm8
757   if (!isImm)
758     Imm8 = getARMRegisterNumbering(MO1.getReg());
759   return (Rn << 9) | Imm8 | (isAdd << 8) | (isImm << 13);
760 }
761
762 /// getAddrModeThumbSPOpValue - Encode the t_addrmode_sp operands.
763 uint32_t ARMMCCodeEmitter::
764 getAddrModeThumbSPOpValue(const MCInst &MI, unsigned OpIdx,
765                           SmallVectorImpl<MCFixup> &Fixups) const {
766   // [SP, #imm]
767   //   {7-0} = imm8
768   const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
769   assert(MI.getOperand(OpIdx).getReg() == ARM::SP &&
770          "Unexpected base register!");
771
772   // The immediate is already shifted for the implicit zeroes, so no change
773   // here.
774   return MO1.getImm() & 0xff;
775 }
776
777 /// getAddrModeISOpValue - Encode the t_addrmode_is# operands.
778 uint32_t ARMMCCodeEmitter::
779 getAddrModeISOpValue(const MCInst &MI, unsigned OpIdx,
780                      SmallVectorImpl<MCFixup> &Fixups) const {
781   // [Rn, #imm]
782   //   {7-3} = imm5
783   //   {2-0} = Rn
784   const MCOperand &MO = MI.getOperand(OpIdx);
785   const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
786   unsigned Rn = getARMRegisterNumbering(MO.getReg());
787   unsigned Imm5 = MO1.getImm();
788   return ((Imm5 & 0x1f) << 3) | Rn;
789 }
790
791 /// getAddrModePCOpValue - Return encoding for t_addrmode_pc operands.
792 uint32_t ARMMCCodeEmitter::
793 getAddrModePCOpValue(const MCInst &MI, unsigned OpIdx,
794                      SmallVectorImpl<MCFixup> &Fixups) const {
795   return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_thumb_cp, Fixups);
796 }
797
798 /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm10' operand.
799 uint32_t ARMMCCodeEmitter::
800 getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx,
801                     SmallVectorImpl<MCFixup> &Fixups) const {
802   // {12-9} = reg
803   // {8}    = (U)nsigned (add == '1', sub == '0')
804   // {7-0}  = imm8
805   unsigned Reg, Imm8;
806   bool isAdd;
807   // If The first operand isn't a register, we have a label reference.
808   const MCOperand &MO = MI.getOperand(OpIdx);
809   if (!MO.isReg()) {
810     Reg = getARMRegisterNumbering(ARM::PC);   // Rn is PC.
811     Imm8 = 0;
812     isAdd = false; // 'U' bit is handled as part of the fixup.
813
814     assert(MO.isExpr() && "Unexpected machine operand type!");
815     const MCExpr *Expr = MO.getExpr();
816     MCFixupKind Kind;
817     const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
818     if (Subtarget.isThumb2())
819       Kind = MCFixupKind(ARM::fixup_t2_pcrel_10);
820     else
821       Kind = MCFixupKind(ARM::fixup_arm_pcrel_10);
822     Fixups.push_back(MCFixup::Create(0, Expr, Kind));
823
824     ++MCNumCPRelocations;
825   } else {
826     EncodeAddrModeOpValues(MI, OpIdx, Reg, Imm8, Fixups);
827     isAdd = ARM_AM::getAM5Op(Imm8) == ARM_AM::add;
828   }
829
830   uint32_t Binary = ARM_AM::getAM5Offset(Imm8);
831   // Immediate is always encoded as positive. The 'U' bit controls add vs sub.
832   if (isAdd)
833     Binary |= (1 << 8);
834   Binary |= (Reg << 9);
835   return Binary;
836 }
837
838 unsigned ARMMCCodeEmitter::
839 getSORegOpValue(const MCInst &MI, unsigned OpIdx,
840                 SmallVectorImpl<MCFixup> &Fixups) const {
841   // Sub-operands are [reg, reg, imm]. The first register is Rm, the reg to be
842   // shifted. The second is either Rs, the amount to shift by, or reg0 in which
843   // case the imm contains the amount to shift by.
844   //
845   // {3-0} = Rm.
846   // {4}   = 1 if reg shift, 0 if imm shift
847   // {6-5} = type
848   //    If reg shift:
849   //      {11-8} = Rs
850   //      {7}    = 0
851   //    else (imm shift)
852   //      {11-7} = imm
853
854   const MCOperand &MO  = MI.getOperand(OpIdx);
855   const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
856   const MCOperand &MO2 = MI.getOperand(OpIdx + 2);
857   ARM_AM::ShiftOpc SOpc = ARM_AM::getSORegShOp(MO2.getImm());
858
859   // Encode Rm.
860   unsigned Binary = getARMRegisterNumbering(MO.getReg());
861
862   // Encode the shift opcode.
863   unsigned SBits = 0;
864   unsigned Rs = MO1.getReg();
865   if (Rs) {
866     // Set shift operand (bit[7:4]).
867     // LSL - 0001
868     // LSR - 0011
869     // ASR - 0101
870     // ROR - 0111
871     // RRX - 0110 and bit[11:8] clear.
872     switch (SOpc) {
873     default: llvm_unreachable("Unknown shift opc!");
874     case ARM_AM::lsl: SBits = 0x1; break;
875     case ARM_AM::lsr: SBits = 0x3; break;
876     case ARM_AM::asr: SBits = 0x5; break;
877     case ARM_AM::ror: SBits = 0x7; break;
878     case ARM_AM::rrx: SBits = 0x6; break;
879     }
880   } else {
881     // Set shift operand (bit[6:4]).
882     // LSL - 000
883     // LSR - 010
884     // ASR - 100
885     // ROR - 110
886     switch (SOpc) {
887     default: llvm_unreachable("Unknown shift opc!");
888     case ARM_AM::lsl: SBits = 0x0; break;
889     case ARM_AM::lsr: SBits = 0x2; break;
890     case ARM_AM::asr: SBits = 0x4; break;
891     case ARM_AM::ror: SBits = 0x6; break;
892     }
893   }
894
895   Binary |= SBits << 4;
896   if (SOpc == ARM_AM::rrx)
897     return Binary;
898
899   // Encode the shift operation Rs or shift_imm (except rrx).
900   if (Rs) {
901     // Encode Rs bit[11:8].
902     assert(ARM_AM::getSORegOffset(MO2.getImm()) == 0);
903     return Binary | (getARMRegisterNumbering(Rs) << ARMII::RegRsShift);
904   }
905
906   // Encode shift_imm bit[11:7].
907   return Binary | ARM_AM::getSORegOffset(MO2.getImm()) << 7;
908 }
909
910 unsigned ARMMCCodeEmitter::
911 getT2AddrModeSORegOpValue(const MCInst &MI, unsigned OpNum,
912                 SmallVectorImpl<MCFixup> &Fixups) const {
913   const MCOperand &MO1 = MI.getOperand(OpNum);
914   const MCOperand &MO2 = MI.getOperand(OpNum+1);
915   const MCOperand &MO3 = MI.getOperand(OpNum+2);
916
917   // Encoded as [Rn, Rm, imm].
918   // FIXME: Needs fixup support.
919   unsigned Value = getARMRegisterNumbering(MO1.getReg());
920   Value <<= 4;
921   Value |= getARMRegisterNumbering(MO2.getReg());
922   Value <<= 2;
923   Value |= MO3.getImm();
924
925   return Value;
926 }
927
928 unsigned ARMMCCodeEmitter::
929 getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum,
930                          SmallVectorImpl<MCFixup> &Fixups) const {
931   const MCOperand &MO1 = MI.getOperand(OpNum);
932   const MCOperand &MO2 = MI.getOperand(OpNum+1);
933
934   // FIXME: Needs fixup support.
935   unsigned Value = getARMRegisterNumbering(MO1.getReg());
936
937   // Even though the immediate is 8 bits long, we need 9 bits in order
938   // to represent the (inverse of the) sign bit.
939   Value <<= 9;
940   int32_t tmp = (int32_t)MO2.getImm();
941   if (tmp < 0)
942     tmp = abs(tmp);
943   else
944     Value |= 256; // Set the ADD bit
945   Value |= tmp & 255;
946   return Value;
947 }
948
949 unsigned ARMMCCodeEmitter::
950 getT2AddrModeImm8OffsetOpValue(const MCInst &MI, unsigned OpNum,
951                          SmallVectorImpl<MCFixup> &Fixups) const {
952   const MCOperand &MO1 = MI.getOperand(OpNum);
953
954   // FIXME: Needs fixup support.
955   unsigned Value = 0;
956   int32_t tmp = (int32_t)MO1.getImm();
957   if (tmp < 0)
958     tmp = abs(tmp);
959   else
960     Value |= 256; // Set the ADD bit
961   Value |= tmp & 255;
962   return Value;
963 }
964
965 unsigned ARMMCCodeEmitter::
966 getT2AddrModeImm12OffsetOpValue(const MCInst &MI, unsigned OpNum,
967                          SmallVectorImpl<MCFixup> &Fixups) const {
968   const MCOperand &MO1 = MI.getOperand(OpNum);
969
970   // FIXME: Needs fixup support.
971   unsigned Value = 0;
972   int32_t tmp = (int32_t)MO1.getImm();
973   if (tmp < 0)
974     tmp = abs(tmp);
975   else
976     Value |= 4096; // Set the ADD bit
977   Value |= tmp & 4095;
978   return Value;
979 }
980
981 unsigned ARMMCCodeEmitter::
982 getT2SORegOpValue(const MCInst &MI, unsigned OpIdx,
983                 SmallVectorImpl<MCFixup> &Fixups) const {
984   // Sub-operands are [reg, imm]. The first register is Rm, the reg to be
985   // shifted. The second is the amount to shift by.
986   //
987   // {3-0} = Rm.
988   // {4}   = 0
989   // {6-5} = type
990   // {11-7} = imm
991
992   const MCOperand &MO  = MI.getOperand(OpIdx);
993   const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
994   ARM_AM::ShiftOpc SOpc = ARM_AM::getSORegShOp(MO1.getImm());
995
996   // Encode Rm.
997   unsigned Binary = getARMRegisterNumbering(MO.getReg());
998
999   // Encode the shift opcode.
1000   unsigned SBits = 0;
1001   // Set shift operand (bit[6:4]).
1002   // LSL - 000
1003   // LSR - 010
1004   // ASR - 100
1005   // ROR - 110
1006   switch (SOpc) {
1007   default: llvm_unreachable("Unknown shift opc!");
1008   case ARM_AM::lsl: SBits = 0x0; break;
1009   case ARM_AM::lsr: SBits = 0x2; break;
1010   case ARM_AM::asr: SBits = 0x4; break;
1011   case ARM_AM::ror: SBits = 0x6; break;
1012   }
1013
1014   Binary |= SBits << 4;
1015   if (SOpc == ARM_AM::rrx)
1016     return Binary;
1017
1018   // Encode shift_imm bit[11:7].
1019   return Binary | ARM_AM::getSORegOffset(MO1.getImm()) << 7;
1020 }
1021
1022 unsigned ARMMCCodeEmitter::
1023 getBitfieldInvertedMaskOpValue(const MCInst &MI, unsigned Op,
1024                                SmallVectorImpl<MCFixup> &Fixups) const {
1025   // 10 bits. lower 5 bits are are the lsb of the mask, high five bits are the
1026   // msb of the mask.
1027   const MCOperand &MO = MI.getOperand(Op);
1028   uint32_t v = ~MO.getImm();
1029   uint32_t lsb = CountTrailingZeros_32(v);
1030   uint32_t msb = (32 - CountLeadingZeros_32 (v)) - 1;
1031   assert (v != 0 && lsb < 32 && msb < 32 && "Illegal bitfield mask!");
1032   return lsb | (msb << 5);
1033 }
1034
1035 unsigned ARMMCCodeEmitter::
1036 getRegisterListOpValue(const MCInst &MI, unsigned Op,
1037                        SmallVectorImpl<MCFixup> &Fixups) const {
1038   // VLDM/VSTM:
1039   //   {12-8} = Vd
1040   //   {7-0}  = Number of registers
1041   //
1042   // LDM/STM:
1043   //   {15-0}  = Bitfield of GPRs.
1044   unsigned Reg = MI.getOperand(Op).getReg();
1045   bool SPRRegs = ARM::SPRRegClass.contains(Reg);
1046   bool DPRRegs = ARM::DPRRegClass.contains(Reg);
1047
1048   unsigned Binary = 0;
1049
1050   if (SPRRegs || DPRRegs) {
1051     // VLDM/VSTM
1052     unsigned RegNo = getARMRegisterNumbering(Reg);
1053     unsigned NumRegs = (MI.getNumOperands() - Op) & 0xff;
1054     Binary |= (RegNo & 0x1f) << 8;
1055     if (SPRRegs)
1056       Binary |= NumRegs;
1057     else
1058       Binary |= NumRegs * 2;
1059   } else {
1060     for (unsigned I = Op, E = MI.getNumOperands(); I < E; ++I) {
1061       unsigned RegNo = getARMRegisterNumbering(MI.getOperand(I).getReg());
1062       Binary |= 1 << RegNo;
1063     }
1064   }
1065
1066   return Binary;
1067 }
1068
1069 /// getAddrMode6AddressOpValue - Encode an addrmode6 register number along
1070 /// with the alignment operand.
1071 unsigned ARMMCCodeEmitter::
1072 getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op,
1073                            SmallVectorImpl<MCFixup> &Fixups) const {
1074   const MCOperand &Reg = MI.getOperand(Op);
1075   const MCOperand &Imm = MI.getOperand(Op + 1);
1076
1077   unsigned RegNo = getARMRegisterNumbering(Reg.getReg());
1078   unsigned Align = 0;
1079
1080   switch (Imm.getImm()) {
1081   default: break;
1082   case 2:
1083   case 4:
1084   case 8:  Align = 0x01; break;
1085   case 16: Align = 0x02; break;
1086   case 32: Align = 0x03; break;
1087   }
1088
1089   return RegNo | (Align << 4);
1090 }
1091
1092 /// getAddrMode6DupAddressOpValue - Encode an addrmode6 register number and
1093 /// alignment operand for use in VLD-dup instructions.  This is the same as
1094 /// getAddrMode6AddressOpValue except for the alignment encoding, which is
1095 /// different for VLD4-dup.
1096 unsigned ARMMCCodeEmitter::
1097 getAddrMode6DupAddressOpValue(const MCInst &MI, unsigned Op,
1098                               SmallVectorImpl<MCFixup> &Fixups) const {
1099   const MCOperand &Reg = MI.getOperand(Op);
1100   const MCOperand &Imm = MI.getOperand(Op + 1);
1101
1102   unsigned RegNo = getARMRegisterNumbering(Reg.getReg());
1103   unsigned Align = 0;
1104
1105   switch (Imm.getImm()) {
1106   default: break;
1107   case 2:
1108   case 4:
1109   case 8:  Align = 0x01; break;
1110   case 16: Align = 0x03; break;
1111   }
1112
1113   return RegNo | (Align << 4);
1114 }
1115
1116 unsigned ARMMCCodeEmitter::
1117 getAddrMode6OffsetOpValue(const MCInst &MI, unsigned Op,
1118                           SmallVectorImpl<MCFixup> &Fixups) const {
1119   const MCOperand &MO = MI.getOperand(Op);
1120   if (MO.getReg() == 0) return 0x0D;
1121   return MO.getReg();
1122 }
1123
1124 void ARMMCCodeEmitter::
1125 EncodeInstruction(const MCInst &MI, raw_ostream &OS,
1126                   SmallVectorImpl<MCFixup> &Fixups) const {
1127   const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
1128   // Pseudo instructions don't get encoded.
1129   const TargetInstrDesc &Desc = TII.get(MI.getOpcode());
1130   uint64_t TSFlags = Desc.TSFlags;
1131   if ((TSFlags & ARMII::FormMask) == ARMII::Pseudo)
1132     return;
1133   int Size;
1134   // Basic size info comes from the TSFlags field.
1135   switch ((TSFlags & ARMII::SizeMask) >> ARMII::SizeShift) {
1136   default: llvm_unreachable("Unexpected instruction size!");
1137   case ARMII::Size2Bytes: Size = 2; break;
1138   case ARMII::Size4Bytes: Size = 4; break;
1139   }
1140   uint32_t Binary = getBinaryCodeForInstr(MI, Fixups);
1141   // Thumb 32-bit wide instructions need to be have the high order halfword
1142   // emitted first.
1143   if (Subtarget.isThumb() && Size == 4) {
1144     EmitConstant(Binary >> 16, 2, OS);
1145     EmitConstant(Binary & 0xffff, 2, OS);
1146   } else
1147     EmitConstant(Binary, Size, OS);
1148   ++MCNumEmitted;  // Keep track of the # of mi's emitted.
1149 }
1150
1151 #include "ARMGenMCCodeEmitter.inc"