1 //===-- ARMAsmParser.cpp - Parse ARM assembly to MCInst instructions ------===// 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 #include "MCTargetDesc/ARMBaseInfo.h" 11 #include "MCTargetDesc/ARMAddressingModes.h" 12 #include "MCTargetDesc/ARMMCExpr.h" 13 #include "llvm/MC/MCParser/MCAsmLexer.h" 14 #include "llvm/MC/MCParser/MCAsmParser.h" 15 #include "llvm/MC/MCParser/MCParsedAsmOperand.h" 16 #include "llvm/MC/MCAsmInfo.h" 17 #include "llvm/MC/MCContext.h" 18 #include "llvm/MC/MCStreamer.h" 19 #include "llvm/MC/MCExpr.h" 20 #include "llvm/MC/MCInst.h" 21 #include "llvm/MC/MCInstrDesc.h" 22 #include "llvm/MC/MCRegisterInfo.h" 23 #include "llvm/MC/MCSubtargetInfo.h" 24 #include "llvm/MC/MCTargetAsmParser.h" 25 #include "llvm/Support/MathExtras.h" 26 #include "llvm/Support/SourceMgr.h" 27 #include "llvm/Support/TargetRegistry.h" 28 #include "llvm/Support/raw_ostream.h" 29 #include "llvm/ADT/BitVector.h" 30 #include "llvm/ADT/OwningPtr.h" 31 #include "llvm/ADT/STLExtras.h" 32 #include "llvm/ADT/SmallVector.h" 33 #include "llvm/ADT/StringSwitch.h" 34 #include "llvm/ADT/Twine.h" 35 36 using namespace llvm; 37 38 namespace { 39 40 class ARMOperand; 41 42 enum VectorLaneTy { NoLanes, AllLanes, IndexedLane }; 43 44 class ARMAsmParser : public MCTargetAsmParser { 45 MCSubtargetInfo &STI; 46 MCAsmParser &Parser; 47 48 struct { 49 ARMCC::CondCodes Cond; // Condition for IT block. 50 unsigned Mask:4; // Condition mask for instructions. 51 // Starting at first 1 (from lsb). 52 // '1' condition as indicated in IT. 53 // '0' inverse of condition (else). 54 // Count of instructions in IT block is 55 // 4 - trailingzeroes(mask) 56 57 bool FirstCond; // Explicit flag for when we're parsing the 58 // First instruction in the IT block. It's 59 // implied in the mask, so needs special 60 // handling. 61 62 unsigned CurPosition; // Current position in parsing of IT 63 // block. In range [0,3]. Initialized 64 // according to count of instructions in block. 65 // ~0U if no active IT block. 66 } ITState; 67 bool inITBlock() { return ITState.CurPosition != ~0U;} 68 void forwardITPosition() { 69 if (!inITBlock()) return; 70 // Move to the next instruction in the IT block, if there is one. If not, 71 // mark the block as done. 72 unsigned TZ = CountTrailingZeros_32(ITState.Mask); 73 if (++ITState.CurPosition == 5 - TZ) 74 ITState.CurPosition = ~0U; // Done with the IT block after this. 75 } 76 77 78 MCAsmParser &getParser() const { return Parser; } 79 MCAsmLexer &getLexer() const { return Parser.getLexer(); } 80 81 void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); } 82 bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); } 83 84 int tryParseRegister(); 85 bool tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &); 86 int tryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &); 87 bool parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &); 88 bool parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &); 89 bool parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &, StringRef Mnemonic); 90 bool parsePrefix(ARMMCExpr::VariantKind &RefKind); 91 bool parseMemRegOffsetShift(ARM_AM::ShiftOpc &ShiftType, 92 unsigned &ShiftAmount); 93 bool parseDirectiveWord(unsigned Size, SMLoc L); 94 bool parseDirectiveThumb(SMLoc L); 95 bool parseDirectiveARM(SMLoc L); 96 bool parseDirectiveThumbFunc(SMLoc L); 97 bool parseDirectiveCode(SMLoc L); 98 bool parseDirectiveSyntax(SMLoc L); 99 100 StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode, 101 bool &CarrySetting, unsigned &ProcessorIMod, 102 StringRef &ITMask); 103 void getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet, 104 bool &CanAcceptPredicationCode); 105 106 bool isThumb() const { 107 // FIXME: Can tablegen auto-generate this? 108 return (STI.getFeatureBits() & ARM::ModeThumb) != 0; 109 } 110 bool isThumbOne() const { 111 return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0; 112 } 113 bool isThumbTwo() const { 114 return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2); 115 } 116 bool hasV6Ops() const { 117 return STI.getFeatureBits() & ARM::HasV6Ops; 118 } 119 bool hasV7Ops() const { 120 return STI.getFeatureBits() & ARM::HasV7Ops; 121 } 122 void SwitchMode() { 123 unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb)); 124 setAvailableFeatures(FB); 125 } 126 bool isMClass() const { 127 return STI.getFeatureBits() & ARM::FeatureMClass; 128 } 129 130 /// @name Auto-generated Match Functions 131 /// { 132 133 #define GET_ASSEMBLER_HEADER 134 #include "ARMGenAsmMatcher.inc" 135 136 /// } 137 138 OperandMatchResultTy parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*>&); 139 OperandMatchResultTy parseCoprocNumOperand( 140 SmallVectorImpl<MCParsedAsmOperand*>&); 141 OperandMatchResultTy parseCoprocRegOperand( 142 SmallVectorImpl<MCParsedAsmOperand*>&); 143 OperandMatchResultTy parseCoprocOptionOperand( 144 SmallVectorImpl<MCParsedAsmOperand*>&); 145 OperandMatchResultTy parseMemBarrierOptOperand( 146 SmallVectorImpl<MCParsedAsmOperand*>&); 147 OperandMatchResultTy parseProcIFlagsOperand( 148 SmallVectorImpl<MCParsedAsmOperand*>&); 149 OperandMatchResultTy parseMSRMaskOperand( 150 SmallVectorImpl<MCParsedAsmOperand*>&); 151 OperandMatchResultTy parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &O, 152 StringRef Op, int Low, int High); 153 OperandMatchResultTy parsePKHLSLImm(SmallVectorImpl<MCParsedAsmOperand*> &O) { 154 return parsePKHImm(O, "lsl", 0, 31); 155 } 156 OperandMatchResultTy parsePKHASRImm(SmallVectorImpl<MCParsedAsmOperand*> &O) { 157 return parsePKHImm(O, "asr", 1, 32); 158 } 159 OperandMatchResultTy parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*>&); 160 OperandMatchResultTy parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*>&); 161 OperandMatchResultTy parseRotImm(SmallVectorImpl<MCParsedAsmOperand*>&); 162 OperandMatchResultTy parseBitfield(SmallVectorImpl<MCParsedAsmOperand*>&); 163 OperandMatchResultTy parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*>&); 164 OperandMatchResultTy parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*>&); 165 OperandMatchResultTy parseFPImm(SmallVectorImpl<MCParsedAsmOperand*>&); 166 OperandMatchResultTy parseVectorList(SmallVectorImpl<MCParsedAsmOperand*>&); 167 OperandMatchResultTy parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index); 168 169 // Asm Match Converter Methods 170 bool cvtT2LdrdPre(MCInst &Inst, unsigned Opcode, 171 const SmallVectorImpl<MCParsedAsmOperand*> &); 172 bool cvtT2StrdPre(MCInst &Inst, unsigned Opcode, 173 const SmallVectorImpl<MCParsedAsmOperand*> &); 174 bool cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode, 175 const SmallVectorImpl<MCParsedAsmOperand*> &); 176 bool cvtStWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode, 177 const SmallVectorImpl<MCParsedAsmOperand*> &); 178 bool cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 179 const SmallVectorImpl<MCParsedAsmOperand*> &); 180 bool cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 181 const SmallVectorImpl<MCParsedAsmOperand*> &); 182 bool cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 183 const SmallVectorImpl<MCParsedAsmOperand*> &); 184 bool cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 185 const SmallVectorImpl<MCParsedAsmOperand*> &); 186 bool cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 187 const SmallVectorImpl<MCParsedAsmOperand*> &); 188 bool cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 189 const SmallVectorImpl<MCParsedAsmOperand*> &); 190 bool cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 191 const SmallVectorImpl<MCParsedAsmOperand*> &); 192 bool cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 193 const SmallVectorImpl<MCParsedAsmOperand*> &); 194 bool cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 195 const SmallVectorImpl<MCParsedAsmOperand*> &); 196 bool cvtLdrdPre(MCInst &Inst, unsigned Opcode, 197 const SmallVectorImpl<MCParsedAsmOperand*> &); 198 bool cvtStrdPre(MCInst &Inst, unsigned Opcode, 199 const SmallVectorImpl<MCParsedAsmOperand*> &); 200 bool cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 201 const SmallVectorImpl<MCParsedAsmOperand*> &); 202 bool cvtThumbMultiply(MCInst &Inst, unsigned Opcode, 203 const SmallVectorImpl<MCParsedAsmOperand*> &); 204 bool cvtVLDwbFixed(MCInst &Inst, unsigned Opcode, 205 const SmallVectorImpl<MCParsedAsmOperand*> &); 206 bool cvtVLDwbRegister(MCInst &Inst, unsigned Opcode, 207 const SmallVectorImpl<MCParsedAsmOperand*> &); 208 bool cvtVSTwbFixed(MCInst &Inst, unsigned Opcode, 209 const SmallVectorImpl<MCParsedAsmOperand*> &); 210 bool cvtVSTwbRegister(MCInst &Inst, unsigned Opcode, 211 const SmallVectorImpl<MCParsedAsmOperand*> &); 212 213 bool validateInstruction(MCInst &Inst, 214 const SmallVectorImpl<MCParsedAsmOperand*> &Ops); 215 bool processInstruction(MCInst &Inst, 216 const SmallVectorImpl<MCParsedAsmOperand*> &Ops); 217 bool shouldOmitCCOutOperand(StringRef Mnemonic, 218 SmallVectorImpl<MCParsedAsmOperand*> &Operands); 219 220 public: 221 enum ARMMatchResultTy { 222 Match_RequiresITBlock = FIRST_TARGET_MATCH_RESULT_TY, 223 Match_RequiresNotITBlock, 224 Match_RequiresV6, 225 Match_RequiresThumb2 226 }; 227 228 ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser) 229 : MCTargetAsmParser(), STI(_STI), Parser(_Parser) { 230 MCAsmParserExtension::Initialize(_Parser); 231 232 // Initialize the set of available features. 233 setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 234 235 // Not in an ITBlock to start with. 236 ITState.CurPosition = ~0U; 237 } 238 239 // Implementation of the MCTargetAsmParser interface: 240 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc); 241 bool ParseInstruction(StringRef Name, SMLoc NameLoc, 242 SmallVectorImpl<MCParsedAsmOperand*> &Operands); 243 bool ParseDirective(AsmToken DirectiveID); 244 245 unsigned checkTargetMatchPredicate(MCInst &Inst); 246 247 bool MatchAndEmitInstruction(SMLoc IDLoc, 248 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 249 MCStreamer &Out); 250 }; 251 } // end anonymous namespace 252 253 namespace { 254 255 /// ARMOperand - Instances of this class represent a parsed ARM machine 256 /// instruction. 257 class ARMOperand : public MCParsedAsmOperand { 258 enum KindTy { 259 k_CondCode, 260 k_CCOut, 261 k_ITCondMask, 262 k_CoprocNum, 263 k_CoprocReg, 264 k_CoprocOption, 265 k_Immediate, 266 k_FPImmediate, 267 k_MemBarrierOpt, 268 k_Memory, 269 k_PostIndexRegister, 270 k_MSRMask, 271 k_ProcIFlags, 272 k_VectorIndex, 273 k_Register, 274 k_RegisterList, 275 k_DPRRegisterList, 276 k_SPRRegisterList, 277 k_VectorList, 278 k_VectorListAllLanes, 279 k_VectorListIndexed, 280 k_ShiftedRegister, 281 k_ShiftedImmediate, 282 k_ShifterImmediate, 283 k_RotateImmediate, 284 k_BitfieldDescriptor, 285 k_Token 286 } Kind; 287 288 SMLoc StartLoc, EndLoc; 289 SmallVector<unsigned, 8> Registers; 290 291 union { 292 struct { 293 ARMCC::CondCodes Val; 294 } CC; 295 296 struct { 297 unsigned Val; 298 } Cop; 299 300 struct { 301 unsigned Val; 302 } CoprocOption; 303 304 struct { 305 unsigned Mask:4; 306 } ITMask; 307 308 struct { 309 ARM_MB::MemBOpt Val; 310 } MBOpt; 311 312 struct { 313 ARM_PROC::IFlags Val; 314 } IFlags; 315 316 struct { 317 unsigned Val; 318 } MMask; 319 320 struct { 321 const char *Data; 322 unsigned Length; 323 } Tok; 324 325 struct { 326 unsigned RegNum; 327 } Reg; 328 329 // A vector register list is a sequential list of 1 to 4 registers. 330 struct { 331 unsigned RegNum; 332 unsigned Count; 333 unsigned LaneIndex; 334 } VectorList; 335 336 struct { 337 unsigned Val; 338 } VectorIndex; 339 340 struct { 341 const MCExpr *Val; 342 } Imm; 343 344 struct { 345 unsigned Val; // encoded 8-bit representation 346 } FPImm; 347 348 /// Combined record for all forms of ARM address expressions. 349 struct { 350 unsigned BaseRegNum; 351 // Offset is in OffsetReg or OffsetImm. If both are zero, no offset 352 // was specified. 353 const MCConstantExpr *OffsetImm; // Offset immediate value 354 unsigned OffsetRegNum; // Offset register num, when OffsetImm == NULL 355 ARM_AM::ShiftOpc ShiftType; // Shift type for OffsetReg 356 unsigned ShiftImm; // shift for OffsetReg. 357 unsigned Alignment; // 0 = no alignment specified 358 // n = alignment in bytes (8, 16, or 32) 359 unsigned isNegative : 1; // Negated OffsetReg? (~'U' bit) 360 } Memory; 361 362 struct { 363 unsigned RegNum; 364 bool isAdd; 365 ARM_AM::ShiftOpc ShiftTy; 366 unsigned ShiftImm; 367 } PostIdxReg; 368 369 struct { 370 bool isASR; 371 unsigned Imm; 372 } ShifterImm; 373 struct { 374 ARM_AM::ShiftOpc ShiftTy; 375 unsigned SrcReg; 376 unsigned ShiftReg; 377 unsigned ShiftImm; 378 } RegShiftedReg; 379 struct { 380 ARM_AM::ShiftOpc ShiftTy; 381 unsigned SrcReg; 382 unsigned ShiftImm; 383 } RegShiftedImm; 384 struct { 385 unsigned Imm; 386 } RotImm; 387 struct { 388 unsigned LSB; 389 unsigned Width; 390 } Bitfield; 391 }; 392 393 ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {} 394 public: 395 ARMOperand(const ARMOperand &o) : MCParsedAsmOperand() { 396 Kind = o.Kind; 397 StartLoc = o.StartLoc; 398 EndLoc = o.EndLoc; 399 switch (Kind) { 400 case k_CondCode: 401 CC = o.CC; 402 break; 403 case k_ITCondMask: 404 ITMask = o.ITMask; 405 break; 406 case k_Token: 407 Tok = o.Tok; 408 break; 409 case k_CCOut: 410 case k_Register: 411 Reg = o.Reg; 412 break; 413 case k_RegisterList: 414 case k_DPRRegisterList: 415 case k_SPRRegisterList: 416 Registers = o.Registers; 417 break; 418 case k_VectorList: 419 case k_VectorListAllLanes: 420 case k_VectorListIndexed: 421 VectorList = o.VectorList; 422 break; 423 case k_CoprocNum: 424 case k_CoprocReg: 425 Cop = o.Cop; 426 break; 427 case k_CoprocOption: 428 CoprocOption = o.CoprocOption; 429 break; 430 case k_Immediate: 431 Imm = o.Imm; 432 break; 433 case k_FPImmediate: 434 FPImm = o.FPImm; 435 break; 436 case k_MemBarrierOpt: 437 MBOpt = o.MBOpt; 438 break; 439 case k_Memory: 440 Memory = o.Memory; 441 break; 442 case k_PostIndexRegister: 443 PostIdxReg = o.PostIdxReg; 444 break; 445 case k_MSRMask: 446 MMask = o.MMask; 447 break; 448 case k_ProcIFlags: 449 IFlags = o.IFlags; 450 break; 451 case k_ShifterImmediate: 452 ShifterImm = o.ShifterImm; 453 break; 454 case k_ShiftedRegister: 455 RegShiftedReg = o.RegShiftedReg; 456 break; 457 case k_ShiftedImmediate: 458 RegShiftedImm = o.RegShiftedImm; 459 break; 460 case k_RotateImmediate: 461 RotImm = o.RotImm; 462 break; 463 case k_BitfieldDescriptor: 464 Bitfield = o.Bitfield; 465 break; 466 case k_VectorIndex: 467 VectorIndex = o.VectorIndex; 468 break; 469 } 470 } 471 472 /// getStartLoc - Get the location of the first token of this operand. 473 SMLoc getStartLoc() const { return StartLoc; } 474 /// getEndLoc - Get the location of the last token of this operand. 475 SMLoc getEndLoc() const { return EndLoc; } 476 477 ARMCC::CondCodes getCondCode() const { 478 assert(Kind == k_CondCode && "Invalid access!"); 479 return CC.Val; 480 } 481 482 unsigned getCoproc() const { 483 assert((Kind == k_CoprocNum || Kind == k_CoprocReg) && "Invalid access!"); 484 return Cop.Val; 485 } 486 487 StringRef getToken() const { 488 assert(Kind == k_Token && "Invalid access!"); 489 return StringRef(Tok.Data, Tok.Length); 490 } 491 492 unsigned getReg() const { 493 assert((Kind == k_Register || Kind == k_CCOut) && "Invalid access!"); 494 return Reg.RegNum; 495 } 496 497 const SmallVectorImpl<unsigned> &getRegList() const { 498 assert((Kind == k_RegisterList || Kind == k_DPRRegisterList || 499 Kind == k_SPRRegisterList) && "Invalid access!"); 500 return Registers; 501 } 502 503 const MCExpr *getImm() const { 504 assert(Kind == k_Immediate && "Invalid access!"); 505 return Imm.Val; 506 } 507 508 unsigned getFPImm() const { 509 assert(Kind == k_FPImmediate && "Invalid access!"); 510 return FPImm.Val; 511 } 512 513 unsigned getVectorIndex() const { 514 assert(Kind == k_VectorIndex && "Invalid access!"); 515 return VectorIndex.Val; 516 } 517 518 ARM_MB::MemBOpt getMemBarrierOpt() const { 519 assert(Kind == k_MemBarrierOpt && "Invalid access!"); 520 return MBOpt.Val; 521 } 522 523 ARM_PROC::IFlags getProcIFlags() const { 524 assert(Kind == k_ProcIFlags && "Invalid access!"); 525 return IFlags.Val; 526 } 527 528 unsigned getMSRMask() const { 529 assert(Kind == k_MSRMask && "Invalid access!"); 530 return MMask.Val; 531 } 532 533 bool isCoprocNum() const { return Kind == k_CoprocNum; } 534 bool isCoprocReg() const { return Kind == k_CoprocReg; } 535 bool isCoprocOption() const { return Kind == k_CoprocOption; } 536 bool isCondCode() const { return Kind == k_CondCode; } 537 bool isCCOut() const { return Kind == k_CCOut; } 538 bool isITMask() const { return Kind == k_ITCondMask; } 539 bool isITCondCode() const { return Kind == k_CondCode; } 540 bool isImm() const { return Kind == k_Immediate; } 541 bool isFPImm() const { return Kind == k_FPImmediate; } 542 bool isImm8s4() const { 543 if (Kind != k_Immediate) 544 return false; 545 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 546 if (!CE) return false; 547 int64_t Value = CE->getValue(); 548 return ((Value & 3) == 0) && Value >= -1020 && Value <= 1020; 549 } 550 bool isImm0_1020s4() const { 551 if (Kind != k_Immediate) 552 return false; 553 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 554 if (!CE) return false; 555 int64_t Value = CE->getValue(); 556 return ((Value & 3) == 0) && Value >= 0 && Value <= 1020; 557 } 558 bool isImm0_508s4() const { 559 if (Kind != k_Immediate) 560 return false; 561 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 562 if (!CE) return false; 563 int64_t Value = CE->getValue(); 564 return ((Value & 3) == 0) && Value >= 0 && Value <= 508; 565 } 566 bool isImm0_255() const { 567 if (Kind != k_Immediate) 568 return false; 569 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 570 if (!CE) return false; 571 int64_t Value = CE->getValue(); 572 return Value >= 0 && Value < 256; 573 } 574 bool isImm0_1() const { 575 if (Kind != k_Immediate) 576 return false; 577 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 578 if (!CE) return false; 579 int64_t Value = CE->getValue(); 580 return Value >= 0 && Value < 2; 581 } 582 bool isImm0_3() const { 583 if (Kind != k_Immediate) 584 return false; 585 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 586 if (!CE) return false; 587 int64_t Value = CE->getValue(); 588 return Value >= 0 && Value < 4; 589 } 590 bool isImm0_7() const { 591 if (Kind != k_Immediate) 592 return false; 593 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 594 if (!CE) return false; 595 int64_t Value = CE->getValue(); 596 return Value >= 0 && Value < 8; 597 } 598 bool isImm0_15() const { 599 if (Kind != k_Immediate) 600 return false; 601 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 602 if (!CE) return false; 603 int64_t Value = CE->getValue(); 604 return Value >= 0 && Value < 16; 605 } 606 bool isImm0_31() const { 607 if (Kind != k_Immediate) 608 return false; 609 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 610 if (!CE) return false; 611 int64_t Value = CE->getValue(); 612 return Value >= 0 && Value < 32; 613 } 614 bool isImm0_63() const { 615 if (Kind != k_Immediate) 616 return false; 617 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 618 if (!CE) return false; 619 int64_t Value = CE->getValue(); 620 return Value >= 0 && Value < 64; 621 } 622 bool isImm8() const { 623 if (Kind != k_Immediate) 624 return false; 625 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 626 if (!CE) return false; 627 int64_t Value = CE->getValue(); 628 return Value == 8; 629 } 630 bool isImm16() const { 631 if (Kind != k_Immediate) 632 return false; 633 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 634 if (!CE) return false; 635 int64_t Value = CE->getValue(); 636 return Value == 16; 637 } 638 bool isImm32() const { 639 if (Kind != k_Immediate) 640 return false; 641 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 642 if (!CE) return false; 643 int64_t Value = CE->getValue(); 644 return Value == 32; 645 } 646 bool isImm1_7() const { 647 if (Kind != k_Immediate) 648 return false; 649 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 650 if (!CE) return false; 651 int64_t Value = CE->getValue(); 652 return Value > 0 && Value < 8; 653 } 654 bool isImm1_15() const { 655 if (Kind != k_Immediate) 656 return false; 657 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 658 if (!CE) return false; 659 int64_t Value = CE->getValue(); 660 return Value > 0 && Value < 16; 661 } 662 bool isImm1_31() const { 663 if (Kind != k_Immediate) 664 return false; 665 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 666 if (!CE) return false; 667 int64_t Value = CE->getValue(); 668 return Value > 0 && Value < 32; 669 } 670 bool isImm1_16() const { 671 if (Kind != k_Immediate) 672 return false; 673 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 674 if (!CE) return false; 675 int64_t Value = CE->getValue(); 676 return Value > 0 && Value < 17; 677 } 678 bool isImm1_32() const { 679 if (Kind != k_Immediate) 680 return false; 681 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 682 if (!CE) return false; 683 int64_t Value = CE->getValue(); 684 return Value > 0 && Value < 33; 685 } 686 bool isImm0_32() const { 687 if (Kind != k_Immediate) 688 return false; 689 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 690 if (!CE) return false; 691 int64_t Value = CE->getValue(); 692 return Value >= 0 && Value < 33; 693 } 694 bool isImm0_65535() const { 695 if (Kind != k_Immediate) 696 return false; 697 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 698 if (!CE) return false; 699 int64_t Value = CE->getValue(); 700 return Value >= 0 && Value < 65536; 701 } 702 bool isImm0_65535Expr() const { 703 if (Kind != k_Immediate) 704 return false; 705 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 706 // If it's not a constant expression, it'll generate a fixup and be 707 // handled later. 708 if (!CE) return true; 709 int64_t Value = CE->getValue(); 710 return Value >= 0 && Value < 65536; 711 } 712 bool isImm24bit() const { 713 if (Kind != k_Immediate) 714 return false; 715 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 716 if (!CE) return false; 717 int64_t Value = CE->getValue(); 718 return Value >= 0 && Value <= 0xffffff; 719 } 720 bool isImmThumbSR() const { 721 if (Kind != k_Immediate) 722 return false; 723 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 724 if (!CE) return false; 725 int64_t Value = CE->getValue(); 726 return Value > 0 && Value < 33; 727 } 728 bool isPKHLSLImm() const { 729 if (Kind != k_Immediate) 730 return false; 731 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 732 if (!CE) return false; 733 int64_t Value = CE->getValue(); 734 return Value >= 0 && Value < 32; 735 } 736 bool isPKHASRImm() const { 737 if (Kind != k_Immediate) 738 return false; 739 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 740 if (!CE) return false; 741 int64_t Value = CE->getValue(); 742 return Value > 0 && Value <= 32; 743 } 744 bool isARMSOImm() const { 745 if (Kind != k_Immediate) 746 return false; 747 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 748 if (!CE) return false; 749 int64_t Value = CE->getValue(); 750 return ARM_AM::getSOImmVal(Value) != -1; 751 } 752 bool isARMSOImmNot() const { 753 if (Kind != k_Immediate) 754 return false; 755 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 756 if (!CE) return false; 757 int64_t Value = CE->getValue(); 758 return ARM_AM::getSOImmVal(~Value) != -1; 759 } 760 bool isARMSOImmNeg() const { 761 if (Kind != k_Immediate) 762 return false; 763 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 764 if (!CE) return false; 765 int64_t Value = CE->getValue(); 766 return ARM_AM::getSOImmVal(-Value) != -1; 767 } 768 bool isT2SOImm() const { 769 if (Kind != k_Immediate) 770 return false; 771 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 772 if (!CE) return false; 773 int64_t Value = CE->getValue(); 774 return ARM_AM::getT2SOImmVal(Value) != -1; 775 } 776 bool isT2SOImmNot() const { 777 if (Kind != k_Immediate) 778 return false; 779 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 780 if (!CE) return false; 781 int64_t Value = CE->getValue(); 782 return ARM_AM::getT2SOImmVal(~Value) != -1; 783 } 784 bool isT2SOImmNeg() const { 785 if (Kind != k_Immediate) 786 return false; 787 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 788 if (!CE) return false; 789 int64_t Value = CE->getValue(); 790 return ARM_AM::getT2SOImmVal(-Value) != -1; 791 } 792 bool isSetEndImm() const { 793 if (Kind != k_Immediate) 794 return false; 795 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 796 if (!CE) return false; 797 int64_t Value = CE->getValue(); 798 return Value == 1 || Value == 0; 799 } 800 bool isReg() const { return Kind == k_Register; } 801 bool isRegList() const { return Kind == k_RegisterList; } 802 bool isDPRRegList() const { return Kind == k_DPRRegisterList; } 803 bool isSPRRegList() const { return Kind == k_SPRRegisterList; } 804 bool isToken() const { return Kind == k_Token; } 805 bool isMemBarrierOpt() const { return Kind == k_MemBarrierOpt; } 806 bool isMemory() const { return Kind == k_Memory; } 807 bool isShifterImm() const { return Kind == k_ShifterImmediate; } 808 bool isRegShiftedReg() const { return Kind == k_ShiftedRegister; } 809 bool isRegShiftedImm() const { return Kind == k_ShiftedImmediate; } 810 bool isRotImm() const { return Kind == k_RotateImmediate; } 811 bool isBitfield() const { return Kind == k_BitfieldDescriptor; } 812 bool isPostIdxRegShifted() const { return Kind == k_PostIndexRegister; } 813 bool isPostIdxReg() const { 814 return Kind == k_PostIndexRegister && PostIdxReg.ShiftTy ==ARM_AM::no_shift; 815 } 816 bool isMemNoOffset(bool alignOK = false) const { 817 if (!isMemory()) 818 return false; 819 // No offset of any kind. 820 return Memory.OffsetRegNum == 0 && Memory.OffsetImm == 0 && 821 (alignOK || Memory.Alignment == 0); 822 } 823 bool isAlignedMemory() const { 824 return isMemNoOffset(true); 825 } 826 bool isAddrMode2() const { 827 if (!isMemory() || Memory.Alignment != 0) return false; 828 // Check for register offset. 829 if (Memory.OffsetRegNum) return true; 830 // Immediate offset in range [-4095, 4095]. 831 if (!Memory.OffsetImm) return true; 832 int64_t Val = Memory.OffsetImm->getValue(); 833 return Val > -4096 && Val < 4096; 834 } 835 bool isAM2OffsetImm() const { 836 if (Kind != k_Immediate) 837 return false; 838 // Immediate offset in range [-4095, 4095]. 839 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 840 if (!CE) return false; 841 int64_t Val = CE->getValue(); 842 return Val > -4096 && Val < 4096; 843 } 844 bool isAddrMode3() const { 845 if (!isMemory() || Memory.Alignment != 0) return false; 846 // No shifts are legal for AM3. 847 if (Memory.ShiftType != ARM_AM::no_shift) return false; 848 // Check for register offset. 849 if (Memory.OffsetRegNum) return true; 850 // Immediate offset in range [-255, 255]. 851 if (!Memory.OffsetImm) return true; 852 int64_t Val = Memory.OffsetImm->getValue(); 853 return Val > -256 && Val < 256; 854 } 855 bool isAM3Offset() const { 856 if (Kind != k_Immediate && Kind != k_PostIndexRegister) 857 return false; 858 if (Kind == k_PostIndexRegister) 859 return PostIdxReg.ShiftTy == ARM_AM::no_shift; 860 // Immediate offset in range [-255, 255]. 861 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 862 if (!CE) return false; 863 int64_t Val = CE->getValue(); 864 // Special case, #-0 is INT32_MIN. 865 return (Val > -256 && Val < 256) || Val == INT32_MIN; 866 } 867 bool isAddrMode5() const { 868 // If we have an immediate that's not a constant, treat it as a label 869 // reference needing a fixup. If it is a constant, it's something else 870 // and we reject it. 871 if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm())) 872 return true; 873 if (!isMemory() || Memory.Alignment != 0) return false; 874 // Check for register offset. 875 if (Memory.OffsetRegNum) return false; 876 // Immediate offset in range [-1020, 1020] and a multiple of 4. 877 if (!Memory.OffsetImm) return true; 878 int64_t Val = Memory.OffsetImm->getValue(); 879 return (Val >= -1020 && Val <= 1020 && ((Val & 3) == 0)) || 880 Val == INT32_MIN; 881 } 882 bool isMemTBB() const { 883 if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative || 884 Memory.ShiftType != ARM_AM::no_shift || Memory.Alignment != 0) 885 return false; 886 return true; 887 } 888 bool isMemTBH() const { 889 if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative || 890 Memory.ShiftType != ARM_AM::lsl || Memory.ShiftImm != 1 || 891 Memory.Alignment != 0 ) 892 return false; 893 return true; 894 } 895 bool isMemRegOffset() const { 896 if (!isMemory() || !Memory.OffsetRegNum || Memory.Alignment != 0) 897 return false; 898 return true; 899 } 900 bool isT2MemRegOffset() const { 901 if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative || 902 Memory.Alignment != 0) 903 return false; 904 // Only lsl #{0, 1, 2, 3} allowed. 905 if (Memory.ShiftType == ARM_AM::no_shift) 906 return true; 907 if (Memory.ShiftType != ARM_AM::lsl || Memory.ShiftImm > 3) 908 return false; 909 return true; 910 } 911 bool isMemThumbRR() const { 912 // Thumb reg+reg addressing is simple. Just two registers, a base and 913 // an offset. No shifts, negations or any other complicating factors. 914 if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative || 915 Memory.ShiftType != ARM_AM::no_shift || Memory.Alignment != 0) 916 return false; 917 return isARMLowRegister(Memory.BaseRegNum) && 918 (!Memory.OffsetRegNum || isARMLowRegister(Memory.OffsetRegNum)); 919 } 920 bool isMemThumbRIs4() const { 921 if (!isMemory() || Memory.OffsetRegNum != 0 || 922 !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0) 923 return false; 924 // Immediate offset, multiple of 4 in range [0, 124]. 925 if (!Memory.OffsetImm) return true; 926 int64_t Val = Memory.OffsetImm->getValue(); 927 return Val >= 0 && Val <= 124 && (Val % 4) == 0; 928 } 929 bool isMemThumbRIs2() const { 930 if (!isMemory() || Memory.OffsetRegNum != 0 || 931 !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0) 932 return false; 933 // Immediate offset, multiple of 4 in range [0, 62]. 934 if (!Memory.OffsetImm) return true; 935 int64_t Val = Memory.OffsetImm->getValue(); 936 return Val >= 0 && Val <= 62 && (Val % 2) == 0; 937 } 938 bool isMemThumbRIs1() const { 939 if (!isMemory() || Memory.OffsetRegNum != 0 || 940 !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0) 941 return false; 942 // Immediate offset in range [0, 31]. 943 if (!Memory.OffsetImm) return true; 944 int64_t Val = Memory.OffsetImm->getValue(); 945 return Val >= 0 && Val <= 31; 946 } 947 bool isMemThumbSPI() const { 948 if (!isMemory() || Memory.OffsetRegNum != 0 || 949 Memory.BaseRegNum != ARM::SP || Memory.Alignment != 0) 950 return false; 951 // Immediate offset, multiple of 4 in range [0, 1020]. 952 if (!Memory.OffsetImm) return true; 953 int64_t Val = Memory.OffsetImm->getValue(); 954 return Val >= 0 && Val <= 1020 && (Val % 4) == 0; 955 } 956 bool isMemImm8s4Offset() const { 957 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 958 return false; 959 // Immediate offset a multiple of 4 in range [-1020, 1020]. 960 if (!Memory.OffsetImm) return true; 961 int64_t Val = Memory.OffsetImm->getValue(); 962 return Val >= -1020 && Val <= 1020 && (Val & 3) == 0; 963 } 964 bool isMemImm0_1020s4Offset() const { 965 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 966 return false; 967 // Immediate offset a multiple of 4 in range [0, 1020]. 968 if (!Memory.OffsetImm) return true; 969 int64_t Val = Memory.OffsetImm->getValue(); 970 return Val >= 0 && Val <= 1020 && (Val & 3) == 0; 971 } 972 bool isMemImm8Offset() const { 973 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 974 return false; 975 // Immediate offset in range [-255, 255]. 976 if (!Memory.OffsetImm) return true; 977 int64_t Val = Memory.OffsetImm->getValue(); 978 return (Val == INT32_MIN) || (Val > -256 && Val < 256); 979 } 980 bool isMemPosImm8Offset() const { 981 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 982 return false; 983 // Immediate offset in range [0, 255]. 984 if (!Memory.OffsetImm) return true; 985 int64_t Val = Memory.OffsetImm->getValue(); 986 return Val >= 0 && Val < 256; 987 } 988 bool isMemNegImm8Offset() const { 989 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 990 return false; 991 // Immediate offset in range [-255, -1]. 992 if (!Memory.OffsetImm) return false; 993 int64_t Val = Memory.OffsetImm->getValue(); 994 return (Val == INT32_MIN) || (Val > -256 && Val < 0); 995 } 996 bool isMemUImm12Offset() const { 997 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 998 return false; 999 // Immediate offset in range [0, 4095]. 1000 if (!Memory.OffsetImm) return true; 1001 int64_t Val = Memory.OffsetImm->getValue(); 1002 return (Val >= 0 && Val < 4096); 1003 } 1004 bool isMemImm12Offset() const { 1005 // If we have an immediate that's not a constant, treat it as a label 1006 // reference needing a fixup. If it is a constant, it's something else 1007 // and we reject it. 1008 if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm())) 1009 return true; 1010 1011 if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0) 1012 return false; 1013 // Immediate offset in range [-4095, 4095]. 1014 if (!Memory.OffsetImm) return true; 1015 int64_t Val = Memory.OffsetImm->getValue(); 1016 return (Val > -4096 && Val < 4096) || (Val == INT32_MIN); 1017 } 1018 bool isPostIdxImm8() const { 1019 if (Kind != k_Immediate) 1020 return false; 1021 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1022 if (!CE) return false; 1023 int64_t Val = CE->getValue(); 1024 return (Val > -256 && Val < 256) || (Val == INT32_MIN); 1025 } 1026 bool isPostIdxImm8s4() const { 1027 if (Kind != k_Immediate) 1028 return false; 1029 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1030 if (!CE) return false; 1031 int64_t Val = CE->getValue(); 1032 return ((Val & 3) == 0 && Val >= -1020 && Val <= 1020) || 1033 (Val == INT32_MIN); 1034 } 1035 1036 bool isMSRMask() const { return Kind == k_MSRMask; } 1037 bool isProcIFlags() const { return Kind == k_ProcIFlags; } 1038 1039 // NEON operands. 1040 bool isVecListOneD() const { 1041 if (Kind != k_VectorList) return false; 1042 return VectorList.Count == 1; 1043 } 1044 1045 bool isVecListTwoD() const { 1046 if (Kind != k_VectorList) return false; 1047 return VectorList.Count == 2; 1048 } 1049 1050 bool isVecListThreeD() const { 1051 if (Kind != k_VectorList) return false; 1052 return VectorList.Count == 3; 1053 } 1054 1055 bool isVecListFourD() const { 1056 if (Kind != k_VectorList) return false; 1057 return VectorList.Count == 4; 1058 } 1059 1060 bool isVecListTwoQ() const { 1061 if (Kind != k_VectorList) return false; 1062 //FIXME: We haven't taught the parser to handle by-two register lists 1063 // yet, so don't pretend to know one. 1064 return VectorList.Count == 2 && false; 1065 } 1066 1067 bool isVecListOneDAllLanes() const { 1068 if (Kind != k_VectorListAllLanes) return false; 1069 return VectorList.Count == 1; 1070 } 1071 1072 bool isVecListTwoDAllLanes() const { 1073 if (Kind != k_VectorListAllLanes) return false; 1074 return VectorList.Count == 2; 1075 } 1076 1077 bool isVecListOneDByteIndexed() const { 1078 if (Kind != k_VectorListIndexed) return false; 1079 return VectorList.Count == 1 && VectorList.LaneIndex <= 7; 1080 } 1081 1082 bool isVectorIndex8() const { 1083 if (Kind != k_VectorIndex) return false; 1084 return VectorIndex.Val < 8; 1085 } 1086 bool isVectorIndex16() const { 1087 if (Kind != k_VectorIndex) return false; 1088 return VectorIndex.Val < 4; 1089 } 1090 bool isVectorIndex32() const { 1091 if (Kind != k_VectorIndex) return false; 1092 return VectorIndex.Val < 2; 1093 } 1094 1095 bool isNEONi8splat() const { 1096 if (Kind != k_Immediate) 1097 return false; 1098 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1099 // Must be a constant. 1100 if (!CE) return false; 1101 int64_t Value = CE->getValue(); 1102 // i8 value splatted across 8 bytes. The immediate is just the 8 byte 1103 // value. 1104 return Value >= 0 && Value < 256; 1105 } 1106 1107 bool isNEONi16splat() const { 1108 if (Kind != k_Immediate) 1109 return false; 1110 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1111 // Must be a constant. 1112 if (!CE) return false; 1113 int64_t Value = CE->getValue(); 1114 // i16 value in the range [0,255] or [0x0100, 0xff00] 1115 return (Value >= 0 && Value < 256) || (Value >= 0x0100 && Value <= 0xff00); 1116 } 1117 1118 bool isNEONi32splat() const { 1119 if (Kind != k_Immediate) 1120 return false; 1121 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1122 // Must be a constant. 1123 if (!CE) return false; 1124 int64_t Value = CE->getValue(); 1125 // i32 value with set bits only in one byte X000, 0X00, 00X0, or 000X. 1126 return (Value >= 0 && Value < 256) || 1127 (Value >= 0x0100 && Value <= 0xff00) || 1128 (Value >= 0x010000 && Value <= 0xff0000) || 1129 (Value >= 0x01000000 && Value <= 0xff000000); 1130 } 1131 1132 bool isNEONi32vmov() const { 1133 if (Kind != k_Immediate) 1134 return false; 1135 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1136 // Must be a constant. 1137 if (!CE) return false; 1138 int64_t Value = CE->getValue(); 1139 // i32 value with set bits only in one byte X000, 0X00, 00X0, or 000X, 1140 // for VMOV/VMVN only, 00Xf or 0Xff are also accepted. 1141 return (Value >= 0 && Value < 256) || 1142 (Value >= 0x0100 && Value <= 0xff00) || 1143 (Value >= 0x010000 && Value <= 0xff0000) || 1144 (Value >= 0x01000000 && Value <= 0xff000000) || 1145 (Value >= 0x01ff && Value <= 0xffff && (Value & 0xff) == 0xff) || 1146 (Value >= 0x01ffff && Value <= 0xffffff && (Value & 0xffff) == 0xffff); 1147 } 1148 1149 bool isNEONi64splat() const { 1150 if (Kind != k_Immediate) 1151 return false; 1152 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1153 // Must be a constant. 1154 if (!CE) return false; 1155 uint64_t Value = CE->getValue(); 1156 // i64 value with each byte being either 0 or 0xff. 1157 for (unsigned i = 0; i < 8; ++i) 1158 if ((Value & 0xff) != 0 && (Value & 0xff) != 0xff) return false; 1159 return true; 1160 } 1161 1162 void addExpr(MCInst &Inst, const MCExpr *Expr) const { 1163 // Add as immediates when possible. Null MCExpr = 0. 1164 if (Expr == 0) 1165 Inst.addOperand(MCOperand::CreateImm(0)); 1166 else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 1167 Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 1168 else 1169 Inst.addOperand(MCOperand::CreateExpr(Expr)); 1170 } 1171 1172 void addCondCodeOperands(MCInst &Inst, unsigned N) const { 1173 assert(N == 2 && "Invalid number of operands!"); 1174 Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode()))); 1175 unsigned RegNum = getCondCode() == ARMCC::AL ? 0: ARM::CPSR; 1176 Inst.addOperand(MCOperand::CreateReg(RegNum)); 1177 } 1178 1179 void addCoprocNumOperands(MCInst &Inst, unsigned N) const { 1180 assert(N == 1 && "Invalid number of operands!"); 1181 Inst.addOperand(MCOperand::CreateImm(getCoproc())); 1182 } 1183 1184 void addCoprocRegOperands(MCInst &Inst, unsigned N) const { 1185 assert(N == 1 && "Invalid number of operands!"); 1186 Inst.addOperand(MCOperand::CreateImm(getCoproc())); 1187 } 1188 1189 void addCoprocOptionOperands(MCInst &Inst, unsigned N) const { 1190 assert(N == 1 && "Invalid number of operands!"); 1191 Inst.addOperand(MCOperand::CreateImm(CoprocOption.Val)); 1192 } 1193 1194 void addITMaskOperands(MCInst &Inst, unsigned N) const { 1195 assert(N == 1 && "Invalid number of operands!"); 1196 Inst.addOperand(MCOperand::CreateImm(ITMask.Mask)); 1197 } 1198 1199 void addITCondCodeOperands(MCInst &Inst, unsigned N) const { 1200 assert(N == 1 && "Invalid number of operands!"); 1201 Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode()))); 1202 } 1203 1204 void addCCOutOperands(MCInst &Inst, unsigned N) const { 1205 assert(N == 1 && "Invalid number of operands!"); 1206 Inst.addOperand(MCOperand::CreateReg(getReg())); 1207 } 1208 1209 void addRegOperands(MCInst &Inst, unsigned N) const { 1210 assert(N == 1 && "Invalid number of operands!"); 1211 Inst.addOperand(MCOperand::CreateReg(getReg())); 1212 } 1213 1214 void addRegShiftedRegOperands(MCInst &Inst, unsigned N) const { 1215 assert(N == 3 && "Invalid number of operands!"); 1216 assert(isRegShiftedReg() && 1217 "addRegShiftedRegOperands() on non RegShiftedReg!"); 1218 Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.SrcReg)); 1219 Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.ShiftReg)); 1220 Inst.addOperand(MCOperand::CreateImm( 1221 ARM_AM::getSORegOpc(RegShiftedReg.ShiftTy, RegShiftedReg.ShiftImm))); 1222 } 1223 1224 void addRegShiftedImmOperands(MCInst &Inst, unsigned N) const { 1225 assert(N == 2 && "Invalid number of operands!"); 1226 assert(isRegShiftedImm() && 1227 "addRegShiftedImmOperands() on non RegShiftedImm!"); 1228 Inst.addOperand(MCOperand::CreateReg(RegShiftedImm.SrcReg)); 1229 Inst.addOperand(MCOperand::CreateImm( 1230 ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm))); 1231 } 1232 1233 void addShifterImmOperands(MCInst &Inst, unsigned N) const { 1234 assert(N == 1 && "Invalid number of operands!"); 1235 Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) | 1236 ShifterImm.Imm)); 1237 } 1238 1239 void addRegListOperands(MCInst &Inst, unsigned N) const { 1240 assert(N == 1 && "Invalid number of operands!"); 1241 const SmallVectorImpl<unsigned> &RegList = getRegList(); 1242 for (SmallVectorImpl<unsigned>::const_iterator 1243 I = RegList.begin(), E = RegList.end(); I != E; ++I) 1244 Inst.addOperand(MCOperand::CreateReg(*I)); 1245 } 1246 1247 void addDPRRegListOperands(MCInst &Inst, unsigned N) const { 1248 addRegListOperands(Inst, N); 1249 } 1250 1251 void addSPRRegListOperands(MCInst &Inst, unsigned N) const { 1252 addRegListOperands(Inst, N); 1253 } 1254 1255 void addRotImmOperands(MCInst &Inst, unsigned N) const { 1256 assert(N == 1 && "Invalid number of operands!"); 1257 // Encoded as val>>3. The printer handles display as 8, 16, 24. 1258 Inst.addOperand(MCOperand::CreateImm(RotImm.Imm >> 3)); 1259 } 1260 1261 void addBitfieldOperands(MCInst &Inst, unsigned N) const { 1262 assert(N == 1 && "Invalid number of operands!"); 1263 // Munge the lsb/width into a bitfield mask. 1264 unsigned lsb = Bitfield.LSB; 1265 unsigned width = Bitfield.Width; 1266 // Make a 32-bit mask w/ the referenced bits clear and all other bits set. 1267 uint32_t Mask = ~(((uint32_t)0xffffffff >> lsb) << (32 - width) >> 1268 (32 - (lsb + width))); 1269 Inst.addOperand(MCOperand::CreateImm(Mask)); 1270 } 1271 1272 void addImmOperands(MCInst &Inst, unsigned N) const { 1273 assert(N == 1 && "Invalid number of operands!"); 1274 addExpr(Inst, getImm()); 1275 } 1276 1277 void addFPImmOperands(MCInst &Inst, unsigned N) const { 1278 assert(N == 1 && "Invalid number of operands!"); 1279 Inst.addOperand(MCOperand::CreateImm(getFPImm())); 1280 } 1281 1282 void addImm8s4Operands(MCInst &Inst, unsigned N) const { 1283 assert(N == 1 && "Invalid number of operands!"); 1284 // FIXME: We really want to scale the value here, but the LDRD/STRD 1285 // instruction don't encode operands that way yet. 1286 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1287 Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 1288 } 1289 1290 void addImm0_1020s4Operands(MCInst &Inst, unsigned N) const { 1291 assert(N == 1 && "Invalid number of operands!"); 1292 // The immediate is scaled by four in the encoding and is stored 1293 // in the MCInst as such. Lop off the low two bits here. 1294 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1295 Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4)); 1296 } 1297 1298 void addImm0_508s4Operands(MCInst &Inst, unsigned N) const { 1299 assert(N == 1 && "Invalid number of operands!"); 1300 // The immediate is scaled by four in the encoding and is stored 1301 // in the MCInst as such. Lop off the low two bits here. 1302 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1303 Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4)); 1304 } 1305 1306 void addImm1_16Operands(MCInst &Inst, unsigned N) const { 1307 assert(N == 1 && "Invalid number of operands!"); 1308 // The constant encodes as the immediate-1, and we store in the instruction 1309 // the bits as encoded, so subtract off one here. 1310 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1311 Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1)); 1312 } 1313 1314 void addImm1_32Operands(MCInst &Inst, unsigned N) const { 1315 assert(N == 1 && "Invalid number of operands!"); 1316 // The constant encodes as the immediate-1, and we store in the instruction 1317 // the bits as encoded, so subtract off one here. 1318 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1319 Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1)); 1320 } 1321 1322 void addImmThumbSROperands(MCInst &Inst, unsigned N) const { 1323 assert(N == 1 && "Invalid number of operands!"); 1324 // The constant encodes as the immediate, except for 32, which encodes as 1325 // zero. 1326 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1327 unsigned Imm = CE->getValue(); 1328 Inst.addOperand(MCOperand::CreateImm((Imm == 32 ? 0 : Imm))); 1329 } 1330 1331 void addPKHASRImmOperands(MCInst &Inst, unsigned N) const { 1332 assert(N == 1 && "Invalid number of operands!"); 1333 // An ASR value of 32 encodes as 0, so that's how we want to add it to 1334 // the instruction as well. 1335 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1336 int Val = CE->getValue(); 1337 Inst.addOperand(MCOperand::CreateImm(Val == 32 ? 0 : Val)); 1338 } 1339 1340 void addT2SOImmNotOperands(MCInst &Inst, unsigned N) const { 1341 assert(N == 1 && "Invalid number of operands!"); 1342 // The operand is actually a t2_so_imm, but we have its bitwise 1343 // negation in the assembly source, so twiddle it here. 1344 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1345 Inst.addOperand(MCOperand::CreateImm(~CE->getValue())); 1346 } 1347 1348 void addT2SOImmNegOperands(MCInst &Inst, unsigned N) const { 1349 assert(N == 1 && "Invalid number of operands!"); 1350 // The operand is actually a t2_so_imm, but we have its 1351 // negation in the assembly source, so twiddle it here. 1352 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1353 Inst.addOperand(MCOperand::CreateImm(-CE->getValue())); 1354 } 1355 1356 void addARMSOImmNotOperands(MCInst &Inst, unsigned N) const { 1357 assert(N == 1 && "Invalid number of operands!"); 1358 // The operand is actually a so_imm, but we have its bitwise 1359 // negation in the assembly source, so twiddle it here. 1360 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1361 Inst.addOperand(MCOperand::CreateImm(~CE->getValue())); 1362 } 1363 1364 void addARMSOImmNegOperands(MCInst &Inst, unsigned N) const { 1365 assert(N == 1 && "Invalid number of operands!"); 1366 // The operand is actually a so_imm, but we have its 1367 // negation in the assembly source, so twiddle it here. 1368 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1369 Inst.addOperand(MCOperand::CreateImm(-CE->getValue())); 1370 } 1371 1372 void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const { 1373 assert(N == 1 && "Invalid number of operands!"); 1374 Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt()))); 1375 } 1376 1377 void addMemNoOffsetOperands(MCInst &Inst, unsigned N) const { 1378 assert(N == 1 && "Invalid number of operands!"); 1379 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1380 } 1381 1382 void addAlignedMemoryOperands(MCInst &Inst, unsigned N) const { 1383 assert(N == 2 && "Invalid number of operands!"); 1384 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1385 Inst.addOperand(MCOperand::CreateImm(Memory.Alignment)); 1386 } 1387 1388 void addAddrMode2Operands(MCInst &Inst, unsigned N) const { 1389 assert(N == 3 && "Invalid number of operands!"); 1390 int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0; 1391 if (!Memory.OffsetRegNum) { 1392 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1393 // Special case for #-0 1394 if (Val == INT32_MIN) Val = 0; 1395 if (Val < 0) Val = -Val; 1396 Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift); 1397 } else { 1398 // For register offset, we encode the shift type and negation flag 1399 // here. 1400 Val = ARM_AM::getAM2Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add, 1401 Memory.ShiftImm, Memory.ShiftType); 1402 } 1403 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1404 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1405 Inst.addOperand(MCOperand::CreateImm(Val)); 1406 } 1407 1408 void addAM2OffsetImmOperands(MCInst &Inst, unsigned N) const { 1409 assert(N == 2 && "Invalid number of operands!"); 1410 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1411 assert(CE && "non-constant AM2OffsetImm operand!"); 1412 int32_t Val = CE->getValue(); 1413 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1414 // Special case for #-0 1415 if (Val == INT32_MIN) Val = 0; 1416 if (Val < 0) Val = -Val; 1417 Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift); 1418 Inst.addOperand(MCOperand::CreateReg(0)); 1419 Inst.addOperand(MCOperand::CreateImm(Val)); 1420 } 1421 1422 void addAddrMode3Operands(MCInst &Inst, unsigned N) const { 1423 assert(N == 3 && "Invalid number of operands!"); 1424 int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0; 1425 if (!Memory.OffsetRegNum) { 1426 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1427 // Special case for #-0 1428 if (Val == INT32_MIN) Val = 0; 1429 if (Val < 0) Val = -Val; 1430 Val = ARM_AM::getAM3Opc(AddSub, Val); 1431 } else { 1432 // For register offset, we encode the shift type and negation flag 1433 // here. 1434 Val = ARM_AM::getAM3Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add, 0); 1435 } 1436 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1437 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1438 Inst.addOperand(MCOperand::CreateImm(Val)); 1439 } 1440 1441 void addAM3OffsetOperands(MCInst &Inst, unsigned N) const { 1442 assert(N == 2 && "Invalid number of operands!"); 1443 if (Kind == k_PostIndexRegister) { 1444 int32_t Val = 1445 ARM_AM::getAM3Opc(PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub, 0); 1446 Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum)); 1447 Inst.addOperand(MCOperand::CreateImm(Val)); 1448 return; 1449 } 1450 1451 // Constant offset. 1452 const MCConstantExpr *CE = static_cast<const MCConstantExpr*>(getImm()); 1453 int32_t Val = CE->getValue(); 1454 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1455 // Special case for #-0 1456 if (Val == INT32_MIN) Val = 0; 1457 if (Val < 0) Val = -Val; 1458 Val = ARM_AM::getAM3Opc(AddSub, Val); 1459 Inst.addOperand(MCOperand::CreateReg(0)); 1460 Inst.addOperand(MCOperand::CreateImm(Val)); 1461 } 1462 1463 void addAddrMode5Operands(MCInst &Inst, unsigned N) const { 1464 assert(N == 2 && "Invalid number of operands!"); 1465 // If we have an immediate that's not a constant, treat it as a label 1466 // reference needing a fixup. If it is a constant, it's something else 1467 // and we reject it. 1468 if (isImm()) { 1469 Inst.addOperand(MCOperand::CreateExpr(getImm())); 1470 Inst.addOperand(MCOperand::CreateImm(0)); 1471 return; 1472 } 1473 1474 // The lower two bits are always zero and as such are not encoded. 1475 int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() / 4 : 0; 1476 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1477 // Special case for #-0 1478 if (Val == INT32_MIN) Val = 0; 1479 if (Val < 0) Val = -Val; 1480 Val = ARM_AM::getAM5Opc(AddSub, Val); 1481 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1482 Inst.addOperand(MCOperand::CreateImm(Val)); 1483 } 1484 1485 void addMemImm8s4OffsetOperands(MCInst &Inst, unsigned N) const { 1486 assert(N == 2 && "Invalid number of operands!"); 1487 int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0; 1488 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1489 Inst.addOperand(MCOperand::CreateImm(Val)); 1490 } 1491 1492 void addMemImm0_1020s4OffsetOperands(MCInst &Inst, unsigned N) const { 1493 assert(N == 2 && "Invalid number of operands!"); 1494 // The lower two bits are always zero and as such are not encoded. 1495 int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() / 4 : 0; 1496 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1497 Inst.addOperand(MCOperand::CreateImm(Val)); 1498 } 1499 1500 void addMemImm8OffsetOperands(MCInst &Inst, unsigned N) const { 1501 assert(N == 2 && "Invalid number of operands!"); 1502 int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0; 1503 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1504 Inst.addOperand(MCOperand::CreateImm(Val)); 1505 } 1506 1507 void addMemPosImm8OffsetOperands(MCInst &Inst, unsigned N) const { 1508 addMemImm8OffsetOperands(Inst, N); 1509 } 1510 1511 void addMemNegImm8OffsetOperands(MCInst &Inst, unsigned N) const { 1512 addMemImm8OffsetOperands(Inst, N); 1513 } 1514 1515 void addMemUImm12OffsetOperands(MCInst &Inst, unsigned N) const { 1516 assert(N == 2 && "Invalid number of operands!"); 1517 // If this is an immediate, it's a label reference. 1518 if (Kind == k_Immediate) { 1519 addExpr(Inst, getImm()); 1520 Inst.addOperand(MCOperand::CreateImm(0)); 1521 return; 1522 } 1523 1524 // Otherwise, it's a normal memory reg+offset. 1525 int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0; 1526 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1527 Inst.addOperand(MCOperand::CreateImm(Val)); 1528 } 1529 1530 void addMemImm12OffsetOperands(MCInst &Inst, unsigned N) const { 1531 assert(N == 2 && "Invalid number of operands!"); 1532 // If this is an immediate, it's a label reference. 1533 if (Kind == k_Immediate) { 1534 addExpr(Inst, getImm()); 1535 Inst.addOperand(MCOperand::CreateImm(0)); 1536 return; 1537 } 1538 1539 // Otherwise, it's a normal memory reg+offset. 1540 int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0; 1541 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1542 Inst.addOperand(MCOperand::CreateImm(Val)); 1543 } 1544 1545 void addMemTBBOperands(MCInst &Inst, unsigned N) const { 1546 assert(N == 2 && "Invalid number of operands!"); 1547 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1548 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1549 } 1550 1551 void addMemTBHOperands(MCInst &Inst, unsigned N) const { 1552 assert(N == 2 && "Invalid number of operands!"); 1553 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1554 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1555 } 1556 1557 void addMemRegOffsetOperands(MCInst &Inst, unsigned N) const { 1558 assert(N == 3 && "Invalid number of operands!"); 1559 unsigned Val = 1560 ARM_AM::getAM2Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add, 1561 Memory.ShiftImm, Memory.ShiftType); 1562 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1563 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1564 Inst.addOperand(MCOperand::CreateImm(Val)); 1565 } 1566 1567 void addT2MemRegOffsetOperands(MCInst &Inst, unsigned N) const { 1568 assert(N == 3 && "Invalid number of operands!"); 1569 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1570 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1571 Inst.addOperand(MCOperand::CreateImm(Memory.ShiftImm)); 1572 } 1573 1574 void addMemThumbRROperands(MCInst &Inst, unsigned N) const { 1575 assert(N == 2 && "Invalid number of operands!"); 1576 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1577 Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum)); 1578 } 1579 1580 void addMemThumbRIs4Operands(MCInst &Inst, unsigned N) const { 1581 assert(N == 2 && "Invalid number of operands!"); 1582 int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 4) : 0; 1583 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1584 Inst.addOperand(MCOperand::CreateImm(Val)); 1585 } 1586 1587 void addMemThumbRIs2Operands(MCInst &Inst, unsigned N) const { 1588 assert(N == 2 && "Invalid number of operands!"); 1589 int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 2) : 0; 1590 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1591 Inst.addOperand(MCOperand::CreateImm(Val)); 1592 } 1593 1594 void addMemThumbRIs1Operands(MCInst &Inst, unsigned N) const { 1595 assert(N == 2 && "Invalid number of operands!"); 1596 int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue()) : 0; 1597 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1598 Inst.addOperand(MCOperand::CreateImm(Val)); 1599 } 1600 1601 void addMemThumbSPIOperands(MCInst &Inst, unsigned N) const { 1602 assert(N == 2 && "Invalid number of operands!"); 1603 int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 4) : 0; 1604 Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum)); 1605 Inst.addOperand(MCOperand::CreateImm(Val)); 1606 } 1607 1608 void addPostIdxImm8Operands(MCInst &Inst, unsigned N) const { 1609 assert(N == 1 && "Invalid number of operands!"); 1610 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1611 assert(CE && "non-constant post-idx-imm8 operand!"); 1612 int Imm = CE->getValue(); 1613 bool isAdd = Imm >= 0; 1614 if (Imm == INT32_MIN) Imm = 0; 1615 Imm = (Imm < 0 ? -Imm : Imm) | (int)isAdd << 8; 1616 Inst.addOperand(MCOperand::CreateImm(Imm)); 1617 } 1618 1619 void addPostIdxImm8s4Operands(MCInst &Inst, unsigned N) const { 1620 assert(N == 1 && "Invalid number of operands!"); 1621 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1622 assert(CE && "non-constant post-idx-imm8s4 operand!"); 1623 int Imm = CE->getValue(); 1624 bool isAdd = Imm >= 0; 1625 if (Imm == INT32_MIN) Imm = 0; 1626 // Immediate is scaled by 4. 1627 Imm = ((Imm < 0 ? -Imm : Imm) / 4) | (int)isAdd << 8; 1628 Inst.addOperand(MCOperand::CreateImm(Imm)); 1629 } 1630 1631 void addPostIdxRegOperands(MCInst &Inst, unsigned N) const { 1632 assert(N == 2 && "Invalid number of operands!"); 1633 Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum)); 1634 Inst.addOperand(MCOperand::CreateImm(PostIdxReg.isAdd)); 1635 } 1636 1637 void addPostIdxRegShiftedOperands(MCInst &Inst, unsigned N) const { 1638 assert(N == 2 && "Invalid number of operands!"); 1639 Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum)); 1640 // The sign, shift type, and shift amount are encoded in a single operand 1641 // using the AM2 encoding helpers. 1642 ARM_AM::AddrOpc opc = PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub; 1643 unsigned Imm = ARM_AM::getAM2Opc(opc, PostIdxReg.ShiftImm, 1644 PostIdxReg.ShiftTy); 1645 Inst.addOperand(MCOperand::CreateImm(Imm)); 1646 } 1647 1648 void addMSRMaskOperands(MCInst &Inst, unsigned N) const { 1649 assert(N == 1 && "Invalid number of operands!"); 1650 Inst.addOperand(MCOperand::CreateImm(unsigned(getMSRMask()))); 1651 } 1652 1653 void addProcIFlagsOperands(MCInst &Inst, unsigned N) const { 1654 assert(N == 1 && "Invalid number of operands!"); 1655 Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags()))); 1656 } 1657 1658 void addVecListOperands(MCInst &Inst, unsigned N) const { 1659 assert(N == 1 && "Invalid number of operands!"); 1660 Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum)); 1661 } 1662 1663 void addVecListIndexedOperands(MCInst &Inst, unsigned N) const { 1664 assert(N == 2 && "Invalid number of operands!"); 1665 Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum)); 1666 Inst.addOperand(MCOperand::CreateImm(VectorList.LaneIndex)); 1667 } 1668 1669 void addVectorIndex8Operands(MCInst &Inst, unsigned N) const { 1670 assert(N == 1 && "Invalid number of operands!"); 1671 Inst.addOperand(MCOperand::CreateImm(getVectorIndex())); 1672 } 1673 1674 void addVectorIndex16Operands(MCInst &Inst, unsigned N) const { 1675 assert(N == 1 && "Invalid number of operands!"); 1676 Inst.addOperand(MCOperand::CreateImm(getVectorIndex())); 1677 } 1678 1679 void addVectorIndex32Operands(MCInst &Inst, unsigned N) const { 1680 assert(N == 1 && "Invalid number of operands!"); 1681 Inst.addOperand(MCOperand::CreateImm(getVectorIndex())); 1682 } 1683 1684 void addNEONi8splatOperands(MCInst &Inst, unsigned N) const { 1685 assert(N == 1 && "Invalid number of operands!"); 1686 // The immediate encodes the type of constant as well as the value. 1687 // Mask in that this is an i8 splat. 1688 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1689 Inst.addOperand(MCOperand::CreateImm(CE->getValue() | 0xe00)); 1690 } 1691 1692 void addNEONi16splatOperands(MCInst &Inst, unsigned N) const { 1693 assert(N == 1 && "Invalid number of operands!"); 1694 // The immediate encodes the type of constant as well as the value. 1695 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1696 unsigned Value = CE->getValue(); 1697 if (Value >= 256) 1698 Value = (Value >> 8) | 0xa00; 1699 else 1700 Value |= 0x800; 1701 Inst.addOperand(MCOperand::CreateImm(Value)); 1702 } 1703 1704 void addNEONi32splatOperands(MCInst &Inst, unsigned N) const { 1705 assert(N == 1 && "Invalid number of operands!"); 1706 // The immediate encodes the type of constant as well as the value. 1707 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1708 unsigned Value = CE->getValue(); 1709 if (Value >= 256 && Value <= 0xff00) 1710 Value = (Value >> 8) | 0x200; 1711 else if (Value > 0xffff && Value <= 0xff0000) 1712 Value = (Value >> 16) | 0x400; 1713 else if (Value > 0xffffff) 1714 Value = (Value >> 24) | 0x600; 1715 Inst.addOperand(MCOperand::CreateImm(Value)); 1716 } 1717 1718 void addNEONi32vmovOperands(MCInst &Inst, unsigned N) const { 1719 assert(N == 1 && "Invalid number of operands!"); 1720 // The immediate encodes the type of constant as well as the value. 1721 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1722 unsigned Value = CE->getValue(); 1723 if (Value >= 256 && Value <= 0xffff) 1724 Value = (Value >> 8) | ((Value & 0xff) ? 0xc00 : 0x200); 1725 else if (Value > 0xffff && Value <= 0xffffff) 1726 Value = (Value >> 16) | ((Value & 0xff) ? 0xd00 : 0x400); 1727 else if (Value > 0xffffff) 1728 Value = (Value >> 24) | 0x600; 1729 Inst.addOperand(MCOperand::CreateImm(Value)); 1730 } 1731 1732 void addNEONi64splatOperands(MCInst &Inst, unsigned N) const { 1733 assert(N == 1 && "Invalid number of operands!"); 1734 // The immediate encodes the type of constant as well as the value. 1735 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1736 uint64_t Value = CE->getValue(); 1737 unsigned Imm = 0; 1738 for (unsigned i = 0; i < 8; ++i, Value >>= 8) { 1739 Imm |= (Value & 1) << i; 1740 } 1741 Inst.addOperand(MCOperand::CreateImm(Imm | 0x1e00)); 1742 } 1743 1744 virtual void print(raw_ostream &OS) const; 1745 1746 static ARMOperand *CreateITMask(unsigned Mask, SMLoc S) { 1747 ARMOperand *Op = new ARMOperand(k_ITCondMask); 1748 Op->ITMask.Mask = Mask; 1749 Op->StartLoc = S; 1750 Op->EndLoc = S; 1751 return Op; 1752 } 1753 1754 static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) { 1755 ARMOperand *Op = new ARMOperand(k_CondCode); 1756 Op->CC.Val = CC; 1757 Op->StartLoc = S; 1758 Op->EndLoc = S; 1759 return Op; 1760 } 1761 1762 static ARMOperand *CreateCoprocNum(unsigned CopVal, SMLoc S) { 1763 ARMOperand *Op = new ARMOperand(k_CoprocNum); 1764 Op->Cop.Val = CopVal; 1765 Op->StartLoc = S; 1766 Op->EndLoc = S; 1767 return Op; 1768 } 1769 1770 static ARMOperand *CreateCoprocReg(unsigned CopVal, SMLoc S) { 1771 ARMOperand *Op = new ARMOperand(k_CoprocReg); 1772 Op->Cop.Val = CopVal; 1773 Op->StartLoc = S; 1774 Op->EndLoc = S; 1775 return Op; 1776 } 1777 1778 static ARMOperand *CreateCoprocOption(unsigned Val, SMLoc S, SMLoc E) { 1779 ARMOperand *Op = new ARMOperand(k_CoprocOption); 1780 Op->Cop.Val = Val; 1781 Op->StartLoc = S; 1782 Op->EndLoc = E; 1783 return Op; 1784 } 1785 1786 static ARMOperand *CreateCCOut(unsigned RegNum, SMLoc S) { 1787 ARMOperand *Op = new ARMOperand(k_CCOut); 1788 Op->Reg.RegNum = RegNum; 1789 Op->StartLoc = S; 1790 Op->EndLoc = S; 1791 return Op; 1792 } 1793 1794 static ARMOperand *CreateToken(StringRef Str, SMLoc S) { 1795 ARMOperand *Op = new ARMOperand(k_Token); 1796 Op->Tok.Data = Str.data(); 1797 Op->Tok.Length = Str.size(); 1798 Op->StartLoc = S; 1799 Op->EndLoc = S; 1800 return Op; 1801 } 1802 1803 static ARMOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) { 1804 ARMOperand *Op = new ARMOperand(k_Register); 1805 Op->Reg.RegNum = RegNum; 1806 Op->StartLoc = S; 1807 Op->EndLoc = E; 1808 return Op; 1809 } 1810 1811 static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy, 1812 unsigned SrcReg, 1813 unsigned ShiftReg, 1814 unsigned ShiftImm, 1815 SMLoc S, SMLoc E) { 1816 ARMOperand *Op = new ARMOperand(k_ShiftedRegister); 1817 Op->RegShiftedReg.ShiftTy = ShTy; 1818 Op->RegShiftedReg.SrcReg = SrcReg; 1819 Op->RegShiftedReg.ShiftReg = ShiftReg; 1820 Op->RegShiftedReg.ShiftImm = ShiftImm; 1821 Op->StartLoc = S; 1822 Op->EndLoc = E; 1823 return Op; 1824 } 1825 1826 static ARMOperand *CreateShiftedImmediate(ARM_AM::ShiftOpc ShTy, 1827 unsigned SrcReg, 1828 unsigned ShiftImm, 1829 SMLoc S, SMLoc E) { 1830 ARMOperand *Op = new ARMOperand(k_ShiftedImmediate); 1831 Op->RegShiftedImm.ShiftTy = ShTy; 1832 Op->RegShiftedImm.SrcReg = SrcReg; 1833 Op->RegShiftedImm.ShiftImm = ShiftImm; 1834 Op->StartLoc = S; 1835 Op->EndLoc = E; 1836 return Op; 1837 } 1838 1839 static ARMOperand *CreateShifterImm(bool isASR, unsigned Imm, 1840 SMLoc S, SMLoc E) { 1841 ARMOperand *Op = new ARMOperand(k_ShifterImmediate); 1842 Op->ShifterImm.isASR = isASR; 1843 Op->ShifterImm.Imm = Imm; 1844 Op->StartLoc = S; 1845 Op->EndLoc = E; 1846 return Op; 1847 } 1848 1849 static ARMOperand *CreateRotImm(unsigned Imm, SMLoc S, SMLoc E) { 1850 ARMOperand *Op = new ARMOperand(k_RotateImmediate); 1851 Op->RotImm.Imm = Imm; 1852 Op->StartLoc = S; 1853 Op->EndLoc = E; 1854 return Op; 1855 } 1856 1857 static ARMOperand *CreateBitfield(unsigned LSB, unsigned Width, 1858 SMLoc S, SMLoc E) { 1859 ARMOperand *Op = new ARMOperand(k_BitfieldDescriptor); 1860 Op->Bitfield.LSB = LSB; 1861 Op->Bitfield.Width = Width; 1862 Op->StartLoc = S; 1863 Op->EndLoc = E; 1864 return Op; 1865 } 1866 1867 static ARMOperand * 1868 CreateRegList(const SmallVectorImpl<std::pair<unsigned, SMLoc> > &Regs, 1869 SMLoc StartLoc, SMLoc EndLoc) { 1870 KindTy Kind = k_RegisterList; 1871 1872 if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Regs.front().first)) 1873 Kind = k_DPRRegisterList; 1874 else if (ARMMCRegisterClasses[ARM::SPRRegClassID]. 1875 contains(Regs.front().first)) 1876 Kind = k_SPRRegisterList; 1877 1878 ARMOperand *Op = new ARMOperand(Kind); 1879 for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator 1880 I = Regs.begin(), E = Regs.end(); I != E; ++I) 1881 Op->Registers.push_back(I->first); 1882 array_pod_sort(Op->Registers.begin(), Op->Registers.end()); 1883 Op->StartLoc = StartLoc; 1884 Op->EndLoc = EndLoc; 1885 return Op; 1886 } 1887 1888 static ARMOperand *CreateVectorList(unsigned RegNum, unsigned Count, 1889 SMLoc S, SMLoc E) { 1890 ARMOperand *Op = new ARMOperand(k_VectorList); 1891 Op->VectorList.RegNum = RegNum; 1892 Op->VectorList.Count = Count; 1893 Op->StartLoc = S; 1894 Op->EndLoc = E; 1895 return Op; 1896 } 1897 1898 static ARMOperand *CreateVectorListAllLanes(unsigned RegNum, unsigned Count, 1899 SMLoc S, SMLoc E) { 1900 ARMOperand *Op = new ARMOperand(k_VectorListAllLanes); 1901 Op->VectorList.RegNum = RegNum; 1902 Op->VectorList.Count = Count; 1903 Op->StartLoc = S; 1904 Op->EndLoc = E; 1905 return Op; 1906 } 1907 1908 static ARMOperand *CreateVectorListIndexed(unsigned RegNum, unsigned Count, 1909 unsigned Index, SMLoc S, SMLoc E) { 1910 ARMOperand *Op = new ARMOperand(k_VectorListIndexed); 1911 Op->VectorList.RegNum = RegNum; 1912 Op->VectorList.Count = Count; 1913 Op->VectorList.LaneIndex = Index; 1914 Op->StartLoc = S; 1915 Op->EndLoc = E; 1916 return Op; 1917 } 1918 1919 static ARMOperand *CreateVectorIndex(unsigned Idx, SMLoc S, SMLoc E, 1920 MCContext &Ctx) { 1921 ARMOperand *Op = new ARMOperand(k_VectorIndex); 1922 Op->VectorIndex.Val = Idx; 1923 Op->StartLoc = S; 1924 Op->EndLoc = E; 1925 return Op; 1926 } 1927 1928 static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) { 1929 ARMOperand *Op = new ARMOperand(k_Immediate); 1930 Op->Imm.Val = Val; 1931 Op->StartLoc = S; 1932 Op->EndLoc = E; 1933 return Op; 1934 } 1935 1936 static ARMOperand *CreateFPImm(unsigned Val, SMLoc S, MCContext &Ctx) { 1937 ARMOperand *Op = new ARMOperand(k_FPImmediate); 1938 Op->FPImm.Val = Val; 1939 Op->StartLoc = S; 1940 Op->EndLoc = S; 1941 return Op; 1942 } 1943 1944 static ARMOperand *CreateMem(unsigned BaseRegNum, 1945 const MCConstantExpr *OffsetImm, 1946 unsigned OffsetRegNum, 1947 ARM_AM::ShiftOpc ShiftType, 1948 unsigned ShiftImm, 1949 unsigned Alignment, 1950 bool isNegative, 1951 SMLoc S, SMLoc E) { 1952 ARMOperand *Op = new ARMOperand(k_Memory); 1953 Op->Memory.BaseRegNum = BaseRegNum; 1954 Op->Memory.OffsetImm = OffsetImm; 1955 Op->Memory.OffsetRegNum = OffsetRegNum; 1956 Op->Memory.ShiftType = ShiftType; 1957 Op->Memory.ShiftImm = ShiftImm; 1958 Op->Memory.Alignment = Alignment; 1959 Op->Memory.isNegative = isNegative; 1960 Op->StartLoc = S; 1961 Op->EndLoc = E; 1962 return Op; 1963 } 1964 1965 static ARMOperand *CreatePostIdxReg(unsigned RegNum, bool isAdd, 1966 ARM_AM::ShiftOpc ShiftTy, 1967 unsigned ShiftImm, 1968 SMLoc S, SMLoc E) { 1969 ARMOperand *Op = new ARMOperand(k_PostIndexRegister); 1970 Op->PostIdxReg.RegNum = RegNum; 1971 Op->PostIdxReg.isAdd = isAdd; 1972 Op->PostIdxReg.ShiftTy = ShiftTy; 1973 Op->PostIdxReg.ShiftImm = ShiftImm; 1974 Op->StartLoc = S; 1975 Op->EndLoc = E; 1976 return Op; 1977 } 1978 1979 static ARMOperand *CreateMemBarrierOpt(ARM_MB::MemBOpt Opt, SMLoc S) { 1980 ARMOperand *Op = new ARMOperand(k_MemBarrierOpt); 1981 Op->MBOpt.Val = Opt; 1982 Op->StartLoc = S; 1983 Op->EndLoc = S; 1984 return Op; 1985 } 1986 1987 static ARMOperand *CreateProcIFlags(ARM_PROC::IFlags IFlags, SMLoc S) { 1988 ARMOperand *Op = new ARMOperand(k_ProcIFlags); 1989 Op->IFlags.Val = IFlags; 1990 Op->StartLoc = S; 1991 Op->EndLoc = S; 1992 return Op; 1993 } 1994 1995 static ARMOperand *CreateMSRMask(unsigned MMask, SMLoc S) { 1996 ARMOperand *Op = new ARMOperand(k_MSRMask); 1997 Op->MMask.Val = MMask; 1998 Op->StartLoc = S; 1999 Op->EndLoc = S; 2000 return Op; 2001 } 2002 }; 2003 2004 } // end anonymous namespace. 2005 2006 void ARMOperand::print(raw_ostream &OS) const { 2007 switch (Kind) { 2008 case k_FPImmediate: 2009 OS << "<fpimm " << getFPImm() << "(" << ARM_AM::getFPImmFloat(getFPImm()) 2010 << ") >"; 2011 break; 2012 case k_CondCode: 2013 OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">"; 2014 break; 2015 case k_CCOut: 2016 OS << "<ccout " << getReg() << ">"; 2017 break; 2018 case k_ITCondMask: { 2019 static const char *MaskStr[] = { 2020 "()", "(t)", "(e)", "(tt)", "(et)", "(te)", "(ee)", "(ttt)", "(ett)", 2021 "(tet)", "(eet)", "(tte)", "(ete)", "(tee)", "(eee)" 2022 }; 2023 assert((ITMask.Mask & 0xf) == ITMask.Mask); 2024 OS << "<it-mask " << MaskStr[ITMask.Mask] << ">"; 2025 break; 2026 } 2027 case k_CoprocNum: 2028 OS << "<coprocessor number: " << getCoproc() << ">"; 2029 break; 2030 case k_CoprocReg: 2031 OS << "<coprocessor register: " << getCoproc() << ">"; 2032 break; 2033 case k_CoprocOption: 2034 OS << "<coprocessor option: " << CoprocOption.Val << ">"; 2035 break; 2036 case k_MSRMask: 2037 OS << "<mask: " << getMSRMask() << ">"; 2038 break; 2039 case k_Immediate: 2040 getImm()->print(OS); 2041 break; 2042 case k_MemBarrierOpt: 2043 OS << "<ARM_MB::" << MemBOptToString(getMemBarrierOpt()) << ">"; 2044 break; 2045 case k_Memory: 2046 OS << "<memory " 2047 << " base:" << Memory.BaseRegNum; 2048 OS << ">"; 2049 break; 2050 case k_PostIndexRegister: 2051 OS << "post-idx register " << (PostIdxReg.isAdd ? "" : "-") 2052 << PostIdxReg.RegNum; 2053 if (PostIdxReg.ShiftTy != ARM_AM::no_shift) 2054 OS << ARM_AM::getShiftOpcStr(PostIdxReg.ShiftTy) << " " 2055 << PostIdxReg.ShiftImm; 2056 OS << ">"; 2057 break; 2058 case k_ProcIFlags: { 2059 OS << "<ARM_PROC::"; 2060 unsigned IFlags = getProcIFlags(); 2061 for (int i=2; i >= 0; --i) 2062 if (IFlags & (1 << i)) 2063 OS << ARM_PROC::IFlagsToString(1 << i); 2064 OS << ">"; 2065 break; 2066 } 2067 case k_Register: 2068 OS << "<register " << getReg() << ">"; 2069 break; 2070 case k_ShifterImmediate: 2071 OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl") 2072 << " #" << ShifterImm.Imm << ">"; 2073 break; 2074 case k_ShiftedRegister: 2075 OS << "<so_reg_reg " 2076 << RegShiftedReg.SrcReg << " " 2077 << ARM_AM::getShiftOpcStr(RegShiftedReg.ShiftTy) 2078 << " " << RegShiftedReg.ShiftReg << ">"; 2079 break; 2080 case k_ShiftedImmediate: 2081 OS << "<so_reg_imm " 2082 << RegShiftedImm.SrcReg << " " 2083 << ARM_AM::getShiftOpcStr(RegShiftedImm.ShiftTy) 2084 << " #" << RegShiftedImm.ShiftImm << ">"; 2085 break; 2086 case k_RotateImmediate: 2087 OS << "<ror " << " #" << (RotImm.Imm * 8) << ">"; 2088 break; 2089 case k_BitfieldDescriptor: 2090 OS << "<bitfield " << "lsb: " << Bitfield.LSB 2091 << ", width: " << Bitfield.Width << ">"; 2092 break; 2093 case k_RegisterList: 2094 case k_DPRRegisterList: 2095 case k_SPRRegisterList: { 2096 OS << "<register_list "; 2097 2098 const SmallVectorImpl<unsigned> &RegList = getRegList(); 2099 for (SmallVectorImpl<unsigned>::const_iterator 2100 I = RegList.begin(), E = RegList.end(); I != E; ) { 2101 OS << *I; 2102 if (++I < E) OS << ", "; 2103 } 2104 2105 OS << ">"; 2106 break; 2107 } 2108 case k_VectorList: 2109 OS << "<vector_list " << VectorList.Count << " * " 2110 << VectorList.RegNum << ">"; 2111 break; 2112 case k_VectorListAllLanes: 2113 OS << "<vector_list(all lanes) " << VectorList.Count << " * " 2114 << VectorList.RegNum << ">"; 2115 break; 2116 case k_VectorListIndexed: 2117 OS << "<vector_list(lane " << VectorList.LaneIndex << ") " 2118 << VectorList.Count << " * " << VectorList.RegNum << ">"; 2119 break; 2120 case k_Token: 2121 OS << "'" << getToken() << "'"; 2122 break; 2123 case k_VectorIndex: 2124 OS << "<vectorindex " << getVectorIndex() << ">"; 2125 break; 2126 } 2127 } 2128 2129 /// @name Auto-generated Match Functions 2130 /// { 2131 2132 static unsigned MatchRegisterName(StringRef Name); 2133 2134 /// } 2135 2136 bool ARMAsmParser::ParseRegister(unsigned &RegNo, 2137 SMLoc &StartLoc, SMLoc &EndLoc) { 2138 RegNo = tryParseRegister(); 2139 2140 return (RegNo == (unsigned)-1); 2141 } 2142 2143 /// Try to parse a register name. The token must be an Identifier when called, 2144 /// and if it is a register name the token is eaten and the register number is 2145 /// returned. Otherwise return -1. 2146 /// 2147 int ARMAsmParser::tryParseRegister() { 2148 const AsmToken &Tok = Parser.getTok(); 2149 if (Tok.isNot(AsmToken::Identifier)) return -1; 2150 2151 // FIXME: Validate register for the current architecture; we have to do 2152 // validation later, so maybe there is no need for this here. 2153 std::string lowerCase = Tok.getString().lower(); 2154 unsigned RegNum = MatchRegisterName(lowerCase); 2155 if (!RegNum) { 2156 RegNum = StringSwitch<unsigned>(lowerCase) 2157 .Case("r13", ARM::SP) 2158 .Case("r14", ARM::LR) 2159 .Case("r15", ARM::PC) 2160 .Case("ip", ARM::R12) 2161 .Default(0); 2162 } 2163 if (!RegNum) return -1; 2164 2165 Parser.Lex(); // Eat identifier token. 2166 2167 return RegNum; 2168 } 2169 2170 // Try to parse a shifter (e.g., "lsl <amt>"). On success, return 0. 2171 // If a recoverable error occurs, return 1. If an irrecoverable error 2172 // occurs, return -1. An irrecoverable error is one where tokens have been 2173 // consumed in the process of trying to parse the shifter (i.e., when it is 2174 // indeed a shifter operand, but malformed). 2175 int ARMAsmParser::tryParseShiftRegister( 2176 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2177 SMLoc S = Parser.getTok().getLoc(); 2178 const AsmToken &Tok = Parser.getTok(); 2179 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 2180 2181 std::string lowerCase = Tok.getString().lower(); 2182 ARM_AM::ShiftOpc ShiftTy = StringSwitch<ARM_AM::ShiftOpc>(lowerCase) 2183 .Case("asl", ARM_AM::lsl) 2184 .Case("lsl", ARM_AM::lsl) 2185 .Case("lsr", ARM_AM::lsr) 2186 .Case("asr", ARM_AM::asr) 2187 .Case("ror", ARM_AM::ror) 2188 .Case("rrx", ARM_AM::rrx) 2189 .Default(ARM_AM::no_shift); 2190 2191 if (ShiftTy == ARM_AM::no_shift) 2192 return 1; 2193 2194 Parser.Lex(); // Eat the operator. 2195 2196 // The source register for the shift has already been added to the 2197 // operand list, so we need to pop it off and combine it into the shifted 2198 // register operand instead. 2199 OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val()); 2200 if (!PrevOp->isReg()) 2201 return Error(PrevOp->getStartLoc(), "shift must be of a register"); 2202 int SrcReg = PrevOp->getReg(); 2203 int64_t Imm = 0; 2204 int ShiftReg = 0; 2205 if (ShiftTy == ARM_AM::rrx) { 2206 // RRX Doesn't have an explicit shift amount. The encoder expects 2207 // the shift register to be the same as the source register. Seems odd, 2208 // but OK. 2209 ShiftReg = SrcReg; 2210 } else { 2211 // Figure out if this is shifted by a constant or a register (for non-RRX). 2212 if (Parser.getTok().is(AsmToken::Hash)) { 2213 Parser.Lex(); // Eat hash. 2214 SMLoc ImmLoc = Parser.getTok().getLoc(); 2215 const MCExpr *ShiftExpr = 0; 2216 if (getParser().ParseExpression(ShiftExpr)) { 2217 Error(ImmLoc, "invalid immediate shift value"); 2218 return -1; 2219 } 2220 // The expression must be evaluatable as an immediate. 2221 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr); 2222 if (!CE) { 2223 Error(ImmLoc, "invalid immediate shift value"); 2224 return -1; 2225 } 2226 // Range check the immediate. 2227 // lsl, ror: 0 <= imm <= 31 2228 // lsr, asr: 0 <= imm <= 32 2229 Imm = CE->getValue(); 2230 if (Imm < 0 || 2231 ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) || 2232 ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) { 2233 Error(ImmLoc, "immediate shift value out of range"); 2234 return -1; 2235 } 2236 } else if (Parser.getTok().is(AsmToken::Identifier)) { 2237 ShiftReg = tryParseRegister(); 2238 SMLoc L = Parser.getTok().getLoc(); 2239 if (ShiftReg == -1) { 2240 Error (L, "expected immediate or register in shift operand"); 2241 return -1; 2242 } 2243 } else { 2244 Error (Parser.getTok().getLoc(), 2245 "expected immediate or register in shift operand"); 2246 return -1; 2247 } 2248 } 2249 2250 if (ShiftReg && ShiftTy != ARM_AM::rrx) 2251 Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg, 2252 ShiftReg, Imm, 2253 S, Parser.getTok().getLoc())); 2254 else 2255 Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm, 2256 S, Parser.getTok().getLoc())); 2257 2258 return 0; 2259 } 2260 2261 2262 /// Try to parse a register name. The token must be an Identifier when called. 2263 /// If it's a register, an AsmOperand is created. Another AsmOperand is created 2264 /// if there is a "writeback". 'true' if it's not a register. 2265 /// 2266 /// TODO this is likely to change to allow different register types and or to 2267 /// parse for a specific register type. 2268 bool ARMAsmParser:: 2269 tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2270 SMLoc S = Parser.getTok().getLoc(); 2271 int RegNo = tryParseRegister(); 2272 if (RegNo == -1) 2273 return true; 2274 2275 Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc())); 2276 2277 const AsmToken &ExclaimTok = Parser.getTok(); 2278 if (ExclaimTok.is(AsmToken::Exclaim)) { 2279 Operands.push_back(ARMOperand::CreateToken(ExclaimTok.getString(), 2280 ExclaimTok.getLoc())); 2281 Parser.Lex(); // Eat exclaim token 2282 return false; 2283 } 2284 2285 // Also check for an index operand. This is only legal for vector registers, 2286 // but that'll get caught OK in operand matching, so we don't need to 2287 // explicitly filter everything else out here. 2288 if (Parser.getTok().is(AsmToken::LBrac)) { 2289 SMLoc SIdx = Parser.getTok().getLoc(); 2290 Parser.Lex(); // Eat left bracket token. 2291 2292 const MCExpr *ImmVal; 2293 if (getParser().ParseExpression(ImmVal)) 2294 return MatchOperand_ParseFail; 2295 const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(ImmVal); 2296 if (!MCE) { 2297 TokError("immediate value expected for vector index"); 2298 return MatchOperand_ParseFail; 2299 } 2300 2301 SMLoc E = Parser.getTok().getLoc(); 2302 if (Parser.getTok().isNot(AsmToken::RBrac)) { 2303 Error(E, "']' expected"); 2304 return MatchOperand_ParseFail; 2305 } 2306 2307 Parser.Lex(); // Eat right bracket token. 2308 2309 Operands.push_back(ARMOperand::CreateVectorIndex(MCE->getValue(), 2310 SIdx, E, 2311 getContext())); 2312 } 2313 2314 return false; 2315 } 2316 2317 /// MatchCoprocessorOperandName - Try to parse an coprocessor related 2318 /// instruction with a symbolic operand name. Example: "p1", "p7", "c3", 2319 /// "c5", ... 2320 static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) { 2321 // Use the same layout as the tablegen'erated register name matcher. Ugly, 2322 // but efficient. 2323 switch (Name.size()) { 2324 default: break; 2325 case 2: 2326 if (Name[0] != CoprocOp) 2327 return -1; 2328 switch (Name[1]) { 2329 default: return -1; 2330 case '0': return 0; 2331 case '1': return 1; 2332 case '2': return 2; 2333 case '3': return 3; 2334 case '4': return 4; 2335 case '5': return 5; 2336 case '6': return 6; 2337 case '7': return 7; 2338 case '8': return 8; 2339 case '9': return 9; 2340 } 2341 break; 2342 case 3: 2343 if (Name[0] != CoprocOp || Name[1] != '1') 2344 return -1; 2345 switch (Name[2]) { 2346 default: return -1; 2347 case '0': return 10; 2348 case '1': return 11; 2349 case '2': return 12; 2350 case '3': return 13; 2351 case '4': return 14; 2352 case '5': return 15; 2353 } 2354 break; 2355 } 2356 2357 return -1; 2358 } 2359 2360 /// parseITCondCode - Try to parse a condition code for an IT instruction. 2361 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2362 parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2363 SMLoc S = Parser.getTok().getLoc(); 2364 const AsmToken &Tok = Parser.getTok(); 2365 if (!Tok.is(AsmToken::Identifier)) 2366 return MatchOperand_NoMatch; 2367 unsigned CC = StringSwitch<unsigned>(Tok.getString()) 2368 .Case("eq", ARMCC::EQ) 2369 .Case("ne", ARMCC::NE) 2370 .Case("hs", ARMCC::HS) 2371 .Case("cs", ARMCC::HS) 2372 .Case("lo", ARMCC::LO) 2373 .Case("cc", ARMCC::LO) 2374 .Case("mi", ARMCC::MI) 2375 .Case("pl", ARMCC::PL) 2376 .Case("vs", ARMCC::VS) 2377 .Case("vc", ARMCC::VC) 2378 .Case("hi", ARMCC::HI) 2379 .Case("ls", ARMCC::LS) 2380 .Case("ge", ARMCC::GE) 2381 .Case("lt", ARMCC::LT) 2382 .Case("gt", ARMCC::GT) 2383 .Case("le", ARMCC::LE) 2384 .Case("al", ARMCC::AL) 2385 .Default(~0U); 2386 if (CC == ~0U) 2387 return MatchOperand_NoMatch; 2388 Parser.Lex(); // Eat the token. 2389 2390 Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC), S)); 2391 2392 return MatchOperand_Success; 2393 } 2394 2395 /// parseCoprocNumOperand - Try to parse an coprocessor number operand. The 2396 /// token must be an Identifier when called, and if it is a coprocessor 2397 /// number, the token is eaten and the operand is added to the operand list. 2398 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2399 parseCoprocNumOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2400 SMLoc S = Parser.getTok().getLoc(); 2401 const AsmToken &Tok = Parser.getTok(); 2402 if (Tok.isNot(AsmToken::Identifier)) 2403 return MatchOperand_NoMatch; 2404 2405 int Num = MatchCoprocessorOperandName(Tok.getString(), 'p'); 2406 if (Num == -1) 2407 return MatchOperand_NoMatch; 2408 2409 Parser.Lex(); // Eat identifier token. 2410 Operands.push_back(ARMOperand::CreateCoprocNum(Num, S)); 2411 return MatchOperand_Success; 2412 } 2413 2414 /// parseCoprocRegOperand - Try to parse an coprocessor register operand. The 2415 /// token must be an Identifier when called, and if it is a coprocessor 2416 /// number, the token is eaten and the operand is added to the operand list. 2417 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2418 parseCoprocRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2419 SMLoc S = Parser.getTok().getLoc(); 2420 const AsmToken &Tok = Parser.getTok(); 2421 if (Tok.isNot(AsmToken::Identifier)) 2422 return MatchOperand_NoMatch; 2423 2424 int Reg = MatchCoprocessorOperandName(Tok.getString(), 'c'); 2425 if (Reg == -1) 2426 return MatchOperand_NoMatch; 2427 2428 Parser.Lex(); // Eat identifier token. 2429 Operands.push_back(ARMOperand::CreateCoprocReg(Reg, S)); 2430 return MatchOperand_Success; 2431 } 2432 2433 /// parseCoprocOptionOperand - Try to parse an coprocessor option operand. 2434 /// coproc_option : '{' imm0_255 '}' 2435 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2436 parseCoprocOptionOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2437 SMLoc S = Parser.getTok().getLoc(); 2438 2439 // If this isn't a '{', this isn't a coprocessor immediate operand. 2440 if (Parser.getTok().isNot(AsmToken::LCurly)) 2441 return MatchOperand_NoMatch; 2442 Parser.Lex(); // Eat the '{' 2443 2444 const MCExpr *Expr; 2445 SMLoc Loc = Parser.getTok().getLoc(); 2446 if (getParser().ParseExpression(Expr)) { 2447 Error(Loc, "illegal expression"); 2448 return MatchOperand_ParseFail; 2449 } 2450 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr); 2451 if (!CE || CE->getValue() < 0 || CE->getValue() > 255) { 2452 Error(Loc, "coprocessor option must be an immediate in range [0, 255]"); 2453 return MatchOperand_ParseFail; 2454 } 2455 int Val = CE->getValue(); 2456 2457 // Check for and consume the closing '}' 2458 if (Parser.getTok().isNot(AsmToken::RCurly)) 2459 return MatchOperand_ParseFail; 2460 SMLoc E = Parser.getTok().getLoc(); 2461 Parser.Lex(); // Eat the '}' 2462 2463 Operands.push_back(ARMOperand::CreateCoprocOption(Val, S, E)); 2464 return MatchOperand_Success; 2465 } 2466 2467 // For register list parsing, we need to map from raw GPR register numbering 2468 // to the enumeration values. The enumeration values aren't sorted by 2469 // register number due to our using "sp", "lr" and "pc" as canonical names. 2470 static unsigned getNextRegister(unsigned Reg) { 2471 // If this is a GPR, we need to do it manually, otherwise we can rely 2472 // on the sort ordering of the enumeration since the other reg-classes 2473 // are sane. 2474 if (!ARMMCRegisterClasses[ARM::GPRRegClassID].contains(Reg)) 2475 return Reg + 1; 2476 switch(Reg) { 2477 default: assert(0 && "Invalid GPR number!"); 2478 case ARM::R0: return ARM::R1; case ARM::R1: return ARM::R2; 2479 case ARM::R2: return ARM::R3; case ARM::R3: return ARM::R4; 2480 case ARM::R4: return ARM::R5; case ARM::R5: return ARM::R6; 2481 case ARM::R6: return ARM::R7; case ARM::R7: return ARM::R8; 2482 case ARM::R8: return ARM::R9; case ARM::R9: return ARM::R10; 2483 case ARM::R10: return ARM::R11; case ARM::R11: return ARM::R12; 2484 case ARM::R12: return ARM::SP; case ARM::SP: return ARM::LR; 2485 case ARM::LR: return ARM::PC; case ARM::PC: return ARM::R0; 2486 } 2487 } 2488 2489 // Return the low-subreg of a given Q register. 2490 static unsigned getDRegFromQReg(unsigned QReg) { 2491 switch (QReg) { 2492 default: llvm_unreachable("expected a Q register!"); 2493 case ARM::Q0: return ARM::D0; 2494 case ARM::Q1: return ARM::D2; 2495 case ARM::Q2: return ARM::D4; 2496 case ARM::Q3: return ARM::D6; 2497 case ARM::Q4: return ARM::D8; 2498 case ARM::Q5: return ARM::D10; 2499 case ARM::Q6: return ARM::D12; 2500 case ARM::Q7: return ARM::D14; 2501 case ARM::Q8: return ARM::D16; 2502 case ARM::Q9: return ARM::D18; 2503 case ARM::Q10: return ARM::D20; 2504 case ARM::Q11: return ARM::D22; 2505 case ARM::Q12: return ARM::D24; 2506 case ARM::Q13: return ARM::D26; 2507 case ARM::Q14: return ARM::D28; 2508 case ARM::Q15: return ARM::D30; 2509 } 2510 } 2511 2512 /// Parse a register list. 2513 bool ARMAsmParser:: 2514 parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2515 assert(Parser.getTok().is(AsmToken::LCurly) && 2516 "Token is not a Left Curly Brace"); 2517 SMLoc S = Parser.getTok().getLoc(); 2518 Parser.Lex(); // Eat '{' token. 2519 SMLoc RegLoc = Parser.getTok().getLoc(); 2520 2521 // Check the first register in the list to see what register class 2522 // this is a list of. 2523 int Reg = tryParseRegister(); 2524 if (Reg == -1) 2525 return Error(RegLoc, "register expected"); 2526 2527 // The reglist instructions have at most 16 registers, so reserve 2528 // space for that many. 2529 SmallVector<std::pair<unsigned, SMLoc>, 16> Registers; 2530 2531 // Allow Q regs and just interpret them as the two D sub-registers. 2532 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) { 2533 Reg = getDRegFromQReg(Reg); 2534 Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc)); 2535 ++Reg; 2536 } 2537 const MCRegisterClass *RC; 2538 if (ARMMCRegisterClasses[ARM::GPRRegClassID].contains(Reg)) 2539 RC = &ARMMCRegisterClasses[ARM::GPRRegClassID]; 2540 else if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg)) 2541 RC = &ARMMCRegisterClasses[ARM::DPRRegClassID]; 2542 else if (ARMMCRegisterClasses[ARM::SPRRegClassID].contains(Reg)) 2543 RC = &ARMMCRegisterClasses[ARM::SPRRegClassID]; 2544 else 2545 return Error(RegLoc, "invalid register in register list"); 2546 2547 // Store the register. 2548 Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc)); 2549 2550 // This starts immediately after the first register token in the list, 2551 // so we can see either a comma or a minus (range separator) as a legal 2552 // next token. 2553 while (Parser.getTok().is(AsmToken::Comma) || 2554 Parser.getTok().is(AsmToken::Minus)) { 2555 if (Parser.getTok().is(AsmToken::Minus)) { 2556 Parser.Lex(); // Eat the minus. 2557 SMLoc EndLoc = Parser.getTok().getLoc(); 2558 int EndReg = tryParseRegister(); 2559 if (EndReg == -1) 2560 return Error(EndLoc, "register expected"); 2561 // Allow Q regs and just interpret them as the two D sub-registers. 2562 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(EndReg)) 2563 EndReg = getDRegFromQReg(EndReg) + 1; 2564 // If the register is the same as the start reg, there's nothing 2565 // more to do. 2566 if (Reg == EndReg) 2567 continue; 2568 // The register must be in the same register class as the first. 2569 if (!RC->contains(EndReg)) 2570 return Error(EndLoc, "invalid register in register list"); 2571 // Ranges must go from low to high. 2572 if (getARMRegisterNumbering(Reg) > getARMRegisterNumbering(EndReg)) 2573 return Error(EndLoc, "bad range in register list"); 2574 2575 // Add all the registers in the range to the register list. 2576 while (Reg != EndReg) { 2577 Reg = getNextRegister(Reg); 2578 Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc)); 2579 } 2580 continue; 2581 } 2582 Parser.Lex(); // Eat the comma. 2583 RegLoc = Parser.getTok().getLoc(); 2584 int OldReg = Reg; 2585 Reg = tryParseRegister(); 2586 if (Reg == -1) 2587 return Error(RegLoc, "register expected"); 2588 // Allow Q regs and just interpret them as the two D sub-registers. 2589 bool isQReg = false; 2590 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) { 2591 Reg = getDRegFromQReg(Reg); 2592 isQReg = true; 2593 } 2594 // The register must be in the same register class as the first. 2595 if (!RC->contains(Reg)) 2596 return Error(RegLoc, "invalid register in register list"); 2597 // List must be monotonically increasing. 2598 if (getARMRegisterNumbering(Reg) <= getARMRegisterNumbering(OldReg)) 2599 return Error(RegLoc, "register list not in ascending order"); 2600 // VFP register lists must also be contiguous. 2601 // It's OK to use the enumeration values directly here rather, as the 2602 // VFP register classes have the enum sorted properly. 2603 if (RC != &ARMMCRegisterClasses[ARM::GPRRegClassID] && 2604 Reg != OldReg + 1) 2605 return Error(RegLoc, "non-contiguous register range"); 2606 Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc)); 2607 if (isQReg) 2608 Registers.push_back(std::pair<unsigned, SMLoc>(++Reg, RegLoc)); 2609 } 2610 2611 SMLoc E = Parser.getTok().getLoc(); 2612 if (Parser.getTok().isNot(AsmToken::RCurly)) 2613 return Error(E, "'}' expected"); 2614 Parser.Lex(); // Eat '}' token. 2615 2616 Operands.push_back(ARMOperand::CreateRegList(Registers, S, E)); 2617 return false; 2618 } 2619 2620 // Helper function to parse the lane index for vector lists. 2621 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2622 parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index) { 2623 Index = 0; // Always return a defined index value. 2624 if (Parser.getTok().is(AsmToken::LBrac)) { 2625 Parser.Lex(); // Eat the '['. 2626 if (Parser.getTok().is(AsmToken::RBrac)) { 2627 // "Dn[]" is the 'all lanes' syntax. 2628 LaneKind = AllLanes; 2629 Parser.Lex(); // Eat the ']'. 2630 return MatchOperand_Success; 2631 } 2632 if (Parser.getTok().is(AsmToken::Integer)) { 2633 int64_t Val = Parser.getTok().getIntVal(); 2634 // Make this range check context sensitive for .8, .16, .32. 2635 if (Val < 0 && Val > 7) 2636 Error(Parser.getTok().getLoc(), "lane index out of range"); 2637 Index = Val; 2638 LaneKind = IndexedLane; 2639 Parser.Lex(); // Eat the token; 2640 if (Parser.getTok().isNot(AsmToken::RBrac)) 2641 Error(Parser.getTok().getLoc(), "']' expected"); 2642 Parser.Lex(); // Eat the ']'. 2643 return MatchOperand_Success; 2644 } 2645 Error(Parser.getTok().getLoc(), "lane index must be empty or an integer"); 2646 return MatchOperand_ParseFail; 2647 } 2648 LaneKind = NoLanes; 2649 return MatchOperand_Success; 2650 } 2651 2652 // parse a vector register list 2653 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2654 parseVectorList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2655 VectorLaneTy LaneKind; 2656 unsigned LaneIndex; 2657 SMLoc S = Parser.getTok().getLoc(); 2658 // As an extension (to match gas), support a plain D register or Q register 2659 // (without encosing curly braces) as a single or double entry list, 2660 // respectively. 2661 if (Parser.getTok().is(AsmToken::Identifier)) { 2662 int Reg = tryParseRegister(); 2663 if (Reg == -1) 2664 return MatchOperand_NoMatch; 2665 SMLoc E = Parser.getTok().getLoc(); 2666 if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg)) { 2667 OperandMatchResultTy Res = parseVectorLane(LaneKind, LaneIndex); 2668 if (Res != MatchOperand_Success) 2669 return Res; 2670 switch (LaneKind) { 2671 default: 2672 assert(0 && "unexpected lane kind!"); 2673 case NoLanes: 2674 E = Parser.getTok().getLoc(); 2675 Operands.push_back(ARMOperand::CreateVectorList(Reg, 1, S, E)); 2676 break; 2677 case AllLanes: 2678 E = Parser.getTok().getLoc(); 2679 Operands.push_back(ARMOperand::CreateVectorListAllLanes(Reg, 1, S, E)); 2680 break; 2681 case IndexedLane: 2682 Operands.push_back(ARMOperand::CreateVectorListIndexed(Reg, 1, 2683 LaneIndex, S,E)); 2684 break; 2685 } 2686 return MatchOperand_Success; 2687 } 2688 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) { 2689 Reg = getDRegFromQReg(Reg); 2690 OperandMatchResultTy Res = parseVectorLane(LaneKind, LaneIndex); 2691 if (Res != MatchOperand_Success) 2692 return Res; 2693 switch (LaneKind) { 2694 default: 2695 assert(0 && "unexpected lane kind!"); 2696 case NoLanes: 2697 E = Parser.getTok().getLoc(); 2698 Operands.push_back(ARMOperand::CreateVectorList(Reg, 2, S, E)); 2699 break; 2700 case AllLanes: 2701 E = Parser.getTok().getLoc(); 2702 Operands.push_back(ARMOperand::CreateVectorListAllLanes(Reg, 2, S, E)); 2703 break; 2704 case IndexedLane: 2705 Operands.push_back(ARMOperand::CreateVectorListIndexed(Reg, 2, 2706 LaneIndex, S,E)); 2707 break; 2708 } 2709 return MatchOperand_Success; 2710 } 2711 Error(S, "vector register expected"); 2712 return MatchOperand_ParseFail; 2713 } 2714 2715 if (Parser.getTok().isNot(AsmToken::LCurly)) 2716 return MatchOperand_NoMatch; 2717 2718 Parser.Lex(); // Eat '{' token. 2719 SMLoc RegLoc = Parser.getTok().getLoc(); 2720 2721 int Reg = tryParseRegister(); 2722 if (Reg == -1) { 2723 Error(RegLoc, "register expected"); 2724 return MatchOperand_ParseFail; 2725 } 2726 unsigned Count = 1; 2727 unsigned FirstReg = Reg; 2728 // The list is of D registers, but we also allow Q regs and just interpret 2729 // them as the two D sub-registers. 2730 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) { 2731 FirstReg = Reg = getDRegFromQReg(Reg); 2732 ++Reg; 2733 ++Count; 2734 } 2735 if (parseVectorLane(LaneKind, LaneIndex) != MatchOperand_Success) 2736 return MatchOperand_ParseFail; 2737 2738 while (Parser.getTok().is(AsmToken::Comma) || 2739 Parser.getTok().is(AsmToken::Minus)) { 2740 if (Parser.getTok().is(AsmToken::Minus)) { 2741 Parser.Lex(); // Eat the minus. 2742 SMLoc EndLoc = Parser.getTok().getLoc(); 2743 int EndReg = tryParseRegister(); 2744 if (EndReg == -1) { 2745 Error(EndLoc, "register expected"); 2746 return MatchOperand_ParseFail; 2747 } 2748 // Allow Q regs and just interpret them as the two D sub-registers. 2749 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(EndReg)) 2750 EndReg = getDRegFromQReg(EndReg) + 1; 2751 // If the register is the same as the start reg, there's nothing 2752 // more to do. 2753 if (Reg == EndReg) 2754 continue; 2755 // The register must be in the same register class as the first. 2756 if (!ARMMCRegisterClasses[ARM::DPRRegClassID].contains(EndReg)) { 2757 Error(EndLoc, "invalid register in register list"); 2758 return MatchOperand_ParseFail; 2759 } 2760 // Ranges must go from low to high. 2761 if (Reg > EndReg) { 2762 Error(EndLoc, "bad range in register list"); 2763 return MatchOperand_ParseFail; 2764 } 2765 // Parse the lane specifier if present. 2766 VectorLaneTy NextLaneKind; 2767 unsigned NextLaneIndex; 2768 if (parseVectorLane(NextLaneKind, NextLaneIndex) != MatchOperand_Success) 2769 return MatchOperand_ParseFail; 2770 if (NextLaneKind != LaneKind || LaneIndex != NextLaneIndex) { 2771 Error(EndLoc, "mismatched lane index in register list"); 2772 return MatchOperand_ParseFail; 2773 } 2774 EndLoc = Parser.getTok().getLoc(); 2775 2776 // Add all the registers in the range to the register list. 2777 Count += EndReg - Reg; 2778 Reg = EndReg; 2779 continue; 2780 } 2781 Parser.Lex(); // Eat the comma. 2782 RegLoc = Parser.getTok().getLoc(); 2783 int OldReg = Reg; 2784 Reg = tryParseRegister(); 2785 if (Reg == -1) { 2786 Error(RegLoc, "register expected"); 2787 return MatchOperand_ParseFail; 2788 } 2789 // vector register lists must be contiguous. 2790 // It's OK to use the enumeration values directly here rather, as the 2791 // VFP register classes have the enum sorted properly. 2792 // 2793 // The list is of D registers, but we also allow Q regs and just interpret 2794 // them as the two D sub-registers. 2795 if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) { 2796 Reg = getDRegFromQReg(Reg); 2797 if (Reg != OldReg + 1) { 2798 Error(RegLoc, "non-contiguous register range"); 2799 return MatchOperand_ParseFail; 2800 } 2801 ++Reg; 2802 Count += 2; 2803 // Parse the lane specifier if present. 2804 VectorLaneTy NextLaneKind; 2805 unsigned NextLaneIndex; 2806 SMLoc EndLoc = Parser.getTok().getLoc(); 2807 if (parseVectorLane(NextLaneKind, NextLaneIndex) != MatchOperand_Success) 2808 return MatchOperand_ParseFail; 2809 if (NextLaneKind != LaneKind || LaneIndex != NextLaneIndex) { 2810 Error(EndLoc, "mismatched lane index in register list"); 2811 return MatchOperand_ParseFail; 2812 } 2813 continue; 2814 } 2815 // Normal D register. Just check that it's contiguous and keep going. 2816 if (Reg != OldReg + 1) { 2817 Error(RegLoc, "non-contiguous register range"); 2818 return MatchOperand_ParseFail; 2819 } 2820 ++Count; 2821 // Parse the lane specifier if present. 2822 VectorLaneTy NextLaneKind; 2823 unsigned NextLaneIndex; 2824 SMLoc EndLoc = Parser.getTok().getLoc(); 2825 if (parseVectorLane(NextLaneKind, NextLaneIndex) != MatchOperand_Success) 2826 return MatchOperand_ParseFail; 2827 if (NextLaneKind != LaneKind || LaneIndex != NextLaneIndex) { 2828 Error(EndLoc, "mismatched lane index in register list"); 2829 return MatchOperand_ParseFail; 2830 } 2831 } 2832 2833 SMLoc E = Parser.getTok().getLoc(); 2834 if (Parser.getTok().isNot(AsmToken::RCurly)) { 2835 Error(E, "'}' expected"); 2836 return MatchOperand_ParseFail; 2837 } 2838 Parser.Lex(); // Eat '}' token. 2839 2840 switch (LaneKind) { 2841 default: 2842 assert(0 && "unexpected lane kind in register list."); 2843 case NoLanes: 2844 Operands.push_back(ARMOperand::CreateVectorList(FirstReg, Count, S, E)); 2845 break; 2846 case AllLanes: 2847 Operands.push_back(ARMOperand::CreateVectorListAllLanes(FirstReg, Count, 2848 S, E)); 2849 break; 2850 case IndexedLane: 2851 Operands.push_back(ARMOperand::CreateVectorListIndexed(FirstReg, Count, 2852 LaneIndex, S, E)); 2853 break; 2854 } 2855 return MatchOperand_Success; 2856 } 2857 2858 /// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options. 2859 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2860 parseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2861 SMLoc S = Parser.getTok().getLoc(); 2862 const AsmToken &Tok = Parser.getTok(); 2863 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 2864 StringRef OptStr = Tok.getString(); 2865 2866 unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size())) 2867 .Case("sy", ARM_MB::SY) 2868 .Case("st", ARM_MB::ST) 2869 .Case("sh", ARM_MB::ISH) 2870 .Case("ish", ARM_MB::ISH) 2871 .Case("shst", ARM_MB::ISHST) 2872 .Case("ishst", ARM_MB::ISHST) 2873 .Case("nsh", ARM_MB::NSH) 2874 .Case("un", ARM_MB::NSH) 2875 .Case("nshst", ARM_MB::NSHST) 2876 .Case("unst", ARM_MB::NSHST) 2877 .Case("osh", ARM_MB::OSH) 2878 .Case("oshst", ARM_MB::OSHST) 2879 .Default(~0U); 2880 2881 if (Opt == ~0U) 2882 return MatchOperand_NoMatch; 2883 2884 Parser.Lex(); // Eat identifier token. 2885 Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S)); 2886 return MatchOperand_Success; 2887 } 2888 2889 /// parseProcIFlagsOperand - Try to parse iflags from CPS instruction. 2890 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2891 parseProcIFlagsOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2892 SMLoc S = Parser.getTok().getLoc(); 2893 const AsmToken &Tok = Parser.getTok(); 2894 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 2895 StringRef IFlagsStr = Tok.getString(); 2896 2897 // An iflags string of "none" is interpreted to mean that none of the AIF 2898 // bits are set. Not a terribly useful instruction, but a valid encoding. 2899 unsigned IFlags = 0; 2900 if (IFlagsStr != "none") { 2901 for (int i = 0, e = IFlagsStr.size(); i != e; ++i) { 2902 unsigned Flag = StringSwitch<unsigned>(IFlagsStr.substr(i, 1)) 2903 .Case("a", ARM_PROC::A) 2904 .Case("i", ARM_PROC::I) 2905 .Case("f", ARM_PROC::F) 2906 .Default(~0U); 2907 2908 // If some specific iflag is already set, it means that some letter is 2909 // present more than once, this is not acceptable. 2910 if (Flag == ~0U || (IFlags & Flag)) 2911 return MatchOperand_NoMatch; 2912 2913 IFlags |= Flag; 2914 } 2915 } 2916 2917 Parser.Lex(); // Eat identifier token. 2918 Operands.push_back(ARMOperand::CreateProcIFlags((ARM_PROC::IFlags)IFlags, S)); 2919 return MatchOperand_Success; 2920 } 2921 2922 /// parseMSRMaskOperand - Try to parse mask flags from MSR instruction. 2923 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2924 parseMSRMaskOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2925 SMLoc S = Parser.getTok().getLoc(); 2926 const AsmToken &Tok = Parser.getTok(); 2927 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 2928 StringRef Mask = Tok.getString(); 2929 2930 if (isMClass()) { 2931 // See ARMv6-M 10.1.1 2932 unsigned FlagsVal = StringSwitch<unsigned>(Mask) 2933 .Case("apsr", 0) 2934 .Case("iapsr", 1) 2935 .Case("eapsr", 2) 2936 .Case("xpsr", 3) 2937 .Case("ipsr", 5) 2938 .Case("epsr", 6) 2939 .Case("iepsr", 7) 2940 .Case("msp", 8) 2941 .Case("psp", 9) 2942 .Case("primask", 16) 2943 .Case("basepri", 17) 2944 .Case("basepri_max", 18) 2945 .Case("faultmask", 19) 2946 .Case("control", 20) 2947 .Default(~0U); 2948 2949 if (FlagsVal == ~0U) 2950 return MatchOperand_NoMatch; 2951 2952 if (!hasV7Ops() && FlagsVal >= 17 && FlagsVal <= 19) 2953 // basepri, basepri_max and faultmask only valid for V7m. 2954 return MatchOperand_NoMatch; 2955 2956 Parser.Lex(); // Eat identifier token. 2957 Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S)); 2958 return MatchOperand_Success; 2959 } 2960 2961 // Split spec_reg from flag, example: CPSR_sxf => "CPSR" and "sxf" 2962 size_t Start = 0, Next = Mask.find('_'); 2963 StringRef Flags = ""; 2964 std::string SpecReg = Mask.slice(Start, Next).lower(); 2965 if (Next != StringRef::npos) 2966 Flags = Mask.slice(Next+1, Mask.size()); 2967 2968 // FlagsVal contains the complete mask: 2969 // 3-0: Mask 2970 // 4: Special Reg (cpsr, apsr => 0; spsr => 1) 2971 unsigned FlagsVal = 0; 2972 2973 if (SpecReg == "apsr") { 2974 FlagsVal = StringSwitch<unsigned>(Flags) 2975 .Case("nzcvq", 0x8) // same as CPSR_f 2976 .Case("g", 0x4) // same as CPSR_s 2977 .Case("nzcvqg", 0xc) // same as CPSR_fs 2978 .Default(~0U); 2979 2980 if (FlagsVal == ~0U) { 2981 if (!Flags.empty()) 2982 return MatchOperand_NoMatch; 2983 else 2984 FlagsVal = 8; // No flag 2985 } 2986 } else if (SpecReg == "cpsr" || SpecReg == "spsr") { 2987 if (Flags == "all") // cpsr_all is an alias for cpsr_fc 2988 Flags = "fc"; 2989 for (int i = 0, e = Flags.size(); i != e; ++i) { 2990 unsigned Flag = StringSwitch<unsigned>(Flags.substr(i, 1)) 2991 .Case("c", 1) 2992 .Case("x", 2) 2993 .Case("s", 4) 2994 .Case("f", 8) 2995 .Default(~0U); 2996 2997 // If some specific flag is already set, it means that some letter is 2998 // present more than once, this is not acceptable. 2999 if (FlagsVal == ~0U || (FlagsVal & Flag)) 3000 return MatchOperand_NoMatch; 3001 FlagsVal |= Flag; 3002 } 3003 } else // No match for special register. 3004 return MatchOperand_NoMatch; 3005 3006 // Special register without flags is NOT equivalent to "fc" flags. 3007 // NOTE: This is a divergence from gas' behavior. Uncommenting the following 3008 // two lines would enable gas compatibility at the expense of breaking 3009 // round-tripping. 3010 // 3011 // if (!FlagsVal) 3012 // FlagsVal = 0x9; 3013 3014 // Bit 4: Special Reg (cpsr, apsr => 0; spsr => 1) 3015 if (SpecReg == "spsr") 3016 FlagsVal |= 16; 3017 3018 Parser.Lex(); // Eat identifier token. 3019 Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S)); 3020 return MatchOperand_Success; 3021 } 3022 3023 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3024 parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands, StringRef Op, 3025 int Low, int High) { 3026 const AsmToken &Tok = Parser.getTok(); 3027 if (Tok.isNot(AsmToken::Identifier)) { 3028 Error(Parser.getTok().getLoc(), Op + " operand expected."); 3029 return MatchOperand_ParseFail; 3030 } 3031 StringRef ShiftName = Tok.getString(); 3032 std::string LowerOp = Op.lower(); 3033 std::string UpperOp = Op.upper(); 3034 if (ShiftName != LowerOp && ShiftName != UpperOp) { 3035 Error(Parser.getTok().getLoc(), Op + " operand expected."); 3036 return MatchOperand_ParseFail; 3037 } 3038 Parser.Lex(); // Eat shift type token. 3039 3040 // There must be a '#' and a shift amount. 3041 if (Parser.getTok().isNot(AsmToken::Hash)) { 3042 Error(Parser.getTok().getLoc(), "'#' expected"); 3043 return MatchOperand_ParseFail; 3044 } 3045 Parser.Lex(); // Eat hash token. 3046 3047 const MCExpr *ShiftAmount; 3048 SMLoc Loc = Parser.getTok().getLoc(); 3049 if (getParser().ParseExpression(ShiftAmount)) { 3050 Error(Loc, "illegal expression"); 3051 return MatchOperand_ParseFail; 3052 } 3053 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 3054 if (!CE) { 3055 Error(Loc, "constant expression expected"); 3056 return MatchOperand_ParseFail; 3057 } 3058 int Val = CE->getValue(); 3059 if (Val < Low || Val > High) { 3060 Error(Loc, "immediate value out of range"); 3061 return MatchOperand_ParseFail; 3062 } 3063 3064 Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc())); 3065 3066 return MatchOperand_Success; 3067 } 3068 3069 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3070 parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3071 const AsmToken &Tok = Parser.getTok(); 3072 SMLoc S = Tok.getLoc(); 3073 if (Tok.isNot(AsmToken::Identifier)) { 3074 Error(Tok.getLoc(), "'be' or 'le' operand expected"); 3075 return MatchOperand_ParseFail; 3076 } 3077 int Val = StringSwitch<int>(Tok.getString()) 3078 .Case("be", 1) 3079 .Case("le", 0) 3080 .Default(-1); 3081 Parser.Lex(); // Eat the token. 3082 3083 if (Val == -1) { 3084 Error(Tok.getLoc(), "'be' or 'le' operand expected"); 3085 return MatchOperand_ParseFail; 3086 } 3087 Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val, 3088 getContext()), 3089 S, Parser.getTok().getLoc())); 3090 return MatchOperand_Success; 3091 } 3092 3093 /// parseShifterImm - Parse the shifter immediate operand for SSAT/USAT 3094 /// instructions. Legal values are: 3095 /// lsl #n 'n' in [0,31] 3096 /// asr #n 'n' in [1,32] 3097 /// n == 32 encoded as n == 0. 3098 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3099 parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3100 const AsmToken &Tok = Parser.getTok(); 3101 SMLoc S = Tok.getLoc(); 3102 if (Tok.isNot(AsmToken::Identifier)) { 3103 Error(S, "shift operator 'asr' or 'lsl' expected"); 3104 return MatchOperand_ParseFail; 3105 } 3106 StringRef ShiftName = Tok.getString(); 3107 bool isASR; 3108 if (ShiftName == "lsl" || ShiftName == "LSL") 3109 isASR = false; 3110 else if (ShiftName == "asr" || ShiftName == "ASR") 3111 isASR = true; 3112 else { 3113 Error(S, "shift operator 'asr' or 'lsl' expected"); 3114 return MatchOperand_ParseFail; 3115 } 3116 Parser.Lex(); // Eat the operator. 3117 3118 // A '#' and a shift amount. 3119 if (Parser.getTok().isNot(AsmToken::Hash)) { 3120 Error(Parser.getTok().getLoc(), "'#' expected"); 3121 return MatchOperand_ParseFail; 3122 } 3123 Parser.Lex(); // Eat hash token. 3124 3125 const MCExpr *ShiftAmount; 3126 SMLoc E = Parser.getTok().getLoc(); 3127 if (getParser().ParseExpression(ShiftAmount)) { 3128 Error(E, "malformed shift expression"); 3129 return MatchOperand_ParseFail; 3130 } 3131 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 3132 if (!CE) { 3133 Error(E, "shift amount must be an immediate"); 3134 return MatchOperand_ParseFail; 3135 } 3136 3137 int64_t Val = CE->getValue(); 3138 if (isASR) { 3139 // Shift amount must be in [1,32] 3140 if (Val < 1 || Val > 32) { 3141 Error(E, "'asr' shift amount must be in range [1,32]"); 3142 return MatchOperand_ParseFail; 3143 } 3144 // asr #32 encoded as asr #0, but is not allowed in Thumb2 mode. 3145 if (isThumb() && Val == 32) { 3146 Error(E, "'asr #32' shift amount not allowed in Thumb mode"); 3147 return MatchOperand_ParseFail; 3148 } 3149 if (Val == 32) Val = 0; 3150 } else { 3151 // Shift amount must be in [1,32] 3152 if (Val < 0 || Val > 31) { 3153 Error(E, "'lsr' shift amount must be in range [0,31]"); 3154 return MatchOperand_ParseFail; 3155 } 3156 } 3157 3158 E = Parser.getTok().getLoc(); 3159 Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E)); 3160 3161 return MatchOperand_Success; 3162 } 3163 3164 /// parseRotImm - Parse the shifter immediate operand for SXTB/UXTB family 3165 /// of instructions. Legal values are: 3166 /// ror #n 'n' in {0, 8, 16, 24} 3167 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3168 parseRotImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3169 const AsmToken &Tok = Parser.getTok(); 3170 SMLoc S = Tok.getLoc(); 3171 if (Tok.isNot(AsmToken::Identifier)) 3172 return MatchOperand_NoMatch; 3173 StringRef ShiftName = Tok.getString(); 3174 if (ShiftName != "ror" && ShiftName != "ROR") 3175 return MatchOperand_NoMatch; 3176 Parser.Lex(); // Eat the operator. 3177 3178 // A '#' and a rotate amount. 3179 if (Parser.getTok().isNot(AsmToken::Hash)) { 3180 Error(Parser.getTok().getLoc(), "'#' expected"); 3181 return MatchOperand_ParseFail; 3182 } 3183 Parser.Lex(); // Eat hash token. 3184 3185 const MCExpr *ShiftAmount; 3186 SMLoc E = Parser.getTok().getLoc(); 3187 if (getParser().ParseExpression(ShiftAmount)) { 3188 Error(E, "malformed rotate expression"); 3189 return MatchOperand_ParseFail; 3190 } 3191 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 3192 if (!CE) { 3193 Error(E, "rotate amount must be an immediate"); 3194 return MatchOperand_ParseFail; 3195 } 3196 3197 int64_t Val = CE->getValue(); 3198 // Shift amount must be in {0, 8, 16, 24} (0 is undocumented extension) 3199 // normally, zero is represented in asm by omitting the rotate operand 3200 // entirely. 3201 if (Val != 8 && Val != 16 && Val != 24 && Val != 0) { 3202 Error(E, "'ror' rotate amount must be 8, 16, or 24"); 3203 return MatchOperand_ParseFail; 3204 } 3205 3206 E = Parser.getTok().getLoc(); 3207 Operands.push_back(ARMOperand::CreateRotImm(Val, S, E)); 3208 3209 return MatchOperand_Success; 3210 } 3211 3212 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3213 parseBitfield(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3214 SMLoc S = Parser.getTok().getLoc(); 3215 // The bitfield descriptor is really two operands, the LSB and the width. 3216 if (Parser.getTok().isNot(AsmToken::Hash)) { 3217 Error(Parser.getTok().getLoc(), "'#' expected"); 3218 return MatchOperand_ParseFail; 3219 } 3220 Parser.Lex(); // Eat hash token. 3221 3222 const MCExpr *LSBExpr; 3223 SMLoc E = Parser.getTok().getLoc(); 3224 if (getParser().ParseExpression(LSBExpr)) { 3225 Error(E, "malformed immediate expression"); 3226 return MatchOperand_ParseFail; 3227 } 3228 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(LSBExpr); 3229 if (!CE) { 3230 Error(E, "'lsb' operand must be an immediate"); 3231 return MatchOperand_ParseFail; 3232 } 3233 3234 int64_t LSB = CE->getValue(); 3235 // The LSB must be in the range [0,31] 3236 if (LSB < 0 || LSB > 31) { 3237 Error(E, "'lsb' operand must be in the range [0,31]"); 3238 return MatchOperand_ParseFail; 3239 } 3240 E = Parser.getTok().getLoc(); 3241 3242 // Expect another immediate operand. 3243 if (Parser.getTok().isNot(AsmToken::Comma)) { 3244 Error(Parser.getTok().getLoc(), "too few operands"); 3245 return MatchOperand_ParseFail; 3246 } 3247 Parser.Lex(); // Eat hash token. 3248 if (Parser.getTok().isNot(AsmToken::Hash)) { 3249 Error(Parser.getTok().getLoc(), "'#' expected"); 3250 return MatchOperand_ParseFail; 3251 } 3252 Parser.Lex(); // Eat hash token. 3253 3254 const MCExpr *WidthExpr; 3255 if (getParser().ParseExpression(WidthExpr)) { 3256 Error(E, "malformed immediate expression"); 3257 return MatchOperand_ParseFail; 3258 } 3259 CE = dyn_cast<MCConstantExpr>(WidthExpr); 3260 if (!CE) { 3261 Error(E, "'width' operand must be an immediate"); 3262 return MatchOperand_ParseFail; 3263 } 3264 3265 int64_t Width = CE->getValue(); 3266 // The LSB must be in the range [1,32-lsb] 3267 if (Width < 1 || Width > 32 - LSB) { 3268 Error(E, "'width' operand must be in the range [1,32-lsb]"); 3269 return MatchOperand_ParseFail; 3270 } 3271 E = Parser.getTok().getLoc(); 3272 3273 Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, E)); 3274 3275 return MatchOperand_Success; 3276 } 3277 3278 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3279 parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3280 // Check for a post-index addressing register operand. Specifically: 3281 // postidx_reg := '+' register {, shift} 3282 // | '-' register {, shift} 3283 // | register {, shift} 3284 3285 // This method must return MatchOperand_NoMatch without consuming any tokens 3286 // in the case where there is no match, as other alternatives take other 3287 // parse methods. 3288 AsmToken Tok = Parser.getTok(); 3289 SMLoc S = Tok.getLoc(); 3290 bool haveEaten = false; 3291 bool isAdd = true; 3292 int Reg = -1; 3293 if (Tok.is(AsmToken::Plus)) { 3294 Parser.Lex(); // Eat the '+' token. 3295 haveEaten = true; 3296 } else if (Tok.is(AsmToken::Minus)) { 3297 Parser.Lex(); // Eat the '-' token. 3298 isAdd = false; 3299 haveEaten = true; 3300 } 3301 if (Parser.getTok().is(AsmToken::Identifier)) 3302 Reg = tryParseRegister(); 3303 if (Reg == -1) { 3304 if (!haveEaten) 3305 return MatchOperand_NoMatch; 3306 Error(Parser.getTok().getLoc(), "register expected"); 3307 return MatchOperand_ParseFail; 3308 } 3309 SMLoc E = Parser.getTok().getLoc(); 3310 3311 ARM_AM::ShiftOpc ShiftTy = ARM_AM::no_shift; 3312 unsigned ShiftImm = 0; 3313 if (Parser.getTok().is(AsmToken::Comma)) { 3314 Parser.Lex(); // Eat the ','. 3315 if (parseMemRegOffsetShift(ShiftTy, ShiftImm)) 3316 return MatchOperand_ParseFail; 3317 } 3318 3319 Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ShiftTy, 3320 ShiftImm, S, E)); 3321 3322 return MatchOperand_Success; 3323 } 3324 3325 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3326 parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3327 // Check for a post-index addressing register operand. Specifically: 3328 // am3offset := '+' register 3329 // | '-' register 3330 // | register 3331 // | # imm 3332 // | # + imm 3333 // | # - imm 3334 3335 // This method must return MatchOperand_NoMatch without consuming any tokens 3336 // in the case where there is no match, as other alternatives take other 3337 // parse methods. 3338 AsmToken Tok = Parser.getTok(); 3339 SMLoc S = Tok.getLoc(); 3340 3341 // Do immediates first, as we always parse those if we have a '#'. 3342 if (Parser.getTok().is(AsmToken::Hash)) { 3343 Parser.Lex(); // Eat the '#'. 3344 // Explicitly look for a '-', as we need to encode negative zero 3345 // differently. 3346 bool isNegative = Parser.getTok().is(AsmToken::Minus); 3347 const MCExpr *Offset; 3348 if (getParser().ParseExpression(Offset)) 3349 return MatchOperand_ParseFail; 3350 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset); 3351 if (!CE) { 3352 Error(S, "constant expression expected"); 3353 return MatchOperand_ParseFail; 3354 } 3355 SMLoc E = Tok.getLoc(); 3356 // Negative zero is encoded as the flag value INT32_MIN. 3357 int32_t Val = CE->getValue(); 3358 if (isNegative && Val == 0) 3359 Val = INT32_MIN; 3360 3361 Operands.push_back( 3362 ARMOperand::CreateImm(MCConstantExpr::Create(Val, getContext()), S, E)); 3363 3364 return MatchOperand_Success; 3365 } 3366 3367 3368 bool haveEaten = false; 3369 bool isAdd = true; 3370 int Reg = -1; 3371 if (Tok.is(AsmToken::Plus)) { 3372 Parser.Lex(); // Eat the '+' token. 3373 haveEaten = true; 3374 } else if (Tok.is(AsmToken::Minus)) { 3375 Parser.Lex(); // Eat the '-' token. 3376 isAdd = false; 3377 haveEaten = true; 3378 } 3379 if (Parser.getTok().is(AsmToken::Identifier)) 3380 Reg = tryParseRegister(); 3381 if (Reg == -1) { 3382 if (!haveEaten) 3383 return MatchOperand_NoMatch; 3384 Error(Parser.getTok().getLoc(), "register expected"); 3385 return MatchOperand_ParseFail; 3386 } 3387 SMLoc E = Parser.getTok().getLoc(); 3388 3389 Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ARM_AM::no_shift, 3390 0, S, E)); 3391 3392 return MatchOperand_Success; 3393 } 3394 3395 /// cvtT2LdrdPre - Convert parsed operands to MCInst. 3396 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3397 /// when they refer multiple MIOperands inside a single one. 3398 bool ARMAsmParser:: 3399 cvtT2LdrdPre(MCInst &Inst, unsigned Opcode, 3400 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3401 // Rt, Rt2 3402 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3403 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 3404 // Create a writeback register dummy placeholder. 3405 Inst.addOperand(MCOperand::CreateReg(0)); 3406 // addr 3407 ((ARMOperand*)Operands[4])->addMemImm8s4OffsetOperands(Inst, 2); 3408 // pred 3409 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3410 return true; 3411 } 3412 3413 /// cvtT2StrdPre - Convert parsed operands to MCInst. 3414 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3415 /// when they refer multiple MIOperands inside a single one. 3416 bool ARMAsmParser:: 3417 cvtT2StrdPre(MCInst &Inst, unsigned Opcode, 3418 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3419 // Create a writeback register dummy placeholder. 3420 Inst.addOperand(MCOperand::CreateReg(0)); 3421 // Rt, Rt2 3422 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3423 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 3424 // addr 3425 ((ARMOperand*)Operands[4])->addMemImm8s4OffsetOperands(Inst, 2); 3426 // pred 3427 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3428 return true; 3429 } 3430 3431 /// cvtLdWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst. 3432 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3433 /// when they refer multiple MIOperands inside a single one. 3434 bool ARMAsmParser:: 3435 cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode, 3436 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3437 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3438 3439 // Create a writeback register dummy placeholder. 3440 Inst.addOperand(MCOperand::CreateImm(0)); 3441 3442 ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2); 3443 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3444 return true; 3445 } 3446 3447 /// cvtStWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst. 3448 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3449 /// when they refer multiple MIOperands inside a single one. 3450 bool ARMAsmParser:: 3451 cvtStWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode, 3452 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3453 // Create a writeback register dummy placeholder. 3454 Inst.addOperand(MCOperand::CreateImm(0)); 3455 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3456 ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2); 3457 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3458 return true; 3459 } 3460 3461 /// cvtLdWriteBackRegAddrMode2 - Convert parsed operands to MCInst. 3462 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3463 /// when they refer multiple MIOperands inside a single one. 3464 bool ARMAsmParser:: 3465 cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 3466 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3467 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3468 3469 // Create a writeback register dummy placeholder. 3470 Inst.addOperand(MCOperand::CreateImm(0)); 3471 3472 ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3); 3473 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3474 return true; 3475 } 3476 3477 /// cvtLdWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst. 3478 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3479 /// when they refer multiple MIOperands inside a single one. 3480 bool ARMAsmParser:: 3481 cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 3482 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3483 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3484 3485 // Create a writeback register dummy placeholder. 3486 Inst.addOperand(MCOperand::CreateImm(0)); 3487 3488 ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2); 3489 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3490 return true; 3491 } 3492 3493 3494 /// cvtStWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst. 3495 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3496 /// when they refer multiple MIOperands inside a single one. 3497 bool ARMAsmParser:: 3498 cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 3499 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3500 // Create a writeback register dummy placeholder. 3501 Inst.addOperand(MCOperand::CreateImm(0)); 3502 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3503 ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2); 3504 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3505 return true; 3506 } 3507 3508 /// cvtStWriteBackRegAddrMode2 - Convert parsed operands to MCInst. 3509 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3510 /// when they refer multiple MIOperands inside a single one. 3511 bool ARMAsmParser:: 3512 cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 3513 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3514 // Create a writeback register dummy placeholder. 3515 Inst.addOperand(MCOperand::CreateImm(0)); 3516 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3517 ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3); 3518 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3519 return true; 3520 } 3521 3522 /// cvtStWriteBackRegAddrMode3 - Convert parsed operands to MCInst. 3523 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3524 /// when they refer multiple MIOperands inside a single one. 3525 bool ARMAsmParser:: 3526 cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 3527 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3528 // Create a writeback register dummy placeholder. 3529 Inst.addOperand(MCOperand::CreateImm(0)); 3530 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3531 ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3); 3532 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3533 return true; 3534 } 3535 3536 /// cvtLdExtTWriteBackImm - Convert parsed operands to MCInst. 3537 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3538 /// when they refer multiple MIOperands inside a single one. 3539 bool ARMAsmParser:: 3540 cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 3541 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3542 // Rt 3543 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3544 // Create a writeback register dummy placeholder. 3545 Inst.addOperand(MCOperand::CreateImm(0)); 3546 // addr 3547 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 3548 // offset 3549 ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1); 3550 // pred 3551 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3552 return true; 3553 } 3554 3555 /// cvtLdExtTWriteBackReg - Convert parsed operands to MCInst. 3556 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3557 /// when they refer multiple MIOperands inside a single one. 3558 bool ARMAsmParser:: 3559 cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 3560 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3561 // Rt 3562 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3563 // Create a writeback register dummy placeholder. 3564 Inst.addOperand(MCOperand::CreateImm(0)); 3565 // addr 3566 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 3567 // offset 3568 ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2); 3569 // pred 3570 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3571 return true; 3572 } 3573 3574 /// cvtStExtTWriteBackImm - Convert parsed operands to MCInst. 3575 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3576 /// when they refer multiple MIOperands inside a single one. 3577 bool ARMAsmParser:: 3578 cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 3579 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3580 // Create a writeback register dummy placeholder. 3581 Inst.addOperand(MCOperand::CreateImm(0)); 3582 // Rt 3583 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3584 // addr 3585 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 3586 // offset 3587 ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1); 3588 // pred 3589 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3590 return true; 3591 } 3592 3593 /// cvtStExtTWriteBackReg - Convert parsed operands to MCInst. 3594 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3595 /// when they refer multiple MIOperands inside a single one. 3596 bool ARMAsmParser:: 3597 cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 3598 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3599 // Create a writeback register dummy placeholder. 3600 Inst.addOperand(MCOperand::CreateImm(0)); 3601 // Rt 3602 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3603 // addr 3604 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 3605 // offset 3606 ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2); 3607 // pred 3608 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3609 return true; 3610 } 3611 3612 /// cvtLdrdPre - Convert parsed operands to MCInst. 3613 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3614 /// when they refer multiple MIOperands inside a single one. 3615 bool ARMAsmParser:: 3616 cvtLdrdPre(MCInst &Inst, unsigned Opcode, 3617 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3618 // Rt, Rt2 3619 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3620 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 3621 // Create a writeback register dummy placeholder. 3622 Inst.addOperand(MCOperand::CreateImm(0)); 3623 // addr 3624 ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3); 3625 // pred 3626 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3627 return true; 3628 } 3629 3630 /// cvtStrdPre - Convert parsed operands to MCInst. 3631 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3632 /// when they refer multiple MIOperands inside a single one. 3633 bool ARMAsmParser:: 3634 cvtStrdPre(MCInst &Inst, unsigned Opcode, 3635 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3636 // Create a writeback register dummy placeholder. 3637 Inst.addOperand(MCOperand::CreateImm(0)); 3638 // Rt, Rt2 3639 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3640 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 3641 // addr 3642 ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3); 3643 // pred 3644 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3645 return true; 3646 } 3647 3648 /// cvtLdWriteBackRegAddrMode3 - Convert parsed operands to MCInst. 3649 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3650 /// when they refer multiple MIOperands inside a single one. 3651 bool ARMAsmParser:: 3652 cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 3653 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3654 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 3655 // Create a writeback register dummy placeholder. 3656 Inst.addOperand(MCOperand::CreateImm(0)); 3657 ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3); 3658 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3659 return true; 3660 } 3661 3662 /// cvtThumbMultiple- Convert parsed operands to MCInst. 3663 /// Needed here because the Asm Gen Matcher can't handle properly tied operands 3664 /// when they refer multiple MIOperands inside a single one. 3665 bool ARMAsmParser:: 3666 cvtThumbMultiply(MCInst &Inst, unsigned Opcode, 3667 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3668 // The second source operand must be the same register as the destination 3669 // operand. 3670 if (Operands.size() == 6 && 3671 (((ARMOperand*)Operands[3])->getReg() != 3672 ((ARMOperand*)Operands[5])->getReg()) && 3673 (((ARMOperand*)Operands[3])->getReg() != 3674 ((ARMOperand*)Operands[4])->getReg())) { 3675 Error(Operands[3]->getStartLoc(), 3676 "destination register must match source register"); 3677 return false; 3678 } 3679 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 3680 ((ARMOperand*)Operands[1])->addCCOutOperands(Inst, 1); 3681 // If we have a three-operand form, make sure to set Rn to be the operand 3682 // that isn't the same as Rd. 3683 unsigned RegOp = 4; 3684 if (Operands.size() == 6 && 3685 ((ARMOperand*)Operands[4])->getReg() == 3686 ((ARMOperand*)Operands[3])->getReg()) 3687 RegOp = 5; 3688 ((ARMOperand*)Operands[RegOp])->addRegOperands(Inst, 1); 3689 Inst.addOperand(Inst.getOperand(0)); 3690 ((ARMOperand*)Operands[2])->addCondCodeOperands(Inst, 2); 3691 3692 return true; 3693 } 3694 3695 bool ARMAsmParser:: 3696 cvtVLDwbFixed(MCInst &Inst, unsigned Opcode, 3697 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3698 // Vd 3699 ((ARMOperand*)Operands[3])->addVecListOperands(Inst, 1); 3700 // Create a writeback register dummy placeholder. 3701 Inst.addOperand(MCOperand::CreateImm(0)); 3702 // Vn 3703 ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2); 3704 // pred 3705 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3706 return true; 3707 } 3708 3709 bool ARMAsmParser:: 3710 cvtVLDwbRegister(MCInst &Inst, unsigned Opcode, 3711 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3712 // Vd 3713 ((ARMOperand*)Operands[3])->addVecListOperands(Inst, 1); 3714 // Create a writeback register dummy placeholder. 3715 Inst.addOperand(MCOperand::CreateImm(0)); 3716 // Vn 3717 ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2); 3718 // Vm 3719 ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1); 3720 // pred 3721 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3722 return true; 3723 } 3724 3725 bool ARMAsmParser:: 3726 cvtVSTwbFixed(MCInst &Inst, unsigned Opcode, 3727 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3728 // Create a writeback register dummy placeholder. 3729 Inst.addOperand(MCOperand::CreateImm(0)); 3730 // Vn 3731 ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2); 3732 // Vt 3733 ((ARMOperand*)Operands[3])->addVecListOperands(Inst, 1); 3734 // pred 3735 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3736 return true; 3737 } 3738 3739 bool ARMAsmParser:: 3740 cvtVSTwbRegister(MCInst &Inst, unsigned Opcode, 3741 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3742 // Create a writeback register dummy placeholder. 3743 Inst.addOperand(MCOperand::CreateImm(0)); 3744 // Vn 3745 ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2); 3746 // Vm 3747 ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1); 3748 // Vt 3749 ((ARMOperand*)Operands[3])->addVecListOperands(Inst, 1); 3750 // pred 3751 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 3752 return true; 3753 } 3754 3755 /// Parse an ARM memory expression, return false if successful else return true 3756 /// or an error. The first token must be a '[' when called. 3757 bool ARMAsmParser:: 3758 parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3759 SMLoc S, E; 3760 assert(Parser.getTok().is(AsmToken::LBrac) && 3761 "Token is not a Left Bracket"); 3762 S = Parser.getTok().getLoc(); 3763 Parser.Lex(); // Eat left bracket token. 3764 3765 const AsmToken &BaseRegTok = Parser.getTok(); 3766 int BaseRegNum = tryParseRegister(); 3767 if (BaseRegNum == -1) 3768 return Error(BaseRegTok.getLoc(), "register expected"); 3769 3770 // The next token must either be a comma or a closing bracket. 3771 const AsmToken &Tok = Parser.getTok(); 3772 if (!Tok.is(AsmToken::Comma) && !Tok.is(AsmToken::RBrac)) 3773 return Error(Tok.getLoc(), "malformed memory operand"); 3774 3775 if (Tok.is(AsmToken::RBrac)) { 3776 E = Tok.getLoc(); 3777 Parser.Lex(); // Eat right bracket token. 3778 3779 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, ARM_AM::no_shift, 3780 0, 0, false, S, E)); 3781 3782 // If there's a pre-indexing writeback marker, '!', just add it as a token 3783 // operand. It's rather odd, but syntactically valid. 3784 if (Parser.getTok().is(AsmToken::Exclaim)) { 3785 Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc())); 3786 Parser.Lex(); // Eat the '!'. 3787 } 3788 3789 return false; 3790 } 3791 3792 assert(Tok.is(AsmToken::Comma) && "Lost comma in memory operand?!"); 3793 Parser.Lex(); // Eat the comma. 3794 3795 // If we have a ':', it's an alignment specifier. 3796 if (Parser.getTok().is(AsmToken::Colon)) { 3797 Parser.Lex(); // Eat the ':'. 3798 E = Parser.getTok().getLoc(); 3799 3800 const MCExpr *Expr; 3801 if (getParser().ParseExpression(Expr)) 3802 return true; 3803 3804 // The expression has to be a constant. Memory references with relocations 3805 // don't come through here, as they use the <label> forms of the relevant 3806 // instructions. 3807 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr); 3808 if (!CE) 3809 return Error (E, "constant expression expected"); 3810 3811 unsigned Align = 0; 3812 switch (CE->getValue()) { 3813 default: 3814 return Error(E, "alignment specifier must be 64, 128, or 256 bits"); 3815 case 64: Align = 8; break; 3816 case 128: Align = 16; break; 3817 case 256: Align = 32; break; 3818 } 3819 3820 // Now we should have the closing ']' 3821 E = Parser.getTok().getLoc(); 3822 if (Parser.getTok().isNot(AsmToken::RBrac)) 3823 return Error(E, "']' expected"); 3824 Parser.Lex(); // Eat right bracket token. 3825 3826 // Don't worry about range checking the value here. That's handled by 3827 // the is*() predicates. 3828 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, 3829 ARM_AM::no_shift, 0, Align, 3830 false, S, E)); 3831 3832 // If there's a pre-indexing writeback marker, '!', just add it as a token 3833 // operand. 3834 if (Parser.getTok().is(AsmToken::Exclaim)) { 3835 Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc())); 3836 Parser.Lex(); // Eat the '!'. 3837 } 3838 3839 return false; 3840 } 3841 3842 // If we have a '#', it's an immediate offset, else assume it's a register 3843 // offset. Be friendly and also accept a plain integer (without a leading 3844 // hash) for gas compatibility. 3845 if (Parser.getTok().is(AsmToken::Hash) || 3846 Parser.getTok().is(AsmToken::Integer)) { 3847 if (Parser.getTok().is(AsmToken::Hash)) 3848 Parser.Lex(); // Eat the '#'. 3849 E = Parser.getTok().getLoc(); 3850 3851 bool isNegative = getParser().getTok().is(AsmToken::Minus); 3852 const MCExpr *Offset; 3853 if (getParser().ParseExpression(Offset)) 3854 return true; 3855 3856 // The expression has to be a constant. Memory references with relocations 3857 // don't come through here, as they use the <label> forms of the relevant 3858 // instructions. 3859 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset); 3860 if (!CE) 3861 return Error (E, "constant expression expected"); 3862 3863 // If the constant was #-0, represent it as INT32_MIN. 3864 int32_t Val = CE->getValue(); 3865 if (isNegative && Val == 0) 3866 CE = MCConstantExpr::Create(INT32_MIN, getContext()); 3867 3868 // Now we should have the closing ']' 3869 E = Parser.getTok().getLoc(); 3870 if (Parser.getTok().isNot(AsmToken::RBrac)) 3871 return Error(E, "']' expected"); 3872 Parser.Lex(); // Eat right bracket token. 3873 3874 // Don't worry about range checking the value here. That's handled by 3875 // the is*() predicates. 3876 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, CE, 0, 3877 ARM_AM::no_shift, 0, 0, 3878 false, S, E)); 3879 3880 // If there's a pre-indexing writeback marker, '!', just add it as a token 3881 // operand. 3882 if (Parser.getTok().is(AsmToken::Exclaim)) { 3883 Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc())); 3884 Parser.Lex(); // Eat the '!'. 3885 } 3886 3887 return false; 3888 } 3889 3890 // The register offset is optionally preceded by a '+' or '-' 3891 bool isNegative = false; 3892 if (Parser.getTok().is(AsmToken::Minus)) { 3893 isNegative = true; 3894 Parser.Lex(); // Eat the '-'. 3895 } else if (Parser.getTok().is(AsmToken::Plus)) { 3896 // Nothing to do. 3897 Parser.Lex(); // Eat the '+'. 3898 } 3899 3900 E = Parser.getTok().getLoc(); 3901 int OffsetRegNum = tryParseRegister(); 3902 if (OffsetRegNum == -1) 3903 return Error(E, "register expected"); 3904 3905 // If there's a shift operator, handle it. 3906 ARM_AM::ShiftOpc ShiftType = ARM_AM::no_shift; 3907 unsigned ShiftImm = 0; 3908 if (Parser.getTok().is(AsmToken::Comma)) { 3909 Parser.Lex(); // Eat the ','. 3910 if (parseMemRegOffsetShift(ShiftType, ShiftImm)) 3911 return true; 3912 } 3913 3914 // Now we should have the closing ']' 3915 E = Parser.getTok().getLoc(); 3916 if (Parser.getTok().isNot(AsmToken::RBrac)) 3917 return Error(E, "']' expected"); 3918 Parser.Lex(); // Eat right bracket token. 3919 3920 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, OffsetRegNum, 3921 ShiftType, ShiftImm, 0, isNegative, 3922 S, E)); 3923 3924 // If there's a pre-indexing writeback marker, '!', just add it as a token 3925 // operand. 3926 if (Parser.getTok().is(AsmToken::Exclaim)) { 3927 Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc())); 3928 Parser.Lex(); // Eat the '!'. 3929 } 3930 3931 return false; 3932 } 3933 3934 /// parseMemRegOffsetShift - one of these two: 3935 /// ( lsl | lsr | asr | ror ) , # shift_amount 3936 /// rrx 3937 /// return true if it parses a shift otherwise it returns false. 3938 bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St, 3939 unsigned &Amount) { 3940 SMLoc Loc = Parser.getTok().getLoc(); 3941 const AsmToken &Tok = Parser.getTok(); 3942 if (Tok.isNot(AsmToken::Identifier)) 3943 return true; 3944 StringRef ShiftName = Tok.getString(); 3945 if (ShiftName == "lsl" || ShiftName == "LSL" || 3946 ShiftName == "asl" || ShiftName == "ASL") 3947 St = ARM_AM::lsl; 3948 else if (ShiftName == "lsr" || ShiftName == "LSR") 3949 St = ARM_AM::lsr; 3950 else if (ShiftName == "asr" || ShiftName == "ASR") 3951 St = ARM_AM::asr; 3952 else if (ShiftName == "ror" || ShiftName == "ROR") 3953 St = ARM_AM::ror; 3954 else if (ShiftName == "rrx" || ShiftName == "RRX") 3955 St = ARM_AM::rrx; 3956 else 3957 return Error(Loc, "illegal shift operator"); 3958 Parser.Lex(); // Eat shift type token. 3959 3960 // rrx stands alone. 3961 Amount = 0; 3962 if (St != ARM_AM::rrx) { 3963 Loc = Parser.getTok().getLoc(); 3964 // A '#' and a shift amount. 3965 const AsmToken &HashTok = Parser.getTok(); 3966 if (HashTok.isNot(AsmToken::Hash)) 3967 return Error(HashTok.getLoc(), "'#' expected"); 3968 Parser.Lex(); // Eat hash token. 3969 3970 const MCExpr *Expr; 3971 if (getParser().ParseExpression(Expr)) 3972 return true; 3973 // Range check the immediate. 3974 // lsl, ror: 0 <= imm <= 31 3975 // lsr, asr: 0 <= imm <= 32 3976 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr); 3977 if (!CE) 3978 return Error(Loc, "shift amount must be an immediate"); 3979 int64_t Imm = CE->getValue(); 3980 if (Imm < 0 || 3981 ((St == ARM_AM::lsl || St == ARM_AM::ror) && Imm > 31) || 3982 ((St == ARM_AM::lsr || St == ARM_AM::asr) && Imm > 32)) 3983 return Error(Loc, "immediate shift value out of range"); 3984 Amount = Imm; 3985 } 3986 3987 return false; 3988 } 3989 3990 /// parseFPImm - A floating point immediate expression operand. 3991 ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 3992 parseFPImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3993 SMLoc S = Parser.getTok().getLoc(); 3994 3995 if (Parser.getTok().isNot(AsmToken::Hash)) 3996 return MatchOperand_NoMatch; 3997 3998 // Disambiguate the VMOV forms that can accept an FP immediate. 3999 // vmov.f32 <sreg>, #imm 4000 // vmov.f64 <dreg>, #imm 4001 // vmov.f32 <dreg>, #imm @ vector f32x2 4002 // vmov.f32 <qreg>, #imm @ vector f32x4 4003 // 4004 // There are also the NEON VMOV instructions which expect an 4005 // integer constant. Make sure we don't try to parse an FPImm 4006 // for these: 4007 // vmov.i{8|16|32|64} <dreg|qreg>, #imm 4008 ARMOperand *TyOp = static_cast<ARMOperand*>(Operands[2]); 4009 if (!TyOp->isToken() || (TyOp->getToken() != ".f32" && 4010 TyOp->getToken() != ".f64")) 4011 return MatchOperand_NoMatch; 4012 4013 Parser.Lex(); // Eat the '#'. 4014 4015 // Handle negation, as that still comes through as a separate token. 4016 bool isNegative = false; 4017 if (Parser.getTok().is(AsmToken::Minus)) { 4018 isNegative = true; 4019 Parser.Lex(); 4020 } 4021 const AsmToken &Tok = Parser.getTok(); 4022 if (Tok.is(AsmToken::Real)) { 4023 APFloat RealVal(APFloat::IEEEdouble, Tok.getString()); 4024 uint64_t IntVal = RealVal.bitcastToAPInt().getZExtValue(); 4025 // If we had a '-' in front, toggle the sign bit. 4026 IntVal ^= (uint64_t)isNegative << 63; 4027 int Val = ARM_AM::getFP64Imm(APInt(64, IntVal)); 4028 Parser.Lex(); // Eat the token. 4029 if (Val == -1) { 4030 TokError("floating point value out of range"); 4031 return MatchOperand_ParseFail; 4032 } 4033 Operands.push_back(ARMOperand::CreateFPImm(Val, S, getContext())); 4034 return MatchOperand_Success; 4035 } 4036 if (Tok.is(AsmToken::Integer)) { 4037 int64_t Val = Tok.getIntVal(); 4038 Parser.Lex(); // Eat the token. 4039 if (Val > 255 || Val < 0) { 4040 TokError("encoded floating point value out of range"); 4041 return MatchOperand_ParseFail; 4042 } 4043 Operands.push_back(ARMOperand::CreateFPImm(Val, S, getContext())); 4044 return MatchOperand_Success; 4045 } 4046 4047 TokError("invalid floating point immediate"); 4048 return MatchOperand_ParseFail; 4049 } 4050 /// Parse a arm instruction operand. For now this parses the operand regardless 4051 /// of the mnemonic. 4052 bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands, 4053 StringRef Mnemonic) { 4054 SMLoc S, E; 4055 4056 // Check if the current operand has a custom associated parser, if so, try to 4057 // custom parse the operand, or fallback to the general approach. 4058 OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic); 4059 if (ResTy == MatchOperand_Success) 4060 return false; 4061 // If there wasn't a custom match, try the generic matcher below. Otherwise, 4062 // there was a match, but an error occurred, in which case, just return that 4063 // the operand parsing failed. 4064 if (ResTy == MatchOperand_ParseFail) 4065 return true; 4066 4067 switch (getLexer().getKind()) { 4068 default: 4069 Error(Parser.getTok().getLoc(), "unexpected token in operand"); 4070 return true; 4071 case AsmToken::Identifier: { 4072 // If this is VMRS, check for the apsr_nzcv operand. 4073 if (!tryParseRegisterWithWriteBack(Operands)) 4074 return false; 4075 int Res = tryParseShiftRegister(Operands); 4076 if (Res == 0) // success 4077 return false; 4078 else if (Res == -1) // irrecoverable error 4079 return true; 4080 if (Mnemonic == "vmrs" && Parser.getTok().getString() == "apsr_nzcv") { 4081 S = Parser.getTok().getLoc(); 4082 Parser.Lex(); 4083 Operands.push_back(ARMOperand::CreateToken("apsr_nzcv", S)); 4084 return false; 4085 } 4086 4087 // Fall though for the Identifier case that is not a register or a 4088 // special name. 4089 } 4090 case AsmToken::LParen: // parenthesized expressions like (_strcmp-4) 4091 case AsmToken::Integer: // things like 1f and 2b as a branch targets 4092 case AsmToken::String: // quoted label names. 4093 case AsmToken::Dot: { // . as a branch target 4094 // This was not a register so parse other operands that start with an 4095 // identifier (like labels) as expressions and create them as immediates. 4096 const MCExpr *IdVal; 4097 S = Parser.getTok().getLoc(); 4098 if (getParser().ParseExpression(IdVal)) 4099 return true; 4100 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 4101 Operands.push_back(ARMOperand::CreateImm(IdVal, S, E)); 4102 return false; 4103 } 4104 case AsmToken::LBrac: 4105 return parseMemory(Operands); 4106 case AsmToken::LCurly: 4107 return parseRegisterList(Operands); 4108 case AsmToken::Hash: { 4109 // #42 -> immediate. 4110 // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate 4111 S = Parser.getTok().getLoc(); 4112 Parser.Lex(); 4113 bool isNegative = Parser.getTok().is(AsmToken::Minus); 4114 const MCExpr *ImmVal; 4115 if (getParser().ParseExpression(ImmVal)) 4116 return true; 4117 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ImmVal); 4118 if (CE) { 4119 int32_t Val = CE->getValue(); 4120 if (isNegative && Val == 0) 4121 ImmVal = MCConstantExpr::Create(INT32_MIN, getContext()); 4122 } 4123 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 4124 Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E)); 4125 return false; 4126 } 4127 case AsmToken::Colon: { 4128 // ":lower16:" and ":upper16:" expression prefixes 4129 // FIXME: Check it's an expression prefix, 4130 // e.g. (FOO - :lower16:BAR) isn't legal. 4131 ARMMCExpr::VariantKind RefKind; 4132 if (parsePrefix(RefKind)) 4133 return true; 4134 4135 const MCExpr *SubExprVal; 4136 if (getParser().ParseExpression(SubExprVal)) 4137 return true; 4138 4139 const MCExpr *ExprVal = ARMMCExpr::Create(RefKind, SubExprVal, 4140 getContext()); 4141 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 4142 Operands.push_back(ARMOperand::CreateImm(ExprVal, S, E)); 4143 return false; 4144 } 4145 } 4146 } 4147 4148 // parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e. 4149 // :lower16: and :upper16:. 4150 bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) { 4151 RefKind = ARMMCExpr::VK_ARM_None; 4152 4153 // :lower16: and :upper16: modifiers 4154 assert(getLexer().is(AsmToken::Colon) && "expected a :"); 4155 Parser.Lex(); // Eat ':' 4156 4157 if (getLexer().isNot(AsmToken::Identifier)) { 4158 Error(Parser.getTok().getLoc(), "expected prefix identifier in operand"); 4159 return true; 4160 } 4161 4162 StringRef IDVal = Parser.getTok().getIdentifier(); 4163 if (IDVal == "lower16") { 4164 RefKind = ARMMCExpr::VK_ARM_LO16; 4165 } else if (IDVal == "upper16") { 4166 RefKind = ARMMCExpr::VK_ARM_HI16; 4167 } else { 4168 Error(Parser.getTok().getLoc(), "unexpected prefix in operand"); 4169 return true; 4170 } 4171 Parser.Lex(); 4172 4173 if (getLexer().isNot(AsmToken::Colon)) { 4174 Error(Parser.getTok().getLoc(), "unexpected token after prefix"); 4175 return true; 4176 } 4177 Parser.Lex(); // Eat the last ':' 4178 return false; 4179 } 4180 4181 /// \brief Given a mnemonic, split out possible predication code and carry 4182 /// setting letters to form a canonical mnemonic and flags. 4183 // 4184 // FIXME: Would be nice to autogen this. 4185 // FIXME: This is a bit of a maze of special cases. 4186 StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic, 4187 unsigned &PredicationCode, 4188 bool &CarrySetting, 4189 unsigned &ProcessorIMod, 4190 StringRef &ITMask) { 4191 PredicationCode = ARMCC::AL; 4192 CarrySetting = false; 4193 ProcessorIMod = 0; 4194 4195 // Ignore some mnemonics we know aren't predicated forms. 4196 // 4197 // FIXME: Would be nice to autogen this. 4198 if ((Mnemonic == "movs" && isThumb()) || 4199 Mnemonic == "teq" || Mnemonic == "vceq" || Mnemonic == "svc" || 4200 Mnemonic == "mls" || Mnemonic == "smmls" || Mnemonic == "vcls" || 4201 Mnemonic == "vmls" || Mnemonic == "vnmls" || Mnemonic == "vacge" || 4202 Mnemonic == "vcge" || Mnemonic == "vclt" || Mnemonic == "vacgt" || 4203 Mnemonic == "vcgt" || Mnemonic == "vcle" || Mnemonic == "smlal" || 4204 Mnemonic == "umaal" || Mnemonic == "umlal" || Mnemonic == "vabal" || 4205 Mnemonic == "vmlal" || Mnemonic == "vpadal" || Mnemonic == "vqdmlal") 4206 return Mnemonic; 4207 4208 // First, split out any predication code. Ignore mnemonics we know aren't 4209 // predicated but do have a carry-set and so weren't caught above. 4210 if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" && 4211 Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" && 4212 Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" && 4213 Mnemonic != "sbcs" && Mnemonic != "rscs") { 4214 unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2)) 4215 .Case("eq", ARMCC::EQ) 4216 .Case("ne", ARMCC::NE) 4217 .Case("hs", ARMCC::HS) 4218 .Case("cs", ARMCC::HS) 4219 .Case("lo", ARMCC::LO) 4220 .Case("cc", ARMCC::LO) 4221 .Case("mi", ARMCC::MI) 4222 .Case("pl", ARMCC::PL) 4223 .Case("vs", ARMCC::VS) 4224 .Case("vc", ARMCC::VC) 4225 .Case("hi", ARMCC::HI) 4226 .Case("ls", ARMCC::LS) 4227 .Case("ge", ARMCC::GE) 4228 .Case("lt", ARMCC::LT) 4229 .Case("gt", ARMCC::GT) 4230 .Case("le", ARMCC::LE) 4231 .Case("al", ARMCC::AL) 4232 .Default(~0U); 4233 if (CC != ~0U) { 4234 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2); 4235 PredicationCode = CC; 4236 } 4237 } 4238 4239 // Next, determine if we have a carry setting bit. We explicitly ignore all 4240 // the instructions we know end in 's'. 4241 if (Mnemonic.endswith("s") && 4242 !(Mnemonic == "cps" || Mnemonic == "mls" || 4243 Mnemonic == "mrs" || Mnemonic == "smmls" || Mnemonic == "vabs" || 4244 Mnemonic == "vcls" || Mnemonic == "vmls" || Mnemonic == "vmrs" || 4245 Mnemonic == "vnmls" || Mnemonic == "vqabs" || Mnemonic == "vrecps" || 4246 Mnemonic == "vrsqrts" || Mnemonic == "srs" || Mnemonic == "flds" || 4247 Mnemonic == "fmrs" || 4248 (Mnemonic == "movs" && isThumb()))) { 4249 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1); 4250 CarrySetting = true; 4251 } 4252 4253 // The "cps" instruction can have a interrupt mode operand which is glued into 4254 // the mnemonic. Check if this is the case, split it and parse the imod op 4255 if (Mnemonic.startswith("cps")) { 4256 // Split out any imod code. 4257 unsigned IMod = 4258 StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2)) 4259 .Case("ie", ARM_PROC::IE) 4260 .Case("id", ARM_PROC::ID) 4261 .Default(~0U); 4262 if (IMod != ~0U) { 4263 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2); 4264 ProcessorIMod = IMod; 4265 } 4266 } 4267 4268 // The "it" instruction has the condition mask on the end of the mnemonic. 4269 if (Mnemonic.startswith("it")) { 4270 ITMask = Mnemonic.slice(2, Mnemonic.size()); 4271 Mnemonic = Mnemonic.slice(0, 2); 4272 } 4273 4274 return Mnemonic; 4275 } 4276 4277 /// \brief Given a canonical mnemonic, determine if the instruction ever allows 4278 /// inclusion of carry set or predication code operands. 4279 // 4280 // FIXME: It would be nice to autogen this. 4281 void ARMAsmParser:: 4282 getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet, 4283 bool &CanAcceptPredicationCode) { 4284 if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" || 4285 Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" || 4286 Mnemonic == "add" || Mnemonic == "adc" || 4287 Mnemonic == "mul" || Mnemonic == "bic" || Mnemonic == "asr" || 4288 Mnemonic == "orr" || Mnemonic == "mvn" || 4289 Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" || 4290 Mnemonic == "sbc" || Mnemonic == "eor" || Mnemonic == "neg" || 4291 (!isThumb() && (Mnemonic == "smull" || Mnemonic == "mov" || 4292 Mnemonic == "mla" || Mnemonic == "smlal" || 4293 Mnemonic == "umlal" || Mnemonic == "umull"))) { 4294 CanAcceptCarrySet = true; 4295 } else 4296 CanAcceptCarrySet = false; 4297 4298 if (Mnemonic == "cbnz" || Mnemonic == "setend" || Mnemonic == "dmb" || 4299 Mnemonic == "cps" || Mnemonic == "mcr2" || Mnemonic == "it" || 4300 Mnemonic == "mcrr2" || Mnemonic == "cbz" || Mnemonic == "cdp2" || 4301 Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" || 4302 Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "setend" || 4303 (Mnemonic == "clrex" && !isThumb()) || 4304 (Mnemonic == "nop" && isThumbOne()) || 4305 ((Mnemonic == "pld" || Mnemonic == "pli" || Mnemonic == "pldw" || 4306 Mnemonic == "ldc2" || Mnemonic == "ldc2l" || 4307 Mnemonic == "stc2" || Mnemonic == "stc2l") && !isThumb()) || 4308 ((Mnemonic.startswith("rfe") || Mnemonic.startswith("srs")) && 4309 !isThumb()) || 4310 Mnemonic.startswith("cps") || (Mnemonic == "movs" && isThumbOne())) { 4311 CanAcceptPredicationCode = false; 4312 } else 4313 CanAcceptPredicationCode = true; 4314 4315 if (isThumb()) { 4316 if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" || 4317 Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp") 4318 CanAcceptPredicationCode = false; 4319 } 4320 } 4321 4322 bool ARMAsmParser::shouldOmitCCOutOperand(StringRef Mnemonic, 4323 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 4324 // FIXME: This is all horribly hacky. We really need a better way to deal 4325 // with optional operands like this in the matcher table. 4326 4327 // The 'mov' mnemonic is special. One variant has a cc_out operand, while 4328 // another does not. Specifically, the MOVW instruction does not. So we 4329 // special case it here and remove the defaulted (non-setting) cc_out 4330 // operand if that's the instruction we're trying to match. 4331 // 4332 // We do this as post-processing of the explicit operands rather than just 4333 // conditionally adding the cc_out in the first place because we need 4334 // to check the type of the parsed immediate operand. 4335 if (Mnemonic == "mov" && Operands.size() > 4 && !isThumb() && 4336 !static_cast<ARMOperand*>(Operands[4])->isARMSOImm() && 4337 static_cast<ARMOperand*>(Operands[4])->isImm0_65535Expr() && 4338 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) 4339 return true; 4340 4341 // Register-register 'add' for thumb does not have a cc_out operand 4342 // when there are only two register operands. 4343 if (isThumb() && Mnemonic == "add" && Operands.size() == 5 && 4344 static_cast<ARMOperand*>(Operands[3])->isReg() && 4345 static_cast<ARMOperand*>(Operands[4])->isReg() && 4346 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) 4347 return true; 4348 // Register-register 'add' for thumb does not have a cc_out operand 4349 // when it's an ADD Rdm, SP, {Rdm|#imm0_255} instruction. We do 4350 // have to check the immediate range here since Thumb2 has a variant 4351 // that can handle a different range and has a cc_out operand. 4352 if (((isThumb() && Mnemonic == "add") || 4353 (isThumbTwo() && Mnemonic == "sub")) && 4354 Operands.size() == 6 && 4355 static_cast<ARMOperand*>(Operands[3])->isReg() && 4356 static_cast<ARMOperand*>(Operands[4])->isReg() && 4357 static_cast<ARMOperand*>(Operands[4])->getReg() == ARM::SP && 4358 static_cast<ARMOperand*>(Operands[1])->getReg() == 0 && 4359 (static_cast<ARMOperand*>(Operands[5])->isReg() || 4360 static_cast<ARMOperand*>(Operands[5])->isImm0_1020s4())) 4361 return true; 4362 // For Thumb2, add/sub immediate does not have a cc_out operand for the 4363 // imm0_4095 variant. That's the least-preferred variant when 4364 // selecting via the generic "add" mnemonic, so to know that we 4365 // should remove the cc_out operand, we have to explicitly check that 4366 // it's not one of the other variants. Ugh. 4367 if (isThumbTwo() && (Mnemonic == "add" || Mnemonic == "sub") && 4368 Operands.size() == 6 && 4369 static_cast<ARMOperand*>(Operands[3])->isReg() && 4370 static_cast<ARMOperand*>(Operands[4])->isReg() && 4371 static_cast<ARMOperand*>(Operands[5])->isImm()) { 4372 // Nest conditions rather than one big 'if' statement for readability. 4373 // 4374 // If either register is a high reg, it's either one of the SP 4375 // variants (handled above) or a 32-bit encoding, so we just 4376 // check against T3. 4377 if ((!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) || 4378 !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg())) && 4379 static_cast<ARMOperand*>(Operands[5])->isT2SOImm()) 4380 return false; 4381 // If both registers are low, we're in an IT block, and the immediate is 4382 // in range, we should use encoding T1 instead, which has a cc_out. 4383 if (inITBlock() && 4384 isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) && 4385 isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) && 4386 static_cast<ARMOperand*>(Operands[5])->isImm0_7()) 4387 return false; 4388 4389 // Otherwise, we use encoding T4, which does not have a cc_out 4390 // operand. 4391 return true; 4392 } 4393 4394 // The thumb2 multiply instruction doesn't have a CCOut register, so 4395 // if we have a "mul" mnemonic in Thumb mode, check if we'll be able to 4396 // use the 16-bit encoding or not. 4397 if (isThumbTwo() && Mnemonic == "mul" && Operands.size() == 6 && 4398 static_cast<ARMOperand*>(Operands[1])->getReg() == 0 && 4399 static_cast<ARMOperand*>(Operands[3])->isReg() && 4400 static_cast<ARMOperand*>(Operands[4])->isReg() && 4401 static_cast<ARMOperand*>(Operands[5])->isReg() && 4402 // If the registers aren't low regs, the destination reg isn't the 4403 // same as one of the source regs, or the cc_out operand is zero 4404 // outside of an IT block, we have to use the 32-bit encoding, so 4405 // remove the cc_out operand. 4406 (!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) || 4407 !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) || 4408 !isARMLowRegister(static_cast<ARMOperand*>(Operands[5])->getReg()) || 4409 !inITBlock() || 4410 (static_cast<ARMOperand*>(Operands[3])->getReg() != 4411 static_cast<ARMOperand*>(Operands[5])->getReg() && 4412 static_cast<ARMOperand*>(Operands[3])->getReg() != 4413 static_cast<ARMOperand*>(Operands[4])->getReg()))) 4414 return true; 4415 4416 // Also check the 'mul' syntax variant that doesn't specify an explicit 4417 // destination register. 4418 if (isThumbTwo() && Mnemonic == "mul" && Operands.size() == 5 && 4419 static_cast<ARMOperand*>(Operands[1])->getReg() == 0 && 4420 static_cast<ARMOperand*>(Operands[3])->isReg() && 4421 static_cast<ARMOperand*>(Operands[4])->isReg() && 4422 // If the registers aren't low regs or the cc_out operand is zero 4423 // outside of an IT block, we have to use the 32-bit encoding, so 4424 // remove the cc_out operand. 4425 (!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) || 4426 !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) || 4427 !inITBlock())) 4428 return true; 4429 4430 4431 4432 // Register-register 'add/sub' for thumb does not have a cc_out operand 4433 // when it's an ADD/SUB SP, #imm. Be lenient on count since there's also 4434 // the "add/sub SP, SP, #imm" version. If the follow-up operands aren't 4435 // right, this will result in better diagnostics (which operand is off) 4436 // anyway. 4437 if (isThumb() && (Mnemonic == "add" || Mnemonic == "sub") && 4438 (Operands.size() == 5 || Operands.size() == 6) && 4439 static_cast<ARMOperand*>(Operands[3])->isReg() && 4440 static_cast<ARMOperand*>(Operands[3])->getReg() == ARM::SP && 4441 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) 4442 return true; 4443 4444 return false; 4445 } 4446 4447 static bool isDataTypeToken(StringRef Tok) { 4448 return Tok == ".8" || Tok == ".16" || Tok == ".32" || Tok == ".64" || 4449 Tok == ".i8" || Tok == ".i16" || Tok == ".i32" || Tok == ".i64" || 4450 Tok == ".u8" || Tok == ".u16" || Tok == ".u32" || Tok == ".u64" || 4451 Tok == ".s8" || Tok == ".s16" || Tok == ".s32" || Tok == ".s64" || 4452 Tok == ".p8" || Tok == ".p16" || Tok == ".f32" || Tok == ".f64" || 4453 Tok == ".f" || Tok == ".d"; 4454 } 4455 4456 // FIXME: This bit should probably be handled via an explicit match class 4457 // in the .td files that matches the suffix instead of having it be 4458 // a literal string token the way it is now. 4459 static bool doesIgnoreDataTypeSuffix(StringRef Mnemonic, StringRef DT) { 4460 return Mnemonic.startswith("vldm") || Mnemonic.startswith("vstm"); 4461 } 4462 4463 /// Parse an arm instruction mnemonic followed by its operands. 4464 bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc, 4465 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 4466 // Create the leading tokens for the mnemonic, split by '.' characters. 4467 size_t Start = 0, Next = Name.find('.'); 4468 StringRef Mnemonic = Name.slice(Start, Next); 4469 4470 // Split out the predication code and carry setting flag from the mnemonic. 4471 unsigned PredicationCode; 4472 unsigned ProcessorIMod; 4473 bool CarrySetting; 4474 StringRef ITMask; 4475 Mnemonic = splitMnemonic(Mnemonic, PredicationCode, CarrySetting, 4476 ProcessorIMod, ITMask); 4477 4478 // In Thumb1, only the branch (B) instruction can be predicated. 4479 if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") { 4480 Parser.EatToEndOfStatement(); 4481 return Error(NameLoc, "conditional execution not supported in Thumb1"); 4482 } 4483 4484 Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc)); 4485 4486 // Handle the IT instruction ITMask. Convert it to a bitmask. This 4487 // is the mask as it will be for the IT encoding if the conditional 4488 // encoding has a '1' as it's bit0 (i.e. 't' ==> '1'). In the case 4489 // where the conditional bit0 is zero, the instruction post-processing 4490 // will adjust the mask accordingly. 4491 if (Mnemonic == "it") { 4492 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + 2); 4493 if (ITMask.size() > 3) { 4494 Parser.EatToEndOfStatement(); 4495 return Error(Loc, "too many conditions on IT instruction"); 4496 } 4497 unsigned Mask = 8; 4498 for (unsigned i = ITMask.size(); i != 0; --i) { 4499 char pos = ITMask[i - 1]; 4500 if (pos != 't' && pos != 'e') { 4501 Parser.EatToEndOfStatement(); 4502 return Error(Loc, "illegal IT block condition mask '" + ITMask + "'"); 4503 } 4504 Mask >>= 1; 4505 if (ITMask[i - 1] == 't') 4506 Mask |= 8; 4507 } 4508 Operands.push_back(ARMOperand::CreateITMask(Mask, Loc)); 4509 } 4510 4511 // FIXME: This is all a pretty gross hack. We should automatically handle 4512 // optional operands like this via tblgen. 4513 4514 // Next, add the CCOut and ConditionCode operands, if needed. 4515 // 4516 // For mnemonics which can ever incorporate a carry setting bit or predication 4517 // code, our matching model involves us always generating CCOut and 4518 // ConditionCode operands to match the mnemonic "as written" and then we let 4519 // the matcher deal with finding the right instruction or generating an 4520 // appropriate error. 4521 bool CanAcceptCarrySet, CanAcceptPredicationCode; 4522 getMnemonicAcceptInfo(Mnemonic, CanAcceptCarrySet, CanAcceptPredicationCode); 4523 4524 // If we had a carry-set on an instruction that can't do that, issue an 4525 // error. 4526 if (!CanAcceptCarrySet && CarrySetting) { 4527 Parser.EatToEndOfStatement(); 4528 return Error(NameLoc, "instruction '" + Mnemonic + 4529 "' can not set flags, but 's' suffix specified"); 4530 } 4531 // If we had a predication code on an instruction that can't do that, issue an 4532 // error. 4533 if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) { 4534 Parser.EatToEndOfStatement(); 4535 return Error(NameLoc, "instruction '" + Mnemonic + 4536 "' is not predicable, but condition code specified"); 4537 } 4538 4539 // Add the carry setting operand, if necessary. 4540 if (CanAcceptCarrySet) { 4541 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size()); 4542 Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0, 4543 Loc)); 4544 } 4545 4546 // Add the predication code operand, if necessary. 4547 if (CanAcceptPredicationCode) { 4548 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() + 4549 CarrySetting); 4550 Operands.push_back(ARMOperand::CreateCondCode( 4551 ARMCC::CondCodes(PredicationCode), Loc)); 4552 } 4553 4554 // Add the processor imod operand, if necessary. 4555 if (ProcessorIMod) { 4556 Operands.push_back(ARMOperand::CreateImm( 4557 MCConstantExpr::Create(ProcessorIMod, getContext()), 4558 NameLoc, NameLoc)); 4559 } 4560 4561 // Add the remaining tokens in the mnemonic. 4562 while (Next != StringRef::npos) { 4563 Start = Next; 4564 Next = Name.find('.', Start + 1); 4565 StringRef ExtraToken = Name.slice(Start, Next); 4566 4567 // Some NEON instructions have an optional datatype suffix that is 4568 // completely ignored. Check for that. 4569 if (isDataTypeToken(ExtraToken) && 4570 doesIgnoreDataTypeSuffix(Mnemonic, ExtraToken)) 4571 continue; 4572 4573 if (ExtraToken != ".n") { 4574 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start); 4575 Operands.push_back(ARMOperand::CreateToken(ExtraToken, Loc)); 4576 } 4577 } 4578 4579 // Read the remaining operands. 4580 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4581 // Read the first operand. 4582 if (parseOperand(Operands, Mnemonic)) { 4583 Parser.EatToEndOfStatement(); 4584 return true; 4585 } 4586 4587 while (getLexer().is(AsmToken::Comma)) { 4588 Parser.Lex(); // Eat the comma. 4589 4590 // Parse and remember the operand. 4591 if (parseOperand(Operands, Mnemonic)) { 4592 Parser.EatToEndOfStatement(); 4593 return true; 4594 } 4595 } 4596 } 4597 4598 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4599 SMLoc Loc = getLexer().getLoc(); 4600 Parser.EatToEndOfStatement(); 4601 return Error(Loc, "unexpected token in argument list"); 4602 } 4603 4604 Parser.Lex(); // Consume the EndOfStatement 4605 4606 // Some instructions, mostly Thumb, have forms for the same mnemonic that 4607 // do and don't have a cc_out optional-def operand. With some spot-checks 4608 // of the operand list, we can figure out which variant we're trying to 4609 // parse and adjust accordingly before actually matching. We shouldn't ever 4610 // try to remove a cc_out operand that was explicitly set on the the 4611 // mnemonic, of course (CarrySetting == true). Reason number #317 the 4612 // table driven matcher doesn't fit well with the ARM instruction set. 4613 if (!CarrySetting && shouldOmitCCOutOperand(Mnemonic, Operands)) { 4614 ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]); 4615 Operands.erase(Operands.begin() + 1); 4616 delete Op; 4617 } 4618 4619 // ARM mode 'blx' need special handling, as the register operand version 4620 // is predicable, but the label operand version is not. So, we can't rely 4621 // on the Mnemonic based checking to correctly figure out when to put 4622 // a k_CondCode operand in the list. If we're trying to match the label 4623 // version, remove the k_CondCode operand here. 4624 if (!isThumb() && Mnemonic == "blx" && Operands.size() == 3 && 4625 static_cast<ARMOperand*>(Operands[2])->isImm()) { 4626 ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]); 4627 Operands.erase(Operands.begin() + 1); 4628 delete Op; 4629 } 4630 4631 // The vector-compare-to-zero instructions have a literal token "#0" at 4632 // the end that comes to here as an immediate operand. Convert it to a 4633 // token to play nicely with the matcher. 4634 if ((Mnemonic == "vceq" || Mnemonic == "vcge" || Mnemonic == "vcgt" || 4635 Mnemonic == "vcle" || Mnemonic == "vclt") && Operands.size() == 6 && 4636 static_cast<ARMOperand*>(Operands[5])->isImm()) { 4637 ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]); 4638 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm()); 4639 if (CE && CE->getValue() == 0) { 4640 Operands.erase(Operands.begin() + 5); 4641 Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc())); 4642 delete Op; 4643 } 4644 } 4645 // VCMP{E} does the same thing, but with a different operand count. 4646 if ((Mnemonic == "vcmp" || Mnemonic == "vcmpe") && Operands.size() == 5 && 4647 static_cast<ARMOperand*>(Operands[4])->isImm()) { 4648 ARMOperand *Op = static_cast<ARMOperand*>(Operands[4]); 4649 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm()); 4650 if (CE && CE->getValue() == 0) { 4651 Operands.erase(Operands.begin() + 4); 4652 Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc())); 4653 delete Op; 4654 } 4655 } 4656 // Similarly, the Thumb1 "RSB" instruction has a literal "#0" on the 4657 // end. Convert it to a token here. 4658 if (Mnemonic == "rsb" && isThumb() && Operands.size() == 6 && 4659 static_cast<ARMOperand*>(Operands[5])->isImm()) { 4660 ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]); 4661 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm()); 4662 if (CE && CE->getValue() == 0) { 4663 Operands.erase(Operands.begin() + 5); 4664 Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc())); 4665 delete Op; 4666 } 4667 } 4668 4669 return false; 4670 } 4671 4672 // Validate context-sensitive operand constraints. 4673 4674 // return 'true' if register list contains non-low GPR registers, 4675 // 'false' otherwise. If Reg is in the register list or is HiReg, set 4676 // 'containsReg' to true. 4677 static bool checkLowRegisterList(MCInst Inst, unsigned OpNo, unsigned Reg, 4678 unsigned HiReg, bool &containsReg) { 4679 containsReg = false; 4680 for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) { 4681 unsigned OpReg = Inst.getOperand(i).getReg(); 4682 if (OpReg == Reg) 4683 containsReg = true; 4684 // Anything other than a low register isn't legal here. 4685 if (!isARMLowRegister(OpReg) && (!HiReg || OpReg != HiReg)) 4686 return true; 4687 } 4688 return false; 4689 } 4690 4691 // Check if the specified regisgter is in the register list of the inst, 4692 // starting at the indicated operand number. 4693 static bool listContainsReg(MCInst &Inst, unsigned OpNo, unsigned Reg) { 4694 for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) { 4695 unsigned OpReg = Inst.getOperand(i).getReg(); 4696 if (OpReg == Reg) 4697 return true; 4698 } 4699 return false; 4700 } 4701 4702 // FIXME: We would really prefer to have MCInstrInfo (the wrapper around 4703 // the ARMInsts array) instead. Getting that here requires awkward 4704 // API changes, though. Better way? 4705 namespace llvm { 4706 extern const MCInstrDesc ARMInsts[]; 4707 } 4708 static const MCInstrDesc &getInstDesc(unsigned Opcode) { 4709 return ARMInsts[Opcode]; 4710 } 4711 4712 // FIXME: We would really like to be able to tablegen'erate this. 4713 bool ARMAsmParser:: 4714 validateInstruction(MCInst &Inst, 4715 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 4716 const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); 4717 SMLoc Loc = Operands[0]->getStartLoc(); 4718 // Check the IT block state first. 4719 // NOTE: In Thumb mode, the BKPT instruction has the interesting property of 4720 // being allowed in IT blocks, but not being predicable. It just always 4721 // executes. 4722 if (inITBlock() && Inst.getOpcode() != ARM::tBKPT) { 4723 unsigned bit = 1; 4724 if (ITState.FirstCond) 4725 ITState.FirstCond = false; 4726 else 4727 bit = (ITState.Mask >> (5 - ITState.CurPosition)) & 1; 4728 // The instruction must be predicable. 4729 if (!MCID.isPredicable()) 4730 return Error(Loc, "instructions in IT block must be predicable"); 4731 unsigned Cond = Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm(); 4732 unsigned ITCond = bit ? ITState.Cond : 4733 ARMCC::getOppositeCondition(ITState.Cond); 4734 if (Cond != ITCond) { 4735 // Find the condition code Operand to get its SMLoc information. 4736 SMLoc CondLoc; 4737 for (unsigned i = 1; i < Operands.size(); ++i) 4738 if (static_cast<ARMOperand*>(Operands[i])->isCondCode()) 4739 CondLoc = Operands[i]->getStartLoc(); 4740 return Error(CondLoc, "incorrect condition in IT block; got '" + 4741 StringRef(ARMCondCodeToString(ARMCC::CondCodes(Cond))) + 4742 "', but expected '" + 4743 ARMCondCodeToString(ARMCC::CondCodes(ITCond)) + "'"); 4744 } 4745 // Check for non-'al' condition codes outside of the IT block. 4746 } else if (isThumbTwo() && MCID.isPredicable() && 4747 Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm() != 4748 ARMCC::AL && Inst.getOpcode() != ARM::tB && 4749 Inst.getOpcode() != ARM::t2B) 4750 return Error(Loc, "predicated instructions must be in IT block"); 4751 4752 switch (Inst.getOpcode()) { 4753 case ARM::LDRD: 4754 case ARM::LDRD_PRE: 4755 case ARM::LDRD_POST: 4756 case ARM::LDREXD: { 4757 // Rt2 must be Rt + 1. 4758 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg()); 4759 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 4760 if (Rt2 != Rt + 1) 4761 return Error(Operands[3]->getStartLoc(), 4762 "destination operands must be sequential"); 4763 return false; 4764 } 4765 case ARM::STRD: { 4766 // Rt2 must be Rt + 1. 4767 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg()); 4768 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 4769 if (Rt2 != Rt + 1) 4770 return Error(Operands[3]->getStartLoc(), 4771 "source operands must be sequential"); 4772 return false; 4773 } 4774 case ARM::STRD_PRE: 4775 case ARM::STRD_POST: 4776 case ARM::STREXD: { 4777 // Rt2 must be Rt + 1. 4778 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 4779 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(2).getReg()); 4780 if (Rt2 != Rt + 1) 4781 return Error(Operands[3]->getStartLoc(), 4782 "source operands must be sequential"); 4783 return false; 4784 } 4785 case ARM::SBFX: 4786 case ARM::UBFX: { 4787 // width must be in range [1, 32-lsb] 4788 unsigned lsb = Inst.getOperand(2).getImm(); 4789 unsigned widthm1 = Inst.getOperand(3).getImm(); 4790 if (widthm1 >= 32 - lsb) 4791 return Error(Operands[5]->getStartLoc(), 4792 "bitfield width must be in range [1,32-lsb]"); 4793 return false; 4794 } 4795 case ARM::tLDMIA: { 4796 // If we're parsing Thumb2, the .w variant is available and handles 4797 // most cases that are normally illegal for a Thumb1 LDM 4798 // instruction. We'll make the transformation in processInstruction() 4799 // if necessary. 4800 // 4801 // Thumb LDM instructions are writeback iff the base register is not 4802 // in the register list. 4803 unsigned Rn = Inst.getOperand(0).getReg(); 4804 bool hasWritebackToken = 4805 (static_cast<ARMOperand*>(Operands[3])->isToken() && 4806 static_cast<ARMOperand*>(Operands[3])->getToken() == "!"); 4807 bool listContainsBase; 4808 if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) && !isThumbTwo()) 4809 return Error(Operands[3 + hasWritebackToken]->getStartLoc(), 4810 "registers must be in range r0-r7"); 4811 // If we should have writeback, then there should be a '!' token. 4812 if (!listContainsBase && !hasWritebackToken && !isThumbTwo()) 4813 return Error(Operands[2]->getStartLoc(), 4814 "writeback operator '!' expected"); 4815 // If we should not have writeback, there must not be a '!'. This is 4816 // true even for the 32-bit wide encodings. 4817 if (listContainsBase && hasWritebackToken) 4818 return Error(Operands[3]->getStartLoc(), 4819 "writeback operator '!' not allowed when base register " 4820 "in register list"); 4821 4822 break; 4823 } 4824 case ARM::t2LDMIA_UPD: { 4825 if (listContainsReg(Inst, 3, Inst.getOperand(0).getReg())) 4826 return Error(Operands[4]->getStartLoc(), 4827 "writeback operator '!' not allowed when base register " 4828 "in register list"); 4829 break; 4830 } 4831 // Like for ldm/stm, push and pop have hi-reg handling version in Thumb2, 4832 // so only issue a diagnostic for thumb1. The instructions will be 4833 // switched to the t2 encodings in processInstruction() if necessary. 4834 case ARM::tPOP: { 4835 bool listContainsBase; 4836 if (checkLowRegisterList(Inst, 2, 0, ARM::PC, listContainsBase) && 4837 !isThumbTwo()) 4838 return Error(Operands[2]->getStartLoc(), 4839 "registers must be in range r0-r7 or pc"); 4840 break; 4841 } 4842 case ARM::tPUSH: { 4843 bool listContainsBase; 4844 if (checkLowRegisterList(Inst, 2, 0, ARM::LR, listContainsBase) && 4845 !isThumbTwo()) 4846 return Error(Operands[2]->getStartLoc(), 4847 "registers must be in range r0-r7 or lr"); 4848 break; 4849 } 4850 case ARM::tSTMIA_UPD: { 4851 bool listContainsBase; 4852 if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase) && !isThumbTwo()) 4853 return Error(Operands[4]->getStartLoc(), 4854 "registers must be in range r0-r7"); 4855 break; 4856 } 4857 } 4858 4859 return false; 4860 } 4861 4862 static unsigned getRealVSTLNOpcode(unsigned Opc) { 4863 switch(Opc) { 4864 default: assert(0 && "unexpected opcode!"); 4865 case ARM::VST1LNdWB_fixed_Asm_8: return ARM::VST1LNd8_UPD; 4866 case ARM::VST1LNdWB_fixed_Asm_P8: return ARM::VST1LNd8_UPD; 4867 case ARM::VST1LNdWB_fixed_Asm_I8: return ARM::VST1LNd8_UPD; 4868 case ARM::VST1LNdWB_fixed_Asm_S8: return ARM::VST1LNd8_UPD; 4869 case ARM::VST1LNdWB_fixed_Asm_U8: return ARM::VST1LNd8_UPD; 4870 case ARM::VST1LNdWB_fixed_Asm_16: return ARM::VST1LNd16_UPD; 4871 case ARM::VST1LNdWB_fixed_Asm_P16: return ARM::VST1LNd16_UPD; 4872 case ARM::VST1LNdWB_fixed_Asm_I16: return ARM::VST1LNd16_UPD; 4873 case ARM::VST1LNdWB_fixed_Asm_S16: return ARM::VST1LNd16_UPD; 4874 case ARM::VST1LNdWB_fixed_Asm_U16: return ARM::VST1LNd16_UPD; 4875 case ARM::VST1LNdWB_fixed_Asm_32: return ARM::VST1LNd32_UPD; 4876 case ARM::VST1LNdWB_fixed_Asm_F: return ARM::VST1LNd32_UPD; 4877 case ARM::VST1LNdWB_fixed_Asm_F32: return ARM::VST1LNd32_UPD; 4878 case ARM::VST1LNdWB_fixed_Asm_I32: return ARM::VST1LNd32_UPD; 4879 case ARM::VST1LNdWB_fixed_Asm_S32: return ARM::VST1LNd32_UPD; 4880 case ARM::VST1LNdWB_fixed_Asm_U32: return ARM::VST1LNd32_UPD; 4881 case ARM::VST1LNdWB_register_Asm_8: return ARM::VST1LNd8_UPD; 4882 case ARM::VST1LNdWB_register_Asm_P8: return ARM::VST1LNd8_UPD; 4883 case ARM::VST1LNdWB_register_Asm_I8: return ARM::VST1LNd8_UPD; 4884 case ARM::VST1LNdWB_register_Asm_S8: return ARM::VST1LNd8_UPD; 4885 case ARM::VST1LNdWB_register_Asm_U8: return ARM::VST1LNd8_UPD; 4886 case ARM::VST1LNdWB_register_Asm_16: return ARM::VST1LNd16_UPD; 4887 case ARM::VST1LNdWB_register_Asm_P16: return ARM::VST1LNd16_UPD; 4888 case ARM::VST1LNdWB_register_Asm_I16: return ARM::VST1LNd16_UPD; 4889 case ARM::VST1LNdWB_register_Asm_S16: return ARM::VST1LNd16_UPD; 4890 case ARM::VST1LNdWB_register_Asm_U16: return ARM::VST1LNd16_UPD; 4891 case ARM::VST1LNdWB_register_Asm_32: return ARM::VST1LNd32_UPD; 4892 case ARM::VST1LNdWB_register_Asm_F: return ARM::VST1LNd32_UPD; 4893 case ARM::VST1LNdWB_register_Asm_F32: return ARM::VST1LNd32_UPD; 4894 case ARM::VST1LNdWB_register_Asm_I32: return ARM::VST1LNd32_UPD; 4895 case ARM::VST1LNdWB_register_Asm_S32: return ARM::VST1LNd32_UPD; 4896 case ARM::VST1LNdWB_register_Asm_U32: return ARM::VST1LNd32_UPD; 4897 case ARM::VST1LNdAsm_8: return ARM::VST1LNd8; 4898 case ARM::VST1LNdAsm_P8: return ARM::VST1LNd8; 4899 case ARM::VST1LNdAsm_I8: return ARM::VST1LNd8; 4900 case ARM::VST1LNdAsm_S8: return ARM::VST1LNd8; 4901 case ARM::VST1LNdAsm_U8: return ARM::VST1LNd8; 4902 case ARM::VST1LNdAsm_16: return ARM::VST1LNd16; 4903 case ARM::VST1LNdAsm_P16: return ARM::VST1LNd16; 4904 case ARM::VST1LNdAsm_I16: return ARM::VST1LNd16; 4905 case ARM::VST1LNdAsm_S16: return ARM::VST1LNd16; 4906 case ARM::VST1LNdAsm_U16: return ARM::VST1LNd16; 4907 case ARM::VST1LNdAsm_32: return ARM::VST1LNd32; 4908 case ARM::VST1LNdAsm_F: return ARM::VST1LNd32; 4909 case ARM::VST1LNdAsm_F32: return ARM::VST1LNd32; 4910 case ARM::VST1LNdAsm_I32: return ARM::VST1LNd32; 4911 case ARM::VST1LNdAsm_S32: return ARM::VST1LNd32; 4912 case ARM::VST1LNdAsm_U32: return ARM::VST1LNd32; 4913 } 4914 } 4915 4916 static unsigned getRealVLDLNOpcode(unsigned Opc) { 4917 switch(Opc) { 4918 default: assert(0 && "unexpected opcode!"); 4919 case ARM::VLD1LNdWB_fixed_Asm_8: return ARM::VLD1LNd8_UPD; 4920 case ARM::VLD1LNdWB_fixed_Asm_P8: return ARM::VLD1LNd8_UPD; 4921 case ARM::VLD1LNdWB_fixed_Asm_I8: return ARM::VLD1LNd8_UPD; 4922 case ARM::VLD1LNdWB_fixed_Asm_S8: return ARM::VLD1LNd8_UPD; 4923 case ARM::VLD1LNdWB_fixed_Asm_U8: return ARM::VLD1LNd8_UPD; 4924 case ARM::VLD1LNdWB_fixed_Asm_16: return ARM::VLD1LNd16_UPD; 4925 case ARM::VLD1LNdWB_fixed_Asm_P16: return ARM::VLD1LNd16_UPD; 4926 case ARM::VLD1LNdWB_fixed_Asm_I16: return ARM::VLD1LNd16_UPD; 4927 case ARM::VLD1LNdWB_fixed_Asm_S16: return ARM::VLD1LNd16_UPD; 4928 case ARM::VLD1LNdWB_fixed_Asm_U16: return ARM::VLD1LNd16_UPD; 4929 case ARM::VLD1LNdWB_fixed_Asm_32: return ARM::VLD1LNd32_UPD; 4930 case ARM::VLD1LNdWB_fixed_Asm_F: return ARM::VLD1LNd32_UPD; 4931 case ARM::VLD1LNdWB_fixed_Asm_F32: return ARM::VLD1LNd32_UPD; 4932 case ARM::VLD1LNdWB_fixed_Asm_I32: return ARM::VLD1LNd32_UPD; 4933 case ARM::VLD1LNdWB_fixed_Asm_S32: return ARM::VLD1LNd32_UPD; 4934 case ARM::VLD1LNdWB_fixed_Asm_U32: return ARM::VLD1LNd32_UPD; 4935 case ARM::VLD1LNdWB_register_Asm_8: return ARM::VLD1LNd8_UPD; 4936 case ARM::VLD1LNdWB_register_Asm_P8: return ARM::VLD1LNd8_UPD; 4937 case ARM::VLD1LNdWB_register_Asm_I8: return ARM::VLD1LNd8_UPD; 4938 case ARM::VLD1LNdWB_register_Asm_S8: return ARM::VLD1LNd8_UPD; 4939 case ARM::VLD1LNdWB_register_Asm_U8: return ARM::VLD1LNd8_UPD; 4940 case ARM::VLD1LNdWB_register_Asm_16: return ARM::VLD1LNd16_UPD; 4941 case ARM::VLD1LNdWB_register_Asm_P16: return ARM::VLD1LNd16_UPD; 4942 case ARM::VLD1LNdWB_register_Asm_I16: return ARM::VLD1LNd16_UPD; 4943 case ARM::VLD1LNdWB_register_Asm_S16: return ARM::VLD1LNd16_UPD; 4944 case ARM::VLD1LNdWB_register_Asm_U16: return ARM::VLD1LNd16_UPD; 4945 case ARM::VLD1LNdWB_register_Asm_32: return ARM::VLD1LNd32_UPD; 4946 case ARM::VLD1LNdWB_register_Asm_F: return ARM::VLD1LNd32_UPD; 4947 case ARM::VLD1LNdWB_register_Asm_F32: return ARM::VLD1LNd32_UPD; 4948 case ARM::VLD1LNdWB_register_Asm_I32: return ARM::VLD1LNd32_UPD; 4949 case ARM::VLD1LNdWB_register_Asm_S32: return ARM::VLD1LNd32_UPD; 4950 case ARM::VLD1LNdWB_register_Asm_U32: return ARM::VLD1LNd32_UPD; 4951 case ARM::VLD1LNdAsm_8: return ARM::VLD1LNd8; 4952 case ARM::VLD1LNdAsm_P8: return ARM::VLD1LNd8; 4953 case ARM::VLD1LNdAsm_I8: return ARM::VLD1LNd8; 4954 case ARM::VLD1LNdAsm_S8: return ARM::VLD1LNd8; 4955 case ARM::VLD1LNdAsm_U8: return ARM::VLD1LNd8; 4956 case ARM::VLD1LNdAsm_16: return ARM::VLD1LNd16; 4957 case ARM::VLD1LNdAsm_P16: return ARM::VLD1LNd16; 4958 case ARM::VLD1LNdAsm_I16: return ARM::VLD1LNd16; 4959 case ARM::VLD1LNdAsm_S16: return ARM::VLD1LNd16; 4960 case ARM::VLD1LNdAsm_U16: return ARM::VLD1LNd16; 4961 case ARM::VLD1LNdAsm_32: return ARM::VLD1LNd32; 4962 case ARM::VLD1LNdAsm_F: return ARM::VLD1LNd32; 4963 case ARM::VLD1LNdAsm_F32: return ARM::VLD1LNd32; 4964 case ARM::VLD1LNdAsm_I32: return ARM::VLD1LNd32; 4965 case ARM::VLD1LNdAsm_S32: return ARM::VLD1LNd32; 4966 case ARM::VLD1LNdAsm_U32: return ARM::VLD1LNd32; 4967 } 4968 } 4969 4970 bool ARMAsmParser:: 4971 processInstruction(MCInst &Inst, 4972 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 4973 switch (Inst.getOpcode()) { 4974 // Handle NEON VST1 complex aliases. 4975 case ARM::VST1LNdWB_register_Asm_8: 4976 case ARM::VST1LNdWB_register_Asm_P8: 4977 case ARM::VST1LNdWB_register_Asm_I8: 4978 case ARM::VST1LNdWB_register_Asm_S8: 4979 case ARM::VST1LNdWB_register_Asm_U8: 4980 case ARM::VST1LNdWB_register_Asm_16: 4981 case ARM::VST1LNdWB_register_Asm_P16: 4982 case ARM::VST1LNdWB_register_Asm_I16: 4983 case ARM::VST1LNdWB_register_Asm_S16: 4984 case ARM::VST1LNdWB_register_Asm_U16: 4985 case ARM::VST1LNdWB_register_Asm_32: 4986 case ARM::VST1LNdWB_register_Asm_F: 4987 case ARM::VST1LNdWB_register_Asm_F32: 4988 case ARM::VST1LNdWB_register_Asm_I32: 4989 case ARM::VST1LNdWB_register_Asm_S32: 4990 case ARM::VST1LNdWB_register_Asm_U32: { 4991 MCInst TmpInst; 4992 // Shuffle the operands around so the lane index operand is in the 4993 // right place. 4994 TmpInst.setOpcode(getRealVSTLNOpcode(Inst.getOpcode())); 4995 TmpInst.addOperand(Inst.getOperand(2)); // Rn_wb 4996 TmpInst.addOperand(Inst.getOperand(2)); // Rn 4997 TmpInst.addOperand(Inst.getOperand(3)); // alignment 4998 TmpInst.addOperand(Inst.getOperand(4)); // Rm 4999 TmpInst.addOperand(Inst.getOperand(0)); // Vd 5000 TmpInst.addOperand(Inst.getOperand(1)); // lane 5001 TmpInst.addOperand(Inst.getOperand(5)); // CondCode 5002 TmpInst.addOperand(Inst.getOperand(6)); 5003 Inst = TmpInst; 5004 return true; 5005 } 5006 case ARM::VST1LNdWB_fixed_Asm_8: 5007 case ARM::VST1LNdWB_fixed_Asm_P8: 5008 case ARM::VST1LNdWB_fixed_Asm_I8: 5009 case ARM::VST1LNdWB_fixed_Asm_S8: 5010 case ARM::VST1LNdWB_fixed_Asm_U8: 5011 case ARM::VST1LNdWB_fixed_Asm_16: 5012 case ARM::VST1LNdWB_fixed_Asm_P16: 5013 case ARM::VST1LNdWB_fixed_Asm_I16: 5014 case ARM::VST1LNdWB_fixed_Asm_S16: 5015 case ARM::VST1LNdWB_fixed_Asm_U16: 5016 case ARM::VST1LNdWB_fixed_Asm_32: 5017 case ARM::VST1LNdWB_fixed_Asm_F: 5018 case ARM::VST1LNdWB_fixed_Asm_F32: 5019 case ARM::VST1LNdWB_fixed_Asm_I32: 5020 case ARM::VST1LNdWB_fixed_Asm_S32: 5021 case ARM::VST1LNdWB_fixed_Asm_U32: { 5022 MCInst TmpInst; 5023 // Shuffle the operands around so the lane index operand is in the 5024 // right place. 5025 TmpInst.setOpcode(getRealVSTLNOpcode(Inst.getOpcode())); 5026 TmpInst.addOperand(Inst.getOperand(2)); // Rn_wb 5027 TmpInst.addOperand(Inst.getOperand(2)); // Rn 5028 TmpInst.addOperand(Inst.getOperand(3)); // alignment 5029 TmpInst.addOperand(MCOperand::CreateReg(0)); // Rm 5030 TmpInst.addOperand(Inst.getOperand(0)); // Vd 5031 TmpInst.addOperand(Inst.getOperand(1)); // lane 5032 TmpInst.addOperand(Inst.getOperand(4)); // CondCode 5033 TmpInst.addOperand(Inst.getOperand(5)); 5034 Inst = TmpInst; 5035 return true; 5036 } 5037 case ARM::VST1LNdAsm_8: 5038 case ARM::VST1LNdAsm_P8: 5039 case ARM::VST1LNdAsm_I8: 5040 case ARM::VST1LNdAsm_S8: 5041 case ARM::VST1LNdAsm_U8: 5042 case ARM::VST1LNdAsm_16: 5043 case ARM::VST1LNdAsm_P16: 5044 case ARM::VST1LNdAsm_I16: 5045 case ARM::VST1LNdAsm_S16: 5046 case ARM::VST1LNdAsm_U16: 5047 case ARM::VST1LNdAsm_32: 5048 case ARM::VST1LNdAsm_F: 5049 case ARM::VST1LNdAsm_F32: 5050 case ARM::VST1LNdAsm_I32: 5051 case ARM::VST1LNdAsm_S32: 5052 case ARM::VST1LNdAsm_U32: { 5053 MCInst TmpInst; 5054 // Shuffle the operands around so the lane index operand is in the 5055 // right place. 5056 TmpInst.setOpcode(getRealVSTLNOpcode(Inst.getOpcode())); 5057 TmpInst.addOperand(Inst.getOperand(2)); // Rn 5058 TmpInst.addOperand(Inst.getOperand(3)); // alignment 5059 TmpInst.addOperand(Inst.getOperand(0)); // Vd 5060 TmpInst.addOperand(Inst.getOperand(1)); // lane 5061 TmpInst.addOperand(Inst.getOperand(4)); // CondCode 5062 TmpInst.addOperand(Inst.getOperand(5)); 5063 Inst = TmpInst; 5064 return true; 5065 } 5066 // Handle NEON VLD1 complex aliases. 5067 case ARM::VLD1LNdWB_register_Asm_8: 5068 case ARM::VLD1LNdWB_register_Asm_P8: 5069 case ARM::VLD1LNdWB_register_Asm_I8: 5070 case ARM::VLD1LNdWB_register_Asm_S8: 5071 case ARM::VLD1LNdWB_register_Asm_U8: 5072 case ARM::VLD1LNdWB_register_Asm_16: 5073 case ARM::VLD1LNdWB_register_Asm_P16: 5074 case ARM::VLD1LNdWB_register_Asm_I16: 5075 case ARM::VLD1LNdWB_register_Asm_S16: 5076 case ARM::VLD1LNdWB_register_Asm_U16: 5077 case ARM::VLD1LNdWB_register_Asm_32: 5078 case ARM::VLD1LNdWB_register_Asm_F: 5079 case ARM::VLD1LNdWB_register_Asm_F32: 5080 case ARM::VLD1LNdWB_register_Asm_I32: 5081 case ARM::VLD1LNdWB_register_Asm_S32: 5082 case ARM::VLD1LNdWB_register_Asm_U32: { 5083 MCInst TmpInst; 5084 // Shuffle the operands around so the lane index operand is in the 5085 // right place. 5086 TmpInst.setOpcode(getRealVLDLNOpcode(Inst.getOpcode())); 5087 TmpInst.addOperand(Inst.getOperand(0)); // Vd 5088 TmpInst.addOperand(Inst.getOperand(2)); // Rn_wb 5089 TmpInst.addOperand(Inst.getOperand(2)); // Rn 5090 TmpInst.addOperand(Inst.getOperand(3)); // alignment 5091 TmpInst.addOperand(Inst.getOperand(4)); // Rm 5092 TmpInst.addOperand(Inst.getOperand(0)); // Tied operand src (== Vd) 5093 TmpInst.addOperand(Inst.getOperand(1)); // lane 5094 TmpInst.addOperand(Inst.getOperand(5)); // CondCode 5095 TmpInst.addOperand(Inst.getOperand(6)); 5096 Inst = TmpInst; 5097 return true; 5098 } 5099 case ARM::VLD1LNdWB_fixed_Asm_8: 5100 case ARM::VLD1LNdWB_fixed_Asm_P8: 5101 case ARM::VLD1LNdWB_fixed_Asm_I8: 5102 case ARM::VLD1LNdWB_fixed_Asm_S8: 5103 case ARM::VLD1LNdWB_fixed_Asm_U8: 5104 case ARM::VLD1LNdWB_fixed_Asm_16: 5105 case ARM::VLD1LNdWB_fixed_Asm_P16: 5106 case ARM::VLD1LNdWB_fixed_Asm_I16: 5107 case ARM::VLD1LNdWB_fixed_Asm_S16: 5108 case ARM::VLD1LNdWB_fixed_Asm_U16: 5109 case ARM::VLD1LNdWB_fixed_Asm_32: 5110 case ARM::VLD1LNdWB_fixed_Asm_F: 5111 case ARM::VLD1LNdWB_fixed_Asm_F32: 5112 case ARM::VLD1LNdWB_fixed_Asm_I32: 5113 case ARM::VLD1LNdWB_fixed_Asm_S32: 5114 case ARM::VLD1LNdWB_fixed_Asm_U32: { 5115 MCInst TmpInst; 5116 // Shuffle the operands around so the lane index operand is in the 5117 // right place. 5118 TmpInst.setOpcode(getRealVLDLNOpcode(Inst.getOpcode())); 5119 TmpInst.addOperand(Inst.getOperand(0)); // Vd 5120 TmpInst.addOperand(Inst.getOperand(2)); // Rn_wb 5121 TmpInst.addOperand(Inst.getOperand(2)); // Rn 5122 TmpInst.addOperand(Inst.getOperand(3)); // alignment 5123 TmpInst.addOperand(MCOperand::CreateReg(0)); // Rm 5124 TmpInst.addOperand(Inst.getOperand(0)); // Tied operand src (== Vd) 5125 TmpInst.addOperand(Inst.getOperand(1)); // lane 5126 TmpInst.addOperand(Inst.getOperand(4)); // CondCode 5127 TmpInst.addOperand(Inst.getOperand(5)); 5128 Inst = TmpInst; 5129 return true; 5130 } 5131 case ARM::VLD1LNdAsm_8: 5132 case ARM::VLD1LNdAsm_P8: 5133 case ARM::VLD1LNdAsm_I8: 5134 case ARM::VLD1LNdAsm_S8: 5135 case ARM::VLD1LNdAsm_U8: 5136 case ARM::VLD1LNdAsm_16: 5137 case ARM::VLD1LNdAsm_P16: 5138 case ARM::VLD1LNdAsm_I16: 5139 case ARM::VLD1LNdAsm_S16: 5140 case ARM::VLD1LNdAsm_U16: 5141 case ARM::VLD1LNdAsm_32: 5142 case ARM::VLD1LNdAsm_F: 5143 case ARM::VLD1LNdAsm_F32: 5144 case ARM::VLD1LNdAsm_I32: 5145 case ARM::VLD1LNdAsm_S32: 5146 case ARM::VLD1LNdAsm_U32: { 5147 MCInst TmpInst; 5148 // Shuffle the operands around so the lane index operand is in the 5149 // right place. 5150 TmpInst.setOpcode(getRealVLDLNOpcode(Inst.getOpcode())); 5151 TmpInst.addOperand(Inst.getOperand(0)); // Vd 5152 TmpInst.addOperand(Inst.getOperand(2)); // Rn 5153 TmpInst.addOperand(Inst.getOperand(3)); // alignment 5154 TmpInst.addOperand(Inst.getOperand(0)); // Tied operand src (== Vd) 5155 TmpInst.addOperand(Inst.getOperand(1)); // lane 5156 TmpInst.addOperand(Inst.getOperand(4)); // CondCode 5157 TmpInst.addOperand(Inst.getOperand(5)); 5158 Inst = TmpInst; 5159 return true; 5160 } 5161 // Handle the MOV complex aliases. 5162 case ARM::ASRr: 5163 case ARM::LSRr: 5164 case ARM::LSLr: 5165 case ARM::RORr: { 5166 ARM_AM::ShiftOpc ShiftTy; 5167 switch(Inst.getOpcode()) { 5168 default: llvm_unreachable("unexpected opcode!"); 5169 case ARM::ASRr: ShiftTy = ARM_AM::asr; break; 5170 case ARM::LSRr: ShiftTy = ARM_AM::lsr; break; 5171 case ARM::LSLr: ShiftTy = ARM_AM::lsl; break; 5172 case ARM::RORr: ShiftTy = ARM_AM::ror; break; 5173 } 5174 // A shift by zero is a plain MOVr, not a MOVsi. 5175 unsigned Shifter = ARM_AM::getSORegOpc(ShiftTy, 0); 5176 MCInst TmpInst; 5177 TmpInst.setOpcode(ARM::MOVsr); 5178 TmpInst.addOperand(Inst.getOperand(0)); // Rd 5179 TmpInst.addOperand(Inst.getOperand(1)); // Rn 5180 TmpInst.addOperand(Inst.getOperand(2)); // Rm 5181 TmpInst.addOperand(MCOperand::CreateImm(Shifter)); // Shift value and ty 5182 TmpInst.addOperand(Inst.getOperand(3)); // CondCode 5183 TmpInst.addOperand(Inst.getOperand(4)); 5184 TmpInst.addOperand(Inst.getOperand(5)); // cc_out 5185 Inst = TmpInst; 5186 return true; 5187 } 5188 case ARM::ASRi: 5189 case ARM::LSRi: 5190 case ARM::LSLi: 5191 case ARM::RORi: { 5192 ARM_AM::ShiftOpc ShiftTy; 5193 switch(Inst.getOpcode()) { 5194 default: llvm_unreachable("unexpected opcode!"); 5195 case ARM::ASRi: ShiftTy = ARM_AM::asr; break; 5196 case ARM::LSRi: ShiftTy = ARM_AM::lsr; break; 5197 case ARM::LSLi: ShiftTy = ARM_AM::lsl; break; 5198 case ARM::RORi: ShiftTy = ARM_AM::ror; break; 5199 } 5200 // A shift by zero is a plain MOVr, not a MOVsi. 5201 unsigned Amt = Inst.getOperand(2).getImm(); 5202 unsigned Opc = Amt == 0 ? ARM::MOVr : ARM::MOVsi; 5203 unsigned Shifter = ARM_AM::getSORegOpc(ShiftTy, Amt); 5204 MCInst TmpInst; 5205 TmpInst.setOpcode(Opc); 5206 TmpInst.addOperand(Inst.getOperand(0)); // Rd 5207 TmpInst.addOperand(Inst.getOperand(1)); // Rn 5208 if (Opc == ARM::MOVsi) 5209 TmpInst.addOperand(MCOperand::CreateImm(Shifter)); // Shift value and ty 5210 TmpInst.addOperand(Inst.getOperand(3)); // CondCode 5211 TmpInst.addOperand(Inst.getOperand(4)); 5212 TmpInst.addOperand(Inst.getOperand(5)); // cc_out 5213 Inst = TmpInst; 5214 return true; 5215 } 5216 case ARM::RRXi: { 5217 unsigned Shifter = ARM_AM::getSORegOpc(ARM_AM::rrx, 0); 5218 MCInst TmpInst; 5219 TmpInst.setOpcode(ARM::MOVsi); 5220 TmpInst.addOperand(Inst.getOperand(0)); // Rd 5221 TmpInst.addOperand(Inst.getOperand(1)); // Rn 5222 TmpInst.addOperand(MCOperand::CreateImm(Shifter)); // Shift value and ty 5223 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 5224 TmpInst.addOperand(Inst.getOperand(3)); 5225 TmpInst.addOperand(Inst.getOperand(4)); // cc_out 5226 Inst = TmpInst; 5227 return true; 5228 } 5229 case ARM::t2LDMIA_UPD: { 5230 // If this is a load of a single register, then we should use 5231 // a post-indexed LDR instruction instead, per the ARM ARM. 5232 if (Inst.getNumOperands() != 5) 5233 return false; 5234 MCInst TmpInst; 5235 TmpInst.setOpcode(ARM::t2LDR_POST); 5236 TmpInst.addOperand(Inst.getOperand(4)); // Rt 5237 TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb 5238 TmpInst.addOperand(Inst.getOperand(1)); // Rn 5239 TmpInst.addOperand(MCOperand::CreateImm(4)); 5240 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 5241 TmpInst.addOperand(Inst.getOperand(3)); 5242 Inst = TmpInst; 5243 return true; 5244 } 5245 case ARM::t2STMDB_UPD: { 5246 // If this is a store of a single register, then we should use 5247 // a pre-indexed STR instruction instead, per the ARM ARM. 5248 if (Inst.getNumOperands() != 5) 5249 return false; 5250 MCInst TmpInst; 5251 TmpInst.setOpcode(ARM::t2STR_PRE); 5252 TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb 5253 TmpInst.addOperand(Inst.getOperand(4)); // Rt 5254 TmpInst.addOperand(Inst.getOperand(1)); // Rn 5255 TmpInst.addOperand(MCOperand::CreateImm(-4)); 5256 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 5257 TmpInst.addOperand(Inst.getOperand(3)); 5258 Inst = TmpInst; 5259 return true; 5260 } 5261 case ARM::LDMIA_UPD: 5262 // If this is a load of a single register via a 'pop', then we should use 5263 // a post-indexed LDR instruction instead, per the ARM ARM. 5264 if (static_cast<ARMOperand*>(Operands[0])->getToken() == "pop" && 5265 Inst.getNumOperands() == 5) { 5266 MCInst TmpInst; 5267 TmpInst.setOpcode(ARM::LDR_POST_IMM); 5268 TmpInst.addOperand(Inst.getOperand(4)); // Rt 5269 TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb 5270 TmpInst.addOperand(Inst.getOperand(1)); // Rn 5271 TmpInst.addOperand(MCOperand::CreateReg(0)); // am2offset 5272 TmpInst.addOperand(MCOperand::CreateImm(4)); 5273 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 5274 TmpInst.addOperand(Inst.getOperand(3)); 5275 Inst = TmpInst; 5276 return true; 5277 } 5278 break; 5279 case ARM::STMDB_UPD: 5280 // If this is a store of a single register via a 'push', then we should use 5281 // a pre-indexed STR instruction instead, per the ARM ARM. 5282 if (static_cast<ARMOperand*>(Operands[0])->getToken() == "push" && 5283 Inst.getNumOperands() == 5) { 5284 MCInst TmpInst; 5285 TmpInst.setOpcode(ARM::STR_PRE_IMM); 5286 TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb 5287 TmpInst.addOperand(Inst.getOperand(4)); // Rt 5288 TmpInst.addOperand(Inst.getOperand(1)); // addrmode_imm12 5289 TmpInst.addOperand(MCOperand::CreateImm(-4)); 5290 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 5291 TmpInst.addOperand(Inst.getOperand(3)); 5292 Inst = TmpInst; 5293 } 5294 break; 5295 case ARM::t2ADDri12: 5296 // If the immediate fits for encoding T3 (t2ADDri) and the generic "add" 5297 // mnemonic was used (not "addw"), encoding T3 is preferred. 5298 if (static_cast<ARMOperand*>(Operands[0])->getToken() != "add" || 5299 ARM_AM::getT2SOImmVal(Inst.getOperand(2).getImm()) == -1) 5300 break; 5301 Inst.setOpcode(ARM::t2ADDri); 5302 Inst.addOperand(MCOperand::CreateReg(0)); // cc_out 5303 break; 5304 case ARM::t2SUBri12: 5305 // If the immediate fits for encoding T3 (t2SUBri) and the generic "sub" 5306 // mnemonic was used (not "subw"), encoding T3 is preferred. 5307 if (static_cast<ARMOperand*>(Operands[0])->getToken() != "sub" || 5308 ARM_AM::getT2SOImmVal(Inst.getOperand(2).getImm()) == -1) 5309 break; 5310 Inst.setOpcode(ARM::t2SUBri); 5311 Inst.addOperand(MCOperand::CreateReg(0)); // cc_out 5312 break; 5313 case ARM::tADDi8: 5314 // If the immediate is in the range 0-7, we want tADDi3 iff Rd was 5315 // explicitly specified. From the ARM ARM: "Encoding T1 is preferred 5316 // to encoding T2 if <Rd> is specified and encoding T2 is preferred 5317 // to encoding T1 if <Rd> is omitted." 5318 if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6) { 5319 Inst.setOpcode(ARM::tADDi3); 5320 return true; 5321 } 5322 break; 5323 case ARM::tSUBi8: 5324 // If the immediate is in the range 0-7, we want tADDi3 iff Rd was 5325 // explicitly specified. From the ARM ARM: "Encoding T1 is preferred 5326 // to encoding T2 if <Rd> is specified and encoding T2 is preferred 5327 // to encoding T1 if <Rd> is omitted." 5328 if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6) { 5329 Inst.setOpcode(ARM::tSUBi3); 5330 return true; 5331 } 5332 break; 5333 case ARM::t2ADDrr: { 5334 // If the destination and first source operand are the same, and 5335 // there's no setting of the flags, use encoding T2 instead of T3. 5336 // Note that this is only for ADD, not SUB. This mirrors the system 5337 // 'as' behaviour. Make sure the wide encoding wasn't explicit. 5338 if (Inst.getOperand(0).getReg() != Inst.getOperand(1).getReg() || 5339 Inst.getOperand(5).getReg() != 0 || 5340 (static_cast<ARMOperand*>(Operands[3])->isToken() && 5341 static_cast<ARMOperand*>(Operands[3])->getToken() == ".w")) 5342 break; 5343 MCInst TmpInst; 5344 TmpInst.setOpcode(ARM::tADDhirr); 5345 TmpInst.addOperand(Inst.getOperand(0)); 5346 TmpInst.addOperand(Inst.getOperand(0)); 5347 TmpInst.addOperand(Inst.getOperand(2)); 5348 TmpInst.addOperand(Inst.getOperand(3)); 5349 TmpInst.addOperand(Inst.getOperand(4)); 5350 Inst = TmpInst; 5351 return true; 5352 } 5353 case ARM::tB: 5354 // A Thumb conditional branch outside of an IT block is a tBcc. 5355 if (Inst.getOperand(1).getImm() != ARMCC::AL && !inITBlock()) { 5356 Inst.setOpcode(ARM::tBcc); 5357 return true; 5358 } 5359 break; 5360 case ARM::t2B: 5361 // A Thumb2 conditional branch outside of an IT block is a t2Bcc. 5362 if (Inst.getOperand(1).getImm() != ARMCC::AL && !inITBlock()){ 5363 Inst.setOpcode(ARM::t2Bcc); 5364 return true; 5365 } 5366 break; 5367 case ARM::t2Bcc: 5368 // If the conditional is AL or we're in an IT block, we really want t2B. 5369 if (Inst.getOperand(1).getImm() == ARMCC::AL || inITBlock()) { 5370 Inst.setOpcode(ARM::t2B); 5371 return true; 5372 } 5373 break; 5374 case ARM::tBcc: 5375 // If the conditional is AL, we really want tB. 5376 if (Inst.getOperand(1).getImm() == ARMCC::AL) { 5377 Inst.setOpcode(ARM::tB); 5378 return true; 5379 } 5380 break; 5381 case ARM::tLDMIA: { 5382 // If the register list contains any high registers, or if the writeback 5383 // doesn't match what tLDMIA can do, we need to use the 32-bit encoding 5384 // instead if we're in Thumb2. Otherwise, this should have generated 5385 // an error in validateInstruction(). 5386 unsigned Rn = Inst.getOperand(0).getReg(); 5387 bool hasWritebackToken = 5388 (static_cast<ARMOperand*>(Operands[3])->isToken() && 5389 static_cast<ARMOperand*>(Operands[3])->getToken() == "!"); 5390 bool listContainsBase; 5391 if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) || 5392 (!listContainsBase && !hasWritebackToken) || 5393 (listContainsBase && hasWritebackToken)) { 5394 // 16-bit encoding isn't sufficient. Switch to the 32-bit version. 5395 assert (isThumbTwo()); 5396 Inst.setOpcode(hasWritebackToken ? ARM::t2LDMIA_UPD : ARM::t2LDMIA); 5397 // If we're switching to the updating version, we need to insert 5398 // the writeback tied operand. 5399 if (hasWritebackToken) 5400 Inst.insert(Inst.begin(), 5401 MCOperand::CreateReg(Inst.getOperand(0).getReg())); 5402 return true; 5403 } 5404 break; 5405 } 5406 case ARM::tSTMIA_UPD: { 5407 // If the register list contains any high registers, we need to use 5408 // the 32-bit encoding instead if we're in Thumb2. Otherwise, this 5409 // should have generated an error in validateInstruction(). 5410 unsigned Rn = Inst.getOperand(0).getReg(); 5411 bool listContainsBase; 5412 if (checkLowRegisterList(Inst, 4, Rn, 0, listContainsBase)) { 5413 // 16-bit encoding isn't sufficient. Switch to the 32-bit version. 5414 assert (isThumbTwo()); 5415 Inst.setOpcode(ARM::t2STMIA_UPD); 5416 return true; 5417 } 5418 break; 5419 } 5420 case ARM::tPOP: { 5421 bool listContainsBase; 5422 // If the register list contains any high registers, we need to use 5423 // the 32-bit encoding instead if we're in Thumb2. Otherwise, this 5424 // should have generated an error in validateInstruction(). 5425 if (!checkLowRegisterList(Inst, 2, 0, ARM::PC, listContainsBase)) 5426 return false; 5427 assert (isThumbTwo()); 5428 Inst.setOpcode(ARM::t2LDMIA_UPD); 5429 // Add the base register and writeback operands. 5430 Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP)); 5431 Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP)); 5432 return true; 5433 } 5434 case ARM::tPUSH: { 5435 bool listContainsBase; 5436 if (!checkLowRegisterList(Inst, 2, 0, ARM::LR, listContainsBase)) 5437 return false; 5438 assert (isThumbTwo()); 5439 Inst.setOpcode(ARM::t2STMDB_UPD); 5440 // Add the base register and writeback operands. 5441 Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP)); 5442 Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP)); 5443 return true; 5444 } 5445 case ARM::t2MOVi: { 5446 // If we can use the 16-bit encoding and the user didn't explicitly 5447 // request the 32-bit variant, transform it here. 5448 if (isARMLowRegister(Inst.getOperand(0).getReg()) && 5449 Inst.getOperand(1).getImm() <= 255 && 5450 ((!inITBlock() && Inst.getOperand(2).getImm() == ARMCC::AL && 5451 Inst.getOperand(4).getReg() == ARM::CPSR) || 5452 (inITBlock() && Inst.getOperand(4).getReg() == 0)) && 5453 (!static_cast<ARMOperand*>(Operands[2])->isToken() || 5454 static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) { 5455 // The operands aren't in the same order for tMOVi8... 5456 MCInst TmpInst; 5457 TmpInst.setOpcode(ARM::tMOVi8); 5458 TmpInst.addOperand(Inst.getOperand(0)); 5459 TmpInst.addOperand(Inst.getOperand(4)); 5460 TmpInst.addOperand(Inst.getOperand(1)); 5461 TmpInst.addOperand(Inst.getOperand(2)); 5462 TmpInst.addOperand(Inst.getOperand(3)); 5463 Inst = TmpInst; 5464 return true; 5465 } 5466 break; 5467 } 5468 case ARM::t2MOVr: { 5469 // If we can use the 16-bit encoding and the user didn't explicitly 5470 // request the 32-bit variant, transform it here. 5471 if (isARMLowRegister(Inst.getOperand(0).getReg()) && 5472 isARMLowRegister(Inst.getOperand(1).getReg()) && 5473 Inst.getOperand(2).getImm() == ARMCC::AL && 5474 Inst.getOperand(4).getReg() == ARM::CPSR && 5475 (!static_cast<ARMOperand*>(Operands[2])->isToken() || 5476 static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) { 5477 // The operands aren't the same for tMOV[S]r... (no cc_out) 5478 MCInst TmpInst; 5479 TmpInst.setOpcode(Inst.getOperand(4).getReg() ? ARM::tMOVSr : ARM::tMOVr); 5480 TmpInst.addOperand(Inst.getOperand(0)); 5481 TmpInst.addOperand(Inst.getOperand(1)); 5482 TmpInst.addOperand(Inst.getOperand(2)); 5483 TmpInst.addOperand(Inst.getOperand(3)); 5484 Inst = TmpInst; 5485 return true; 5486 } 5487 break; 5488 } 5489 case ARM::t2SXTH: 5490 case ARM::t2SXTB: 5491 case ARM::t2UXTH: 5492 case ARM::t2UXTB: { 5493 // If we can use the 16-bit encoding and the user didn't explicitly 5494 // request the 32-bit variant, transform it here. 5495 if (isARMLowRegister(Inst.getOperand(0).getReg()) && 5496 isARMLowRegister(Inst.getOperand(1).getReg()) && 5497 Inst.getOperand(2).getImm() == 0 && 5498 (!static_cast<ARMOperand*>(Operands[2])->isToken() || 5499 static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) { 5500 unsigned NewOpc; 5501 switch (Inst.getOpcode()) { 5502 default: llvm_unreachable("Illegal opcode!"); 5503 case ARM::t2SXTH: NewOpc = ARM::tSXTH; break; 5504 case ARM::t2SXTB: NewOpc = ARM::tSXTB; break; 5505 case ARM::t2UXTH: NewOpc = ARM::tUXTH; break; 5506 case ARM::t2UXTB: NewOpc = ARM::tUXTB; break; 5507 } 5508 // The operands aren't the same for thumb1 (no rotate operand). 5509 MCInst TmpInst; 5510 TmpInst.setOpcode(NewOpc); 5511 TmpInst.addOperand(Inst.getOperand(0)); 5512 TmpInst.addOperand(Inst.getOperand(1)); 5513 TmpInst.addOperand(Inst.getOperand(3)); 5514 TmpInst.addOperand(Inst.getOperand(4)); 5515 Inst = TmpInst; 5516 return true; 5517 } 5518 break; 5519 } 5520 case ARM::t2IT: { 5521 // The mask bits for all but the first condition are represented as 5522 // the low bit of the condition code value implies 't'. We currently 5523 // always have 1 implies 't', so XOR toggle the bits if the low bit 5524 // of the condition code is zero. The encoding also expects the low 5525 // bit of the condition to be encoded as bit 4 of the mask operand, 5526 // so mask that in if needed 5527 MCOperand &MO = Inst.getOperand(1); 5528 unsigned Mask = MO.getImm(); 5529 unsigned OrigMask = Mask; 5530 unsigned TZ = CountTrailingZeros_32(Mask); 5531 if ((Inst.getOperand(0).getImm() & 1) == 0) { 5532 assert(Mask && TZ <= 3 && "illegal IT mask value!"); 5533 for (unsigned i = 3; i != TZ; --i) 5534 Mask ^= 1 << i; 5535 } else 5536 Mask |= 0x10; 5537 MO.setImm(Mask); 5538 5539 // Set up the IT block state according to the IT instruction we just 5540 // matched. 5541 assert(!inITBlock() && "nested IT blocks?!"); 5542 ITState.Cond = ARMCC::CondCodes(Inst.getOperand(0).getImm()); 5543 ITState.Mask = OrigMask; // Use the original mask, not the updated one. 5544 ITState.CurPosition = 0; 5545 ITState.FirstCond = true; 5546 break; 5547 } 5548 } 5549 return false; 5550 } 5551 5552 unsigned ARMAsmParser::checkTargetMatchPredicate(MCInst &Inst) { 5553 // 16-bit thumb arithmetic instructions either require or preclude the 'S' 5554 // suffix depending on whether they're in an IT block or not. 5555 unsigned Opc = Inst.getOpcode(); 5556 const MCInstrDesc &MCID = getInstDesc(Opc); 5557 if (MCID.TSFlags & ARMII::ThumbArithFlagSetting) { 5558 assert(MCID.hasOptionalDef() && 5559 "optionally flag setting instruction missing optional def operand"); 5560 assert(MCID.NumOperands == Inst.getNumOperands() && 5561 "operand count mismatch!"); 5562 // Find the optional-def operand (cc_out). 5563 unsigned OpNo; 5564 for (OpNo = 0; 5565 !MCID.OpInfo[OpNo].isOptionalDef() && OpNo < MCID.NumOperands; 5566 ++OpNo) 5567 ; 5568 // If we're parsing Thumb1, reject it completely. 5569 if (isThumbOne() && Inst.getOperand(OpNo).getReg() != ARM::CPSR) 5570 return Match_MnemonicFail; 5571 // If we're parsing Thumb2, which form is legal depends on whether we're 5572 // in an IT block. 5573 if (isThumbTwo() && Inst.getOperand(OpNo).getReg() != ARM::CPSR && 5574 !inITBlock()) 5575 return Match_RequiresITBlock; 5576 if (isThumbTwo() && Inst.getOperand(OpNo).getReg() == ARM::CPSR && 5577 inITBlock()) 5578 return Match_RequiresNotITBlock; 5579 } 5580 // Some high-register supporting Thumb1 encodings only allow both registers 5581 // to be from r0-r7 when in Thumb2. 5582 else if (Opc == ARM::tADDhirr && isThumbOne() && 5583 isARMLowRegister(Inst.getOperand(1).getReg()) && 5584 isARMLowRegister(Inst.getOperand(2).getReg())) 5585 return Match_RequiresThumb2; 5586 // Others only require ARMv6 or later. 5587 else if (Opc == ARM::tMOVr && isThumbOne() && !hasV6Ops() && 5588 isARMLowRegister(Inst.getOperand(0).getReg()) && 5589 isARMLowRegister(Inst.getOperand(1).getReg())) 5590 return Match_RequiresV6; 5591 return Match_Success; 5592 } 5593 5594 bool ARMAsmParser:: 5595 MatchAndEmitInstruction(SMLoc IDLoc, 5596 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 5597 MCStreamer &Out) { 5598 MCInst Inst; 5599 unsigned ErrorInfo; 5600 unsigned MatchResult; 5601 MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo); 5602 switch (MatchResult) { 5603 default: break; 5604 case Match_Success: 5605 // Context sensitive operand constraints aren't handled by the matcher, 5606 // so check them here. 5607 if (validateInstruction(Inst, Operands)) { 5608 // Still progress the IT block, otherwise one wrong condition causes 5609 // nasty cascading errors. 5610 forwardITPosition(); 5611 return true; 5612 } 5613 5614 // Some instructions need post-processing to, for example, tweak which 5615 // encoding is selected. Loop on it while changes happen so the 5616 // individual transformations can chain off each other. E.g., 5617 // tPOP(r8)->t2LDMIA_UPD(sp,r8)->t2STR_POST(sp,r8) 5618 while (processInstruction(Inst, Operands)) 5619 ; 5620 5621 // Only move forward at the very end so that everything in validate 5622 // and process gets a consistent answer about whether we're in an IT 5623 // block. 5624 forwardITPosition(); 5625 5626 Out.EmitInstruction(Inst); 5627 return false; 5628 case Match_MissingFeature: 5629 Error(IDLoc, "instruction requires a CPU feature not currently enabled"); 5630 return true; 5631 case Match_InvalidOperand: { 5632 SMLoc ErrorLoc = IDLoc; 5633 if (ErrorInfo != ~0U) { 5634 if (ErrorInfo >= Operands.size()) 5635 return Error(IDLoc, "too few operands for instruction"); 5636 5637 ErrorLoc = ((ARMOperand*)Operands[ErrorInfo])->getStartLoc(); 5638 if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc; 5639 } 5640 5641 return Error(ErrorLoc, "invalid operand for instruction"); 5642 } 5643 case Match_MnemonicFail: 5644 return Error(IDLoc, "invalid instruction"); 5645 case Match_ConversionFail: 5646 // The converter function will have already emited a diagnostic. 5647 return true; 5648 case Match_RequiresNotITBlock: 5649 return Error(IDLoc, "flag setting instruction only valid outside IT block"); 5650 case Match_RequiresITBlock: 5651 return Error(IDLoc, "instruction only valid inside IT block"); 5652 case Match_RequiresV6: 5653 return Error(IDLoc, "instruction variant requires ARMv6 or later"); 5654 case Match_RequiresThumb2: 5655 return Error(IDLoc, "instruction variant requires Thumb2"); 5656 } 5657 5658 llvm_unreachable("Implement any new match types added!"); 5659 return true; 5660 } 5661 5662 /// parseDirective parses the arm specific directives 5663 bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) { 5664 StringRef IDVal = DirectiveID.getIdentifier(); 5665 if (IDVal == ".word") 5666 return parseDirectiveWord(4, DirectiveID.getLoc()); 5667 else if (IDVal == ".thumb") 5668 return parseDirectiveThumb(DirectiveID.getLoc()); 5669 else if (IDVal == ".arm") 5670 return parseDirectiveARM(DirectiveID.getLoc()); 5671 else if (IDVal == ".thumb_func") 5672 return parseDirectiveThumbFunc(DirectiveID.getLoc()); 5673 else if (IDVal == ".code") 5674 return parseDirectiveCode(DirectiveID.getLoc()); 5675 else if (IDVal == ".syntax") 5676 return parseDirectiveSyntax(DirectiveID.getLoc()); 5677 return true; 5678 } 5679 5680 /// parseDirectiveWord 5681 /// ::= .word [ expression (, expression)* ] 5682 bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) { 5683 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5684 for (;;) { 5685 const MCExpr *Value; 5686 if (getParser().ParseExpression(Value)) 5687 return true; 5688 5689 getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/); 5690 5691 if (getLexer().is(AsmToken::EndOfStatement)) 5692 break; 5693 5694 // FIXME: Improve diagnostic. 5695 if (getLexer().isNot(AsmToken::Comma)) 5696 return Error(L, "unexpected token in directive"); 5697 Parser.Lex(); 5698 } 5699 } 5700 5701 Parser.Lex(); 5702 return false; 5703 } 5704 5705 /// parseDirectiveThumb 5706 /// ::= .thumb 5707 bool ARMAsmParser::parseDirectiveThumb(SMLoc L) { 5708 if (getLexer().isNot(AsmToken::EndOfStatement)) 5709 return Error(L, "unexpected token in directive"); 5710 Parser.Lex(); 5711 5712 if (!isThumb()) 5713 SwitchMode(); 5714 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16); 5715 return false; 5716 } 5717 5718 /// parseDirectiveARM 5719 /// ::= .arm 5720 bool ARMAsmParser::parseDirectiveARM(SMLoc L) { 5721 if (getLexer().isNot(AsmToken::EndOfStatement)) 5722 return Error(L, "unexpected token in directive"); 5723 Parser.Lex(); 5724 5725 if (isThumb()) 5726 SwitchMode(); 5727 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32); 5728 return false; 5729 } 5730 5731 /// parseDirectiveThumbFunc 5732 /// ::= .thumbfunc symbol_name 5733 bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) { 5734 const MCAsmInfo &MAI = getParser().getStreamer().getContext().getAsmInfo(); 5735 bool isMachO = MAI.hasSubsectionsViaSymbols(); 5736 StringRef Name; 5737 5738 // Darwin asm has function name after .thumb_func direction 5739 // ELF doesn't 5740 if (isMachO) { 5741 const AsmToken &Tok = Parser.getTok(); 5742 if (Tok.isNot(AsmToken::Identifier) && Tok.isNot(AsmToken::String)) 5743 return Error(L, "unexpected token in .thumb_func directive"); 5744 Name = Tok.getIdentifier(); 5745 Parser.Lex(); // Consume the identifier token. 5746 } 5747 5748 if (getLexer().isNot(AsmToken::EndOfStatement)) 5749 return Error(L, "unexpected token in directive"); 5750 Parser.Lex(); 5751 5752 // FIXME: assuming function name will be the line following .thumb_func 5753 if (!isMachO) { 5754 Name = Parser.getTok().getIdentifier(); 5755 } 5756 5757 // Mark symbol as a thumb symbol. 5758 MCSymbol *Func = getParser().getContext().GetOrCreateSymbol(Name); 5759 getParser().getStreamer().EmitThumbFunc(Func); 5760 return false; 5761 } 5762 5763 /// parseDirectiveSyntax 5764 /// ::= .syntax unified | divided 5765 bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) { 5766 const AsmToken &Tok = Parser.getTok(); 5767 if (Tok.isNot(AsmToken::Identifier)) 5768 return Error(L, "unexpected token in .syntax directive"); 5769 StringRef Mode = Tok.getString(); 5770 if (Mode == "unified" || Mode == "UNIFIED") 5771 Parser.Lex(); 5772 else if (Mode == "divided" || Mode == "DIVIDED") 5773 return Error(L, "'.syntax divided' arm asssembly not supported"); 5774 else 5775 return Error(L, "unrecognized syntax mode in .syntax directive"); 5776 5777 if (getLexer().isNot(AsmToken::EndOfStatement)) 5778 return Error(Parser.getTok().getLoc(), "unexpected token in directive"); 5779 Parser.Lex(); 5780 5781 // TODO tell the MC streamer the mode 5782 // getParser().getStreamer().Emit???(); 5783 return false; 5784 } 5785 5786 /// parseDirectiveCode 5787 /// ::= .code 16 | 32 5788 bool ARMAsmParser::parseDirectiveCode(SMLoc L) { 5789 const AsmToken &Tok = Parser.getTok(); 5790 if (Tok.isNot(AsmToken::Integer)) 5791 return Error(L, "unexpected token in .code directive"); 5792 int64_t Val = Parser.getTok().getIntVal(); 5793 if (Val == 16) 5794 Parser.Lex(); 5795 else if (Val == 32) 5796 Parser.Lex(); 5797 else 5798 return Error(L, "invalid operand to .code directive"); 5799 5800 if (getLexer().isNot(AsmToken::EndOfStatement)) 5801 return Error(Parser.getTok().getLoc(), "unexpected token in directive"); 5802 Parser.Lex(); 5803 5804 if (Val == 16) { 5805 if (!isThumb()) 5806 SwitchMode(); 5807 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16); 5808 } else { 5809 if (isThumb()) 5810 SwitchMode(); 5811 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32); 5812 } 5813 5814 return false; 5815 } 5816 5817 extern "C" void LLVMInitializeARMAsmLexer(); 5818 5819 /// Force static initialization. 5820 extern "C" void LLVMInitializeARMAsmParser() { 5821 RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget); 5822 RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget); 5823 LLVMInitializeARMAsmLexer(); 5824 } 5825 5826 #define GET_REGISTER_MATCHER 5827 #define GET_MATCHER_IMPLEMENTATION 5828 #include "ARMGenAsmMatcher.inc" 5829