ARMAsmParser.cpp revision eeec025cf5a2236ee9527a3312496a6ea42100c6
1//===-- ARMAsmParser.cpp - Parse ARM assembly to MCInst instructions ------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "MCTargetDesc/ARMBaseInfo.h" 11#include "MCTargetDesc/ARMAddressingModes.h" 12#include "MCTargetDesc/ARMMCExpr.h" 13#include "llvm/MC/MCParser/MCAsmLexer.h" 14#include "llvm/MC/MCParser/MCAsmParser.h" 15#include "llvm/MC/MCParser/MCParsedAsmOperand.h" 16#include "llvm/MC/MCAsmInfo.h" 17#include "llvm/MC/MCContext.h" 18#include "llvm/MC/MCStreamer.h" 19#include "llvm/MC/MCExpr.h" 20#include "llvm/MC/MCInst.h" 21#include "llvm/MC/MCInstrDesc.h" 22#include "llvm/MC/MCRegisterInfo.h" 23#include "llvm/MC/MCSubtargetInfo.h" 24#include "llvm/MC/MCTargetAsmParser.h" 25#include "llvm/Support/MathExtras.h" 26#include "llvm/Support/SourceMgr.h" 27#include "llvm/Support/TargetRegistry.h" 28#include "llvm/Support/raw_ostream.h" 29#include "llvm/ADT/BitVector.h" 30#include "llvm/ADT/OwningPtr.h" 31#include "llvm/ADT/STLExtras.h" 32#include "llvm/ADT/SmallVector.h" 33#include "llvm/ADT/StringExtras.h" 34#include "llvm/ADT/StringSwitch.h" 35#include "llvm/ADT/Twine.h" 36 37using namespace llvm; 38 39namespace { 40 41class ARMOperand; 42 43class ARMAsmParser : public MCTargetAsmParser { 44 MCSubtargetInfo &STI; 45 MCAsmParser &Parser; 46 47 struct { 48 ARMCC::CondCodes Cond; // Condition for IT block. 49 unsigned Mask:4; // Condition mask for instructions. 50 // Starting at first 1 (from lsb). 51 // '1' condition as indicated in IT. 52 // '0' inverse of condition (else). 53 // Count of instructions in IT block is 54 // 4 - trailingzeroes(mask) 55 56 bool FirstCond; // Explicit flag for when we're parsing the 57 // First instruction in the IT block. It's 58 // implied in the mask, so needs special 59 // handling. 60 61 unsigned CurPosition; // Current position in parsing of IT 62 // block. In range [0,3]. Initialized 63 // according to count of instructions in block. 64 // ~0U if no active IT block. 65 } ITState; 66 bool inITBlock() { return ITState.CurPosition != ~0U;} 67 void forwardITPosition() { 68 if (!inITBlock()) return; 69 // Move to the next instruction in the IT block, if there is one. If not, 70 // mark the block as done. 71 unsigned TZ = CountTrailingZeros_32(ITState.Mask); 72 if (++ITState.CurPosition == 5 - TZ) 73 ITState.CurPosition = ~0U; // Done with the IT block after this. 74 } 75 76 77 MCAsmParser &getParser() const { return Parser; } 78 MCAsmLexer &getLexer() const { return Parser.getLexer(); } 79 80 void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); } 81 bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); } 82 83 int tryParseRegister(); 84 bool tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &); 85 int tryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &); 86 bool parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &); 87 bool parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &); 88 bool parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &, StringRef Mnemonic); 89 bool parsePrefix(ARMMCExpr::VariantKind &RefKind); 90 const MCExpr *applyPrefixToExpr(const MCExpr *E, 91 MCSymbolRefExpr::VariantKind Variant); 92 93 94 bool parseMemRegOffsetShift(ARM_AM::ShiftOpc &ShiftType, 95 unsigned &ShiftAmount); 96 bool parseDirectiveWord(unsigned Size, SMLoc L); 97 bool parseDirectiveThumb(SMLoc L); 98 bool parseDirectiveThumbFunc(SMLoc L); 99 bool parseDirectiveCode(SMLoc L); 100 bool parseDirectiveSyntax(SMLoc L); 101 102 StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode, 103 bool &CarrySetting, unsigned &ProcessorIMod, 104 StringRef &ITMask); 105 void getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet, 106 bool &CanAcceptPredicationCode); 107 108 bool isThumb() const { 109 // FIXME: Can tablegen auto-generate this? 110 return (STI.getFeatureBits() & ARM::ModeThumb) != 0; 111 } 112 bool isThumbOne() const { 113 return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0; 114 } 115 bool isThumbTwo() const { 116 return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2); 117 } 118 bool hasV6Ops() const { 119 return STI.getFeatureBits() & ARM::HasV6Ops; 120 } 121 void SwitchMode() { 122 unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb)); 123 setAvailableFeatures(FB); 124 } 125 126 /// @name Auto-generated Match Functions 127 /// { 128 129#define GET_ASSEMBLER_HEADER 130#include "ARMGenAsmMatcher.inc" 131 132 /// } 133 134 OperandMatchResultTy parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*>&); 135 OperandMatchResultTy parseCoprocNumOperand( 136 SmallVectorImpl<MCParsedAsmOperand*>&); 137 OperandMatchResultTy parseCoprocRegOperand( 138 SmallVectorImpl<MCParsedAsmOperand*>&); 139 OperandMatchResultTy parseMemBarrierOptOperand( 140 SmallVectorImpl<MCParsedAsmOperand*>&); 141 OperandMatchResultTy parseProcIFlagsOperand( 142 SmallVectorImpl<MCParsedAsmOperand*>&); 143 OperandMatchResultTy parseMSRMaskOperand( 144 SmallVectorImpl<MCParsedAsmOperand*>&); 145 OperandMatchResultTy parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &O, 146 StringRef Op, int Low, int High); 147 OperandMatchResultTy parsePKHLSLImm(SmallVectorImpl<MCParsedAsmOperand*> &O) { 148 return parsePKHImm(O, "lsl", 0, 31); 149 } 150 OperandMatchResultTy parsePKHASRImm(SmallVectorImpl<MCParsedAsmOperand*> &O) { 151 return parsePKHImm(O, "asr", 1, 32); 152 } 153 OperandMatchResultTy parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*>&); 154 OperandMatchResultTy parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*>&); 155 OperandMatchResultTy parseRotImm(SmallVectorImpl<MCParsedAsmOperand*>&); 156 OperandMatchResultTy parseBitfield(SmallVectorImpl<MCParsedAsmOperand*>&); 157 OperandMatchResultTy parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*>&); 158 OperandMatchResultTy parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*>&); 159 160 // Asm Match Converter Methods 161 bool cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode, 162 const SmallVectorImpl<MCParsedAsmOperand*> &); 163 bool cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 164 const SmallVectorImpl<MCParsedAsmOperand*> &); 165 bool cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 166 const SmallVectorImpl<MCParsedAsmOperand*> &); 167 bool cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 168 const SmallVectorImpl<MCParsedAsmOperand*> &); 169 bool cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 170 const SmallVectorImpl<MCParsedAsmOperand*> &); 171 bool cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 172 const SmallVectorImpl<MCParsedAsmOperand*> &); 173 bool cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 174 const SmallVectorImpl<MCParsedAsmOperand*> &); 175 bool cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 176 const SmallVectorImpl<MCParsedAsmOperand*> &); 177 bool cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 178 const SmallVectorImpl<MCParsedAsmOperand*> &); 179 bool cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 180 const SmallVectorImpl<MCParsedAsmOperand*> &); 181 bool cvtLdrdPre(MCInst &Inst, unsigned Opcode, 182 const SmallVectorImpl<MCParsedAsmOperand*> &); 183 bool cvtStrdPre(MCInst &Inst, unsigned Opcode, 184 const SmallVectorImpl<MCParsedAsmOperand*> &); 185 bool cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 186 const SmallVectorImpl<MCParsedAsmOperand*> &); 187 bool cvtThumbMultiply(MCInst &Inst, unsigned Opcode, 188 const SmallVectorImpl<MCParsedAsmOperand*> &); 189 190 bool validateInstruction(MCInst &Inst, 191 const SmallVectorImpl<MCParsedAsmOperand*> &Ops); 192 void processInstruction(MCInst &Inst, 193 const SmallVectorImpl<MCParsedAsmOperand*> &Ops); 194 bool shouldOmitCCOutOperand(StringRef Mnemonic, 195 SmallVectorImpl<MCParsedAsmOperand*> &Operands); 196 197public: 198 enum ARMMatchResultTy { 199 Match_RequiresITBlock = FIRST_TARGET_MATCH_RESULT_TY, 200 Match_RequiresNotITBlock, 201 Match_RequiresV6, 202 Match_RequiresThumb2 203 }; 204 205 ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser) 206 : MCTargetAsmParser(), STI(_STI), Parser(_Parser) { 207 MCAsmParserExtension::Initialize(_Parser); 208 209 // Initialize the set of available features. 210 setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 211 212 // Not in an ITBlock to start with. 213 ITState.CurPosition = ~0U; 214 } 215 216 // Implementation of the MCTargetAsmParser interface: 217 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc); 218 bool ParseInstruction(StringRef Name, SMLoc NameLoc, 219 SmallVectorImpl<MCParsedAsmOperand*> &Operands); 220 bool ParseDirective(AsmToken DirectiveID); 221 222 unsigned checkTargetMatchPredicate(MCInst &Inst); 223 224 bool MatchAndEmitInstruction(SMLoc IDLoc, 225 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 226 MCStreamer &Out); 227}; 228} // end anonymous namespace 229 230namespace { 231 232/// ARMOperand - Instances of this class represent a parsed ARM machine 233/// instruction. 234class ARMOperand : public MCParsedAsmOperand { 235 enum KindTy { 236 CondCode, 237 CCOut, 238 ITCondMask, 239 CoprocNum, 240 CoprocReg, 241 Immediate, 242 MemBarrierOpt, 243 Memory, 244 PostIndexRegister, 245 MSRMask, 246 ProcIFlags, 247 Register, 248 RegisterList, 249 DPRRegisterList, 250 SPRRegisterList, 251 ShiftedRegister, 252 ShiftedImmediate, 253 ShifterImmediate, 254 RotateImmediate, 255 BitfieldDescriptor, 256 Token 257 } Kind; 258 259 SMLoc StartLoc, EndLoc; 260 SmallVector<unsigned, 8> Registers; 261 262 union { 263 struct { 264 ARMCC::CondCodes Val; 265 } CC; 266 267 struct { 268 unsigned Val; 269 } Cop; 270 271 struct { 272 unsigned Mask:4; 273 } ITMask; 274 275 struct { 276 ARM_MB::MemBOpt Val; 277 } MBOpt; 278 279 struct { 280 ARM_PROC::IFlags Val; 281 } IFlags; 282 283 struct { 284 unsigned Val; 285 } MMask; 286 287 struct { 288 const char *Data; 289 unsigned Length; 290 } Tok; 291 292 struct { 293 unsigned RegNum; 294 } Reg; 295 296 struct { 297 const MCExpr *Val; 298 } Imm; 299 300 /// Combined record for all forms of ARM address expressions. 301 struct { 302 unsigned BaseRegNum; 303 // Offset is in OffsetReg or OffsetImm. If both are zero, no offset 304 // was specified. 305 const MCConstantExpr *OffsetImm; // Offset immediate value 306 unsigned OffsetRegNum; // Offset register num, when OffsetImm == NULL 307 ARM_AM::ShiftOpc ShiftType; // Shift type for OffsetReg 308 unsigned ShiftImm; // shift for OffsetReg. 309 unsigned isNegative : 1; // Negated OffsetReg? (~'U' bit) 310 } Mem; 311 312 struct { 313 unsigned RegNum; 314 bool isAdd; 315 ARM_AM::ShiftOpc ShiftTy; 316 unsigned ShiftImm; 317 } PostIdxReg; 318 319 struct { 320 bool isASR; 321 unsigned Imm; 322 } ShifterImm; 323 struct { 324 ARM_AM::ShiftOpc ShiftTy; 325 unsigned SrcReg; 326 unsigned ShiftReg; 327 unsigned ShiftImm; 328 } RegShiftedReg; 329 struct { 330 ARM_AM::ShiftOpc ShiftTy; 331 unsigned SrcReg; 332 unsigned ShiftImm; 333 } RegShiftedImm; 334 struct { 335 unsigned Imm; 336 } RotImm; 337 struct { 338 unsigned LSB; 339 unsigned Width; 340 } Bitfield; 341 }; 342 343 ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {} 344public: 345 ARMOperand(const ARMOperand &o) : MCParsedAsmOperand() { 346 Kind = o.Kind; 347 StartLoc = o.StartLoc; 348 EndLoc = o.EndLoc; 349 switch (Kind) { 350 case CondCode: 351 CC = o.CC; 352 break; 353 case ITCondMask: 354 ITMask = o.ITMask; 355 break; 356 case Token: 357 Tok = o.Tok; 358 break; 359 case CCOut: 360 case Register: 361 Reg = o.Reg; 362 break; 363 case RegisterList: 364 case DPRRegisterList: 365 case SPRRegisterList: 366 Registers = o.Registers; 367 break; 368 case CoprocNum: 369 case CoprocReg: 370 Cop = o.Cop; 371 break; 372 case Immediate: 373 Imm = o.Imm; 374 break; 375 case MemBarrierOpt: 376 MBOpt = o.MBOpt; 377 break; 378 case Memory: 379 Mem = o.Mem; 380 break; 381 case PostIndexRegister: 382 PostIdxReg = o.PostIdxReg; 383 break; 384 case MSRMask: 385 MMask = o.MMask; 386 break; 387 case ProcIFlags: 388 IFlags = o.IFlags; 389 break; 390 case ShifterImmediate: 391 ShifterImm = o.ShifterImm; 392 break; 393 case ShiftedRegister: 394 RegShiftedReg = o.RegShiftedReg; 395 break; 396 case ShiftedImmediate: 397 RegShiftedImm = o.RegShiftedImm; 398 break; 399 case RotateImmediate: 400 RotImm = o.RotImm; 401 break; 402 case BitfieldDescriptor: 403 Bitfield = o.Bitfield; 404 break; 405 } 406 } 407 408 /// getStartLoc - Get the location of the first token of this operand. 409 SMLoc getStartLoc() const { return StartLoc; } 410 /// getEndLoc - Get the location of the last token of this operand. 411 SMLoc getEndLoc() const { return EndLoc; } 412 413 ARMCC::CondCodes getCondCode() const { 414 assert(Kind == CondCode && "Invalid access!"); 415 return CC.Val; 416 } 417 418 unsigned getCoproc() const { 419 assert((Kind == CoprocNum || Kind == CoprocReg) && "Invalid access!"); 420 return Cop.Val; 421 } 422 423 StringRef getToken() const { 424 assert(Kind == Token && "Invalid access!"); 425 return StringRef(Tok.Data, Tok.Length); 426 } 427 428 unsigned getReg() const { 429 assert((Kind == Register || Kind == CCOut) && "Invalid access!"); 430 return Reg.RegNum; 431 } 432 433 const SmallVectorImpl<unsigned> &getRegList() const { 434 assert((Kind == RegisterList || Kind == DPRRegisterList || 435 Kind == SPRRegisterList) && "Invalid access!"); 436 return Registers; 437 } 438 439 const MCExpr *getImm() const { 440 assert(Kind == Immediate && "Invalid access!"); 441 return Imm.Val; 442 } 443 444 ARM_MB::MemBOpt getMemBarrierOpt() const { 445 assert(Kind == MemBarrierOpt && "Invalid access!"); 446 return MBOpt.Val; 447 } 448 449 ARM_PROC::IFlags getProcIFlags() const { 450 assert(Kind == ProcIFlags && "Invalid access!"); 451 return IFlags.Val; 452 } 453 454 unsigned getMSRMask() const { 455 assert(Kind == MSRMask && "Invalid access!"); 456 return MMask.Val; 457 } 458 459 bool isCoprocNum() const { return Kind == CoprocNum; } 460 bool isCoprocReg() const { return Kind == CoprocReg; } 461 bool isCondCode() const { return Kind == CondCode; } 462 bool isCCOut() const { return Kind == CCOut; } 463 bool isITMask() const { return Kind == ITCondMask; } 464 bool isITCondCode() const { return Kind == CondCode; } 465 bool isImm() const { return Kind == Immediate; } 466 bool isImm0_1020s4() const { 467 if (Kind != Immediate) 468 return false; 469 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 470 if (!CE) return false; 471 int64_t Value = CE->getValue(); 472 return ((Value & 3) == 0) && Value >= 0 && Value <= 1020; 473 } 474 bool isImm0_508s4() const { 475 if (Kind != Immediate) 476 return false; 477 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 478 if (!CE) return false; 479 int64_t Value = CE->getValue(); 480 return ((Value & 3) == 0) && Value >= 0 && Value <= 508; 481 } 482 bool isImm0_255() const { 483 if (Kind != Immediate) 484 return false; 485 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 486 if (!CE) return false; 487 int64_t Value = CE->getValue(); 488 return Value >= 0 && Value < 256; 489 } 490 bool isImm0_7() const { 491 if (Kind != Immediate) 492 return false; 493 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 494 if (!CE) return false; 495 int64_t Value = CE->getValue(); 496 return Value >= 0 && Value < 8; 497 } 498 bool isImm0_15() const { 499 if (Kind != Immediate) 500 return false; 501 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 502 if (!CE) return false; 503 int64_t Value = CE->getValue(); 504 return Value >= 0 && Value < 16; 505 } 506 bool isImm0_31() const { 507 if (Kind != Immediate) 508 return false; 509 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 510 if (!CE) return false; 511 int64_t Value = CE->getValue(); 512 return Value >= 0 && Value < 32; 513 } 514 bool isImm1_16() const { 515 if (Kind != Immediate) 516 return false; 517 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 518 if (!CE) return false; 519 int64_t Value = CE->getValue(); 520 return Value > 0 && Value < 17; 521 } 522 bool isImm1_32() const { 523 if (Kind != Immediate) 524 return false; 525 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 526 if (!CE) return false; 527 int64_t Value = CE->getValue(); 528 return Value > 0 && Value < 33; 529 } 530 bool isImm0_65535() const { 531 if (Kind != Immediate) 532 return false; 533 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 534 if (!CE) return false; 535 int64_t Value = CE->getValue(); 536 return Value >= 0 && Value < 65536; 537 } 538 bool isImm0_65535Expr() const { 539 if (Kind != Immediate) 540 return false; 541 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 542 // If it's not a constant expression, it'll generate a fixup and be 543 // handled later. 544 if (!CE) return true; 545 int64_t Value = CE->getValue(); 546 return Value >= 0 && Value < 65536; 547 } 548 bool isImm24bit() const { 549 if (Kind != Immediate) 550 return false; 551 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 552 if (!CE) return false; 553 int64_t Value = CE->getValue(); 554 return Value >= 0 && Value <= 0xffffff; 555 } 556 bool isImmThumbSR() const { 557 if (Kind != Immediate) 558 return false; 559 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 560 if (!CE) return false; 561 int64_t Value = CE->getValue(); 562 return Value > 0 && Value < 33; 563 } 564 bool isPKHLSLImm() const { 565 if (Kind != Immediate) 566 return false; 567 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 568 if (!CE) return false; 569 int64_t Value = CE->getValue(); 570 return Value >= 0 && Value < 32; 571 } 572 bool isPKHASRImm() const { 573 if (Kind != Immediate) 574 return false; 575 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 576 if (!CE) return false; 577 int64_t Value = CE->getValue(); 578 return Value > 0 && Value <= 32; 579 } 580 bool isARMSOImm() const { 581 if (Kind != Immediate) 582 return false; 583 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 584 if (!CE) return false; 585 int64_t Value = CE->getValue(); 586 return ARM_AM::getSOImmVal(Value) != -1; 587 } 588 bool isT2SOImm() const { 589 if (Kind != Immediate) 590 return false; 591 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 592 if (!CE) return false; 593 int64_t Value = CE->getValue(); 594 return ARM_AM::getT2SOImmVal(Value) != -1; 595 } 596 bool isSetEndImm() const { 597 if (Kind != Immediate) 598 return false; 599 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 600 if (!CE) return false; 601 int64_t Value = CE->getValue(); 602 return Value == 1 || Value == 0; 603 } 604 bool isReg() const { return Kind == Register; } 605 bool isRegList() const { return Kind == RegisterList; } 606 bool isDPRRegList() const { return Kind == DPRRegisterList; } 607 bool isSPRRegList() const { return Kind == SPRRegisterList; } 608 bool isToken() const { return Kind == Token; } 609 bool isMemBarrierOpt() const { return Kind == MemBarrierOpt; } 610 bool isMemory() const { return Kind == Memory; } 611 bool isShifterImm() const { return Kind == ShifterImmediate; } 612 bool isRegShiftedReg() const { return Kind == ShiftedRegister; } 613 bool isRegShiftedImm() const { return Kind == ShiftedImmediate; } 614 bool isRotImm() const { return Kind == RotateImmediate; } 615 bool isBitfield() const { return Kind == BitfieldDescriptor; } 616 bool isPostIdxRegShifted() const { return Kind == PostIndexRegister; } 617 bool isPostIdxReg() const { 618 return Kind == PostIndexRegister && PostIdxReg.ShiftTy == ARM_AM::no_shift; 619 } 620 bool isMemNoOffset() const { 621 if (Kind != Memory) 622 return false; 623 // No offset of any kind. 624 return Mem.OffsetRegNum == 0 && Mem.OffsetImm == 0; 625 } 626 bool isAddrMode2() const { 627 if (Kind != Memory) 628 return false; 629 // Check for register offset. 630 if (Mem.OffsetRegNum) return true; 631 // Immediate offset in range [-4095, 4095]. 632 if (!Mem.OffsetImm) return true; 633 int64_t Val = Mem.OffsetImm->getValue(); 634 return Val > -4096 && Val < 4096; 635 } 636 bool isAM2OffsetImm() const { 637 if (Kind != Immediate) 638 return false; 639 // Immediate offset in range [-4095, 4095]. 640 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 641 if (!CE) return false; 642 int64_t Val = CE->getValue(); 643 return Val > -4096 && Val < 4096; 644 } 645 bool isAddrMode3() const { 646 if (Kind != Memory) 647 return false; 648 // No shifts are legal for AM3. 649 if (Mem.ShiftType != ARM_AM::no_shift) return false; 650 // Check for register offset. 651 if (Mem.OffsetRegNum) return true; 652 // Immediate offset in range [-255, 255]. 653 if (!Mem.OffsetImm) return true; 654 int64_t Val = Mem.OffsetImm->getValue(); 655 return Val > -256 && Val < 256; 656 } 657 bool isAM3Offset() const { 658 if (Kind != Immediate && Kind != PostIndexRegister) 659 return false; 660 if (Kind == PostIndexRegister) 661 return PostIdxReg.ShiftTy == ARM_AM::no_shift; 662 // Immediate offset in range [-255, 255]. 663 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 664 if (!CE) return false; 665 int64_t Val = CE->getValue(); 666 // Special case, #-0 is INT32_MIN. 667 return (Val > -256 && Val < 256) || Val == INT32_MIN; 668 } 669 bool isAddrMode5() const { 670 if (Kind != Memory) 671 return false; 672 // Check for register offset. 673 if (Mem.OffsetRegNum) return false; 674 // Immediate offset in range [-1020, 1020] and a multiple of 4. 675 if (!Mem.OffsetImm) return true; 676 int64_t Val = Mem.OffsetImm->getValue(); 677 return (Val >= -1020 && Val <= 1020 && ((Val & 3) == 0)) || 678 Val == INT32_MIN; 679 } 680 bool isMemRegOffset() const { 681 if (Kind != Memory || !Mem.OffsetRegNum) 682 return false; 683 return true; 684 } 685 bool isT2MemRegOffset() const { 686 if (Kind != Memory || !Mem.OffsetRegNum || Mem.isNegative) 687 return false; 688 // Only lsl #{0, 1, 2, 3} allowed. 689 if (Mem.ShiftType == ARM_AM::no_shift) 690 return true; 691 if (Mem.ShiftType != ARM_AM::lsl || Mem.ShiftImm > 3) 692 return false; 693 return true; 694 } 695 bool isMemThumbRR() const { 696 // Thumb reg+reg addressing is simple. Just two registers, a base and 697 // an offset. No shifts, negations or any other complicating factors. 698 if (Kind != Memory || !Mem.OffsetRegNum || Mem.isNegative || 699 Mem.ShiftType != ARM_AM::no_shift) 700 return false; 701 return isARMLowRegister(Mem.BaseRegNum) && 702 (!Mem.OffsetRegNum || isARMLowRegister(Mem.OffsetRegNum)); 703 } 704 bool isMemThumbRIs4() const { 705 if (Kind != Memory || Mem.OffsetRegNum != 0 || 706 !isARMLowRegister(Mem.BaseRegNum)) 707 return false; 708 // Immediate offset, multiple of 4 in range [0, 124]. 709 if (!Mem.OffsetImm) return true; 710 int64_t Val = Mem.OffsetImm->getValue(); 711 return Val >= 0 && Val <= 124 && (Val % 4) == 0; 712 } 713 bool isMemThumbRIs2() const { 714 if (Kind != Memory || Mem.OffsetRegNum != 0 || 715 !isARMLowRegister(Mem.BaseRegNum)) 716 return false; 717 // Immediate offset, multiple of 4 in range [0, 62]. 718 if (!Mem.OffsetImm) return true; 719 int64_t Val = Mem.OffsetImm->getValue(); 720 return Val >= 0 && Val <= 62 && (Val % 2) == 0; 721 } 722 bool isMemThumbRIs1() const { 723 if (Kind != Memory || Mem.OffsetRegNum != 0 || 724 !isARMLowRegister(Mem.BaseRegNum)) 725 return false; 726 // Immediate offset in range [0, 31]. 727 if (!Mem.OffsetImm) return true; 728 int64_t Val = Mem.OffsetImm->getValue(); 729 return Val >= 0 && Val <= 31; 730 } 731 bool isMemThumbSPI() const { 732 if (Kind != Memory || Mem.OffsetRegNum != 0 || Mem.BaseRegNum != ARM::SP) 733 return false; 734 // Immediate offset, multiple of 4 in range [0, 1020]. 735 if (!Mem.OffsetImm) return true; 736 int64_t Val = Mem.OffsetImm->getValue(); 737 return Val >= 0 && Val <= 1020 && (Val % 4) == 0; 738 } 739 bool isMemImm8Offset() const { 740 if (Kind != Memory || Mem.OffsetRegNum != 0) 741 return false; 742 // Immediate offset in range [-255, 255]. 743 if (!Mem.OffsetImm) return true; 744 int64_t Val = Mem.OffsetImm->getValue(); 745 return Val > -256 && Val < 256; 746 } 747 bool isMemPosImm8Offset() const { 748 if (Kind != Memory || Mem.OffsetRegNum != 0) 749 return false; 750 // Immediate offset in range [0, 255]. 751 if (!Mem.OffsetImm) return true; 752 int64_t Val = Mem.OffsetImm->getValue(); 753 return Val >= 0 && Val < 256; 754 } 755 bool isMemNegImm8Offset() const { 756 if (Kind != Memory || Mem.OffsetRegNum != 0) 757 return false; 758 // Immediate offset in range [-255, -1]. 759 if (!Mem.OffsetImm) return true; 760 int64_t Val = Mem.OffsetImm->getValue(); 761 return Val > -256 && Val < 0; 762 } 763 bool isMemUImm12Offset() const { 764 // If we have an immediate that's not a constant, treat it as a label 765 // reference needing a fixup. If it is a constant, it's something else 766 // and we reject it. 767 if (Kind == Immediate && !isa<MCConstantExpr>(getImm())) 768 return true; 769 770 if (Kind != Memory || Mem.OffsetRegNum != 0) 771 return false; 772 // Immediate offset in range [0, 4095]. 773 if (!Mem.OffsetImm) return true; 774 int64_t Val = Mem.OffsetImm->getValue(); 775 return (Val >= 0 && Val < 4096); 776 } 777 bool isMemImm12Offset() const { 778 // If we have an immediate that's not a constant, treat it as a label 779 // reference needing a fixup. If it is a constant, it's something else 780 // and we reject it. 781 if (Kind == Immediate && !isa<MCConstantExpr>(getImm())) 782 return true; 783 784 if (Kind != Memory || Mem.OffsetRegNum != 0) 785 return false; 786 // Immediate offset in range [-4095, 4095]. 787 if (!Mem.OffsetImm) return true; 788 int64_t Val = Mem.OffsetImm->getValue(); 789 return (Val > -4096 && Val < 4096) || (Val == INT32_MIN); 790 } 791 bool isPostIdxImm8() const { 792 if (Kind != Immediate) 793 return false; 794 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 795 if (!CE) return false; 796 int64_t Val = CE->getValue(); 797 return (Val > -256 && Val < 256) || (Val == INT32_MIN); 798 } 799 800 bool isMSRMask() const { return Kind == MSRMask; } 801 bool isProcIFlags() const { return Kind == ProcIFlags; } 802 803 void addExpr(MCInst &Inst, const MCExpr *Expr) const { 804 // Add as immediates when possible. Null MCExpr = 0. 805 if (Expr == 0) 806 Inst.addOperand(MCOperand::CreateImm(0)); 807 else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 808 Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 809 else 810 Inst.addOperand(MCOperand::CreateExpr(Expr)); 811 } 812 813 void addCondCodeOperands(MCInst &Inst, unsigned N) const { 814 assert(N == 2 && "Invalid number of operands!"); 815 Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode()))); 816 unsigned RegNum = getCondCode() == ARMCC::AL ? 0: ARM::CPSR; 817 Inst.addOperand(MCOperand::CreateReg(RegNum)); 818 } 819 820 void addCoprocNumOperands(MCInst &Inst, unsigned N) const { 821 assert(N == 1 && "Invalid number of operands!"); 822 Inst.addOperand(MCOperand::CreateImm(getCoproc())); 823 } 824 825 void addITMaskOperands(MCInst &Inst, unsigned N) const { 826 assert(N == 1 && "Invalid number of operands!"); 827 Inst.addOperand(MCOperand::CreateImm(ITMask.Mask)); 828 } 829 830 void addITCondCodeOperands(MCInst &Inst, unsigned N) const { 831 assert(N == 1 && "Invalid number of operands!"); 832 Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode()))); 833 } 834 835 void addCoprocRegOperands(MCInst &Inst, unsigned N) const { 836 assert(N == 1 && "Invalid number of operands!"); 837 Inst.addOperand(MCOperand::CreateImm(getCoproc())); 838 } 839 840 void addCCOutOperands(MCInst &Inst, unsigned N) const { 841 assert(N == 1 && "Invalid number of operands!"); 842 Inst.addOperand(MCOperand::CreateReg(getReg())); 843 } 844 845 void addRegOperands(MCInst &Inst, unsigned N) const { 846 assert(N == 1 && "Invalid number of operands!"); 847 Inst.addOperand(MCOperand::CreateReg(getReg())); 848 } 849 850 void addRegShiftedRegOperands(MCInst &Inst, unsigned N) const { 851 assert(N == 3 && "Invalid number of operands!"); 852 assert(isRegShiftedReg() && "addRegShiftedRegOperands() on non RegShiftedReg!"); 853 Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.SrcReg)); 854 Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.ShiftReg)); 855 Inst.addOperand(MCOperand::CreateImm( 856 ARM_AM::getSORegOpc(RegShiftedReg.ShiftTy, RegShiftedReg.ShiftImm))); 857 } 858 859 void addRegShiftedImmOperands(MCInst &Inst, unsigned N) const { 860 assert(N == 2 && "Invalid number of operands!"); 861 assert(isRegShiftedImm() && "addRegShiftedImmOperands() on non RegShiftedImm!"); 862 Inst.addOperand(MCOperand::CreateReg(RegShiftedImm.SrcReg)); 863 Inst.addOperand(MCOperand::CreateImm( 864 ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm))); 865 } 866 867 void addShifterImmOperands(MCInst &Inst, unsigned N) const { 868 assert(N == 1 && "Invalid number of operands!"); 869 Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) | 870 ShifterImm.Imm)); 871 } 872 873 void addRegListOperands(MCInst &Inst, unsigned N) const { 874 assert(N == 1 && "Invalid number of operands!"); 875 const SmallVectorImpl<unsigned> &RegList = getRegList(); 876 for (SmallVectorImpl<unsigned>::const_iterator 877 I = RegList.begin(), E = RegList.end(); I != E; ++I) 878 Inst.addOperand(MCOperand::CreateReg(*I)); 879 } 880 881 void addDPRRegListOperands(MCInst &Inst, unsigned N) const { 882 addRegListOperands(Inst, N); 883 } 884 885 void addSPRRegListOperands(MCInst &Inst, unsigned N) const { 886 addRegListOperands(Inst, N); 887 } 888 889 void addRotImmOperands(MCInst &Inst, unsigned N) const { 890 assert(N == 1 && "Invalid number of operands!"); 891 // Encoded as val>>3. The printer handles display as 8, 16, 24. 892 Inst.addOperand(MCOperand::CreateImm(RotImm.Imm >> 3)); 893 } 894 895 void addBitfieldOperands(MCInst &Inst, unsigned N) const { 896 assert(N == 1 && "Invalid number of operands!"); 897 // Munge the lsb/width into a bitfield mask. 898 unsigned lsb = Bitfield.LSB; 899 unsigned width = Bitfield.Width; 900 // Make a 32-bit mask w/ the referenced bits clear and all other bits set. 901 uint32_t Mask = ~(((uint32_t)0xffffffff >> lsb) << (32 - width) >> 902 (32 - (lsb + width))); 903 Inst.addOperand(MCOperand::CreateImm(Mask)); 904 } 905 906 void addImmOperands(MCInst &Inst, unsigned N) const { 907 assert(N == 1 && "Invalid number of operands!"); 908 addExpr(Inst, getImm()); 909 } 910 911 void addImm0_1020s4Operands(MCInst &Inst, unsigned N) const { 912 assert(N == 1 && "Invalid number of operands!"); 913 // The immediate is scaled by four in the encoding and is stored 914 // in the MCInst as such. Lop off the low two bits here. 915 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 916 Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4)); 917 } 918 919 void addImm0_508s4Operands(MCInst &Inst, unsigned N) const { 920 assert(N == 1 && "Invalid number of operands!"); 921 // The immediate is scaled by four in the encoding and is stored 922 // in the MCInst as such. Lop off the low two bits here. 923 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 924 Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4)); 925 } 926 927 void addImm0_255Operands(MCInst &Inst, unsigned N) const { 928 assert(N == 1 && "Invalid number of operands!"); 929 addExpr(Inst, getImm()); 930 } 931 932 void addImm0_7Operands(MCInst &Inst, unsigned N) const { 933 assert(N == 1 && "Invalid number of operands!"); 934 addExpr(Inst, getImm()); 935 } 936 937 void addImm0_15Operands(MCInst &Inst, unsigned N) const { 938 assert(N == 1 && "Invalid number of operands!"); 939 addExpr(Inst, getImm()); 940 } 941 942 void addImm0_31Operands(MCInst &Inst, unsigned N) const { 943 assert(N == 1 && "Invalid number of operands!"); 944 addExpr(Inst, getImm()); 945 } 946 947 void addImm1_16Operands(MCInst &Inst, unsigned N) const { 948 assert(N == 1 && "Invalid number of operands!"); 949 // The constant encodes as the immediate-1, and we store in the instruction 950 // the bits as encoded, so subtract off one here. 951 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 952 Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1)); 953 } 954 955 void addImm1_32Operands(MCInst &Inst, unsigned N) const { 956 assert(N == 1 && "Invalid number of operands!"); 957 // The constant encodes as the immediate-1, and we store in the instruction 958 // the bits as encoded, so subtract off one here. 959 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 960 Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1)); 961 } 962 963 void addImm0_65535Operands(MCInst &Inst, unsigned N) const { 964 assert(N == 1 && "Invalid number of operands!"); 965 addExpr(Inst, getImm()); 966 } 967 968 void addImm0_65535ExprOperands(MCInst &Inst, unsigned N) const { 969 assert(N == 1 && "Invalid number of operands!"); 970 addExpr(Inst, getImm()); 971 } 972 973 void addImm24bitOperands(MCInst &Inst, unsigned N) const { 974 assert(N == 1 && "Invalid number of operands!"); 975 addExpr(Inst, getImm()); 976 } 977 978 void addImmThumbSROperands(MCInst &Inst, unsigned N) const { 979 assert(N == 1 && "Invalid number of operands!"); 980 // The constant encodes as the immediate, except for 32, which encodes as 981 // zero. 982 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 983 unsigned Imm = CE->getValue(); 984 Inst.addOperand(MCOperand::CreateImm((Imm == 32 ? 0 : Imm))); 985 } 986 987 void addPKHLSLImmOperands(MCInst &Inst, unsigned N) const { 988 assert(N == 1 && "Invalid number of operands!"); 989 addExpr(Inst, getImm()); 990 } 991 992 void addPKHASRImmOperands(MCInst &Inst, unsigned N) const { 993 assert(N == 1 && "Invalid number of operands!"); 994 // An ASR value of 32 encodes as 0, so that's how we want to add it to 995 // the instruction as well. 996 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 997 int Val = CE->getValue(); 998 Inst.addOperand(MCOperand::CreateImm(Val == 32 ? 0 : Val)); 999 } 1000 1001 void addARMSOImmOperands(MCInst &Inst, unsigned N) const { 1002 assert(N == 1 && "Invalid number of operands!"); 1003 addExpr(Inst, getImm()); 1004 } 1005 1006 void addT2SOImmOperands(MCInst &Inst, unsigned N) const { 1007 assert(N == 1 && "Invalid number of operands!"); 1008 addExpr(Inst, getImm()); 1009 } 1010 1011 void addSetEndImmOperands(MCInst &Inst, unsigned N) const { 1012 assert(N == 1 && "Invalid number of operands!"); 1013 addExpr(Inst, getImm()); 1014 } 1015 1016 void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const { 1017 assert(N == 1 && "Invalid number of operands!"); 1018 Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt()))); 1019 } 1020 1021 void addMemNoOffsetOperands(MCInst &Inst, unsigned N) const { 1022 assert(N == 1 && "Invalid number of operands!"); 1023 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1024 } 1025 1026 void addAddrMode2Operands(MCInst &Inst, unsigned N) const { 1027 assert(N == 3 && "Invalid number of operands!"); 1028 int32_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0; 1029 if (!Mem.OffsetRegNum) { 1030 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1031 // Special case for #-0 1032 if (Val == INT32_MIN) Val = 0; 1033 if (Val < 0) Val = -Val; 1034 Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift); 1035 } else { 1036 // For register offset, we encode the shift type and negation flag 1037 // here. 1038 Val = ARM_AM::getAM2Opc(Mem.isNegative ? ARM_AM::sub : ARM_AM::add, 1039 Mem.ShiftImm, Mem.ShiftType); 1040 } 1041 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1042 Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum)); 1043 Inst.addOperand(MCOperand::CreateImm(Val)); 1044 } 1045 1046 void addAM2OffsetImmOperands(MCInst &Inst, unsigned N) const { 1047 assert(N == 2 && "Invalid number of operands!"); 1048 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1049 assert(CE && "non-constant AM2OffsetImm operand!"); 1050 int32_t Val = CE->getValue(); 1051 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1052 // Special case for #-0 1053 if (Val == INT32_MIN) Val = 0; 1054 if (Val < 0) Val = -Val; 1055 Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift); 1056 Inst.addOperand(MCOperand::CreateReg(0)); 1057 Inst.addOperand(MCOperand::CreateImm(Val)); 1058 } 1059 1060 void addAddrMode3Operands(MCInst &Inst, unsigned N) const { 1061 assert(N == 3 && "Invalid number of operands!"); 1062 int32_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0; 1063 if (!Mem.OffsetRegNum) { 1064 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1065 // Special case for #-0 1066 if (Val == INT32_MIN) Val = 0; 1067 if (Val < 0) Val = -Val; 1068 Val = ARM_AM::getAM3Opc(AddSub, Val); 1069 } else { 1070 // For register offset, we encode the shift type and negation flag 1071 // here. 1072 Val = ARM_AM::getAM3Opc(Mem.isNegative ? ARM_AM::sub : ARM_AM::add, 0); 1073 } 1074 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1075 Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum)); 1076 Inst.addOperand(MCOperand::CreateImm(Val)); 1077 } 1078 1079 void addAM3OffsetOperands(MCInst &Inst, unsigned N) const { 1080 assert(N == 2 && "Invalid number of operands!"); 1081 if (Kind == PostIndexRegister) { 1082 int32_t Val = 1083 ARM_AM::getAM3Opc(PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub, 0); 1084 Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum)); 1085 Inst.addOperand(MCOperand::CreateImm(Val)); 1086 return; 1087 } 1088 1089 // Constant offset. 1090 const MCConstantExpr *CE = static_cast<const MCConstantExpr*>(getImm()); 1091 int32_t Val = CE->getValue(); 1092 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1093 // Special case for #-0 1094 if (Val == INT32_MIN) Val = 0; 1095 if (Val < 0) Val = -Val; 1096 Val = ARM_AM::getAM3Opc(AddSub, Val); 1097 Inst.addOperand(MCOperand::CreateReg(0)); 1098 Inst.addOperand(MCOperand::CreateImm(Val)); 1099 } 1100 1101 void addAddrMode5Operands(MCInst &Inst, unsigned N) const { 1102 assert(N == 2 && "Invalid number of operands!"); 1103 // The lower two bits are always zero and as such are not encoded. 1104 int32_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() / 4 : 0; 1105 ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add; 1106 // Special case for #-0 1107 if (Val == INT32_MIN) Val = 0; 1108 if (Val < 0) Val = -Val; 1109 Val = ARM_AM::getAM5Opc(AddSub, Val); 1110 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1111 Inst.addOperand(MCOperand::CreateImm(Val)); 1112 } 1113 1114 void addMemImm8OffsetOperands(MCInst &Inst, unsigned N) const { 1115 assert(N == 2 && "Invalid number of operands!"); 1116 int64_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0; 1117 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1118 Inst.addOperand(MCOperand::CreateImm(Val)); 1119 } 1120 1121 void addMemPosImm8OffsetOperands(MCInst &Inst, unsigned N) const { 1122 addMemImm8OffsetOperands(Inst, N); 1123 } 1124 1125 void addMemNegImm8OffsetOperands(MCInst &Inst, unsigned N) const { 1126 addMemImm8OffsetOperands(Inst, N); 1127 } 1128 1129 void addMemUImm12OffsetOperands(MCInst &Inst, unsigned N) const { 1130 assert(N == 2 && "Invalid number of operands!"); 1131 // If this is an immediate, it's a label reference. 1132 if (Kind == Immediate) { 1133 addExpr(Inst, getImm()); 1134 Inst.addOperand(MCOperand::CreateImm(0)); 1135 return; 1136 } 1137 1138 // Otherwise, it's a normal memory reg+offset. 1139 int64_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0; 1140 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1141 Inst.addOperand(MCOperand::CreateImm(Val)); 1142 } 1143 1144 void addMemImm12OffsetOperands(MCInst &Inst, unsigned N) const { 1145 assert(N == 2 && "Invalid number of operands!"); 1146 // If this is an immediate, it's a label reference. 1147 if (Kind == Immediate) { 1148 addExpr(Inst, getImm()); 1149 Inst.addOperand(MCOperand::CreateImm(0)); 1150 return; 1151 } 1152 1153 // Otherwise, it's a normal memory reg+offset. 1154 int64_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0; 1155 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1156 Inst.addOperand(MCOperand::CreateImm(Val)); 1157 } 1158 1159 void addMemRegOffsetOperands(MCInst &Inst, unsigned N) const { 1160 assert(N == 3 && "Invalid number of operands!"); 1161 unsigned Val = ARM_AM::getAM2Opc(Mem.isNegative ? ARM_AM::sub : ARM_AM::add, 1162 Mem.ShiftImm, Mem.ShiftType); 1163 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1164 Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum)); 1165 Inst.addOperand(MCOperand::CreateImm(Val)); 1166 } 1167 1168 void addT2MemRegOffsetOperands(MCInst &Inst, unsigned N) const { 1169 assert(N == 3 && "Invalid number of operands!"); 1170 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1171 Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum)); 1172 Inst.addOperand(MCOperand::CreateImm(Mem.ShiftImm)); 1173 } 1174 1175 void addMemThumbRROperands(MCInst &Inst, unsigned N) const { 1176 assert(N == 2 && "Invalid number of operands!"); 1177 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1178 Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum)); 1179 } 1180 1181 void addMemThumbRIs4Operands(MCInst &Inst, unsigned N) const { 1182 assert(N == 2 && "Invalid number of operands!"); 1183 int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue() / 4) : 0; 1184 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1185 Inst.addOperand(MCOperand::CreateImm(Val)); 1186 } 1187 1188 void addMemThumbRIs2Operands(MCInst &Inst, unsigned N) const { 1189 assert(N == 2 && "Invalid number of operands!"); 1190 int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue() / 2) : 0; 1191 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1192 Inst.addOperand(MCOperand::CreateImm(Val)); 1193 } 1194 1195 void addMemThumbRIs1Operands(MCInst &Inst, unsigned N) const { 1196 assert(N == 2 && "Invalid number of operands!"); 1197 int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue()) : 0; 1198 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1199 Inst.addOperand(MCOperand::CreateImm(Val)); 1200 } 1201 1202 void addMemThumbSPIOperands(MCInst &Inst, unsigned N) const { 1203 assert(N == 2 && "Invalid number of operands!"); 1204 int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue() / 4) : 0; 1205 Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); 1206 Inst.addOperand(MCOperand::CreateImm(Val)); 1207 } 1208 1209 void addPostIdxImm8Operands(MCInst &Inst, unsigned N) const { 1210 assert(N == 1 && "Invalid number of operands!"); 1211 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 1212 assert(CE && "non-constant post-idx-imm8 operand!"); 1213 int Imm = CE->getValue(); 1214 bool isAdd = Imm >= 0; 1215 if (Imm == INT32_MIN) Imm = 0; 1216 Imm = (Imm < 0 ? -Imm : Imm) | (int)isAdd << 8; 1217 Inst.addOperand(MCOperand::CreateImm(Imm)); 1218 } 1219 1220 void addPostIdxRegOperands(MCInst &Inst, unsigned N) const { 1221 assert(N == 2 && "Invalid number of operands!"); 1222 Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum)); 1223 Inst.addOperand(MCOperand::CreateImm(PostIdxReg.isAdd)); 1224 } 1225 1226 void addPostIdxRegShiftedOperands(MCInst &Inst, unsigned N) const { 1227 assert(N == 2 && "Invalid number of operands!"); 1228 Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum)); 1229 // The sign, shift type, and shift amount are encoded in a single operand 1230 // using the AM2 encoding helpers. 1231 ARM_AM::AddrOpc opc = PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub; 1232 unsigned Imm = ARM_AM::getAM2Opc(opc, PostIdxReg.ShiftImm, 1233 PostIdxReg.ShiftTy); 1234 Inst.addOperand(MCOperand::CreateImm(Imm)); 1235 } 1236 1237 void addMSRMaskOperands(MCInst &Inst, unsigned N) const { 1238 assert(N == 1 && "Invalid number of operands!"); 1239 Inst.addOperand(MCOperand::CreateImm(unsigned(getMSRMask()))); 1240 } 1241 1242 void addProcIFlagsOperands(MCInst &Inst, unsigned N) const { 1243 assert(N == 1 && "Invalid number of operands!"); 1244 Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags()))); 1245 } 1246 1247 virtual void print(raw_ostream &OS) const; 1248 1249 static ARMOperand *CreateITMask(unsigned Mask, SMLoc S) { 1250 ARMOperand *Op = new ARMOperand(ITCondMask); 1251 Op->ITMask.Mask = Mask; 1252 Op->StartLoc = S; 1253 Op->EndLoc = S; 1254 return Op; 1255 } 1256 1257 static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) { 1258 ARMOperand *Op = new ARMOperand(CondCode); 1259 Op->CC.Val = CC; 1260 Op->StartLoc = S; 1261 Op->EndLoc = S; 1262 return Op; 1263 } 1264 1265 static ARMOperand *CreateCoprocNum(unsigned CopVal, SMLoc S) { 1266 ARMOperand *Op = new ARMOperand(CoprocNum); 1267 Op->Cop.Val = CopVal; 1268 Op->StartLoc = S; 1269 Op->EndLoc = S; 1270 return Op; 1271 } 1272 1273 static ARMOperand *CreateCoprocReg(unsigned CopVal, SMLoc S) { 1274 ARMOperand *Op = new ARMOperand(CoprocReg); 1275 Op->Cop.Val = CopVal; 1276 Op->StartLoc = S; 1277 Op->EndLoc = S; 1278 return Op; 1279 } 1280 1281 static ARMOperand *CreateCCOut(unsigned RegNum, SMLoc S) { 1282 ARMOperand *Op = new ARMOperand(CCOut); 1283 Op->Reg.RegNum = RegNum; 1284 Op->StartLoc = S; 1285 Op->EndLoc = S; 1286 return Op; 1287 } 1288 1289 static ARMOperand *CreateToken(StringRef Str, SMLoc S) { 1290 ARMOperand *Op = new ARMOperand(Token); 1291 Op->Tok.Data = Str.data(); 1292 Op->Tok.Length = Str.size(); 1293 Op->StartLoc = S; 1294 Op->EndLoc = S; 1295 return Op; 1296 } 1297 1298 static ARMOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) { 1299 ARMOperand *Op = new ARMOperand(Register); 1300 Op->Reg.RegNum = RegNum; 1301 Op->StartLoc = S; 1302 Op->EndLoc = E; 1303 return Op; 1304 } 1305 1306 static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy, 1307 unsigned SrcReg, 1308 unsigned ShiftReg, 1309 unsigned ShiftImm, 1310 SMLoc S, SMLoc E) { 1311 ARMOperand *Op = new ARMOperand(ShiftedRegister); 1312 Op->RegShiftedReg.ShiftTy = ShTy; 1313 Op->RegShiftedReg.SrcReg = SrcReg; 1314 Op->RegShiftedReg.ShiftReg = ShiftReg; 1315 Op->RegShiftedReg.ShiftImm = ShiftImm; 1316 Op->StartLoc = S; 1317 Op->EndLoc = E; 1318 return Op; 1319 } 1320 1321 static ARMOperand *CreateShiftedImmediate(ARM_AM::ShiftOpc ShTy, 1322 unsigned SrcReg, 1323 unsigned ShiftImm, 1324 SMLoc S, SMLoc E) { 1325 ARMOperand *Op = new ARMOperand(ShiftedImmediate); 1326 Op->RegShiftedImm.ShiftTy = ShTy; 1327 Op->RegShiftedImm.SrcReg = SrcReg; 1328 Op->RegShiftedImm.ShiftImm = ShiftImm; 1329 Op->StartLoc = S; 1330 Op->EndLoc = E; 1331 return Op; 1332 } 1333 1334 static ARMOperand *CreateShifterImm(bool isASR, unsigned Imm, 1335 SMLoc S, SMLoc E) { 1336 ARMOperand *Op = new ARMOperand(ShifterImmediate); 1337 Op->ShifterImm.isASR = isASR; 1338 Op->ShifterImm.Imm = Imm; 1339 Op->StartLoc = S; 1340 Op->EndLoc = E; 1341 return Op; 1342 } 1343 1344 static ARMOperand *CreateRotImm(unsigned Imm, SMLoc S, SMLoc E) { 1345 ARMOperand *Op = new ARMOperand(RotateImmediate); 1346 Op->RotImm.Imm = Imm; 1347 Op->StartLoc = S; 1348 Op->EndLoc = E; 1349 return Op; 1350 } 1351 1352 static ARMOperand *CreateBitfield(unsigned LSB, unsigned Width, 1353 SMLoc S, SMLoc E) { 1354 ARMOperand *Op = new ARMOperand(BitfieldDescriptor); 1355 Op->Bitfield.LSB = LSB; 1356 Op->Bitfield.Width = Width; 1357 Op->StartLoc = S; 1358 Op->EndLoc = E; 1359 return Op; 1360 } 1361 1362 static ARMOperand * 1363 CreateRegList(const SmallVectorImpl<std::pair<unsigned, SMLoc> > &Regs, 1364 SMLoc StartLoc, SMLoc EndLoc) { 1365 KindTy Kind = RegisterList; 1366 1367 if (llvm::ARMMCRegisterClasses[ARM::DPRRegClassID]. 1368 contains(Regs.front().first)) 1369 Kind = DPRRegisterList; 1370 else if (llvm::ARMMCRegisterClasses[ARM::SPRRegClassID]. 1371 contains(Regs.front().first)) 1372 Kind = SPRRegisterList; 1373 1374 ARMOperand *Op = new ARMOperand(Kind); 1375 for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator 1376 I = Regs.begin(), E = Regs.end(); I != E; ++I) 1377 Op->Registers.push_back(I->first); 1378 array_pod_sort(Op->Registers.begin(), Op->Registers.end()); 1379 Op->StartLoc = StartLoc; 1380 Op->EndLoc = EndLoc; 1381 return Op; 1382 } 1383 1384 static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) { 1385 ARMOperand *Op = new ARMOperand(Immediate); 1386 Op->Imm.Val = Val; 1387 Op->StartLoc = S; 1388 Op->EndLoc = E; 1389 return Op; 1390 } 1391 1392 static ARMOperand *CreateMem(unsigned BaseRegNum, 1393 const MCConstantExpr *OffsetImm, 1394 unsigned OffsetRegNum, 1395 ARM_AM::ShiftOpc ShiftType, 1396 unsigned ShiftImm, 1397 bool isNegative, 1398 SMLoc S, SMLoc E) { 1399 ARMOperand *Op = new ARMOperand(Memory); 1400 Op->Mem.BaseRegNum = BaseRegNum; 1401 Op->Mem.OffsetImm = OffsetImm; 1402 Op->Mem.OffsetRegNum = OffsetRegNum; 1403 Op->Mem.ShiftType = ShiftType; 1404 Op->Mem.ShiftImm = ShiftImm; 1405 Op->Mem.isNegative = isNegative; 1406 Op->StartLoc = S; 1407 Op->EndLoc = E; 1408 return Op; 1409 } 1410 1411 static ARMOperand *CreatePostIdxReg(unsigned RegNum, bool isAdd, 1412 ARM_AM::ShiftOpc ShiftTy, 1413 unsigned ShiftImm, 1414 SMLoc S, SMLoc E) { 1415 ARMOperand *Op = new ARMOperand(PostIndexRegister); 1416 Op->PostIdxReg.RegNum = RegNum; 1417 Op->PostIdxReg.isAdd = isAdd; 1418 Op->PostIdxReg.ShiftTy = ShiftTy; 1419 Op->PostIdxReg.ShiftImm = ShiftImm; 1420 Op->StartLoc = S; 1421 Op->EndLoc = E; 1422 return Op; 1423 } 1424 1425 static ARMOperand *CreateMemBarrierOpt(ARM_MB::MemBOpt Opt, SMLoc S) { 1426 ARMOperand *Op = new ARMOperand(MemBarrierOpt); 1427 Op->MBOpt.Val = Opt; 1428 Op->StartLoc = S; 1429 Op->EndLoc = S; 1430 return Op; 1431 } 1432 1433 static ARMOperand *CreateProcIFlags(ARM_PROC::IFlags IFlags, SMLoc S) { 1434 ARMOperand *Op = new ARMOperand(ProcIFlags); 1435 Op->IFlags.Val = IFlags; 1436 Op->StartLoc = S; 1437 Op->EndLoc = S; 1438 return Op; 1439 } 1440 1441 static ARMOperand *CreateMSRMask(unsigned MMask, SMLoc S) { 1442 ARMOperand *Op = new ARMOperand(MSRMask); 1443 Op->MMask.Val = MMask; 1444 Op->StartLoc = S; 1445 Op->EndLoc = S; 1446 return Op; 1447 } 1448}; 1449 1450} // end anonymous namespace. 1451 1452void ARMOperand::print(raw_ostream &OS) const { 1453 switch (Kind) { 1454 case CondCode: 1455 OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">"; 1456 break; 1457 case CCOut: 1458 OS << "<ccout " << getReg() << ">"; 1459 break; 1460 case ITCondMask: { 1461 static char MaskStr[][6] = { "()", "(t)", "(e)", "(tt)", "(et)", "(te)", 1462 "(ee)", "(ttt)", "(ett)", "(tet)", "(eet)", "(tte)", "(ete)", 1463 "(tee)", "(eee)" }; 1464 assert((ITMask.Mask & 0xf) == ITMask.Mask); 1465 OS << "<it-mask " << MaskStr[ITMask.Mask] << ">"; 1466 break; 1467 } 1468 case CoprocNum: 1469 OS << "<coprocessor number: " << getCoproc() << ">"; 1470 break; 1471 case CoprocReg: 1472 OS << "<coprocessor register: " << getCoproc() << ">"; 1473 break; 1474 case MSRMask: 1475 OS << "<mask: " << getMSRMask() << ">"; 1476 break; 1477 case Immediate: 1478 getImm()->print(OS); 1479 break; 1480 case MemBarrierOpt: 1481 OS << "<ARM_MB::" << MemBOptToString(getMemBarrierOpt()) << ">"; 1482 break; 1483 case Memory: 1484 OS << "<memory " 1485 << " base:" << Mem.BaseRegNum; 1486 OS << ">"; 1487 break; 1488 case PostIndexRegister: 1489 OS << "post-idx register " << (PostIdxReg.isAdd ? "" : "-") 1490 << PostIdxReg.RegNum; 1491 if (PostIdxReg.ShiftTy != ARM_AM::no_shift) 1492 OS << ARM_AM::getShiftOpcStr(PostIdxReg.ShiftTy) << " " 1493 << PostIdxReg.ShiftImm; 1494 OS << ">"; 1495 break; 1496 case ProcIFlags: { 1497 OS << "<ARM_PROC::"; 1498 unsigned IFlags = getProcIFlags(); 1499 for (int i=2; i >= 0; --i) 1500 if (IFlags & (1 << i)) 1501 OS << ARM_PROC::IFlagsToString(1 << i); 1502 OS << ">"; 1503 break; 1504 } 1505 case Register: 1506 OS << "<register " << getReg() << ">"; 1507 break; 1508 case ShifterImmediate: 1509 OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl") 1510 << " #" << ShifterImm.Imm << ">"; 1511 break; 1512 case ShiftedRegister: 1513 OS << "<so_reg_reg " 1514 << RegShiftedReg.SrcReg 1515 << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedReg.ShiftImm)) 1516 << ", " << RegShiftedReg.ShiftReg << ", " 1517 << ARM_AM::getSORegOffset(RegShiftedReg.ShiftImm) 1518 << ">"; 1519 break; 1520 case ShiftedImmediate: 1521 OS << "<so_reg_imm " 1522 << RegShiftedImm.SrcReg 1523 << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedImm.ShiftImm)) 1524 << ", " << ARM_AM::getSORegOffset(RegShiftedImm.ShiftImm) 1525 << ">"; 1526 break; 1527 case RotateImmediate: 1528 OS << "<ror " << " #" << (RotImm.Imm * 8) << ">"; 1529 break; 1530 case BitfieldDescriptor: 1531 OS << "<bitfield " << "lsb: " << Bitfield.LSB 1532 << ", width: " << Bitfield.Width << ">"; 1533 break; 1534 case RegisterList: 1535 case DPRRegisterList: 1536 case SPRRegisterList: { 1537 OS << "<register_list "; 1538 1539 const SmallVectorImpl<unsigned> &RegList = getRegList(); 1540 for (SmallVectorImpl<unsigned>::const_iterator 1541 I = RegList.begin(), E = RegList.end(); I != E; ) { 1542 OS << *I; 1543 if (++I < E) OS << ", "; 1544 } 1545 1546 OS << ">"; 1547 break; 1548 } 1549 case Token: 1550 OS << "'" << getToken() << "'"; 1551 break; 1552 } 1553} 1554 1555/// @name Auto-generated Match Functions 1556/// { 1557 1558static unsigned MatchRegisterName(StringRef Name); 1559 1560/// } 1561 1562bool ARMAsmParser::ParseRegister(unsigned &RegNo, 1563 SMLoc &StartLoc, SMLoc &EndLoc) { 1564 RegNo = tryParseRegister(); 1565 1566 return (RegNo == (unsigned)-1); 1567} 1568 1569/// Try to parse a register name. The token must be an Identifier when called, 1570/// and if it is a register name the token is eaten and the register number is 1571/// returned. Otherwise return -1. 1572/// 1573int ARMAsmParser::tryParseRegister() { 1574 const AsmToken &Tok = Parser.getTok(); 1575 if (Tok.isNot(AsmToken::Identifier)) return -1; 1576 1577 // FIXME: Validate register for the current architecture; we have to do 1578 // validation later, so maybe there is no need for this here. 1579 std::string upperCase = Tok.getString().str(); 1580 std::string lowerCase = LowercaseString(upperCase); 1581 unsigned RegNum = MatchRegisterName(lowerCase); 1582 if (!RegNum) { 1583 RegNum = StringSwitch<unsigned>(lowerCase) 1584 .Case("r13", ARM::SP) 1585 .Case("r14", ARM::LR) 1586 .Case("r15", ARM::PC) 1587 .Case("ip", ARM::R12) 1588 .Default(0); 1589 } 1590 if (!RegNum) return -1; 1591 1592 Parser.Lex(); // Eat identifier token. 1593 return RegNum; 1594} 1595 1596// Try to parse a shifter (e.g., "lsl <amt>"). On success, return 0. 1597// If a recoverable error occurs, return 1. If an irrecoverable error 1598// occurs, return -1. An irrecoverable error is one where tokens have been 1599// consumed in the process of trying to parse the shifter (i.e., when it is 1600// indeed a shifter operand, but malformed). 1601int ARMAsmParser::tryParseShiftRegister( 1602 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1603 SMLoc S = Parser.getTok().getLoc(); 1604 const AsmToken &Tok = Parser.getTok(); 1605 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1606 1607 std::string upperCase = Tok.getString().str(); 1608 std::string lowerCase = LowercaseString(upperCase); 1609 ARM_AM::ShiftOpc ShiftTy = StringSwitch<ARM_AM::ShiftOpc>(lowerCase) 1610 .Case("lsl", ARM_AM::lsl) 1611 .Case("lsr", ARM_AM::lsr) 1612 .Case("asr", ARM_AM::asr) 1613 .Case("ror", ARM_AM::ror) 1614 .Case("rrx", ARM_AM::rrx) 1615 .Default(ARM_AM::no_shift); 1616 1617 if (ShiftTy == ARM_AM::no_shift) 1618 return 1; 1619 1620 Parser.Lex(); // Eat the operator. 1621 1622 // The source register for the shift has already been added to the 1623 // operand list, so we need to pop it off and combine it into the shifted 1624 // register operand instead. 1625 OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val()); 1626 if (!PrevOp->isReg()) 1627 return Error(PrevOp->getStartLoc(), "shift must be of a register"); 1628 int SrcReg = PrevOp->getReg(); 1629 int64_t Imm = 0; 1630 int ShiftReg = 0; 1631 if (ShiftTy == ARM_AM::rrx) { 1632 // RRX Doesn't have an explicit shift amount. The encoder expects 1633 // the shift register to be the same as the source register. Seems odd, 1634 // but OK. 1635 ShiftReg = SrcReg; 1636 } else { 1637 // Figure out if this is shifted by a constant or a register (for non-RRX). 1638 if (Parser.getTok().is(AsmToken::Hash)) { 1639 Parser.Lex(); // Eat hash. 1640 SMLoc ImmLoc = Parser.getTok().getLoc(); 1641 const MCExpr *ShiftExpr = 0; 1642 if (getParser().ParseExpression(ShiftExpr)) { 1643 Error(ImmLoc, "invalid immediate shift value"); 1644 return -1; 1645 } 1646 // The expression must be evaluatable as an immediate. 1647 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr); 1648 if (!CE) { 1649 Error(ImmLoc, "invalid immediate shift value"); 1650 return -1; 1651 } 1652 // Range check the immediate. 1653 // lsl, ror: 0 <= imm <= 31 1654 // lsr, asr: 0 <= imm <= 32 1655 Imm = CE->getValue(); 1656 if (Imm < 0 || 1657 ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) || 1658 ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) { 1659 Error(ImmLoc, "immediate shift value out of range"); 1660 return -1; 1661 } 1662 } else if (Parser.getTok().is(AsmToken::Identifier)) { 1663 ShiftReg = tryParseRegister(); 1664 SMLoc L = Parser.getTok().getLoc(); 1665 if (ShiftReg == -1) { 1666 Error (L, "expected immediate or register in shift operand"); 1667 return -1; 1668 } 1669 } else { 1670 Error (Parser.getTok().getLoc(), 1671 "expected immediate or register in shift operand"); 1672 return -1; 1673 } 1674 } 1675 1676 if (ShiftReg && ShiftTy != ARM_AM::rrx) 1677 Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg, 1678 ShiftReg, Imm, 1679 S, Parser.getTok().getLoc())); 1680 else 1681 Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm, 1682 S, Parser.getTok().getLoc())); 1683 1684 return 0; 1685} 1686 1687 1688/// Try to parse a register name. The token must be an Identifier when called. 1689/// If it's a register, an AsmOperand is created. Another AsmOperand is created 1690/// if there is a "writeback". 'true' if it's not a register. 1691/// 1692/// TODO this is likely to change to allow different register types and or to 1693/// parse for a specific register type. 1694bool ARMAsmParser:: 1695tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1696 SMLoc S = Parser.getTok().getLoc(); 1697 int RegNo = tryParseRegister(); 1698 if (RegNo == -1) 1699 return true; 1700 1701 Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc())); 1702 1703 const AsmToken &ExclaimTok = Parser.getTok(); 1704 if (ExclaimTok.is(AsmToken::Exclaim)) { 1705 Operands.push_back(ARMOperand::CreateToken(ExclaimTok.getString(), 1706 ExclaimTok.getLoc())); 1707 Parser.Lex(); // Eat exclaim token 1708 } 1709 1710 return false; 1711} 1712 1713/// MatchCoprocessorOperandName - Try to parse an coprocessor related 1714/// instruction with a symbolic operand name. Example: "p1", "p7", "c3", 1715/// "c5", ... 1716static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) { 1717 // Use the same layout as the tablegen'erated register name matcher. Ugly, 1718 // but efficient. 1719 switch (Name.size()) { 1720 default: break; 1721 case 2: 1722 if (Name[0] != CoprocOp) 1723 return -1; 1724 switch (Name[1]) { 1725 default: return -1; 1726 case '0': return 0; 1727 case '1': return 1; 1728 case '2': return 2; 1729 case '3': return 3; 1730 case '4': return 4; 1731 case '5': return 5; 1732 case '6': return 6; 1733 case '7': return 7; 1734 case '8': return 8; 1735 case '9': return 9; 1736 } 1737 break; 1738 case 3: 1739 if (Name[0] != CoprocOp || Name[1] != '1') 1740 return -1; 1741 switch (Name[2]) { 1742 default: return -1; 1743 case '0': return 10; 1744 case '1': return 11; 1745 case '2': return 12; 1746 case '3': return 13; 1747 case '4': return 14; 1748 case '5': return 15; 1749 } 1750 break; 1751 } 1752 1753 return -1; 1754} 1755 1756/// parseITCondCode - Try to parse a condition code for an IT instruction. 1757ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1758parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1759 SMLoc S = Parser.getTok().getLoc(); 1760 const AsmToken &Tok = Parser.getTok(); 1761 if (!Tok.is(AsmToken::Identifier)) 1762 return MatchOperand_NoMatch; 1763 unsigned CC = StringSwitch<unsigned>(Tok.getString()) 1764 .Case("eq", ARMCC::EQ) 1765 .Case("ne", ARMCC::NE) 1766 .Case("hs", ARMCC::HS) 1767 .Case("cs", ARMCC::HS) 1768 .Case("lo", ARMCC::LO) 1769 .Case("cc", ARMCC::LO) 1770 .Case("mi", ARMCC::MI) 1771 .Case("pl", ARMCC::PL) 1772 .Case("vs", ARMCC::VS) 1773 .Case("vc", ARMCC::VC) 1774 .Case("hi", ARMCC::HI) 1775 .Case("ls", ARMCC::LS) 1776 .Case("ge", ARMCC::GE) 1777 .Case("lt", ARMCC::LT) 1778 .Case("gt", ARMCC::GT) 1779 .Case("le", ARMCC::LE) 1780 .Case("al", ARMCC::AL) 1781 .Default(~0U); 1782 if (CC == ~0U) 1783 return MatchOperand_NoMatch; 1784 Parser.Lex(); // Eat the token. 1785 1786 Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC), S)); 1787 1788 return MatchOperand_Success; 1789} 1790 1791/// parseCoprocNumOperand - Try to parse an coprocessor number operand. The 1792/// token must be an Identifier when called, and if it is a coprocessor 1793/// number, the token is eaten and the operand is added to the operand list. 1794ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1795parseCoprocNumOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1796 SMLoc S = Parser.getTok().getLoc(); 1797 const AsmToken &Tok = Parser.getTok(); 1798 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1799 1800 int Num = MatchCoprocessorOperandName(Tok.getString(), 'p'); 1801 if (Num == -1) 1802 return MatchOperand_NoMatch; 1803 1804 Parser.Lex(); // Eat identifier token. 1805 Operands.push_back(ARMOperand::CreateCoprocNum(Num, S)); 1806 return MatchOperand_Success; 1807} 1808 1809/// parseCoprocRegOperand - Try to parse an coprocessor register operand. The 1810/// token must be an Identifier when called, and if it is a coprocessor 1811/// number, the token is eaten and the operand is added to the operand list. 1812ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1813parseCoprocRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1814 SMLoc S = Parser.getTok().getLoc(); 1815 const AsmToken &Tok = Parser.getTok(); 1816 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1817 1818 int Reg = MatchCoprocessorOperandName(Tok.getString(), 'c'); 1819 if (Reg == -1) 1820 return MatchOperand_NoMatch; 1821 1822 Parser.Lex(); // Eat identifier token. 1823 Operands.push_back(ARMOperand::CreateCoprocReg(Reg, S)); 1824 return MatchOperand_Success; 1825} 1826 1827/// Parse a register list, return it if successful else return null. The first 1828/// token must be a '{' when called. 1829bool ARMAsmParser:: 1830parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1831 assert(Parser.getTok().is(AsmToken::LCurly) && 1832 "Token is not a Left Curly Brace"); 1833 SMLoc S = Parser.getTok().getLoc(); 1834 1835 // Read the rest of the registers in the list. 1836 unsigned PrevRegNum = 0; 1837 SmallVector<std::pair<unsigned, SMLoc>, 32> Registers; 1838 1839 do { 1840 bool IsRange = Parser.getTok().is(AsmToken::Minus); 1841 Parser.Lex(); // Eat non-identifier token. 1842 1843 const AsmToken &RegTok = Parser.getTok(); 1844 SMLoc RegLoc = RegTok.getLoc(); 1845 if (RegTok.isNot(AsmToken::Identifier)) { 1846 Error(RegLoc, "register expected"); 1847 return true; 1848 } 1849 1850 int RegNum = tryParseRegister(); 1851 if (RegNum == -1) { 1852 Error(RegLoc, "register expected"); 1853 return true; 1854 } 1855 1856 if (IsRange) { 1857 int Reg = PrevRegNum; 1858 do { 1859 ++Reg; 1860 Registers.push_back(std::make_pair(Reg, RegLoc)); 1861 } while (Reg != RegNum); 1862 } else { 1863 Registers.push_back(std::make_pair(RegNum, RegLoc)); 1864 } 1865 1866 PrevRegNum = RegNum; 1867 } while (Parser.getTok().is(AsmToken::Comma) || 1868 Parser.getTok().is(AsmToken::Minus)); 1869 1870 // Process the right curly brace of the list. 1871 const AsmToken &RCurlyTok = Parser.getTok(); 1872 if (RCurlyTok.isNot(AsmToken::RCurly)) { 1873 Error(RCurlyTok.getLoc(), "'}' expected"); 1874 return true; 1875 } 1876 1877 SMLoc E = RCurlyTok.getLoc(); 1878 Parser.Lex(); // Eat right curly brace token. 1879 1880 // Verify the register list. 1881 bool EmittedWarning = false; 1882 unsigned HighRegNum = 0; 1883 BitVector RegMap(32); 1884 for (unsigned i = 0, e = Registers.size(); i != e; ++i) { 1885 const std::pair<unsigned, SMLoc> &RegInfo = Registers[i]; 1886 unsigned Reg = getARMRegisterNumbering(RegInfo.first); 1887 1888 if (RegMap[Reg]) { 1889 Error(RegInfo.second, "register duplicated in register list"); 1890 return true; 1891 } 1892 1893 if (!EmittedWarning && Reg < HighRegNum) 1894 Warning(RegInfo.second, 1895 "register not in ascending order in register list"); 1896 1897 RegMap.set(Reg); 1898 HighRegNum = std::max(Reg, HighRegNum); 1899 } 1900 1901 Operands.push_back(ARMOperand::CreateRegList(Registers, S, E)); 1902 return false; 1903} 1904 1905/// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options. 1906ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1907parseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1908 SMLoc S = Parser.getTok().getLoc(); 1909 const AsmToken &Tok = Parser.getTok(); 1910 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1911 StringRef OptStr = Tok.getString(); 1912 1913 unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size())) 1914 .Case("sy", ARM_MB::SY) 1915 .Case("st", ARM_MB::ST) 1916 .Case("sh", ARM_MB::ISH) 1917 .Case("ish", ARM_MB::ISH) 1918 .Case("shst", ARM_MB::ISHST) 1919 .Case("ishst", ARM_MB::ISHST) 1920 .Case("nsh", ARM_MB::NSH) 1921 .Case("un", ARM_MB::NSH) 1922 .Case("nshst", ARM_MB::NSHST) 1923 .Case("unst", ARM_MB::NSHST) 1924 .Case("osh", ARM_MB::OSH) 1925 .Case("oshst", ARM_MB::OSHST) 1926 .Default(~0U); 1927 1928 if (Opt == ~0U) 1929 return MatchOperand_NoMatch; 1930 1931 Parser.Lex(); // Eat identifier token. 1932 Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S)); 1933 return MatchOperand_Success; 1934} 1935 1936/// parseProcIFlagsOperand - Try to parse iflags from CPS instruction. 1937ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1938parseProcIFlagsOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1939 SMLoc S = Parser.getTok().getLoc(); 1940 const AsmToken &Tok = Parser.getTok(); 1941 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1942 StringRef IFlagsStr = Tok.getString(); 1943 1944 unsigned IFlags = 0; 1945 for (int i = 0, e = IFlagsStr.size(); i != e; ++i) { 1946 unsigned Flag = StringSwitch<unsigned>(IFlagsStr.substr(i, 1)) 1947 .Case("a", ARM_PROC::A) 1948 .Case("i", ARM_PROC::I) 1949 .Case("f", ARM_PROC::F) 1950 .Default(~0U); 1951 1952 // If some specific iflag is already set, it means that some letter is 1953 // present more than once, this is not acceptable. 1954 if (Flag == ~0U || (IFlags & Flag)) 1955 return MatchOperand_NoMatch; 1956 1957 IFlags |= Flag; 1958 } 1959 1960 Parser.Lex(); // Eat identifier token. 1961 Operands.push_back(ARMOperand::CreateProcIFlags((ARM_PROC::IFlags)IFlags, S)); 1962 return MatchOperand_Success; 1963} 1964 1965/// parseMSRMaskOperand - Try to parse mask flags from MSR instruction. 1966ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1967parseMSRMaskOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1968 SMLoc S = Parser.getTok().getLoc(); 1969 const AsmToken &Tok = Parser.getTok(); 1970 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1971 StringRef Mask = Tok.getString(); 1972 1973 // Split spec_reg from flag, example: CPSR_sxf => "CPSR" and "sxf" 1974 size_t Start = 0, Next = Mask.find('_'); 1975 StringRef Flags = ""; 1976 std::string SpecReg = LowercaseString(Mask.slice(Start, Next)); 1977 if (Next != StringRef::npos) 1978 Flags = Mask.slice(Next+1, Mask.size()); 1979 1980 // FlagsVal contains the complete mask: 1981 // 3-0: Mask 1982 // 4: Special Reg (cpsr, apsr => 0; spsr => 1) 1983 unsigned FlagsVal = 0; 1984 1985 if (SpecReg == "apsr") { 1986 FlagsVal = StringSwitch<unsigned>(Flags) 1987 .Case("nzcvq", 0x8) // same as CPSR_f 1988 .Case("g", 0x4) // same as CPSR_s 1989 .Case("nzcvqg", 0xc) // same as CPSR_fs 1990 .Default(~0U); 1991 1992 if (FlagsVal == ~0U) { 1993 if (!Flags.empty()) 1994 return MatchOperand_NoMatch; 1995 else 1996 FlagsVal = 0; // No flag 1997 } 1998 } else if (SpecReg == "cpsr" || SpecReg == "spsr") { 1999 if (Flags == "all") // cpsr_all is an alias for cpsr_fc 2000 Flags = "fc"; 2001 for (int i = 0, e = Flags.size(); i != e; ++i) { 2002 unsigned Flag = StringSwitch<unsigned>(Flags.substr(i, 1)) 2003 .Case("c", 1) 2004 .Case("x", 2) 2005 .Case("s", 4) 2006 .Case("f", 8) 2007 .Default(~0U); 2008 2009 // If some specific flag is already set, it means that some letter is 2010 // present more than once, this is not acceptable. 2011 if (FlagsVal == ~0U || (FlagsVal & Flag)) 2012 return MatchOperand_NoMatch; 2013 FlagsVal |= Flag; 2014 } 2015 } else // No match for special register. 2016 return MatchOperand_NoMatch; 2017 2018 // Special register without flags are equivalent to "fc" flags. 2019 if (!FlagsVal) 2020 FlagsVal = 0x9; 2021 2022 // Bit 4: Special Reg (cpsr, apsr => 0; spsr => 1) 2023 if (SpecReg == "spsr") 2024 FlagsVal |= 16; 2025 2026 Parser.Lex(); // Eat identifier token. 2027 Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S)); 2028 return MatchOperand_Success; 2029} 2030 2031ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2032parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands, StringRef Op, 2033 int Low, int High) { 2034 const AsmToken &Tok = Parser.getTok(); 2035 if (Tok.isNot(AsmToken::Identifier)) { 2036 Error(Parser.getTok().getLoc(), Op + " operand expected."); 2037 return MatchOperand_ParseFail; 2038 } 2039 StringRef ShiftName = Tok.getString(); 2040 std::string LowerOp = LowercaseString(Op); 2041 std::string UpperOp = UppercaseString(Op); 2042 if (ShiftName != LowerOp && ShiftName != UpperOp) { 2043 Error(Parser.getTok().getLoc(), Op + " operand expected."); 2044 return MatchOperand_ParseFail; 2045 } 2046 Parser.Lex(); // Eat shift type token. 2047 2048 // There must be a '#' and a shift amount. 2049 if (Parser.getTok().isNot(AsmToken::Hash)) { 2050 Error(Parser.getTok().getLoc(), "'#' expected"); 2051 return MatchOperand_ParseFail; 2052 } 2053 Parser.Lex(); // Eat hash token. 2054 2055 const MCExpr *ShiftAmount; 2056 SMLoc Loc = Parser.getTok().getLoc(); 2057 if (getParser().ParseExpression(ShiftAmount)) { 2058 Error(Loc, "illegal expression"); 2059 return MatchOperand_ParseFail; 2060 } 2061 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 2062 if (!CE) { 2063 Error(Loc, "constant expression expected"); 2064 return MatchOperand_ParseFail; 2065 } 2066 int Val = CE->getValue(); 2067 if (Val < Low || Val > High) { 2068 Error(Loc, "immediate value out of range"); 2069 return MatchOperand_ParseFail; 2070 } 2071 2072 Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc())); 2073 2074 return MatchOperand_Success; 2075} 2076 2077ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2078parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2079 const AsmToken &Tok = Parser.getTok(); 2080 SMLoc S = Tok.getLoc(); 2081 if (Tok.isNot(AsmToken::Identifier)) { 2082 Error(Tok.getLoc(), "'be' or 'le' operand expected"); 2083 return MatchOperand_ParseFail; 2084 } 2085 int Val = StringSwitch<int>(Tok.getString()) 2086 .Case("be", 1) 2087 .Case("le", 0) 2088 .Default(-1); 2089 Parser.Lex(); // Eat the token. 2090 2091 if (Val == -1) { 2092 Error(Tok.getLoc(), "'be' or 'le' operand expected"); 2093 return MatchOperand_ParseFail; 2094 } 2095 Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val, 2096 getContext()), 2097 S, Parser.getTok().getLoc())); 2098 return MatchOperand_Success; 2099} 2100 2101/// parseShifterImm - Parse the shifter immediate operand for SSAT/USAT 2102/// instructions. Legal values are: 2103/// lsl #n 'n' in [0,31] 2104/// asr #n 'n' in [1,32] 2105/// n == 32 encoded as n == 0. 2106ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2107parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2108 const AsmToken &Tok = Parser.getTok(); 2109 SMLoc S = Tok.getLoc(); 2110 if (Tok.isNot(AsmToken::Identifier)) { 2111 Error(S, "shift operator 'asr' or 'lsl' expected"); 2112 return MatchOperand_ParseFail; 2113 } 2114 StringRef ShiftName = Tok.getString(); 2115 bool isASR; 2116 if (ShiftName == "lsl" || ShiftName == "LSL") 2117 isASR = false; 2118 else if (ShiftName == "asr" || ShiftName == "ASR") 2119 isASR = true; 2120 else { 2121 Error(S, "shift operator 'asr' or 'lsl' expected"); 2122 return MatchOperand_ParseFail; 2123 } 2124 Parser.Lex(); // Eat the operator. 2125 2126 // A '#' and a shift amount. 2127 if (Parser.getTok().isNot(AsmToken::Hash)) { 2128 Error(Parser.getTok().getLoc(), "'#' expected"); 2129 return MatchOperand_ParseFail; 2130 } 2131 Parser.Lex(); // Eat hash token. 2132 2133 const MCExpr *ShiftAmount; 2134 SMLoc E = Parser.getTok().getLoc(); 2135 if (getParser().ParseExpression(ShiftAmount)) { 2136 Error(E, "malformed shift expression"); 2137 return MatchOperand_ParseFail; 2138 } 2139 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 2140 if (!CE) { 2141 Error(E, "shift amount must be an immediate"); 2142 return MatchOperand_ParseFail; 2143 } 2144 2145 int64_t Val = CE->getValue(); 2146 if (isASR) { 2147 // Shift amount must be in [1,32] 2148 if (Val < 1 || Val > 32) { 2149 Error(E, "'asr' shift amount must be in range [1,32]"); 2150 return MatchOperand_ParseFail; 2151 } 2152 // asr #32 encoded as asr #0. 2153 if (Val == 32) Val = 0; 2154 } else { 2155 // Shift amount must be in [1,32] 2156 if (Val < 0 || Val > 31) { 2157 Error(E, "'lsr' shift amount must be in range [0,31]"); 2158 return MatchOperand_ParseFail; 2159 } 2160 } 2161 2162 E = Parser.getTok().getLoc(); 2163 Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E)); 2164 2165 return MatchOperand_Success; 2166} 2167 2168/// parseRotImm - Parse the shifter immediate operand for SXTB/UXTB family 2169/// of instructions. Legal values are: 2170/// ror #n 'n' in {0, 8, 16, 24} 2171ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2172parseRotImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2173 const AsmToken &Tok = Parser.getTok(); 2174 SMLoc S = Tok.getLoc(); 2175 if (Tok.isNot(AsmToken::Identifier)) { 2176 Error(S, "rotate operator 'ror' expected"); 2177 return MatchOperand_ParseFail; 2178 } 2179 StringRef ShiftName = Tok.getString(); 2180 if (ShiftName != "ror" && ShiftName != "ROR") { 2181 Error(S, "rotate operator 'ror' expected"); 2182 return MatchOperand_ParseFail; 2183 } 2184 Parser.Lex(); // Eat the operator. 2185 2186 // A '#' and a rotate amount. 2187 if (Parser.getTok().isNot(AsmToken::Hash)) { 2188 Error(Parser.getTok().getLoc(), "'#' expected"); 2189 return MatchOperand_ParseFail; 2190 } 2191 Parser.Lex(); // Eat hash token. 2192 2193 const MCExpr *ShiftAmount; 2194 SMLoc E = Parser.getTok().getLoc(); 2195 if (getParser().ParseExpression(ShiftAmount)) { 2196 Error(E, "malformed rotate expression"); 2197 return MatchOperand_ParseFail; 2198 } 2199 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 2200 if (!CE) { 2201 Error(E, "rotate amount must be an immediate"); 2202 return MatchOperand_ParseFail; 2203 } 2204 2205 int64_t Val = CE->getValue(); 2206 // Shift amount must be in {0, 8, 16, 24} (0 is undocumented extension) 2207 // normally, zero is represented in asm by omitting the rotate operand 2208 // entirely. 2209 if (Val != 8 && Val != 16 && Val != 24 && Val != 0) { 2210 Error(E, "'ror' rotate amount must be 8, 16, or 24"); 2211 return MatchOperand_ParseFail; 2212 } 2213 2214 E = Parser.getTok().getLoc(); 2215 Operands.push_back(ARMOperand::CreateRotImm(Val, S, E)); 2216 2217 return MatchOperand_Success; 2218} 2219 2220ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2221parseBitfield(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2222 SMLoc S = Parser.getTok().getLoc(); 2223 // The bitfield descriptor is really two operands, the LSB and the width. 2224 if (Parser.getTok().isNot(AsmToken::Hash)) { 2225 Error(Parser.getTok().getLoc(), "'#' expected"); 2226 return MatchOperand_ParseFail; 2227 } 2228 Parser.Lex(); // Eat hash token. 2229 2230 const MCExpr *LSBExpr; 2231 SMLoc E = Parser.getTok().getLoc(); 2232 if (getParser().ParseExpression(LSBExpr)) { 2233 Error(E, "malformed immediate expression"); 2234 return MatchOperand_ParseFail; 2235 } 2236 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(LSBExpr); 2237 if (!CE) { 2238 Error(E, "'lsb' operand must be an immediate"); 2239 return MatchOperand_ParseFail; 2240 } 2241 2242 int64_t LSB = CE->getValue(); 2243 // The LSB must be in the range [0,31] 2244 if (LSB < 0 || LSB > 31) { 2245 Error(E, "'lsb' operand must be in the range [0,31]"); 2246 return MatchOperand_ParseFail; 2247 } 2248 E = Parser.getTok().getLoc(); 2249 2250 // Expect another immediate operand. 2251 if (Parser.getTok().isNot(AsmToken::Comma)) { 2252 Error(Parser.getTok().getLoc(), "too few operands"); 2253 return MatchOperand_ParseFail; 2254 } 2255 Parser.Lex(); // Eat hash token. 2256 if (Parser.getTok().isNot(AsmToken::Hash)) { 2257 Error(Parser.getTok().getLoc(), "'#' expected"); 2258 return MatchOperand_ParseFail; 2259 } 2260 Parser.Lex(); // Eat hash token. 2261 2262 const MCExpr *WidthExpr; 2263 if (getParser().ParseExpression(WidthExpr)) { 2264 Error(E, "malformed immediate expression"); 2265 return MatchOperand_ParseFail; 2266 } 2267 CE = dyn_cast<MCConstantExpr>(WidthExpr); 2268 if (!CE) { 2269 Error(E, "'width' operand must be an immediate"); 2270 return MatchOperand_ParseFail; 2271 } 2272 2273 int64_t Width = CE->getValue(); 2274 // The LSB must be in the range [1,32-lsb] 2275 if (Width < 1 || Width > 32 - LSB) { 2276 Error(E, "'width' operand must be in the range [1,32-lsb]"); 2277 return MatchOperand_ParseFail; 2278 } 2279 E = Parser.getTok().getLoc(); 2280 2281 Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, E)); 2282 2283 return MatchOperand_Success; 2284} 2285 2286ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2287parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2288 // Check for a post-index addressing register operand. Specifically: 2289 // postidx_reg := '+' register {, shift} 2290 // | '-' register {, shift} 2291 // | register {, shift} 2292 2293 // This method must return MatchOperand_NoMatch without consuming any tokens 2294 // in the case where there is no match, as other alternatives take other 2295 // parse methods. 2296 AsmToken Tok = Parser.getTok(); 2297 SMLoc S = Tok.getLoc(); 2298 bool haveEaten = false; 2299 bool isAdd = true; 2300 int Reg = -1; 2301 if (Tok.is(AsmToken::Plus)) { 2302 Parser.Lex(); // Eat the '+' token. 2303 haveEaten = true; 2304 } else if (Tok.is(AsmToken::Minus)) { 2305 Parser.Lex(); // Eat the '-' token. 2306 isAdd = false; 2307 haveEaten = true; 2308 } 2309 if (Parser.getTok().is(AsmToken::Identifier)) 2310 Reg = tryParseRegister(); 2311 if (Reg == -1) { 2312 if (!haveEaten) 2313 return MatchOperand_NoMatch; 2314 Error(Parser.getTok().getLoc(), "register expected"); 2315 return MatchOperand_ParseFail; 2316 } 2317 SMLoc E = Parser.getTok().getLoc(); 2318 2319 ARM_AM::ShiftOpc ShiftTy = ARM_AM::no_shift; 2320 unsigned ShiftImm = 0; 2321 if (Parser.getTok().is(AsmToken::Comma)) { 2322 Parser.Lex(); // Eat the ','. 2323 if (parseMemRegOffsetShift(ShiftTy, ShiftImm)) 2324 return MatchOperand_ParseFail; 2325 } 2326 2327 Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ShiftTy, 2328 ShiftImm, S, E)); 2329 2330 return MatchOperand_Success; 2331} 2332 2333ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 2334parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2335 // Check for a post-index addressing register operand. Specifically: 2336 // am3offset := '+' register 2337 // | '-' register 2338 // | register 2339 // | # imm 2340 // | # + imm 2341 // | # - imm 2342 2343 // This method must return MatchOperand_NoMatch without consuming any tokens 2344 // in the case where there is no match, as other alternatives take other 2345 // parse methods. 2346 AsmToken Tok = Parser.getTok(); 2347 SMLoc S = Tok.getLoc(); 2348 2349 // Do immediates first, as we always parse those if we have a '#'. 2350 if (Parser.getTok().is(AsmToken::Hash)) { 2351 Parser.Lex(); // Eat the '#'. 2352 // Explicitly look for a '-', as we need to encode negative zero 2353 // differently. 2354 bool isNegative = Parser.getTok().is(AsmToken::Minus); 2355 const MCExpr *Offset; 2356 if (getParser().ParseExpression(Offset)) 2357 return MatchOperand_ParseFail; 2358 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset); 2359 if (!CE) { 2360 Error(S, "constant expression expected"); 2361 return MatchOperand_ParseFail; 2362 } 2363 SMLoc E = Tok.getLoc(); 2364 // Negative zero is encoded as the flag value INT32_MIN. 2365 int32_t Val = CE->getValue(); 2366 if (isNegative && Val == 0) 2367 Val = INT32_MIN; 2368 2369 Operands.push_back( 2370 ARMOperand::CreateImm(MCConstantExpr::Create(Val, getContext()), S, E)); 2371 2372 return MatchOperand_Success; 2373 } 2374 2375 2376 bool haveEaten = false; 2377 bool isAdd = true; 2378 int Reg = -1; 2379 if (Tok.is(AsmToken::Plus)) { 2380 Parser.Lex(); // Eat the '+' token. 2381 haveEaten = true; 2382 } else if (Tok.is(AsmToken::Minus)) { 2383 Parser.Lex(); // Eat the '-' token. 2384 isAdd = false; 2385 haveEaten = true; 2386 } 2387 if (Parser.getTok().is(AsmToken::Identifier)) 2388 Reg = tryParseRegister(); 2389 if (Reg == -1) { 2390 if (!haveEaten) 2391 return MatchOperand_NoMatch; 2392 Error(Parser.getTok().getLoc(), "register expected"); 2393 return MatchOperand_ParseFail; 2394 } 2395 SMLoc E = Parser.getTok().getLoc(); 2396 2397 Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ARM_AM::no_shift, 2398 0, S, E)); 2399 2400 return MatchOperand_Success; 2401} 2402 2403/// cvtLdWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst. 2404/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2405/// when they refer multiple MIOperands inside a single one. 2406bool ARMAsmParser:: 2407cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode, 2408 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2409 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2410 2411 // Create a writeback register dummy placeholder. 2412 Inst.addOperand(MCOperand::CreateImm(0)); 2413 2414 ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2); 2415 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2416 return true; 2417} 2418 2419/// cvtLdWriteBackRegAddrMode2 - Convert parsed operands to MCInst. 2420/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2421/// when they refer multiple MIOperands inside a single one. 2422bool ARMAsmParser:: 2423cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 2424 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2425 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2426 2427 // Create a writeback register dummy placeholder. 2428 Inst.addOperand(MCOperand::CreateImm(0)); 2429 2430 ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3); 2431 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2432 return true; 2433} 2434 2435/// cvtLdWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst. 2436/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2437/// when they refer multiple MIOperands inside a single one. 2438bool ARMAsmParser:: 2439cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 2440 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2441 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2442 2443 // Create a writeback register dummy placeholder. 2444 Inst.addOperand(MCOperand::CreateImm(0)); 2445 2446 ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2); 2447 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2448 return true; 2449} 2450 2451 2452/// cvtStWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst. 2453/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2454/// when they refer multiple MIOperands inside a single one. 2455bool ARMAsmParser:: 2456cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode, 2457 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2458 // Create a writeback register dummy placeholder. 2459 Inst.addOperand(MCOperand::CreateImm(0)); 2460 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2461 ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2); 2462 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2463 return true; 2464} 2465 2466/// cvtStWriteBackRegAddrMode2 - Convert parsed operands to MCInst. 2467/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2468/// when they refer multiple MIOperands inside a single one. 2469bool ARMAsmParser:: 2470cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 2471 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2472 // Create a writeback register dummy placeholder. 2473 Inst.addOperand(MCOperand::CreateImm(0)); 2474 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2475 ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3); 2476 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2477 return true; 2478} 2479 2480/// cvtStWriteBackRegAddrMode3 - Convert parsed operands to MCInst. 2481/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2482/// when they refer multiple MIOperands inside a single one. 2483bool ARMAsmParser:: 2484cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 2485 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2486 // Create a writeback register dummy placeholder. 2487 Inst.addOperand(MCOperand::CreateImm(0)); 2488 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2489 ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3); 2490 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2491 return true; 2492} 2493 2494/// cvtLdExtTWriteBackImm - Convert parsed operands to MCInst. 2495/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2496/// when they refer multiple MIOperands inside a single one. 2497bool ARMAsmParser:: 2498cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 2499 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2500 // Rt 2501 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2502 // Create a writeback register dummy placeholder. 2503 Inst.addOperand(MCOperand::CreateImm(0)); 2504 // addr 2505 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 2506 // offset 2507 ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1); 2508 // pred 2509 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2510 return true; 2511} 2512 2513/// cvtLdExtTWriteBackReg - Convert parsed operands to MCInst. 2514/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2515/// when they refer multiple MIOperands inside a single one. 2516bool ARMAsmParser:: 2517cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 2518 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2519 // Rt 2520 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2521 // Create a writeback register dummy placeholder. 2522 Inst.addOperand(MCOperand::CreateImm(0)); 2523 // addr 2524 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 2525 // offset 2526 ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2); 2527 // pred 2528 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2529 return true; 2530} 2531 2532/// cvtStExtTWriteBackImm - Convert parsed operands to MCInst. 2533/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2534/// when they refer multiple MIOperands inside a single one. 2535bool ARMAsmParser:: 2536cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode, 2537 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2538 // Create a writeback register dummy placeholder. 2539 Inst.addOperand(MCOperand::CreateImm(0)); 2540 // Rt 2541 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2542 // addr 2543 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 2544 // offset 2545 ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1); 2546 // pred 2547 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2548 return true; 2549} 2550 2551/// cvtStExtTWriteBackReg - Convert parsed operands to MCInst. 2552/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2553/// when they refer multiple MIOperands inside a single one. 2554bool ARMAsmParser:: 2555cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode, 2556 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2557 // Create a writeback register dummy placeholder. 2558 Inst.addOperand(MCOperand::CreateImm(0)); 2559 // Rt 2560 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2561 // addr 2562 ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1); 2563 // offset 2564 ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2); 2565 // pred 2566 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2567 return true; 2568} 2569 2570/// cvtLdrdPre - Convert parsed operands to MCInst. 2571/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2572/// when they refer multiple MIOperands inside a single one. 2573bool ARMAsmParser:: 2574cvtLdrdPre(MCInst &Inst, unsigned Opcode, 2575 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2576 // Rt, Rt2 2577 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2578 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 2579 // Create a writeback register dummy placeholder. 2580 Inst.addOperand(MCOperand::CreateImm(0)); 2581 // addr 2582 ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3); 2583 // pred 2584 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2585 return true; 2586} 2587 2588/// cvtStrdPre - Convert parsed operands to MCInst. 2589/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2590/// when they refer multiple MIOperands inside a single one. 2591bool ARMAsmParser:: 2592cvtStrdPre(MCInst &Inst, unsigned Opcode, 2593 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2594 // Create a writeback register dummy placeholder. 2595 Inst.addOperand(MCOperand::CreateImm(0)); 2596 // Rt, Rt2 2597 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2598 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 2599 // addr 2600 ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3); 2601 // pred 2602 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2603 return true; 2604} 2605 2606/// cvtLdWriteBackRegAddrMode3 - Convert parsed operands to MCInst. 2607/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2608/// when they refer multiple MIOperands inside a single one. 2609bool ARMAsmParser:: 2610cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 2611 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2612 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 2613 // Create a writeback register dummy placeholder. 2614 Inst.addOperand(MCOperand::CreateImm(0)); 2615 ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3); 2616 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 2617 return true; 2618} 2619 2620/// cvtThumbMultiple- Convert parsed operands to MCInst. 2621/// Needed here because the Asm Gen Matcher can't handle properly tied operands 2622/// when they refer multiple MIOperands inside a single one. 2623bool ARMAsmParser:: 2624cvtThumbMultiply(MCInst &Inst, unsigned Opcode, 2625 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2626 // The second source operand must be the same register as the destination 2627 // operand. 2628 if (Operands.size() == 6 && 2629 (((ARMOperand*)Operands[3])->getReg() != 2630 ((ARMOperand*)Operands[5])->getReg()) && 2631 (((ARMOperand*)Operands[3])->getReg() != 2632 ((ARMOperand*)Operands[4])->getReg())) { 2633 Error(Operands[3]->getStartLoc(), 2634 "destination register must match source register"); 2635 return false; 2636 } 2637 ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1); 2638 ((ARMOperand*)Operands[1])->addCCOutOperands(Inst, 1); 2639 ((ARMOperand*)Operands[4])->addRegOperands(Inst, 1); 2640 // If we have a three-operand form, use that, else the second source operand 2641 // is just the destination operand again. 2642 if (Operands.size() == 6) 2643 ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1); 2644 else 2645 Inst.addOperand(Inst.getOperand(0)); 2646 ((ARMOperand*)Operands[2])->addCondCodeOperands(Inst, 2); 2647 2648 return true; 2649} 2650 2651/// Parse an ARM memory expression, return false if successful else return true 2652/// or an error. The first token must be a '[' when called. 2653bool ARMAsmParser:: 2654parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2655 SMLoc S, E; 2656 assert(Parser.getTok().is(AsmToken::LBrac) && 2657 "Token is not a Left Bracket"); 2658 S = Parser.getTok().getLoc(); 2659 Parser.Lex(); // Eat left bracket token. 2660 2661 const AsmToken &BaseRegTok = Parser.getTok(); 2662 int BaseRegNum = tryParseRegister(); 2663 if (BaseRegNum == -1) 2664 return Error(BaseRegTok.getLoc(), "register expected"); 2665 2666 // The next token must either be a comma or a closing bracket. 2667 const AsmToken &Tok = Parser.getTok(); 2668 if (!Tok.is(AsmToken::Comma) && !Tok.is(AsmToken::RBrac)) 2669 return Error(Tok.getLoc(), "malformed memory operand"); 2670 2671 if (Tok.is(AsmToken::RBrac)) { 2672 E = Tok.getLoc(); 2673 Parser.Lex(); // Eat right bracket token. 2674 2675 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, ARM_AM::no_shift, 2676 0, false, S, E)); 2677 2678 return false; 2679 } 2680 2681 assert(Tok.is(AsmToken::Comma) && "Lost comma in memory operand?!"); 2682 Parser.Lex(); // Eat the comma. 2683 2684 // If we have a '#' it's an immediate offset, else assume it's a register 2685 // offset. 2686 if (Parser.getTok().is(AsmToken::Hash)) { 2687 Parser.Lex(); // Eat the '#'. 2688 E = Parser.getTok().getLoc(); 2689 2690 bool isNegative = getParser().getTok().is(AsmToken::Minus); 2691 const MCExpr *Offset; 2692 if (getParser().ParseExpression(Offset)) 2693 return true; 2694 2695 // The expression has to be a constant. Memory references with relocations 2696 // don't come through here, as they use the <label> forms of the relevant 2697 // instructions. 2698 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset); 2699 if (!CE) 2700 return Error (E, "constant expression expected"); 2701 2702 // If the constant was #-0, represent it as INT32_MIN. 2703 int32_t Val = CE->getValue(); 2704 if (isNegative && Val == 0) 2705 CE = MCConstantExpr::Create(INT32_MIN, getContext()); 2706 2707 // Now we should have the closing ']' 2708 E = Parser.getTok().getLoc(); 2709 if (Parser.getTok().isNot(AsmToken::RBrac)) 2710 return Error(E, "']' expected"); 2711 Parser.Lex(); // Eat right bracket token. 2712 2713 // Don't worry about range checking the value here. That's handled by 2714 // the is*() predicates. 2715 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, CE, 0, 2716 ARM_AM::no_shift, 0, false, S,E)); 2717 2718 // If there's a pre-indexing writeback marker, '!', just add it as a token 2719 // operand. 2720 if (Parser.getTok().is(AsmToken::Exclaim)) { 2721 Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc())); 2722 Parser.Lex(); // Eat the '!'. 2723 } 2724 2725 return false; 2726 } 2727 2728 // The register offset is optionally preceded by a '+' or '-' 2729 bool isNegative = false; 2730 if (Parser.getTok().is(AsmToken::Minus)) { 2731 isNegative = true; 2732 Parser.Lex(); // Eat the '-'. 2733 } else if (Parser.getTok().is(AsmToken::Plus)) { 2734 // Nothing to do. 2735 Parser.Lex(); // Eat the '+'. 2736 } 2737 2738 E = Parser.getTok().getLoc(); 2739 int OffsetRegNum = tryParseRegister(); 2740 if (OffsetRegNum == -1) 2741 return Error(E, "register expected"); 2742 2743 // If there's a shift operator, handle it. 2744 ARM_AM::ShiftOpc ShiftType = ARM_AM::no_shift; 2745 unsigned ShiftImm = 0; 2746 if (Parser.getTok().is(AsmToken::Comma)) { 2747 Parser.Lex(); // Eat the ','. 2748 if (parseMemRegOffsetShift(ShiftType, ShiftImm)) 2749 return true; 2750 } 2751 2752 // Now we should have the closing ']' 2753 E = Parser.getTok().getLoc(); 2754 if (Parser.getTok().isNot(AsmToken::RBrac)) 2755 return Error(E, "']' expected"); 2756 Parser.Lex(); // Eat right bracket token. 2757 2758 Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, OffsetRegNum, 2759 ShiftType, ShiftImm, isNegative, 2760 S, E)); 2761 2762 // If there's a pre-indexing writeback marker, '!', just add it as a token 2763 // operand. 2764 if (Parser.getTok().is(AsmToken::Exclaim)) { 2765 Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc())); 2766 Parser.Lex(); // Eat the '!'. 2767 } 2768 2769 return false; 2770} 2771 2772/// parseMemRegOffsetShift - one of these two: 2773/// ( lsl | lsr | asr | ror ) , # shift_amount 2774/// rrx 2775/// return true if it parses a shift otherwise it returns false. 2776bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St, 2777 unsigned &Amount) { 2778 SMLoc Loc = Parser.getTok().getLoc(); 2779 const AsmToken &Tok = Parser.getTok(); 2780 if (Tok.isNot(AsmToken::Identifier)) 2781 return true; 2782 StringRef ShiftName = Tok.getString(); 2783 if (ShiftName == "lsl" || ShiftName == "LSL") 2784 St = ARM_AM::lsl; 2785 else if (ShiftName == "lsr" || ShiftName == "LSR") 2786 St = ARM_AM::lsr; 2787 else if (ShiftName == "asr" || ShiftName == "ASR") 2788 St = ARM_AM::asr; 2789 else if (ShiftName == "ror" || ShiftName == "ROR") 2790 St = ARM_AM::ror; 2791 else if (ShiftName == "rrx" || ShiftName == "RRX") 2792 St = ARM_AM::rrx; 2793 else 2794 return Error(Loc, "illegal shift operator"); 2795 Parser.Lex(); // Eat shift type token. 2796 2797 // rrx stands alone. 2798 Amount = 0; 2799 if (St != ARM_AM::rrx) { 2800 Loc = Parser.getTok().getLoc(); 2801 // A '#' and a shift amount. 2802 const AsmToken &HashTok = Parser.getTok(); 2803 if (HashTok.isNot(AsmToken::Hash)) 2804 return Error(HashTok.getLoc(), "'#' expected"); 2805 Parser.Lex(); // Eat hash token. 2806 2807 const MCExpr *Expr; 2808 if (getParser().ParseExpression(Expr)) 2809 return true; 2810 // Range check the immediate. 2811 // lsl, ror: 0 <= imm <= 31 2812 // lsr, asr: 0 <= imm <= 32 2813 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr); 2814 if (!CE) 2815 return Error(Loc, "shift amount must be an immediate"); 2816 int64_t Imm = CE->getValue(); 2817 if (Imm < 0 || 2818 ((St == ARM_AM::lsl || St == ARM_AM::ror) && Imm > 31) || 2819 ((St == ARM_AM::lsr || St == ARM_AM::asr) && Imm > 32)) 2820 return Error(Loc, "immediate shift value out of range"); 2821 Amount = Imm; 2822 } 2823 2824 return false; 2825} 2826 2827/// Parse a arm instruction operand. For now this parses the operand regardless 2828/// of the mnemonic. 2829bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands, 2830 StringRef Mnemonic) { 2831 SMLoc S, E; 2832 2833 // Check if the current operand has a custom associated parser, if so, try to 2834 // custom parse the operand, or fallback to the general approach. 2835 OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic); 2836 if (ResTy == MatchOperand_Success) 2837 return false; 2838 // If there wasn't a custom match, try the generic matcher below. Otherwise, 2839 // there was a match, but an error occurred, in which case, just return that 2840 // the operand parsing failed. 2841 if (ResTy == MatchOperand_ParseFail) 2842 return true; 2843 2844 switch (getLexer().getKind()) { 2845 default: 2846 Error(Parser.getTok().getLoc(), "unexpected token in operand"); 2847 return true; 2848 case AsmToken::Identifier: { 2849 if (!tryParseRegisterWithWriteBack(Operands)) 2850 return false; 2851 int Res = tryParseShiftRegister(Operands); 2852 if (Res == 0) // success 2853 return false; 2854 else if (Res == -1) // irrecoverable error 2855 return true; 2856 2857 // Fall though for the Identifier case that is not a register or a 2858 // special name. 2859 } 2860 case AsmToken::Integer: // things like 1f and 2b as a branch targets 2861 case AsmToken::Dot: { // . as a branch target 2862 // This was not a register so parse other operands that start with an 2863 // identifier (like labels) as expressions and create them as immediates. 2864 const MCExpr *IdVal; 2865 S = Parser.getTok().getLoc(); 2866 if (getParser().ParseExpression(IdVal)) 2867 return true; 2868 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2869 Operands.push_back(ARMOperand::CreateImm(IdVal, S, E)); 2870 return false; 2871 } 2872 case AsmToken::LBrac: 2873 return parseMemory(Operands); 2874 case AsmToken::LCurly: 2875 return parseRegisterList(Operands); 2876 case AsmToken::Hash: { 2877 // #42 -> immediate. 2878 // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate 2879 S = Parser.getTok().getLoc(); 2880 Parser.Lex(); 2881 bool isNegative = Parser.getTok().is(AsmToken::Minus); 2882 const MCExpr *ImmVal; 2883 if (getParser().ParseExpression(ImmVal)) 2884 return true; 2885 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ImmVal); 2886 if (!CE) { 2887 Error(S, "constant expression expected"); 2888 return MatchOperand_ParseFail; 2889 } 2890 int32_t Val = CE->getValue(); 2891 if (isNegative && Val == 0) 2892 ImmVal = MCConstantExpr::Create(INT32_MIN, getContext()); 2893 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2894 Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E)); 2895 return false; 2896 } 2897 case AsmToken::Colon: { 2898 // ":lower16:" and ":upper16:" expression prefixes 2899 // FIXME: Check it's an expression prefix, 2900 // e.g. (FOO - :lower16:BAR) isn't legal. 2901 ARMMCExpr::VariantKind RefKind; 2902 if (parsePrefix(RefKind)) 2903 return true; 2904 2905 const MCExpr *SubExprVal; 2906 if (getParser().ParseExpression(SubExprVal)) 2907 return true; 2908 2909 const MCExpr *ExprVal = ARMMCExpr::Create(RefKind, SubExprVal, 2910 getContext()); 2911 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2912 Operands.push_back(ARMOperand::CreateImm(ExprVal, S, E)); 2913 return false; 2914 } 2915 } 2916} 2917 2918// parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e. 2919// :lower16: and :upper16:. 2920bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) { 2921 RefKind = ARMMCExpr::VK_ARM_None; 2922 2923 // :lower16: and :upper16: modifiers 2924 assert(getLexer().is(AsmToken::Colon) && "expected a :"); 2925 Parser.Lex(); // Eat ':' 2926 2927 if (getLexer().isNot(AsmToken::Identifier)) { 2928 Error(Parser.getTok().getLoc(), "expected prefix identifier in operand"); 2929 return true; 2930 } 2931 2932 StringRef IDVal = Parser.getTok().getIdentifier(); 2933 if (IDVal == "lower16") { 2934 RefKind = ARMMCExpr::VK_ARM_LO16; 2935 } else if (IDVal == "upper16") { 2936 RefKind = ARMMCExpr::VK_ARM_HI16; 2937 } else { 2938 Error(Parser.getTok().getLoc(), "unexpected prefix in operand"); 2939 return true; 2940 } 2941 Parser.Lex(); 2942 2943 if (getLexer().isNot(AsmToken::Colon)) { 2944 Error(Parser.getTok().getLoc(), "unexpected token after prefix"); 2945 return true; 2946 } 2947 Parser.Lex(); // Eat the last ':' 2948 return false; 2949} 2950 2951const MCExpr * 2952ARMAsmParser::applyPrefixToExpr(const MCExpr *E, 2953 MCSymbolRefExpr::VariantKind Variant) { 2954 // Recurse over the given expression, rebuilding it to apply the given variant 2955 // to the leftmost symbol. 2956 if (Variant == MCSymbolRefExpr::VK_None) 2957 return E; 2958 2959 switch (E->getKind()) { 2960 case MCExpr::Target: 2961 llvm_unreachable("Can't handle target expr yet"); 2962 case MCExpr::Constant: 2963 llvm_unreachable("Can't handle lower16/upper16 of constant yet"); 2964 2965 case MCExpr::SymbolRef: { 2966 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 2967 2968 if (SRE->getKind() != MCSymbolRefExpr::VK_None) 2969 return 0; 2970 2971 return MCSymbolRefExpr::Create(&SRE->getSymbol(), Variant, getContext()); 2972 } 2973 2974 case MCExpr::Unary: 2975 llvm_unreachable("Can't handle unary expressions yet"); 2976 2977 case MCExpr::Binary: { 2978 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 2979 const MCExpr *LHS = applyPrefixToExpr(BE->getLHS(), Variant); 2980 const MCExpr *RHS = BE->getRHS(); 2981 if (!LHS) 2982 return 0; 2983 2984 return MCBinaryExpr::Create(BE->getOpcode(), LHS, RHS, getContext()); 2985 } 2986 } 2987 2988 assert(0 && "Invalid expression kind!"); 2989 return 0; 2990} 2991 2992/// \brief Given a mnemonic, split out possible predication code and carry 2993/// setting letters to form a canonical mnemonic and flags. 2994// 2995// FIXME: Would be nice to autogen this. 2996// FIXME: This is a bit of a maze of special cases. 2997StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic, 2998 unsigned &PredicationCode, 2999 bool &CarrySetting, 3000 unsigned &ProcessorIMod, 3001 StringRef &ITMask) { 3002 PredicationCode = ARMCC::AL; 3003 CarrySetting = false; 3004 ProcessorIMod = 0; 3005 3006 // Ignore some mnemonics we know aren't predicated forms. 3007 // 3008 // FIXME: Would be nice to autogen this. 3009 if ((Mnemonic == "movs" && isThumb()) || 3010 Mnemonic == "teq" || Mnemonic == "vceq" || Mnemonic == "svc" || 3011 Mnemonic == "mls" || Mnemonic == "smmls" || Mnemonic == "vcls" || 3012 Mnemonic == "vmls" || Mnemonic == "vnmls" || Mnemonic == "vacge" || 3013 Mnemonic == "vcge" || Mnemonic == "vclt" || Mnemonic == "vacgt" || 3014 Mnemonic == "vcgt" || Mnemonic == "vcle" || Mnemonic == "smlal" || 3015 Mnemonic == "umaal" || Mnemonic == "umlal" || Mnemonic == "vabal" || 3016 Mnemonic == "vmlal" || Mnemonic == "vpadal" || Mnemonic == "vqdmlal") 3017 return Mnemonic; 3018 3019 // First, split out any predication code. Ignore mnemonics we know aren't 3020 // predicated but do have a carry-set and so weren't caught above. 3021 if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" && 3022 Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" && 3023 Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" && 3024 Mnemonic != "sbcs" && Mnemonic != "rscs") { 3025 unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2)) 3026 .Case("eq", ARMCC::EQ) 3027 .Case("ne", ARMCC::NE) 3028 .Case("hs", ARMCC::HS) 3029 .Case("cs", ARMCC::HS) 3030 .Case("lo", ARMCC::LO) 3031 .Case("cc", ARMCC::LO) 3032 .Case("mi", ARMCC::MI) 3033 .Case("pl", ARMCC::PL) 3034 .Case("vs", ARMCC::VS) 3035 .Case("vc", ARMCC::VC) 3036 .Case("hi", ARMCC::HI) 3037 .Case("ls", ARMCC::LS) 3038 .Case("ge", ARMCC::GE) 3039 .Case("lt", ARMCC::LT) 3040 .Case("gt", ARMCC::GT) 3041 .Case("le", ARMCC::LE) 3042 .Case("al", ARMCC::AL) 3043 .Default(~0U); 3044 if (CC != ~0U) { 3045 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2); 3046 PredicationCode = CC; 3047 } 3048 } 3049 3050 // Next, determine if we have a carry setting bit. We explicitly ignore all 3051 // the instructions we know end in 's'. 3052 if (Mnemonic.endswith("s") && 3053 !(Mnemonic == "cps" || Mnemonic == "mls" || 3054 Mnemonic == "mrs" || Mnemonic == "smmls" || Mnemonic == "vabs" || 3055 Mnemonic == "vcls" || Mnemonic == "vmls" || Mnemonic == "vmrs" || 3056 Mnemonic == "vnmls" || Mnemonic == "vqabs" || Mnemonic == "vrecps" || 3057 Mnemonic == "vrsqrts" || Mnemonic == "srs" || 3058 (Mnemonic == "movs" && isThumb()))) { 3059 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1); 3060 CarrySetting = true; 3061 } 3062 3063 // The "cps" instruction can have a interrupt mode operand which is glued into 3064 // the mnemonic. Check if this is the case, split it and parse the imod op 3065 if (Mnemonic.startswith("cps")) { 3066 // Split out any imod code. 3067 unsigned IMod = 3068 StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2)) 3069 .Case("ie", ARM_PROC::IE) 3070 .Case("id", ARM_PROC::ID) 3071 .Default(~0U); 3072 if (IMod != ~0U) { 3073 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2); 3074 ProcessorIMod = IMod; 3075 } 3076 } 3077 3078 // The "it" instruction has the condition mask on the end of the mnemonic. 3079 if (Mnemonic.startswith("it")) { 3080 ITMask = Mnemonic.slice(2, Mnemonic.size()); 3081 Mnemonic = Mnemonic.slice(0, 2); 3082 } 3083 3084 return Mnemonic; 3085} 3086 3087/// \brief Given a canonical mnemonic, determine if the instruction ever allows 3088/// inclusion of carry set or predication code operands. 3089// 3090// FIXME: It would be nice to autogen this. 3091void ARMAsmParser:: 3092getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet, 3093 bool &CanAcceptPredicationCode) { 3094 if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" || 3095 Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" || 3096 Mnemonic == "smull" || Mnemonic == "add" || Mnemonic == "adc" || 3097 Mnemonic == "mul" || Mnemonic == "bic" || Mnemonic == "asr" || 3098 Mnemonic == "umlal" || Mnemonic == "orr" || Mnemonic == "mvn" || 3099 Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" || 3100 Mnemonic == "sbc" || Mnemonic == "mla" || Mnemonic == "umull" || 3101 Mnemonic == "eor" || Mnemonic == "smlal" || Mnemonic == "neg" || 3102 (Mnemonic == "mov" && !isThumb())) { 3103 CanAcceptCarrySet = true; 3104 } else { 3105 CanAcceptCarrySet = false; 3106 } 3107 3108 if (Mnemonic == "cbnz" || Mnemonic == "setend" || Mnemonic == "dmb" || 3109 Mnemonic == "cps" || Mnemonic == "mcr2" || Mnemonic == "it" || 3110 Mnemonic == "mcrr2" || Mnemonic == "cbz" || Mnemonic == "cdp2" || 3111 Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" || 3112 Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "setend" || 3113 (Mnemonic == "clrex" && !isThumb()) || 3114 (Mnemonic == "nop" && isThumbOne()) || 3115 ((Mnemonic == "pld" || Mnemonic == "pli" || Mnemonic == "pldw") && 3116 !isThumb()) || 3117 ((Mnemonic.startswith("rfe") || Mnemonic.startswith("srs")) && 3118 !isThumb()) || 3119 Mnemonic.startswith("cps") || (Mnemonic == "movs" && isThumb())) { 3120 CanAcceptPredicationCode = false; 3121 } else { 3122 CanAcceptPredicationCode = true; 3123 } 3124 3125 if (isThumb()) 3126 if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" || 3127 Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp") 3128 CanAcceptPredicationCode = false; 3129} 3130 3131bool ARMAsmParser::shouldOmitCCOutOperand(StringRef Mnemonic, 3132 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3133 // FIXME: This is all horribly hacky. We really need a better way to deal 3134 // with optional operands like this in the matcher table. 3135 3136 // The 'mov' mnemonic is special. One variant has a cc_out operand, while 3137 // another does not. Specifically, the MOVW instruction does not. So we 3138 // special case it here and remove the defaulted (non-setting) cc_out 3139 // operand if that's the instruction we're trying to match. 3140 // 3141 // We do this as post-processing of the explicit operands rather than just 3142 // conditionally adding the cc_out in the first place because we need 3143 // to check the type of the parsed immediate operand. 3144 if (Mnemonic == "mov" && Operands.size() > 4 && 3145 !static_cast<ARMOperand*>(Operands[4])->isARMSOImm() && 3146 static_cast<ARMOperand*>(Operands[4])->isImm0_65535Expr() && 3147 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) 3148 return true; 3149 3150 // Register-register 'add' for thumb does not have a cc_out operand 3151 // when there are only two register operands. 3152 if (isThumb() && Mnemonic == "add" && Operands.size() == 5 && 3153 static_cast<ARMOperand*>(Operands[3])->isReg() && 3154 static_cast<ARMOperand*>(Operands[4])->isReg() && 3155 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) 3156 return true; 3157 // Register-register 'add' for thumb does not have a cc_out operand 3158 // when it's an ADD Rdm, SP, {Rdm|#imm0_255} instruction. We do 3159 // have to check the immediate range here since Thumb2 has a variant 3160 // that can handle a different range and has a cc_out operand. 3161 if (isThumb() && Mnemonic == "add" && Operands.size() == 6 && 3162 static_cast<ARMOperand*>(Operands[3])->isReg() && 3163 static_cast<ARMOperand*>(Operands[4])->isReg() && 3164 static_cast<ARMOperand*>(Operands[4])->getReg() == ARM::SP && 3165 static_cast<ARMOperand*>(Operands[1])->getReg() == 0 && 3166 (static_cast<ARMOperand*>(Operands[5])->isReg() || 3167 static_cast<ARMOperand*>(Operands[5])->isImm0_1020s4())) 3168 return true; 3169 // For Thumb2, add immediate does not have a cc_out operand for the 3170 // imm0_4096 variant. That's the least-preferred variant when 3171 // selecting via the generic "add" mnemonic, so to know that we 3172 // should remove the cc_out operand, we have to explicitly check that 3173 // it's not one of the other variants. Ugh. 3174 if (isThumbTwo() && Mnemonic == "add" && Operands.size() == 6 && 3175 static_cast<ARMOperand*>(Operands[3])->isReg() && 3176 static_cast<ARMOperand*>(Operands[4])->isReg() && 3177 static_cast<ARMOperand*>(Operands[5])->isImm()) { 3178 // Nest conditions rather than one big 'if' statement for readability. 3179 // 3180 // If either register is a high reg, it's either one of the SP 3181 // variants (handled above) or a 32-bit encoding, so we just 3182 // check against T3. 3183 if ((!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) || 3184 !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg())) && 3185 static_cast<ARMOperand*>(Operands[5])->isT2SOImm()) 3186 return false; 3187 // If both registers are low, we're in an IT block, and the immediate is 3188 // in range, we should use encoding T1 instead, which has a cc_out. 3189 if (inITBlock() && 3190 isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) && 3191 isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) && 3192 static_cast<ARMOperand*>(Operands[5])->isImm0_7()) 3193 return false; 3194 3195 // Otherwise, we use encoding T4, which does not have a cc_out 3196 // operand. 3197 return true; 3198 } 3199 3200 3201 // Register-register 'add/sub' for thumb does not have a cc_out operand 3202 // when it's an ADD/SUB SP, #imm. Be lenient on count since there's also 3203 // the "add/sub SP, SP, #imm" version. If the follow-up operands aren't 3204 // right, this will result in better diagnostics (which operand is off) 3205 // anyway. 3206 if (isThumb() && (Mnemonic == "add" || Mnemonic == "sub") && 3207 (Operands.size() == 5 || Operands.size() == 6) && 3208 static_cast<ARMOperand*>(Operands[3])->isReg() && 3209 static_cast<ARMOperand*>(Operands[3])->getReg() == ARM::SP && 3210 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) 3211 return true; 3212 3213 return false; 3214} 3215 3216/// Parse an arm instruction mnemonic followed by its operands. 3217bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc, 3218 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3219 // Create the leading tokens for the mnemonic, split by '.' characters. 3220 size_t Start = 0, Next = Name.find('.'); 3221 StringRef Mnemonic = Name.slice(Start, Next); 3222 3223 // Split out the predication code and carry setting flag from the mnemonic. 3224 unsigned PredicationCode; 3225 unsigned ProcessorIMod; 3226 bool CarrySetting; 3227 StringRef ITMask; 3228 Mnemonic = splitMnemonic(Mnemonic, PredicationCode, CarrySetting, 3229 ProcessorIMod, ITMask); 3230 3231 // In Thumb1, only the branch (B) instruction can be predicated. 3232 if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") { 3233 Parser.EatToEndOfStatement(); 3234 return Error(NameLoc, "conditional execution not supported in Thumb1"); 3235 } 3236 3237 Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc)); 3238 3239 // Handle the IT instruction ITMask. Convert it to a bitmask. This 3240 // is the mask as it will be for the IT encoding if the conditional 3241 // encoding has a '1' as it's bit0 (i.e. 't' ==> '1'). In the case 3242 // where the conditional bit0 is zero, the instruction post-processing 3243 // will adjust the mask accordingly. 3244 if (Mnemonic == "it") { 3245 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + 2); 3246 if (ITMask.size() > 3) { 3247 Parser.EatToEndOfStatement(); 3248 return Error(Loc, "too many conditions on IT instruction"); 3249 } 3250 unsigned Mask = 8; 3251 for (unsigned i = ITMask.size(); i != 0; --i) { 3252 char pos = ITMask[i - 1]; 3253 if (pos != 't' && pos != 'e') { 3254 Parser.EatToEndOfStatement(); 3255 return Error(Loc, "illegal IT block condition mask '" + ITMask + "'"); 3256 } 3257 Mask >>= 1; 3258 if (ITMask[i - 1] == 't') 3259 Mask |= 8; 3260 } 3261 Operands.push_back(ARMOperand::CreateITMask(Mask, Loc)); 3262 } 3263 3264 // FIXME: This is all a pretty gross hack. We should automatically handle 3265 // optional operands like this via tblgen. 3266 3267 // Next, add the CCOut and ConditionCode operands, if needed. 3268 // 3269 // For mnemonics which can ever incorporate a carry setting bit or predication 3270 // code, our matching model involves us always generating CCOut and 3271 // ConditionCode operands to match the mnemonic "as written" and then we let 3272 // the matcher deal with finding the right instruction or generating an 3273 // appropriate error. 3274 bool CanAcceptCarrySet, CanAcceptPredicationCode; 3275 getMnemonicAcceptInfo(Mnemonic, CanAcceptCarrySet, CanAcceptPredicationCode); 3276 3277 // If we had a carry-set on an instruction that can't do that, issue an 3278 // error. 3279 if (!CanAcceptCarrySet && CarrySetting) { 3280 Parser.EatToEndOfStatement(); 3281 return Error(NameLoc, "instruction '" + Mnemonic + 3282 "' can not set flags, but 's' suffix specified"); 3283 } 3284 // If we had a predication code on an instruction that can't do that, issue an 3285 // error. 3286 if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) { 3287 Parser.EatToEndOfStatement(); 3288 return Error(NameLoc, "instruction '" + Mnemonic + 3289 "' is not predicable, but condition code specified"); 3290 } 3291 3292 // Add the carry setting operand, if necessary. 3293 if (CanAcceptCarrySet) { 3294 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size()); 3295 Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0, 3296 Loc)); 3297 } 3298 3299 // Add the predication code operand, if necessary. 3300 if (CanAcceptPredicationCode) { 3301 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() + 3302 CarrySetting); 3303 Operands.push_back(ARMOperand::CreateCondCode( 3304 ARMCC::CondCodes(PredicationCode), Loc)); 3305 } 3306 3307 // Add the processor imod operand, if necessary. 3308 if (ProcessorIMod) { 3309 Operands.push_back(ARMOperand::CreateImm( 3310 MCConstantExpr::Create(ProcessorIMod, getContext()), 3311 NameLoc, NameLoc)); 3312 } 3313 3314 // Add the remaining tokens in the mnemonic. 3315 while (Next != StringRef::npos) { 3316 Start = Next; 3317 Next = Name.find('.', Start + 1); 3318 StringRef ExtraToken = Name.slice(Start, Next); 3319 3320 // For now, we're only parsing Thumb1 (for the most part), so 3321 // just ignore ".n" qualifiers. We'll use them to restrict 3322 // matching when we do Thumb2. 3323 if (ExtraToken != ".n") { 3324 SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start); 3325 Operands.push_back(ARMOperand::CreateToken(ExtraToken, Loc)); 3326 } 3327 } 3328 3329 // Read the remaining operands. 3330 if (getLexer().isNot(AsmToken::EndOfStatement)) { 3331 // Read the first operand. 3332 if (parseOperand(Operands, Mnemonic)) { 3333 Parser.EatToEndOfStatement(); 3334 return true; 3335 } 3336 3337 while (getLexer().is(AsmToken::Comma)) { 3338 Parser.Lex(); // Eat the comma. 3339 3340 // Parse and remember the operand. 3341 if (parseOperand(Operands, Mnemonic)) { 3342 Parser.EatToEndOfStatement(); 3343 return true; 3344 } 3345 } 3346 } 3347 3348 if (getLexer().isNot(AsmToken::EndOfStatement)) { 3349 Parser.EatToEndOfStatement(); 3350 return TokError("unexpected token in argument list"); 3351 } 3352 3353 Parser.Lex(); // Consume the EndOfStatement 3354 3355 // Some instructions, mostly Thumb, have forms for the same mnemonic that 3356 // do and don't have a cc_out optional-def operand. With some spot-checks 3357 // of the operand list, we can figure out which variant we're trying to 3358 // parse and adjust accordingly before actually matching. We shouldn't ever 3359 // try to remove a cc_out operand that was explicitly set on the the 3360 // mnemonic, of course (CarrySetting == true). Reason number #317 the 3361 // table driven matcher doesn't fit well with the ARM instruction set. 3362 if (!CarrySetting && shouldOmitCCOutOperand(Mnemonic, Operands)) { 3363 ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]); 3364 Operands.erase(Operands.begin() + 1); 3365 delete Op; 3366 } 3367 3368 // ARM mode 'blx' need special handling, as the register operand version 3369 // is predicable, but the label operand version is not. So, we can't rely 3370 // on the Mnemonic based checking to correctly figure out when to put 3371 // a CondCode operand in the list. If we're trying to match the label 3372 // version, remove the CondCode operand here. 3373 if (!isThumb() && Mnemonic == "blx" && Operands.size() == 3 && 3374 static_cast<ARMOperand*>(Operands[2])->isImm()) { 3375 ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]); 3376 Operands.erase(Operands.begin() + 1); 3377 delete Op; 3378 } 3379 3380 // The vector-compare-to-zero instructions have a literal token "#0" at 3381 // the end that comes to here as an immediate operand. Convert it to a 3382 // token to play nicely with the matcher. 3383 if ((Mnemonic == "vceq" || Mnemonic == "vcge" || Mnemonic == "vcgt" || 3384 Mnemonic == "vcle" || Mnemonic == "vclt") && Operands.size() == 6 && 3385 static_cast<ARMOperand*>(Operands[5])->isImm()) { 3386 ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]); 3387 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm()); 3388 if (CE && CE->getValue() == 0) { 3389 Operands.erase(Operands.begin() + 5); 3390 Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc())); 3391 delete Op; 3392 } 3393 } 3394 // Similarly, the Thumb1 "RSB" instruction has a literal "#0" on the 3395 // end. Convert it to a token here. 3396 if (Mnemonic == "rsb" && isThumb() && Operands.size() == 6 && 3397 static_cast<ARMOperand*>(Operands[5])->isImm()) { 3398 ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]); 3399 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm()); 3400 if (CE && CE->getValue() == 0) { 3401 Operands.erase(Operands.begin() + 5); 3402 Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc())); 3403 delete Op; 3404 } 3405 } 3406 3407 return false; 3408} 3409 3410// Validate context-sensitive operand constraints. 3411 3412// return 'true' if register list contains non-low GPR registers, 3413// 'false' otherwise. If Reg is in the register list or is HiReg, set 3414// 'containsReg' to true. 3415static bool checkLowRegisterList(MCInst Inst, unsigned OpNo, unsigned Reg, 3416 unsigned HiReg, bool &containsReg) { 3417 containsReg = false; 3418 for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) { 3419 unsigned OpReg = Inst.getOperand(i).getReg(); 3420 if (OpReg == Reg) 3421 containsReg = true; 3422 // Anything other than a low register isn't legal here. 3423 if (!isARMLowRegister(OpReg) && (!HiReg || OpReg != HiReg)) 3424 return true; 3425 } 3426 return false; 3427} 3428 3429// Check if the specified regisgter is in the register list of the inst, 3430// starting at the indicated operand number. 3431static bool listContainsReg(MCInst &Inst, unsigned OpNo, unsigned Reg) { 3432 for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) { 3433 unsigned OpReg = Inst.getOperand(i).getReg(); 3434 if (OpReg == Reg) 3435 return true; 3436 } 3437 return false; 3438} 3439 3440// FIXME: We would really prefer to have MCInstrInfo (the wrapper around 3441// the ARMInsts array) instead. Getting that here requires awkward 3442// API changes, though. Better way? 3443namespace llvm { 3444extern MCInstrDesc ARMInsts[]; 3445} 3446static MCInstrDesc &getInstDesc(unsigned Opcode) { 3447 return ARMInsts[Opcode]; 3448} 3449 3450// FIXME: We would really like to be able to tablegen'erate this. 3451bool ARMAsmParser:: 3452validateInstruction(MCInst &Inst, 3453 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3454 MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); 3455 SMLoc Loc = Operands[0]->getStartLoc(); 3456 // Check the IT block state first. 3457 if (inITBlock()) { 3458 unsigned bit = 1; 3459 if (ITState.FirstCond) 3460 ITState.FirstCond = false; 3461 else 3462 bit = (ITState.Mask >> (5 - ITState.CurPosition)) & 1; 3463 // The instruction must be predicable. 3464 if (!MCID.isPredicable()) 3465 return Error(Loc, "instructions in IT block must be predicable"); 3466 unsigned Cond = Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm(); 3467 unsigned ITCond = bit ? ITState.Cond : 3468 ARMCC::getOppositeCondition(ITState.Cond); 3469 if (Cond != ITCond) { 3470 // Find the condition code Operand to get its SMLoc information. 3471 SMLoc CondLoc; 3472 for (unsigned i = 1; i < Operands.size(); ++i) 3473 if (static_cast<ARMOperand*>(Operands[i])->isCondCode()) 3474 CondLoc = Operands[i]->getStartLoc(); 3475 return Error(CondLoc, "incorrect condition in IT block; got '" + 3476 StringRef(ARMCondCodeToString(ARMCC::CondCodes(Cond))) + 3477 "', but expected '" + 3478 ARMCondCodeToString(ARMCC::CondCodes(ITCond)) + "'"); 3479 } 3480 // Check for non-'al' condition codes outside of the IT block. 3481 } else if (isThumbTwo() && MCID.isPredicable() && 3482 Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm() != 3483 ARMCC::AL && Inst.getOpcode() != ARM::tBcc && 3484 Inst.getOpcode() != ARM::t2Bcc) 3485 return Error(Loc, "predicated instructions must be in IT block"); 3486 3487 switch (Inst.getOpcode()) { 3488 case ARM::LDRD: 3489 case ARM::LDRD_PRE: 3490 case ARM::LDRD_POST: 3491 case ARM::LDREXD: { 3492 // Rt2 must be Rt + 1. 3493 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg()); 3494 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 3495 if (Rt2 != Rt + 1) 3496 return Error(Operands[3]->getStartLoc(), 3497 "destination operands must be sequential"); 3498 return false; 3499 } 3500 case ARM::STRD: { 3501 // Rt2 must be Rt + 1. 3502 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg()); 3503 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 3504 if (Rt2 != Rt + 1) 3505 return Error(Operands[3]->getStartLoc(), 3506 "source operands must be sequential"); 3507 return false; 3508 } 3509 case ARM::STRD_PRE: 3510 case ARM::STRD_POST: 3511 case ARM::STREXD: { 3512 // Rt2 must be Rt + 1. 3513 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 3514 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(2).getReg()); 3515 if (Rt2 != Rt + 1) 3516 return Error(Operands[3]->getStartLoc(), 3517 "source operands must be sequential"); 3518 return false; 3519 } 3520 case ARM::SBFX: 3521 case ARM::UBFX: { 3522 // width must be in range [1, 32-lsb] 3523 unsigned lsb = Inst.getOperand(2).getImm(); 3524 unsigned widthm1 = Inst.getOperand(3).getImm(); 3525 if (widthm1 >= 32 - lsb) 3526 return Error(Operands[5]->getStartLoc(), 3527 "bitfield width must be in range [1,32-lsb]"); 3528 return false; 3529 } 3530 case ARM::tLDMIA: { 3531 // If we're parsing Thumb2, the .w variant is available and handles 3532 // most cases that are normally illegal for a Thumb1 LDM 3533 // instruction. We'll make the transformation in processInstruction() 3534 // if necessary. 3535 // 3536 // Thumb LDM instructions are writeback iff the base register is not 3537 // in the register list. 3538 unsigned Rn = Inst.getOperand(0).getReg(); 3539 bool hasWritebackToken = 3540 (static_cast<ARMOperand*>(Operands[3])->isToken() && 3541 static_cast<ARMOperand*>(Operands[3])->getToken() == "!"); 3542 bool listContainsBase; 3543 if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) && !isThumbTwo()) 3544 return Error(Operands[3 + hasWritebackToken]->getStartLoc(), 3545 "registers must be in range r0-r7"); 3546 // If we should have writeback, then there should be a '!' token. 3547 if (!listContainsBase && !hasWritebackToken && !isThumbTwo()) 3548 return Error(Operands[2]->getStartLoc(), 3549 "writeback operator '!' expected"); 3550 // If we should not have writeback, there must not be a '!'. This is 3551 // true even for the 32-bit wide encodings. 3552 if (listContainsBase && hasWritebackToken) 3553 return Error(Operands[3]->getStartLoc(), 3554 "writeback operator '!' not allowed when base register " 3555 "in register list"); 3556 3557 break; 3558 } 3559 case ARM::t2LDMIA_UPD: { 3560 if (listContainsReg(Inst, 3, Inst.getOperand(0).getReg())) 3561 return Error(Operands[4]->getStartLoc(), 3562 "writeback operator '!' not allowed when base register " 3563 "in register list"); 3564 break; 3565 } 3566 case ARM::tPOP: { 3567 bool listContainsBase; 3568 if (checkLowRegisterList(Inst, 3, 0, ARM::PC, listContainsBase)) 3569 return Error(Operands[2]->getStartLoc(), 3570 "registers must be in range r0-r7 or pc"); 3571 break; 3572 } 3573 case ARM::tPUSH: { 3574 bool listContainsBase; 3575 if (checkLowRegisterList(Inst, 3, 0, ARM::LR, listContainsBase)) 3576 return Error(Operands[2]->getStartLoc(), 3577 "registers must be in range r0-r7 or lr"); 3578 break; 3579 } 3580 case ARM::tSTMIA_UPD: { 3581 bool listContainsBase; 3582 if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase)) 3583 return Error(Operands[4]->getStartLoc(), 3584 "registers must be in range r0-r7"); 3585 break; 3586 } 3587 } 3588 3589 return false; 3590} 3591 3592void ARMAsmParser:: 3593processInstruction(MCInst &Inst, 3594 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 3595 switch (Inst.getOpcode()) { 3596 case ARM::LDMIA_UPD: 3597 // If this is a load of a single register via a 'pop', then we should use 3598 // a post-indexed LDR instruction instead, per the ARM ARM. 3599 if (static_cast<ARMOperand*>(Operands[0])->getToken() == "pop" && 3600 Inst.getNumOperands() == 5) { 3601 MCInst TmpInst; 3602 TmpInst.setOpcode(ARM::LDR_POST_IMM); 3603 TmpInst.addOperand(Inst.getOperand(4)); // Rt 3604 TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb 3605 TmpInst.addOperand(Inst.getOperand(1)); // Rn 3606 TmpInst.addOperand(MCOperand::CreateReg(0)); // am2offset 3607 TmpInst.addOperand(MCOperand::CreateImm(4)); 3608 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 3609 TmpInst.addOperand(Inst.getOperand(3)); 3610 Inst = TmpInst; 3611 } 3612 break; 3613 case ARM::STMDB_UPD: 3614 // If this is a store of a single register via a 'push', then we should use 3615 // a pre-indexed STR instruction instead, per the ARM ARM. 3616 if (static_cast<ARMOperand*>(Operands[0])->getToken() == "push" && 3617 Inst.getNumOperands() == 5) { 3618 MCInst TmpInst; 3619 TmpInst.setOpcode(ARM::STR_PRE_IMM); 3620 TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb 3621 TmpInst.addOperand(Inst.getOperand(4)); // Rt 3622 TmpInst.addOperand(Inst.getOperand(1)); // addrmode_imm12 3623 TmpInst.addOperand(MCOperand::CreateImm(-4)); 3624 TmpInst.addOperand(Inst.getOperand(2)); // CondCode 3625 TmpInst.addOperand(Inst.getOperand(3)); 3626 Inst = TmpInst; 3627 } 3628 break; 3629 case ARM::tADDi8: 3630 // If the immediate is in the range 0-7, we want tADDi3 iff Rd was 3631 // explicitly specified. From the ARM ARM: "Encoding T1 is preferred 3632 // to encoding T2 if <Rd> is specified and encoding T2 is preferred 3633 // to encoding T1 if <Rd> is omitted." 3634 if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6) 3635 Inst.setOpcode(ARM::tADDi3); 3636 break; 3637 case ARM::t2Bcc: 3638 // If the conditional is AL or we're in an IT block, we really want t2B. 3639 if (Inst.getOperand(1).getImm() == ARMCC::AL || inITBlock()) 3640 Inst.setOpcode(ARM::t2B); 3641 break; 3642 case ARM::tBcc: 3643 // If the conditional is AL, we really want tB. 3644 if (Inst.getOperand(1).getImm() == ARMCC::AL) 3645 Inst.setOpcode(ARM::tB); 3646 break; 3647 case ARM::tLDMIA: { 3648 // If the register list contains any high registers, or if the writeback 3649 // doesn't match what tLDMIA can do, we need to use the 32-bit encoding 3650 // instead if we're in Thumb2. Otherwise, this should have generated 3651 // an error in validateInstruction(). 3652 unsigned Rn = Inst.getOperand(0).getReg(); 3653 bool hasWritebackToken = 3654 (static_cast<ARMOperand*>(Operands[3])->isToken() && 3655 static_cast<ARMOperand*>(Operands[3])->getToken() == "!"); 3656 bool listContainsBase; 3657 if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) || 3658 (!listContainsBase && !hasWritebackToken) || 3659 (listContainsBase && hasWritebackToken)) { 3660 // 16-bit encoding isn't sufficient. Switch to the 32-bit version. 3661 assert (isThumbTwo()); 3662 Inst.setOpcode(hasWritebackToken ? ARM::t2LDMIA_UPD : ARM::t2LDMIA); 3663 // If we're switching to the updating version, we need to insert 3664 // the writeback tied operand. 3665 if (hasWritebackToken) 3666 Inst.insert(Inst.begin(), 3667 MCOperand::CreateReg(Inst.getOperand(0).getReg())); 3668 } 3669 break; 3670 } 3671 case ARM::t2IT: { 3672 // The mask bits for all but the first condition are represented as 3673 // the low bit of the condition code value implies 't'. We currently 3674 // always have 1 implies 't', so XOR toggle the bits if the low bit 3675 // of the condition code is zero. The encoding also expects the low 3676 // bit of the condition to be encoded as bit 4 of the mask operand, 3677 // so mask that in if needed 3678 MCOperand &MO = Inst.getOperand(1); 3679 unsigned Mask = MO.getImm(); 3680 unsigned OrigMask = Mask; 3681 unsigned TZ = CountTrailingZeros_32(Mask); 3682 if ((Inst.getOperand(0).getImm() & 1) == 0) { 3683 assert(Mask && TZ <= 3 && "illegal IT mask value!"); 3684 for (unsigned i = 3; i != TZ; --i) 3685 Mask ^= 1 << i; 3686 } else 3687 Mask |= 0x10; 3688 MO.setImm(Mask); 3689 3690 // Set up the IT block state according to the IT instruction we just 3691 // matched. 3692 assert(!inITBlock() && "nested IT blocks?!"); 3693 ITState.Cond = ARMCC::CondCodes(Inst.getOperand(0).getImm()); 3694 ITState.Mask = OrigMask; // Use the original mask, not the updated one. 3695 ITState.CurPosition = 0; 3696 ITState.FirstCond = true; 3697 break; 3698 } 3699 } 3700} 3701 3702unsigned ARMAsmParser::checkTargetMatchPredicate(MCInst &Inst) { 3703 // 16-bit thumb arithmetic instructions either require or preclude the 'S' 3704 // suffix depending on whether they're in an IT block or not. 3705 unsigned Opc = Inst.getOpcode(); 3706 MCInstrDesc &MCID = getInstDesc(Opc); 3707 if (MCID.TSFlags & ARMII::ThumbArithFlagSetting) { 3708 assert(MCID.hasOptionalDef() && 3709 "optionally flag setting instruction missing optional def operand"); 3710 assert(MCID.NumOperands == Inst.getNumOperands() && 3711 "operand count mismatch!"); 3712 // Find the optional-def operand (cc_out). 3713 unsigned OpNo; 3714 for (OpNo = 0; 3715 !MCID.OpInfo[OpNo].isOptionalDef() && OpNo < MCID.NumOperands; 3716 ++OpNo) 3717 ; 3718 // If we're parsing Thumb1, reject it completely. 3719 if (isThumbOne() && Inst.getOperand(OpNo).getReg() != ARM::CPSR) 3720 return Match_MnemonicFail; 3721 // If we're parsing Thumb2, which form is legal depends on whether we're 3722 // in an IT block. 3723 if (isThumbTwo() && Inst.getOperand(OpNo).getReg() != ARM::CPSR && 3724 !inITBlock()) 3725 return Match_RequiresITBlock; 3726 if (isThumbTwo() && Inst.getOperand(OpNo).getReg() == ARM::CPSR && 3727 inITBlock()) 3728 return Match_RequiresNotITBlock; 3729 } 3730 // Some high-register supporting Thumb1 encodings only allow both registers 3731 // to be from r0-r7 when in Thumb2. 3732 else if (Opc == ARM::tADDhirr && isThumbOne() && 3733 isARMLowRegister(Inst.getOperand(1).getReg()) && 3734 isARMLowRegister(Inst.getOperand(2).getReg())) 3735 return Match_RequiresThumb2; 3736 // Others only require ARMv6 or later. 3737 else if (Opc == ARM::tMOVr && isThumbOne() && !hasV6Ops() && 3738 isARMLowRegister(Inst.getOperand(0).getReg()) && 3739 isARMLowRegister(Inst.getOperand(1).getReg())) 3740 return Match_RequiresV6; 3741 return Match_Success; 3742} 3743 3744bool ARMAsmParser:: 3745MatchAndEmitInstruction(SMLoc IDLoc, 3746 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 3747 MCStreamer &Out) { 3748 MCInst Inst; 3749 unsigned ErrorInfo; 3750 unsigned MatchResult; 3751 MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo); 3752 switch (MatchResult) { 3753 default: break; 3754 case Match_Success: 3755 // Context sensitive operand constraints aren't handled by the matcher, 3756 // so check them here. 3757 if (validateInstruction(Inst, Operands)) { 3758 // Still progress the IT block, otherwise one wrong condition causes 3759 // nasty cascading errors. 3760 forwardITPosition(); 3761 return true; 3762 } 3763 3764 // Some instructions need post-processing to, for example, tweak which 3765 // encoding is selected. 3766 processInstruction(Inst, Operands); 3767 3768 // Only move forward at the very end so that everything in validate 3769 // and process gets a consistent answer about whether we're in an IT 3770 // block. 3771 forwardITPosition(); 3772 3773 Out.EmitInstruction(Inst); 3774 return false; 3775 case Match_MissingFeature: 3776 Error(IDLoc, "instruction requires a CPU feature not currently enabled"); 3777 return true; 3778 case Match_InvalidOperand: { 3779 SMLoc ErrorLoc = IDLoc; 3780 if (ErrorInfo != ~0U) { 3781 if (ErrorInfo >= Operands.size()) 3782 return Error(IDLoc, "too few operands for instruction"); 3783 3784 ErrorLoc = ((ARMOperand*)Operands[ErrorInfo])->getStartLoc(); 3785 if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc; 3786 } 3787 3788 return Error(ErrorLoc, "invalid operand for instruction"); 3789 } 3790 case Match_MnemonicFail: 3791 return Error(IDLoc, "invalid instruction"); 3792 case Match_ConversionFail: 3793 // The converter function will have already emited a diagnostic. 3794 return true; 3795 case Match_RequiresNotITBlock: 3796 return Error(IDLoc, "flag setting instruction only valid outside IT block"); 3797 case Match_RequiresITBlock: 3798 return Error(IDLoc, "instruction only valid inside IT block"); 3799 case Match_RequiresV6: 3800 return Error(IDLoc, "instruction variant requires ARMv6 or later"); 3801 case Match_RequiresThumb2: 3802 return Error(IDLoc, "instruction variant requires Thumb2"); 3803 } 3804 3805 llvm_unreachable("Implement any new match types added!"); 3806 return true; 3807} 3808 3809/// parseDirective parses the arm specific directives 3810bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) { 3811 StringRef IDVal = DirectiveID.getIdentifier(); 3812 if (IDVal == ".word") 3813 return parseDirectiveWord(4, DirectiveID.getLoc()); 3814 else if (IDVal == ".thumb") 3815 return parseDirectiveThumb(DirectiveID.getLoc()); 3816 else if (IDVal == ".thumb_func") 3817 return parseDirectiveThumbFunc(DirectiveID.getLoc()); 3818 else if (IDVal == ".code") 3819 return parseDirectiveCode(DirectiveID.getLoc()); 3820 else if (IDVal == ".syntax") 3821 return parseDirectiveSyntax(DirectiveID.getLoc()); 3822 return true; 3823} 3824 3825/// parseDirectiveWord 3826/// ::= .word [ expression (, expression)* ] 3827bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) { 3828 if (getLexer().isNot(AsmToken::EndOfStatement)) { 3829 for (;;) { 3830 const MCExpr *Value; 3831 if (getParser().ParseExpression(Value)) 3832 return true; 3833 3834 getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/); 3835 3836 if (getLexer().is(AsmToken::EndOfStatement)) 3837 break; 3838 3839 // FIXME: Improve diagnostic. 3840 if (getLexer().isNot(AsmToken::Comma)) 3841 return Error(L, "unexpected token in directive"); 3842 Parser.Lex(); 3843 } 3844 } 3845 3846 Parser.Lex(); 3847 return false; 3848} 3849 3850/// parseDirectiveThumb 3851/// ::= .thumb 3852bool ARMAsmParser::parseDirectiveThumb(SMLoc L) { 3853 if (getLexer().isNot(AsmToken::EndOfStatement)) 3854 return Error(L, "unexpected token in directive"); 3855 Parser.Lex(); 3856 3857 // TODO: set thumb mode 3858 // TODO: tell the MC streamer the mode 3859 // getParser().getStreamer().Emit???(); 3860 return false; 3861} 3862 3863/// parseDirectiveThumbFunc 3864/// ::= .thumbfunc symbol_name 3865bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) { 3866 const MCAsmInfo &MAI = getParser().getStreamer().getContext().getAsmInfo(); 3867 bool isMachO = MAI.hasSubsectionsViaSymbols(); 3868 StringRef Name; 3869 3870 // Darwin asm has function name after .thumb_func direction 3871 // ELF doesn't 3872 if (isMachO) { 3873 const AsmToken &Tok = Parser.getTok(); 3874 if (Tok.isNot(AsmToken::Identifier) && Tok.isNot(AsmToken::String)) 3875 return Error(L, "unexpected token in .thumb_func directive"); 3876 Name = Tok.getString(); 3877 Parser.Lex(); // Consume the identifier token. 3878 } 3879 3880 if (getLexer().isNot(AsmToken::EndOfStatement)) 3881 return Error(L, "unexpected token in directive"); 3882 Parser.Lex(); 3883 3884 // FIXME: assuming function name will be the line following .thumb_func 3885 if (!isMachO) { 3886 Name = Parser.getTok().getString(); 3887 } 3888 3889 // Mark symbol as a thumb symbol. 3890 MCSymbol *Func = getParser().getContext().GetOrCreateSymbol(Name); 3891 getParser().getStreamer().EmitThumbFunc(Func); 3892 return false; 3893} 3894 3895/// parseDirectiveSyntax 3896/// ::= .syntax unified | divided 3897bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) { 3898 const AsmToken &Tok = Parser.getTok(); 3899 if (Tok.isNot(AsmToken::Identifier)) 3900 return Error(L, "unexpected token in .syntax directive"); 3901 StringRef Mode = Tok.getString(); 3902 if (Mode == "unified" || Mode == "UNIFIED") 3903 Parser.Lex(); 3904 else if (Mode == "divided" || Mode == "DIVIDED") 3905 return Error(L, "'.syntax divided' arm asssembly not supported"); 3906 else 3907 return Error(L, "unrecognized syntax mode in .syntax directive"); 3908 3909 if (getLexer().isNot(AsmToken::EndOfStatement)) 3910 return Error(Parser.getTok().getLoc(), "unexpected token in directive"); 3911 Parser.Lex(); 3912 3913 // TODO tell the MC streamer the mode 3914 // getParser().getStreamer().Emit???(); 3915 return false; 3916} 3917 3918/// parseDirectiveCode 3919/// ::= .code 16 | 32 3920bool ARMAsmParser::parseDirectiveCode(SMLoc L) { 3921 const AsmToken &Tok = Parser.getTok(); 3922 if (Tok.isNot(AsmToken::Integer)) 3923 return Error(L, "unexpected token in .code directive"); 3924 int64_t Val = Parser.getTok().getIntVal(); 3925 if (Val == 16) 3926 Parser.Lex(); 3927 else if (Val == 32) 3928 Parser.Lex(); 3929 else 3930 return Error(L, "invalid operand to .code directive"); 3931 3932 if (getLexer().isNot(AsmToken::EndOfStatement)) 3933 return Error(Parser.getTok().getLoc(), "unexpected token in directive"); 3934 Parser.Lex(); 3935 3936 if (Val == 16) { 3937 if (!isThumb()) 3938 SwitchMode(); 3939 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16); 3940 } else { 3941 if (isThumb()) 3942 SwitchMode(); 3943 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32); 3944 } 3945 3946 return false; 3947} 3948 3949extern "C" void LLVMInitializeARMAsmLexer(); 3950 3951/// Force static initialization. 3952extern "C" void LLVMInitializeARMAsmParser() { 3953 RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget); 3954 RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget); 3955 LLVMInitializeARMAsmLexer(); 3956} 3957 3958#define GET_REGISTER_MATCHER 3959#define GET_MATCHER_IMPLEMENTATION 3960#include "ARMGenAsmMatcher.inc" 3961