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