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