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