1 //===-- ARMInstPrinter.cpp - Convert ARM MCInst to assembly syntax --------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This class prints an ARM MCInst to a .s file.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "asm-printer"
15 #include "ARMBaseInfo.h"
16 #include "ARMInstPrinter.h"
17 #include "ARMAddressingModes.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCAsmInfo.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/Support/raw_ostream.h"
25 #define GET_INSTRUCTION_NAME
26 #include "ARMGenAsmWriter.inc"
28 StringRef
ARMInstPrinter::getOpcodeName(unsigned Opcode
) const {
29 return getInstructionName(Opcode
);
33 void ARMInstPrinter::printInst(const MCInst
*MI
, raw_ostream
&O
) {
34 // Check for MOVs and print canonical forms, instead.
35 if (MI
->getOpcode() == ARM::MOVs
) {
36 // FIXME: Thumb variants?
37 const MCOperand
&Dst
= MI
->getOperand(0);
38 const MCOperand
&MO1
= MI
->getOperand(1);
39 const MCOperand
&MO2
= MI
->getOperand(2);
40 const MCOperand
&MO3
= MI
->getOperand(3);
42 O
<< '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3
.getImm()));
43 printSBitModifierOperand(MI
, 6, O
);
44 printPredicateOperand(MI
, 4, O
);
46 O
<< '\t' << getRegisterName(Dst
.getReg())
47 << ", " << getRegisterName(MO1
.getReg());
49 if (ARM_AM::getSORegShOp(MO3
.getImm()) == ARM_AM::rrx
)
55 O
<< getRegisterName(MO2
.getReg());
56 assert(ARM_AM::getSORegOffset(MO3
.getImm()) == 0);
58 O
<< "#" << ARM_AM::getSORegOffset(MO3
.getImm());
64 if ((MI
->getOpcode() == ARM::STM_UPD
|| MI
->getOpcode() == ARM::t2STM_UPD
) &&
65 MI
->getOperand(0).getReg() == ARM::SP
) {
66 const MCOperand
&MO1
= MI
->getOperand(2);
67 if (ARM_AM::getAM4SubMode(MO1
.getImm()) == ARM_AM::db
) {
69 printPredicateOperand(MI
, 3, O
);
71 printRegisterList(MI
, 5, O
);
77 if ((MI
->getOpcode() == ARM::LDM_UPD
|| MI
->getOpcode() == ARM::t2LDM_UPD
) &&
78 MI
->getOperand(0).getReg() == ARM::SP
) {
79 const MCOperand
&MO1
= MI
->getOperand(2);
80 if (ARM_AM::getAM4SubMode(MO1
.getImm()) == ARM_AM::ia
) {
82 printPredicateOperand(MI
, 3, O
);
84 printRegisterList(MI
, 5, O
);
90 if ((MI
->getOpcode() == ARM::VSTMS_UPD
|| MI
->getOpcode() ==ARM::VSTMD_UPD
) &&
91 MI
->getOperand(0).getReg() == ARM::SP
) {
92 const MCOperand
&MO1
= MI
->getOperand(2);
93 if (ARM_AM::getAM4SubMode(MO1
.getImm()) == ARM_AM::db
) {
95 printPredicateOperand(MI
, 3, O
);
97 printRegisterList(MI
, 5, O
);
103 if ((MI
->getOpcode() == ARM::VLDMS_UPD
|| MI
->getOpcode() ==ARM::VLDMD_UPD
) &&
104 MI
->getOperand(0).getReg() == ARM::SP
) {
105 const MCOperand
&MO1
= MI
->getOperand(2);
106 if (ARM_AM::getAM4SubMode(MO1
.getImm()) == ARM_AM::ia
) {
108 printPredicateOperand(MI
, 3, O
);
110 printRegisterList(MI
, 5, O
);
115 printInstruction(MI
, O
);
118 void ARMInstPrinter::printOperand(const MCInst
*MI
, unsigned OpNo
,
120 const MCOperand
&Op
= MI
->getOperand(OpNo
);
122 unsigned Reg
= Op
.getReg();
123 O
<< getRegisterName(Reg
);
124 } else if (Op
.isImm()) {
125 O
<< '#' << Op
.getImm();
127 assert(Op
.isExpr() && "unknown operand kind in printOperand");
132 static void printSOImm(raw_ostream
&O
, int64_t V
, raw_ostream
*CommentStream
,
133 const MCAsmInfo
*MAI
) {
134 // Break it up into two parts that make up a shifter immediate.
135 V
= ARM_AM::getSOImmVal(V
);
136 assert(V
!= -1 && "Not a valid so_imm value!");
138 unsigned Imm
= ARM_AM::getSOImmValImm(V
);
139 unsigned Rot
= ARM_AM::getSOImmValRot(V
);
141 // Print low-level immediate formation info, per
142 // A5.1.3: "Data-processing operands - Immediate".
144 O
<< "#" << Imm
<< ", " << Rot
;
145 // Pretty printed version.
147 *CommentStream
<< (int)ARM_AM::rotr32(Imm
, Rot
) << "\n";
154 /// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit
155 /// immediate in bits 0-7.
156 void ARMInstPrinter::printSOImmOperand(const MCInst
*MI
, unsigned OpNum
,
158 const MCOperand
&MO
= MI
->getOperand(OpNum
);
159 assert(MO
.isImm() && "Not a valid so_imm value!");
160 printSOImm(O
, MO
.getImm(), CommentStream
, &MAI
);
163 /// printSOImm2PartOperand - SOImm is broken into two pieces using a 'mov'
164 /// followed by an 'orr' to materialize.
165 void ARMInstPrinter::printSOImm2PartOperand(const MCInst
*MI
, unsigned OpNum
,
167 // FIXME: REMOVE this method.
171 // so_reg is a 4-operand unit corresponding to register forms of the A5.1
172 // "Addressing Mode 1 - Data-processing operands" forms. This includes:
174 // REG REG 0,SH_OPC - e.g. R5, ROR R3
175 // REG 0 IMM,SH_OPC - e.g. R5, LSL #3
176 void ARMInstPrinter::printSORegOperand(const MCInst
*MI
, unsigned OpNum
,
178 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
179 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
180 const MCOperand
&MO3
= MI
->getOperand(OpNum
+2);
182 O
<< getRegisterName(MO1
.getReg());
184 // Print the shift opc.
185 ARM_AM::ShiftOpc ShOpc
= ARM_AM::getSORegShOp(MO3
.getImm());
186 O
<< ", " << ARM_AM::getShiftOpcStr(ShOpc
);
188 O
<< ' ' << getRegisterName(MO2
.getReg());
189 assert(ARM_AM::getSORegOffset(MO3
.getImm()) == 0);
190 } else if (ShOpc
!= ARM_AM::rrx
) {
191 O
<< " #" << ARM_AM::getSORegOffset(MO3
.getImm());
196 void ARMInstPrinter::printAddrMode2Operand(const MCInst
*MI
, unsigned Op
,
198 const MCOperand
&MO1
= MI
->getOperand(Op
);
199 const MCOperand
&MO2
= MI
->getOperand(Op
+1);
200 const MCOperand
&MO3
= MI
->getOperand(Op
+2);
202 if (!MO1
.isReg()) { // FIXME: This is for CP entries, but isn't right.
203 printOperand(MI
, Op
, O
);
207 O
<< "[" << getRegisterName(MO1
.getReg());
210 if (ARM_AM::getAM2Offset(MO3
.getImm())) // Don't print +0.
212 << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3
.getImm()))
213 << ARM_AM::getAM2Offset(MO3
.getImm());
219 << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3
.getImm()))
220 << getRegisterName(MO2
.getReg());
222 if (unsigned ShImm
= ARM_AM::getAM2Offset(MO3
.getImm()))
224 << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO3
.getImm()))
229 void ARMInstPrinter::printAddrMode2OffsetOperand(const MCInst
*MI
,
232 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
233 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
236 unsigned ImmOffs
= ARM_AM::getAM2Offset(MO2
.getImm());
238 << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2
.getImm()))
243 O
<< ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2
.getImm()))
244 << getRegisterName(MO1
.getReg());
246 if (unsigned ShImm
= ARM_AM::getAM2Offset(MO2
.getImm()))
248 << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO2
.getImm()))
252 void ARMInstPrinter::printAddrMode3Operand(const MCInst
*MI
, unsigned OpNum
,
254 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
255 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
256 const MCOperand
&MO3
= MI
->getOperand(OpNum
+2);
258 O
<< '[' << getRegisterName(MO1
.getReg());
261 O
<< ", " << (char)ARM_AM::getAM3Op(MO3
.getImm())
262 << getRegisterName(MO2
.getReg()) << ']';
266 if (unsigned ImmOffs
= ARM_AM::getAM3Offset(MO3
.getImm()))
268 << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO3
.getImm()))
273 void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst
*MI
,
276 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
277 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
280 O
<< (char)ARM_AM::getAM3Op(MO2
.getImm())
281 << getRegisterName(MO1
.getReg());
285 unsigned ImmOffs
= ARM_AM::getAM3Offset(MO2
.getImm());
287 << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO2
.getImm()))
291 void ARMInstPrinter::printLdStmModeOperand(const MCInst
*MI
, unsigned OpNum
,
293 ARM_AM::AMSubMode Mode
= ARM_AM::getAM4SubMode(MI
->getOperand(OpNum
)
295 O
<< ARM_AM::getAMSubModeStr(Mode
);
298 void ARMInstPrinter::printAddrMode5Operand(const MCInst
*MI
, unsigned OpNum
,
300 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
301 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
303 if (!MO1
.isReg()) { // FIXME: This is for CP entries, but isn't right.
304 printOperand(MI
, OpNum
, O
);
308 O
<< "[" << getRegisterName(MO1
.getReg());
310 if (unsigned ImmOffs
= ARM_AM::getAM5Offset(MO2
.getImm())) {
312 << ARM_AM::getAddrOpcStr(ARM_AM::getAM5Op(MO2
.getImm()))
318 void ARMInstPrinter::printAddrMode6Operand(const MCInst
*MI
, unsigned OpNum
,
320 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
321 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
323 O
<< "[" << getRegisterName(MO1
.getReg());
325 // FIXME: Both darwin as and GNU as violate ARM docs here.
326 O
<< ", :" << (MO2
.getImm() << 3);
331 void ARMInstPrinter::printAddrMode6OffsetOperand(const MCInst
*MI
,
334 const MCOperand
&MO
= MI
->getOperand(OpNum
);
335 if (MO
.getReg() == 0)
338 O
<< ", " << getRegisterName(MO
.getReg());
341 void ARMInstPrinter::printBitfieldInvMaskImmOperand(const MCInst
*MI
,
344 const MCOperand
&MO
= MI
->getOperand(OpNum
);
345 uint32_t v
= ~MO
.getImm();
346 int32_t lsb
= CountTrailingZeros_32(v
);
347 int32_t width
= (32 - CountLeadingZeros_32 (v
)) - lsb
;
348 assert(MO
.isImm() && "Not a valid bf_inv_mask_imm value!");
349 O
<< '#' << lsb
<< ", #" << width
;
352 void ARMInstPrinter::printMemBOption(const MCInst
*MI
, unsigned OpNum
,
354 unsigned val
= MI
->getOperand(OpNum
).getImm();
355 O
<< ARM_MB::MemBOptToString(val
);
358 void ARMInstPrinter::printShiftImmOperand(const MCInst
*MI
, unsigned OpNum
,
360 unsigned ShiftOp
= MI
->getOperand(OpNum
).getImm();
361 ARM_AM::ShiftOpc Opc
= ARM_AM::getSORegShOp(ShiftOp
);
363 case ARM_AM::no_shift
:
372 assert(0 && "unexpected shift opcode for shift immediate operand");
374 O
<< ARM_AM::getSORegOffset(ShiftOp
);
377 void ARMInstPrinter::printRegisterList(const MCInst
*MI
, unsigned OpNum
,
380 for (unsigned i
= OpNum
, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
381 if (i
!= OpNum
) O
<< ", ";
382 O
<< getRegisterName(MI
->getOperand(i
).getReg());
387 void ARMInstPrinter::printSetendOperand(const MCInst
*MI
, unsigned OpNum
,
389 const MCOperand
&Op
= MI
->getOperand(OpNum
);
396 void ARMInstPrinter::printCPSOptionOperand(const MCInst
*MI
, unsigned OpNum
,
398 const MCOperand
&Op
= MI
->getOperand(OpNum
);
399 unsigned option
= Op
.getImm();
400 unsigned mode
= option
& 31;
401 bool changemode
= option
>> 5 & 1;
402 unsigned AIF
= option
>> 6 & 7;
403 unsigned imod
= option
>> 9 & 3;
410 if (AIF
& 4) O
<< 'a';
411 if (AIF
& 2) O
<< 'i';
412 if (AIF
& 1) O
<< 'f';
413 if (AIF
> 0 && changemode
) O
<< ", ";
419 void ARMInstPrinter::printMSRMaskOperand(const MCInst
*MI
, unsigned OpNum
,
421 const MCOperand
&Op
= MI
->getOperand(OpNum
);
422 unsigned Mask
= Op
.getImm();
425 if (Mask
& 8) O
<< 'f';
426 if (Mask
& 4) O
<< 's';
427 if (Mask
& 2) O
<< 'x';
428 if (Mask
& 1) O
<< 'c';
432 void ARMInstPrinter::printNegZeroOperand(const MCInst
*MI
, unsigned OpNum
,
434 const MCOperand
&Op
= MI
->getOperand(OpNum
);
437 O
<< '-' << (-Op
.getImm() - 1);
442 void ARMInstPrinter::printPredicateOperand(const MCInst
*MI
, unsigned OpNum
,
444 ARMCC::CondCodes CC
= (ARMCC::CondCodes
)MI
->getOperand(OpNum
).getImm();
446 O
<< ARMCondCodeToString(CC
);
449 void ARMInstPrinter::printMandatoryPredicateOperand(const MCInst
*MI
,
452 ARMCC::CondCodes CC
= (ARMCC::CondCodes
)MI
->getOperand(OpNum
).getImm();
453 O
<< ARMCondCodeToString(CC
);
456 void ARMInstPrinter::printSBitModifierOperand(const MCInst
*MI
, unsigned OpNum
,
458 if (MI
->getOperand(OpNum
).getReg()) {
459 assert(MI
->getOperand(OpNum
).getReg() == ARM::CPSR
&&
460 "Expect ARM CPSR register!");
465 void ARMInstPrinter::printNoHashImmediate(const MCInst
*MI
, unsigned OpNum
,
467 O
<< MI
->getOperand(OpNum
).getImm();
470 void ARMInstPrinter::printPCLabel(const MCInst
*MI
, unsigned OpNum
,
472 llvm_unreachable("Unhandled PC-relative pseudo-instruction!");
475 void ARMInstPrinter::printThumbS4ImmOperand(const MCInst
*MI
, unsigned OpNum
,
477 O
<< "#" << MI
->getOperand(OpNum
).getImm() * 4;
480 void ARMInstPrinter::printThumbITMask(const MCInst
*MI
, unsigned OpNum
,
482 // (3 - the number of trailing zeros) is the number of then / else.
483 unsigned Mask
= MI
->getOperand(OpNum
).getImm();
484 unsigned CondBit0
= Mask
>> 4 & 1;
485 unsigned NumTZ
= CountTrailingZeros_32(Mask
);
486 assert(NumTZ
<= 3 && "Invalid IT mask!");
487 for (unsigned Pos
= 3, e
= NumTZ
; Pos
> e
; --Pos
) {
488 bool T
= ((Mask
>> Pos
) & 1) == CondBit0
;
496 void ARMInstPrinter::printThumbAddrModeRROperand(const MCInst
*MI
, unsigned Op
,
498 const MCOperand
&MO1
= MI
->getOperand(Op
);
499 const MCOperand
&MO2
= MI
->getOperand(Op
+1);
500 O
<< "[" << getRegisterName(MO1
.getReg());
501 O
<< ", " << getRegisterName(MO2
.getReg()) << "]";
504 void ARMInstPrinter::printThumbAddrModeRI5Operand(const MCInst
*MI
, unsigned Op
,
507 const MCOperand
&MO1
= MI
->getOperand(Op
);
508 const MCOperand
&MO2
= MI
->getOperand(Op
+1);
509 const MCOperand
&MO3
= MI
->getOperand(Op
+2);
511 if (!MO1
.isReg()) { // FIXME: This is for CP entries, but isn't right.
512 printOperand(MI
, Op
, O
);
516 O
<< "[" << getRegisterName(MO1
.getReg());
518 O
<< ", " << getRegisterName(MO3
.getReg());
519 else if (unsigned ImmOffs
= MO2
.getImm())
520 O
<< ", #" << ImmOffs
* Scale
;
524 void ARMInstPrinter::printThumbAddrModeS1Operand(const MCInst
*MI
, unsigned Op
,
526 printThumbAddrModeRI5Operand(MI
, Op
, O
, 1);
529 void ARMInstPrinter::printThumbAddrModeS2Operand(const MCInst
*MI
, unsigned Op
,
531 printThumbAddrModeRI5Operand(MI
, Op
, O
, 2);
534 void ARMInstPrinter::printThumbAddrModeS4Operand(const MCInst
*MI
, unsigned Op
,
536 printThumbAddrModeRI5Operand(MI
, Op
, O
, 4);
539 void ARMInstPrinter::printThumbAddrModeSPOperand(const MCInst
*MI
, unsigned Op
,
541 const MCOperand
&MO1
= MI
->getOperand(Op
);
542 const MCOperand
&MO2
= MI
->getOperand(Op
+1);
543 O
<< "[" << getRegisterName(MO1
.getReg());
544 if (unsigned ImmOffs
= MO2
.getImm())
545 O
<< ", #" << ImmOffs
*4;
549 void ARMInstPrinter::printTBAddrMode(const MCInst
*MI
, unsigned OpNum
,
551 O
<< "[pc, " << getRegisterName(MI
->getOperand(OpNum
).getReg());
552 if (MI
->getOpcode() == ARM::t2TBH
)
557 // Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2
558 // register with shift forms.
560 // REG IMM, SH_OPC - e.g. R5, LSL #3
561 void ARMInstPrinter::printT2SOOperand(const MCInst
*MI
, unsigned OpNum
,
563 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
564 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
566 unsigned Reg
= MO1
.getReg();
567 O
<< getRegisterName(Reg
);
569 // Print the shift opc.
570 assert(MO2
.isImm() && "Not a valid t2_so_reg value!");
571 ARM_AM::ShiftOpc ShOpc
= ARM_AM::getSORegShOp(MO2
.getImm());
572 O
<< ", " << ARM_AM::getShiftOpcStr(ShOpc
);
573 if (ShOpc
!= ARM_AM::rrx
)
574 O
<< " #" << ARM_AM::getSORegOffset(MO2
.getImm());
577 void ARMInstPrinter::printAddrModeImm12Operand(const MCInst
*MI
, unsigned OpNum
,
579 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
580 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
582 if (!MO1
.isReg()) { // FIXME: This is for CP entries, but isn't right.
583 printOperand(MI
, OpNum
, O
);
587 O
<< "[" << getRegisterName(MO1
.getReg());
589 int32_t OffImm
= (int32_t)MO2
.getImm();
590 bool isSub
= OffImm
< 0;
591 // Special value for #-0. All others are normal.
592 if (OffImm
== INT32_MIN
)
595 O
<< ", #-" << -OffImm
;
597 O
<< ", #" << OffImm
;
601 void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst
*MI
,
604 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
605 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
607 O
<< "[" << getRegisterName(MO1
.getReg());
609 int32_t OffImm
= (int32_t)MO2
.getImm();
612 O
<< ", #-" << -OffImm
;
614 O
<< ", #" << OffImm
;
618 void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst
*MI
,
621 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
622 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
624 O
<< "[" << getRegisterName(MO1
.getReg());
626 int32_t OffImm
= (int32_t)MO2
.getImm() / 4;
629 O
<< ", #-" << -OffImm
* 4;
631 O
<< ", #" << OffImm
* 4;
635 void ARMInstPrinter::printT2AddrModeImm8OffsetOperand(const MCInst
*MI
,
638 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
639 int32_t OffImm
= (int32_t)MO1
.getImm();
642 O
<< "#-" << -OffImm
;
647 void ARMInstPrinter::printT2AddrModeImm8s4OffsetOperand(const MCInst
*MI
,
650 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
651 int32_t OffImm
= (int32_t)MO1
.getImm() / 4;
654 O
<< "#-" << -OffImm
* 4;
656 O
<< "#" << OffImm
* 4;
659 void ARMInstPrinter::printT2AddrModeSoRegOperand(const MCInst
*MI
,
662 const MCOperand
&MO1
= MI
->getOperand(OpNum
);
663 const MCOperand
&MO2
= MI
->getOperand(OpNum
+1);
664 const MCOperand
&MO3
= MI
->getOperand(OpNum
+2);
666 O
<< "[" << getRegisterName(MO1
.getReg());
668 assert(MO2
.getReg() && "Invalid so_reg load / store address!");
669 O
<< ", " << getRegisterName(MO2
.getReg());
671 unsigned ShAmt
= MO3
.getImm();
673 assert(ShAmt
<= 3 && "Not a valid Thumb2 addressing mode!");
674 O
<< ", lsl #" << ShAmt
;
679 void ARMInstPrinter::printVFPf32ImmOperand(const MCInst
*MI
, unsigned OpNum
,
681 O
<< '#' << (float)MI
->getOperand(OpNum
).getFPImm();
684 void ARMInstPrinter::printVFPf64ImmOperand(const MCInst
*MI
, unsigned OpNum
,
686 O
<< '#' << MI
->getOperand(OpNum
).getFPImm();
689 void ARMInstPrinter::printNEONModImmOperand(const MCInst
*MI
, unsigned OpNum
,
691 unsigned EncodedImm
= MI
->getOperand(OpNum
).getImm();
693 uint64_t Val
= ARM_AM::decodeNEONModImm(EncodedImm
, EltBits
);
694 O
<< "#0x" << utohexstr(Val
);