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