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