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