ARMAsmParser.cpp revision 7b2958392c2be221ff1f0d2ffd45d453dec515dd
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/MCRegisterInfo.h" 22#include "llvm/MC/MCSubtargetInfo.h" 23#include "llvm/MC/MCTargetAsmParser.h" 24#include "llvm/Target/TargetRegistry.h" 25#include "llvm/Support/SourceMgr.h" 26#include "llvm/Support/raw_ostream.h" 27#include "llvm/ADT/OwningPtr.h" 28#include "llvm/ADT/STLExtras.h" 29#include "llvm/ADT/SmallVector.h" 30#include "llvm/ADT/StringExtras.h" 31#include "llvm/ADT/StringSwitch.h" 32#include "llvm/ADT/Twine.h" 33 34using namespace llvm; 35 36namespace { 37 38class ARMOperand; 39 40class ARMAsmParser : public MCTargetAsmParser { 41 MCSubtargetInfo &STI; 42 MCAsmParser &Parser; 43 44 MCAsmParser &getParser() const { return Parser; } 45 MCAsmLexer &getLexer() const { return Parser.getLexer(); } 46 47 void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); } 48 bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); } 49 50 int tryParseRegister(); 51 bool tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &); 52 int tryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &); 53 bool parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &); 54 bool parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &, 55 ARMII::AddrMode AddrMode); 56 bool parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &, StringRef Mnemonic); 57 bool parsePrefix(ARMMCExpr::VariantKind &RefKind); 58 const MCExpr *applyPrefixToExpr(const MCExpr *E, 59 MCSymbolRefExpr::VariantKind Variant); 60 61 62 bool parseMemoryOffsetReg(bool &Negative, 63 bool &OffsetRegShifted, 64 enum ARM_AM::ShiftOpc &ShiftType, 65 const MCExpr *&ShiftAmount, 66 const MCExpr *&Offset, 67 bool &OffsetIsReg, 68 int &OffsetRegNum, 69 SMLoc &E); 70 bool parseShift(enum ARM_AM::ShiftOpc &St, 71 const MCExpr *&ShiftAmount, SMLoc &E); 72 bool parseDirectiveWord(unsigned Size, SMLoc L); 73 bool parseDirectiveThumb(SMLoc L); 74 bool parseDirectiveThumbFunc(SMLoc L); 75 bool parseDirectiveCode(SMLoc L); 76 bool parseDirectiveSyntax(SMLoc L); 77 78 StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode, 79 bool &CarrySetting, unsigned &ProcessorIMod); 80 void getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet, 81 bool &CanAcceptPredicationCode); 82 83 bool isThumb() const { 84 // FIXME: Can tablegen auto-generate this? 85 return (STI.getFeatureBits() & ARM::ModeThumb) != 0; 86 } 87 bool isThumbOne() const { 88 return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0; 89 } 90 void SwitchMode() { 91 unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb)); 92 setAvailableFeatures(FB); 93 } 94 95 /// @name Auto-generated Match Functions 96 /// { 97 98#define GET_ASSEMBLER_HEADER 99#include "ARMGenAsmMatcher.inc" 100 101 /// } 102 103 OperandMatchResultTy parseCoprocNumOperand( 104 SmallVectorImpl<MCParsedAsmOperand*>&); 105 OperandMatchResultTy parseCoprocRegOperand( 106 SmallVectorImpl<MCParsedAsmOperand*>&); 107 OperandMatchResultTy parseMemBarrierOptOperand( 108 SmallVectorImpl<MCParsedAsmOperand*>&); 109 OperandMatchResultTy parseProcIFlagsOperand( 110 SmallVectorImpl<MCParsedAsmOperand*>&); 111 OperandMatchResultTy parseMSRMaskOperand( 112 SmallVectorImpl<MCParsedAsmOperand*>&); 113 OperandMatchResultTy parseMemMode2Operand( 114 SmallVectorImpl<MCParsedAsmOperand*>&); 115 OperandMatchResultTy parseMemMode3Operand( 116 SmallVectorImpl<MCParsedAsmOperand*>&); 117 OperandMatchResultTy parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &O, 118 StringRef Op, int Low, int High); 119 OperandMatchResultTy parsePKHLSLImm(SmallVectorImpl<MCParsedAsmOperand*> &O) { 120 return parsePKHImm(O, "lsl", 0, 31); 121 } 122 OperandMatchResultTy parsePKHASRImm(SmallVectorImpl<MCParsedAsmOperand*> &O) { 123 return parsePKHImm(O, "asr", 1, 32); 124 } 125 OperandMatchResultTy parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*>&); 126 OperandMatchResultTy parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*>&); 127 OperandMatchResultTy parseRotImm(SmallVectorImpl<MCParsedAsmOperand*>&); 128 129 // Asm Match Converter Methods 130 bool cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 131 const SmallVectorImpl<MCParsedAsmOperand*> &); 132 bool cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 133 const SmallVectorImpl<MCParsedAsmOperand*> &); 134 bool cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 135 const SmallVectorImpl<MCParsedAsmOperand*> &); 136 bool cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 137 const SmallVectorImpl<MCParsedAsmOperand*> &); 138 139 140 bool validateInstruction(MCInst &Inst, 141 const SmallVectorImpl<MCParsedAsmOperand*> &Ops); 142 143public: 144 ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser) 145 : MCTargetAsmParser(), STI(_STI), Parser(_Parser) { 146 MCAsmParserExtension::Initialize(_Parser); 147 148 // Initialize the set of available features. 149 setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 150 } 151 152 // Implementation of the MCTargetAsmParser interface: 153 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc); 154 bool ParseInstruction(StringRef Name, SMLoc NameLoc, 155 SmallVectorImpl<MCParsedAsmOperand*> &Operands); 156 bool ParseDirective(AsmToken DirectiveID); 157 158 bool MatchAndEmitInstruction(SMLoc IDLoc, 159 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 160 MCStreamer &Out); 161}; 162} // end anonymous namespace 163 164namespace { 165 166/// ARMOperand - Instances of this class represent a parsed ARM machine 167/// instruction. 168class ARMOperand : public MCParsedAsmOperand { 169 enum KindTy { 170 CondCode, 171 CCOut, 172 CoprocNum, 173 CoprocReg, 174 Immediate, 175 MemBarrierOpt, 176 Memory, 177 MSRMask, 178 ProcIFlags, 179 Register, 180 RegisterList, 181 DPRRegisterList, 182 SPRRegisterList, 183 ShiftedRegister, 184 ShiftedImmediate, 185 ShifterImmediate, 186 RotateImmediate, 187 Token 188 } Kind; 189 190 SMLoc StartLoc, EndLoc; 191 SmallVector<unsigned, 8> Registers; 192 193 union { 194 struct { 195 ARMCC::CondCodes Val; 196 } CC; 197 198 struct { 199 ARM_MB::MemBOpt Val; 200 } MBOpt; 201 202 struct { 203 unsigned Val; 204 } Cop; 205 206 struct { 207 ARM_PROC::IFlags Val; 208 } IFlags; 209 210 struct { 211 unsigned Val; 212 } MMask; 213 214 struct { 215 const char *Data; 216 unsigned Length; 217 } Tok; 218 219 struct { 220 unsigned RegNum; 221 } Reg; 222 223 struct { 224 const MCExpr *Val; 225 } Imm; 226 227 /// Combined record for all forms of ARM address expressions. 228 struct { 229 ARMII::AddrMode AddrMode; 230 unsigned BaseRegNum; 231 union { 232 unsigned RegNum; ///< Offset register num, when OffsetIsReg. 233 const MCExpr *Value; ///< Offset value, when !OffsetIsReg. 234 } Offset; 235 const MCExpr *ShiftAmount; // used when OffsetRegShifted is true 236 enum ARM_AM::ShiftOpc ShiftType; // used when OffsetRegShifted is true 237 unsigned OffsetRegShifted : 1; // only used when OffsetIsReg is true 238 unsigned Preindexed : 1; 239 unsigned Postindexed : 1; 240 unsigned OffsetIsReg : 1; 241 unsigned Negative : 1; // only used when OffsetIsReg is true 242 unsigned Writeback : 1; 243 } Mem; 244 245 struct { 246 bool isASR; 247 unsigned Imm; 248 } ShifterImm; 249 struct { 250 ARM_AM::ShiftOpc ShiftTy; 251 unsigned SrcReg; 252 unsigned ShiftReg; 253 unsigned ShiftImm; 254 } RegShiftedReg; 255 struct { 256 ARM_AM::ShiftOpc ShiftTy; 257 unsigned SrcReg; 258 unsigned ShiftImm; 259 } RegShiftedImm; 260 struct { 261 unsigned Imm; 262 } RotImm; 263 }; 264 265 ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {} 266public: 267 ARMOperand(const ARMOperand &o) : MCParsedAsmOperand() { 268 Kind = o.Kind; 269 StartLoc = o.StartLoc; 270 EndLoc = o.EndLoc; 271 switch (Kind) { 272 case CondCode: 273 CC = o.CC; 274 break; 275 case Token: 276 Tok = o.Tok; 277 break; 278 case CCOut: 279 case Register: 280 Reg = o.Reg; 281 break; 282 case RegisterList: 283 case DPRRegisterList: 284 case SPRRegisterList: 285 Registers = o.Registers; 286 break; 287 case CoprocNum: 288 case CoprocReg: 289 Cop = o.Cop; 290 break; 291 case Immediate: 292 Imm = o.Imm; 293 break; 294 case MemBarrierOpt: 295 MBOpt = o.MBOpt; 296 break; 297 case Memory: 298 Mem = o.Mem; 299 break; 300 case MSRMask: 301 MMask = o.MMask; 302 break; 303 case ProcIFlags: 304 IFlags = o.IFlags; 305 break; 306 case ShifterImmediate: 307 ShifterImm = o.ShifterImm; 308 break; 309 case ShiftedRegister: 310 RegShiftedReg = o.RegShiftedReg; 311 break; 312 case ShiftedImmediate: 313 RegShiftedImm = o.RegShiftedImm; 314 break; 315 case RotateImmediate: 316 RotImm = o.RotImm; 317 break; 318 } 319 } 320 321 /// getStartLoc - Get the location of the first token of this operand. 322 SMLoc getStartLoc() const { return StartLoc; } 323 /// getEndLoc - Get the location of the last token of this operand. 324 SMLoc getEndLoc() const { return EndLoc; } 325 326 ARMCC::CondCodes getCondCode() const { 327 assert(Kind == CondCode && "Invalid access!"); 328 return CC.Val; 329 } 330 331 unsigned getCoproc() const { 332 assert((Kind == CoprocNum || Kind == CoprocReg) && "Invalid access!"); 333 return Cop.Val; 334 } 335 336 StringRef getToken() const { 337 assert(Kind == Token && "Invalid access!"); 338 return StringRef(Tok.Data, Tok.Length); 339 } 340 341 unsigned getReg() const { 342 assert((Kind == Register || Kind == CCOut) && "Invalid access!"); 343 return Reg.RegNum; 344 } 345 346 const SmallVectorImpl<unsigned> &getRegList() const { 347 assert((Kind == RegisterList || Kind == DPRRegisterList || 348 Kind == SPRRegisterList) && "Invalid access!"); 349 return Registers; 350 } 351 352 const MCExpr *getImm() const { 353 assert(Kind == Immediate && "Invalid access!"); 354 return Imm.Val; 355 } 356 357 ARM_MB::MemBOpt getMemBarrierOpt() const { 358 assert(Kind == MemBarrierOpt && "Invalid access!"); 359 return MBOpt.Val; 360 } 361 362 ARM_PROC::IFlags getProcIFlags() const { 363 assert(Kind == ProcIFlags && "Invalid access!"); 364 return IFlags.Val; 365 } 366 367 unsigned getMSRMask() const { 368 assert(Kind == MSRMask && "Invalid access!"); 369 return MMask.Val; 370 } 371 372 /// @name Memory Operand Accessors 373 /// @{ 374 ARMII::AddrMode getMemAddrMode() const { 375 return Mem.AddrMode; 376 } 377 unsigned getMemBaseRegNum() const { 378 return Mem.BaseRegNum; 379 } 380 unsigned getMemOffsetRegNum() const { 381 assert(Mem.OffsetIsReg && "Invalid access!"); 382 return Mem.Offset.RegNum; 383 } 384 const MCExpr *getMemOffset() const { 385 assert(!Mem.OffsetIsReg && "Invalid access!"); 386 return Mem.Offset.Value; 387 } 388 unsigned getMemOffsetRegShifted() const { 389 assert(Mem.OffsetIsReg && "Invalid access!"); 390 return Mem.OffsetRegShifted; 391 } 392 const MCExpr *getMemShiftAmount() const { 393 assert(Mem.OffsetIsReg && Mem.OffsetRegShifted && "Invalid access!"); 394 return Mem.ShiftAmount; 395 } 396 enum ARM_AM::ShiftOpc getMemShiftType() const { 397 assert(Mem.OffsetIsReg && Mem.OffsetRegShifted && "Invalid access!"); 398 return Mem.ShiftType; 399 } 400 bool getMemPreindexed() const { return Mem.Preindexed; } 401 bool getMemPostindexed() const { return Mem.Postindexed; } 402 bool getMemOffsetIsReg() const { return Mem.OffsetIsReg; } 403 bool getMemNegative() const { return Mem.Negative; } 404 bool getMemWriteback() const { return Mem.Writeback; } 405 406 /// @} 407 408 bool isCoprocNum() const { return Kind == CoprocNum; } 409 bool isCoprocReg() const { return Kind == CoprocReg; } 410 bool isCondCode() const { return Kind == CondCode; } 411 bool isCCOut() const { return Kind == CCOut; } 412 bool isImm() const { return Kind == Immediate; } 413 bool isImm0_255() const { 414 if (Kind != Immediate) 415 return false; 416 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 417 if (!CE) return false; 418 int64_t Value = CE->getValue(); 419 return Value >= 0 && Value < 256; 420 } 421 bool isImm0_7() const { 422 if (Kind != Immediate) 423 return false; 424 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 425 if (!CE) return false; 426 int64_t Value = CE->getValue(); 427 return Value >= 0 && Value < 8; 428 } 429 bool isImm0_15() const { 430 if (Kind != Immediate) 431 return false; 432 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 433 if (!CE) return false; 434 int64_t Value = CE->getValue(); 435 return Value >= 0 && Value < 16; 436 } 437 bool isImm0_31() const { 438 if (Kind != Immediate) 439 return false; 440 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 441 if (!CE) return false; 442 int64_t Value = CE->getValue(); 443 return Value >= 0 && Value < 32; 444 } 445 bool isImm1_16() const { 446 if (Kind != Immediate) 447 return false; 448 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 449 if (!CE) return false; 450 int64_t Value = CE->getValue(); 451 return Value > 0 && Value < 17; 452 } 453 bool isImm1_32() const { 454 if (Kind != Immediate) 455 return false; 456 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 457 if (!CE) return false; 458 int64_t Value = CE->getValue(); 459 return Value > 0 && Value < 33; 460 } 461 bool isImm0_65535() const { 462 if (Kind != Immediate) 463 return false; 464 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 465 if (!CE) return false; 466 int64_t Value = CE->getValue(); 467 return Value >= 0 && Value < 65536; 468 } 469 bool isImm0_65535Expr() const { 470 if (Kind != Immediate) 471 return false; 472 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 473 // If it's not a constant expression, it'll generate a fixup and be 474 // handled later. 475 if (!CE) return true; 476 int64_t Value = CE->getValue(); 477 return Value >= 0 && Value < 65536; 478 } 479 bool isImm24bit() 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 <= 0xffffff; 486 } 487 bool isPKHLSLImm() const { 488 if (Kind != Immediate) 489 return false; 490 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 491 if (!CE) return false; 492 int64_t Value = CE->getValue(); 493 return Value >= 0 && Value < 32; 494 } 495 bool isPKHASRImm() const { 496 if (Kind != Immediate) 497 return false; 498 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 499 if (!CE) return false; 500 int64_t Value = CE->getValue(); 501 return Value > 0 && Value <= 32; 502 } 503 bool isARMSOImm() const { 504 if (Kind != Immediate) 505 return false; 506 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 507 if (!CE) return false; 508 int64_t Value = CE->getValue(); 509 return ARM_AM::getSOImmVal(Value) != -1; 510 } 511 bool isT2SOImm() const { 512 if (Kind != Immediate) 513 return false; 514 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 515 if (!CE) return false; 516 int64_t Value = CE->getValue(); 517 return ARM_AM::getT2SOImmVal(Value) != -1; 518 } 519 bool isSetEndImm() const { 520 if (Kind != Immediate) 521 return false; 522 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 523 if (!CE) return false; 524 int64_t Value = CE->getValue(); 525 return Value == 1 || Value == 0; 526 } 527 bool isReg() const { return Kind == Register; } 528 bool isRegList() const { return Kind == RegisterList; } 529 bool isDPRRegList() const { return Kind == DPRRegisterList; } 530 bool isSPRRegList() const { return Kind == SPRRegisterList; } 531 bool isToken() const { return Kind == Token; } 532 bool isMemBarrierOpt() const { return Kind == MemBarrierOpt; } 533 bool isMemory() const { return Kind == Memory; } 534 bool isShifterImm() const { return Kind == ShifterImmediate; } 535 bool isRegShiftedReg() const { return Kind == ShiftedRegister; } 536 bool isRegShiftedImm() const { return Kind == ShiftedImmediate; } 537 bool isRotImm() const { return Kind == RotateImmediate; } 538 bool isMemMode2() const { 539 if (getMemAddrMode() != ARMII::AddrMode2) 540 return false; 541 542 if (getMemOffsetIsReg()) 543 return true; 544 545 if (getMemNegative() && 546 !(getMemPostindexed() || getMemPreindexed())) 547 return false; 548 549 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 550 if (!CE) return false; 551 int64_t Value = CE->getValue(); 552 553 // The offset must be in the range 0-4095 (imm12). 554 if (Value > 4095 || Value < -4095) 555 return false; 556 557 return true; 558 } 559 bool isMemMode3() const { 560 if (getMemAddrMode() != ARMII::AddrMode3) 561 return false; 562 563 if (getMemOffsetIsReg()) { 564 if (getMemOffsetRegShifted()) 565 return false; // No shift with offset reg allowed 566 return true; 567 } 568 569 if (getMemNegative() && 570 !(getMemPostindexed() || getMemPreindexed())) 571 return false; 572 573 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 574 if (!CE) return false; 575 int64_t Value = CE->getValue(); 576 577 // The offset must be in the range 0-255 (imm8). 578 if (Value > 255 || Value < -255) 579 return false; 580 581 return true; 582 } 583 bool isMemMode5() const { 584 if (!isMemory() || getMemOffsetIsReg() || getMemWriteback() || 585 getMemNegative()) 586 return false; 587 588 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 589 if (!CE) return false; 590 591 // The offset must be a multiple of 4 in the range 0-1020. 592 int64_t Value = CE->getValue(); 593 return ((Value & 0x3) == 0 && Value <= 1020 && Value >= -1020); 594 } 595 bool isMemMode7() const { 596 if (!isMemory() || 597 getMemPreindexed() || 598 getMemPostindexed() || 599 getMemOffsetIsReg() || 600 getMemNegative() || 601 getMemWriteback()) 602 return false; 603 604 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 605 if (!CE) return false; 606 607 if (CE->getValue()) 608 return false; 609 610 return true; 611 } 612 bool isMemModeRegThumb() const { 613 if (!isMemory() || !getMemOffsetIsReg() || getMemWriteback()) 614 return false; 615 return true; 616 } 617 bool isMemModeImmThumb() const { 618 if (!isMemory() || getMemOffsetIsReg() || getMemWriteback()) 619 return false; 620 621 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 622 if (!CE) return false; 623 624 // The offset must be a multiple of 4 in the range 0-124. 625 uint64_t Value = CE->getValue(); 626 return ((Value & 0x3) == 0 && Value <= 124); 627 } 628 bool isMSRMask() const { return Kind == MSRMask; } 629 bool isProcIFlags() const { return Kind == ProcIFlags; } 630 631 void addExpr(MCInst &Inst, const MCExpr *Expr) const { 632 // Add as immediates when possible. Null MCExpr = 0. 633 if (Expr == 0) 634 Inst.addOperand(MCOperand::CreateImm(0)); 635 else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 636 Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 637 else 638 Inst.addOperand(MCOperand::CreateExpr(Expr)); 639 } 640 641 void addCondCodeOperands(MCInst &Inst, unsigned N) const { 642 assert(N == 2 && "Invalid number of operands!"); 643 Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode()))); 644 unsigned RegNum = getCondCode() == ARMCC::AL ? 0: ARM::CPSR; 645 Inst.addOperand(MCOperand::CreateReg(RegNum)); 646 } 647 648 void addCoprocNumOperands(MCInst &Inst, unsigned N) const { 649 assert(N == 1 && "Invalid number of operands!"); 650 Inst.addOperand(MCOperand::CreateImm(getCoproc())); 651 } 652 653 void addCoprocRegOperands(MCInst &Inst, unsigned N) const { 654 assert(N == 1 && "Invalid number of operands!"); 655 Inst.addOperand(MCOperand::CreateImm(getCoproc())); 656 } 657 658 void addCCOutOperands(MCInst &Inst, unsigned N) const { 659 assert(N == 1 && "Invalid number of operands!"); 660 Inst.addOperand(MCOperand::CreateReg(getReg())); 661 } 662 663 void addRegOperands(MCInst &Inst, unsigned N) const { 664 assert(N == 1 && "Invalid number of operands!"); 665 Inst.addOperand(MCOperand::CreateReg(getReg())); 666 } 667 668 void addRegShiftedRegOperands(MCInst &Inst, unsigned N) const { 669 assert(N == 3 && "Invalid number of operands!"); 670 assert(isRegShiftedReg() && "addRegShiftedRegOperands() on non RegShiftedReg!"); 671 Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.SrcReg)); 672 Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.ShiftReg)); 673 Inst.addOperand(MCOperand::CreateImm( 674 ARM_AM::getSORegOpc(RegShiftedReg.ShiftTy, RegShiftedReg.ShiftImm))); 675 } 676 677 void addRegShiftedImmOperands(MCInst &Inst, unsigned N) const { 678 assert(N == 2 && "Invalid number of operands!"); 679 assert(isRegShiftedImm() && "addRegShiftedImmOperands() on non RegShiftedImm!"); 680 Inst.addOperand(MCOperand::CreateReg(RegShiftedImm.SrcReg)); 681 Inst.addOperand(MCOperand::CreateImm( 682 ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm))); 683 } 684 685 686 void addShifterImmOperands(MCInst &Inst, unsigned N) const { 687 assert(N == 1 && "Invalid number of operands!"); 688 Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) | 689 ShifterImm.Imm)); 690 } 691 692 void addRegListOperands(MCInst &Inst, unsigned N) const { 693 assert(N == 1 && "Invalid number of operands!"); 694 const SmallVectorImpl<unsigned> &RegList = getRegList(); 695 for (SmallVectorImpl<unsigned>::const_iterator 696 I = RegList.begin(), E = RegList.end(); I != E; ++I) 697 Inst.addOperand(MCOperand::CreateReg(*I)); 698 } 699 700 void addDPRRegListOperands(MCInst &Inst, unsigned N) const { 701 addRegListOperands(Inst, N); 702 } 703 704 void addSPRRegListOperands(MCInst &Inst, unsigned N) const { 705 addRegListOperands(Inst, N); 706 } 707 708 void addRotImmOperands(MCInst &Inst, unsigned N) const { 709 assert(N == 1 && "Invalid number of operands!"); 710 // Encoded as val>>3. The printer handles display as 8, 16, 24. 711 Inst.addOperand(MCOperand::CreateImm(RotImm.Imm >> 3)); 712 } 713 714 void addImmOperands(MCInst &Inst, unsigned N) const { 715 assert(N == 1 && "Invalid number of operands!"); 716 addExpr(Inst, getImm()); 717 } 718 719 void addImm0_255Operands(MCInst &Inst, unsigned N) const { 720 assert(N == 1 && "Invalid number of operands!"); 721 addExpr(Inst, getImm()); 722 } 723 724 void addImm0_7Operands(MCInst &Inst, unsigned N) const { 725 assert(N == 1 && "Invalid number of operands!"); 726 addExpr(Inst, getImm()); 727 } 728 729 void addImm0_15Operands(MCInst &Inst, unsigned N) const { 730 assert(N == 1 && "Invalid number of operands!"); 731 addExpr(Inst, getImm()); 732 } 733 734 void addImm0_31Operands(MCInst &Inst, unsigned N) const { 735 assert(N == 1 && "Invalid number of operands!"); 736 addExpr(Inst, getImm()); 737 } 738 739 void addImm1_16Operands(MCInst &Inst, unsigned N) const { 740 assert(N == 1 && "Invalid number of operands!"); 741 // The constant encodes as the immediate-1, and we store in the instruction 742 // the bits as encoded, so subtract off one here. 743 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 744 Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1)); 745 } 746 747 void addImm1_32Operands(MCInst &Inst, unsigned N) const { 748 assert(N == 1 && "Invalid number of operands!"); 749 // The constant encodes as the immediate-1, and we store in the instruction 750 // the bits as encoded, so subtract off one here. 751 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 752 Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1)); 753 } 754 755 void addImm0_65535Operands(MCInst &Inst, unsigned N) const { 756 assert(N == 1 && "Invalid number of operands!"); 757 addExpr(Inst, getImm()); 758 } 759 760 void addImm0_65535ExprOperands(MCInst &Inst, unsigned N) const { 761 assert(N == 1 && "Invalid number of operands!"); 762 addExpr(Inst, getImm()); 763 } 764 765 void addImm24bitOperands(MCInst &Inst, unsigned N) const { 766 assert(N == 1 && "Invalid number of operands!"); 767 addExpr(Inst, getImm()); 768 } 769 770 void addPKHLSLImmOperands(MCInst &Inst, unsigned N) const { 771 assert(N == 1 && "Invalid number of operands!"); 772 addExpr(Inst, getImm()); 773 } 774 775 void addPKHASRImmOperands(MCInst &Inst, unsigned N) const { 776 assert(N == 1 && "Invalid number of operands!"); 777 // An ASR value of 32 encodes as 0, so that's how we want to add it to 778 // the instruction as well. 779 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 780 int Val = CE->getValue(); 781 Inst.addOperand(MCOperand::CreateImm(Val == 32 ? 0 : Val)); 782 } 783 784 void addARMSOImmOperands(MCInst &Inst, unsigned N) const { 785 assert(N == 1 && "Invalid number of operands!"); 786 addExpr(Inst, getImm()); 787 } 788 789 void addT2SOImmOperands(MCInst &Inst, unsigned N) const { 790 assert(N == 1 && "Invalid number of operands!"); 791 addExpr(Inst, getImm()); 792 } 793 794 void addSetEndImmOperands(MCInst &Inst, unsigned N) const { 795 assert(N == 1 && "Invalid number of operands!"); 796 addExpr(Inst, getImm()); 797 } 798 799 void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const { 800 assert(N == 1 && "Invalid number of operands!"); 801 Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt()))); 802 } 803 804 void addMemMode7Operands(MCInst &Inst, unsigned N) const { 805 assert(N == 1 && isMemMode7() && "Invalid number of operands!"); 806 Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); 807 808 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 809 (void)CE; 810 assert((CE || CE->getValue() == 0) && 811 "No offset operand support in mode 7"); 812 } 813 814 void addMemMode2Operands(MCInst &Inst, unsigned N) const { 815 assert(isMemMode2() && "Invalid mode or number of operands!"); 816 Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); 817 unsigned IdxMode = (getMemPreindexed() | getMemPostindexed() << 1); 818 819 if (getMemOffsetIsReg()) { 820 Inst.addOperand(MCOperand::CreateReg(getMemOffsetRegNum())); 821 822 ARM_AM::AddrOpc AMOpc = getMemNegative() ? ARM_AM::sub : ARM_AM::add; 823 ARM_AM::ShiftOpc ShOpc = ARM_AM::no_shift; 824 int64_t ShiftAmount = 0; 825 826 if (getMemOffsetRegShifted()) { 827 ShOpc = getMemShiftType(); 828 const MCConstantExpr *CE = 829 dyn_cast<MCConstantExpr>(getMemShiftAmount()); 830 ShiftAmount = CE->getValue(); 831 } 832 833 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM2Opc(AMOpc, ShiftAmount, 834 ShOpc, IdxMode))); 835 return; 836 } 837 838 // Create a operand placeholder to always yield the same number of operands. 839 Inst.addOperand(MCOperand::CreateReg(0)); 840 841 // FIXME: #-0 is encoded differently than #0. Does the parser preserve 842 // the difference? 843 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 844 assert(CE && "Non-constant mode 2 offset operand!"); 845 int64_t Offset = CE->getValue(); 846 847 if (Offset >= 0) 848 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM2Opc(ARM_AM::add, 849 Offset, ARM_AM::no_shift, IdxMode))); 850 else 851 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM2Opc(ARM_AM::sub, 852 -Offset, ARM_AM::no_shift, IdxMode))); 853 } 854 855 void addMemMode3Operands(MCInst &Inst, unsigned N) const { 856 assert(isMemMode3() && "Invalid mode or number of operands!"); 857 Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); 858 unsigned IdxMode = (getMemPreindexed() | getMemPostindexed() << 1); 859 860 if (getMemOffsetIsReg()) { 861 Inst.addOperand(MCOperand::CreateReg(getMemOffsetRegNum())); 862 863 ARM_AM::AddrOpc AMOpc = getMemNegative() ? ARM_AM::sub : ARM_AM::add; 864 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM3Opc(AMOpc, 0, 865 IdxMode))); 866 return; 867 } 868 869 // Create a operand placeholder to always yield the same number of operands. 870 Inst.addOperand(MCOperand::CreateReg(0)); 871 872 // FIXME: #-0 is encoded differently than #0. Does the parser preserve 873 // the difference? 874 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 875 assert(CE && "Non-constant mode 3 offset operand!"); 876 int64_t Offset = CE->getValue(); 877 878 if (Offset >= 0) 879 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM3Opc(ARM_AM::add, 880 Offset, IdxMode))); 881 else 882 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM3Opc(ARM_AM::sub, 883 -Offset, IdxMode))); 884 } 885 886 void addMemMode5Operands(MCInst &Inst, unsigned N) const { 887 assert(N == 2 && isMemMode5() && "Invalid number of operands!"); 888 889 Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); 890 assert(!getMemOffsetIsReg() && "Invalid mode 5 operand"); 891 892 // FIXME: #-0 is encoded differently than #0. Does the parser preserve 893 // the difference? 894 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 895 assert(CE && "Non-constant mode 5 offset operand!"); 896 897 // The MCInst offset operand doesn't include the low two bits (like 898 // the instruction encoding). 899 int64_t Offset = CE->getValue() / 4; 900 if (Offset >= 0) 901 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::add, 902 Offset))); 903 else 904 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::sub, 905 -Offset))); 906 } 907 908 void addMemModeRegThumbOperands(MCInst &Inst, unsigned N) const { 909 assert(N == 2 && isMemModeRegThumb() && "Invalid number of operands!"); 910 Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); 911 Inst.addOperand(MCOperand::CreateReg(getMemOffsetRegNum())); 912 } 913 914 void addMemModeImmThumbOperands(MCInst &Inst, unsigned N) const { 915 assert(N == 2 && isMemModeImmThumb() && "Invalid number of operands!"); 916 Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); 917 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); 918 assert(CE && "Non-constant mode offset operand!"); 919 Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 920 } 921 922 void addMSRMaskOperands(MCInst &Inst, unsigned N) const { 923 assert(N == 1 && "Invalid number of operands!"); 924 Inst.addOperand(MCOperand::CreateImm(unsigned(getMSRMask()))); 925 } 926 927 void addProcIFlagsOperands(MCInst &Inst, unsigned N) const { 928 assert(N == 1 && "Invalid number of operands!"); 929 Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags()))); 930 } 931 932 virtual void print(raw_ostream &OS) const; 933 934 static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) { 935 ARMOperand *Op = new ARMOperand(CondCode); 936 Op->CC.Val = CC; 937 Op->StartLoc = S; 938 Op->EndLoc = S; 939 return Op; 940 } 941 942 static ARMOperand *CreateCoprocNum(unsigned CopVal, SMLoc S) { 943 ARMOperand *Op = new ARMOperand(CoprocNum); 944 Op->Cop.Val = CopVal; 945 Op->StartLoc = S; 946 Op->EndLoc = S; 947 return Op; 948 } 949 950 static ARMOperand *CreateCoprocReg(unsigned CopVal, SMLoc S) { 951 ARMOperand *Op = new ARMOperand(CoprocReg); 952 Op->Cop.Val = CopVal; 953 Op->StartLoc = S; 954 Op->EndLoc = S; 955 return Op; 956 } 957 958 static ARMOperand *CreateCCOut(unsigned RegNum, SMLoc S) { 959 ARMOperand *Op = new ARMOperand(CCOut); 960 Op->Reg.RegNum = RegNum; 961 Op->StartLoc = S; 962 Op->EndLoc = S; 963 return Op; 964 } 965 966 static ARMOperand *CreateToken(StringRef Str, SMLoc S) { 967 ARMOperand *Op = new ARMOperand(Token); 968 Op->Tok.Data = Str.data(); 969 Op->Tok.Length = Str.size(); 970 Op->StartLoc = S; 971 Op->EndLoc = S; 972 return Op; 973 } 974 975 static ARMOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) { 976 ARMOperand *Op = new ARMOperand(Register); 977 Op->Reg.RegNum = RegNum; 978 Op->StartLoc = S; 979 Op->EndLoc = E; 980 return Op; 981 } 982 983 static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy, 984 unsigned SrcReg, 985 unsigned ShiftReg, 986 unsigned ShiftImm, 987 SMLoc S, SMLoc E) { 988 ARMOperand *Op = new ARMOperand(ShiftedRegister); 989 Op->RegShiftedReg.ShiftTy = ShTy; 990 Op->RegShiftedReg.SrcReg = SrcReg; 991 Op->RegShiftedReg.ShiftReg = ShiftReg; 992 Op->RegShiftedReg.ShiftImm = ShiftImm; 993 Op->StartLoc = S; 994 Op->EndLoc = E; 995 return Op; 996 } 997 998 static ARMOperand *CreateShiftedImmediate(ARM_AM::ShiftOpc ShTy, 999 unsigned SrcReg, 1000 unsigned ShiftImm, 1001 SMLoc S, SMLoc E) { 1002 ARMOperand *Op = new ARMOperand(ShiftedImmediate); 1003 Op->RegShiftedImm.ShiftTy = ShTy; 1004 Op->RegShiftedImm.SrcReg = SrcReg; 1005 Op->RegShiftedImm.ShiftImm = ShiftImm; 1006 Op->StartLoc = S; 1007 Op->EndLoc = E; 1008 return Op; 1009 } 1010 1011 static ARMOperand *CreateShifterImm(bool isASR, unsigned Imm, 1012 SMLoc S, SMLoc E) { 1013 ARMOperand *Op = new ARMOperand(ShifterImmediate); 1014 Op->ShifterImm.isASR = isASR; 1015 Op->ShifterImm.Imm = Imm; 1016 Op->StartLoc = S; 1017 Op->EndLoc = E; 1018 return Op; 1019 } 1020 1021 static ARMOperand *CreateRotImm(unsigned Imm, SMLoc S, SMLoc E) { 1022 ARMOperand *Op = new ARMOperand(RotateImmediate); 1023 Op->RotImm.Imm = Imm; 1024 Op->StartLoc = S; 1025 Op->EndLoc = E; 1026 return Op; 1027 } 1028 1029 static ARMOperand * 1030 CreateRegList(const SmallVectorImpl<std::pair<unsigned, SMLoc> > &Regs, 1031 SMLoc StartLoc, SMLoc EndLoc) { 1032 KindTy Kind = RegisterList; 1033 1034 if (llvm::ARMMCRegisterClasses[ARM::DPRRegClassID]. 1035 contains(Regs.front().first)) 1036 Kind = DPRRegisterList; 1037 else if (llvm::ARMMCRegisterClasses[ARM::SPRRegClassID]. 1038 contains(Regs.front().first)) 1039 Kind = SPRRegisterList; 1040 1041 ARMOperand *Op = new ARMOperand(Kind); 1042 for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator 1043 I = Regs.begin(), E = Regs.end(); I != E; ++I) 1044 Op->Registers.push_back(I->first); 1045 array_pod_sort(Op->Registers.begin(), Op->Registers.end()); 1046 Op->StartLoc = StartLoc; 1047 Op->EndLoc = EndLoc; 1048 return Op; 1049 } 1050 1051 static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) { 1052 ARMOperand *Op = new ARMOperand(Immediate); 1053 Op->Imm.Val = Val; 1054 Op->StartLoc = S; 1055 Op->EndLoc = E; 1056 return Op; 1057 } 1058 1059 static ARMOperand *CreateMem(ARMII::AddrMode AddrMode, unsigned BaseRegNum, 1060 bool OffsetIsReg, const MCExpr *Offset, 1061 int OffsetRegNum, bool OffsetRegShifted, 1062 enum ARM_AM::ShiftOpc ShiftType, 1063 const MCExpr *ShiftAmount, bool Preindexed, 1064 bool Postindexed, bool Negative, bool Writeback, 1065 SMLoc S, SMLoc E) { 1066 assert((OffsetRegNum == -1 || OffsetIsReg) && 1067 "OffsetRegNum must imply OffsetIsReg!"); 1068 assert((!OffsetRegShifted || OffsetIsReg) && 1069 "OffsetRegShifted must imply OffsetIsReg!"); 1070 assert((Offset || OffsetIsReg) && 1071 "Offset must exists unless register offset is used!"); 1072 assert((!ShiftAmount || (OffsetIsReg && OffsetRegShifted)) && 1073 "Cannot have shift amount without shifted register offset!"); 1074 assert((!Offset || !OffsetIsReg) && 1075 "Cannot have expression offset and register offset!"); 1076 1077 ARMOperand *Op = new ARMOperand(Memory); 1078 Op->Mem.AddrMode = AddrMode; 1079 Op->Mem.BaseRegNum = BaseRegNum; 1080 Op->Mem.OffsetIsReg = OffsetIsReg; 1081 if (OffsetIsReg) 1082 Op->Mem.Offset.RegNum = OffsetRegNum; 1083 else 1084 Op->Mem.Offset.Value = Offset; 1085 Op->Mem.OffsetRegShifted = OffsetRegShifted; 1086 Op->Mem.ShiftType = ShiftType; 1087 Op->Mem.ShiftAmount = ShiftAmount; 1088 Op->Mem.Preindexed = Preindexed; 1089 Op->Mem.Postindexed = Postindexed; 1090 Op->Mem.Negative = Negative; 1091 Op->Mem.Writeback = Writeback; 1092 1093 Op->StartLoc = S; 1094 Op->EndLoc = E; 1095 return Op; 1096 } 1097 1098 static ARMOperand *CreateMemBarrierOpt(ARM_MB::MemBOpt Opt, SMLoc S) { 1099 ARMOperand *Op = new ARMOperand(MemBarrierOpt); 1100 Op->MBOpt.Val = Opt; 1101 Op->StartLoc = S; 1102 Op->EndLoc = S; 1103 return Op; 1104 } 1105 1106 static ARMOperand *CreateProcIFlags(ARM_PROC::IFlags IFlags, SMLoc S) { 1107 ARMOperand *Op = new ARMOperand(ProcIFlags); 1108 Op->IFlags.Val = IFlags; 1109 Op->StartLoc = S; 1110 Op->EndLoc = S; 1111 return Op; 1112 } 1113 1114 static ARMOperand *CreateMSRMask(unsigned MMask, SMLoc S) { 1115 ARMOperand *Op = new ARMOperand(MSRMask); 1116 Op->MMask.Val = MMask; 1117 Op->StartLoc = S; 1118 Op->EndLoc = S; 1119 return Op; 1120 } 1121}; 1122 1123} // end anonymous namespace. 1124 1125void ARMOperand::print(raw_ostream &OS) const { 1126 switch (Kind) { 1127 case CondCode: 1128 OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">"; 1129 break; 1130 case CCOut: 1131 OS << "<ccout " << getReg() << ">"; 1132 break; 1133 case CoprocNum: 1134 OS << "<coprocessor number: " << getCoproc() << ">"; 1135 break; 1136 case CoprocReg: 1137 OS << "<coprocessor register: " << getCoproc() << ">"; 1138 break; 1139 case MSRMask: 1140 OS << "<mask: " << getMSRMask() << ">"; 1141 break; 1142 case Immediate: 1143 getImm()->print(OS); 1144 break; 1145 case MemBarrierOpt: 1146 OS << "<ARM_MB::" << MemBOptToString(getMemBarrierOpt()) << ">"; 1147 break; 1148 case Memory: 1149 OS << "<memory " 1150 << "am:" << ARMII::AddrModeToString(getMemAddrMode()) 1151 << " base:" << getMemBaseRegNum(); 1152 if (getMemOffsetIsReg()) { 1153 OS << " offset:<register " << getMemOffsetRegNum(); 1154 if (getMemOffsetRegShifted()) { 1155 OS << " offset-shift-type:" << getMemShiftType(); 1156 OS << " offset-shift-amount:" << *getMemShiftAmount(); 1157 } 1158 } else { 1159 OS << " offset:" << *getMemOffset(); 1160 } 1161 if (getMemOffsetIsReg()) 1162 OS << " (offset-is-reg)"; 1163 if (getMemPreindexed()) 1164 OS << " (pre-indexed)"; 1165 if (getMemPostindexed()) 1166 OS << " (post-indexed)"; 1167 if (getMemNegative()) 1168 OS << " (negative)"; 1169 if (getMemWriteback()) 1170 OS << " (writeback)"; 1171 OS << ">"; 1172 break; 1173 case ProcIFlags: { 1174 OS << "<ARM_PROC::"; 1175 unsigned IFlags = getProcIFlags(); 1176 for (int i=2; i >= 0; --i) 1177 if (IFlags & (1 << i)) 1178 OS << ARM_PROC::IFlagsToString(1 << i); 1179 OS << ">"; 1180 break; 1181 } 1182 case Register: 1183 OS << "<register " << getReg() << ">"; 1184 break; 1185 case ShifterImmediate: 1186 OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl") 1187 << " #" << ShifterImm.Imm << ">"; 1188 break; 1189 case ShiftedRegister: 1190 OS << "<so_reg_reg " 1191 << RegShiftedReg.SrcReg 1192 << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedReg.ShiftImm)) 1193 << ", " << RegShiftedReg.ShiftReg << ", " 1194 << ARM_AM::getSORegOffset(RegShiftedReg.ShiftImm) 1195 << ">"; 1196 break; 1197 case ShiftedImmediate: 1198 OS << "<so_reg_imm " 1199 << RegShiftedImm.SrcReg 1200 << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedImm.ShiftImm)) 1201 << ", " << ARM_AM::getSORegOffset(RegShiftedImm.ShiftImm) 1202 << ">"; 1203 break; 1204 case RotateImmediate: 1205 OS << "<ror " << " #" << (RotImm.Imm * 8) << ">"; 1206 break; 1207 case RegisterList: 1208 case DPRRegisterList: 1209 case SPRRegisterList: { 1210 OS << "<register_list "; 1211 1212 const SmallVectorImpl<unsigned> &RegList = getRegList(); 1213 for (SmallVectorImpl<unsigned>::const_iterator 1214 I = RegList.begin(), E = RegList.end(); I != E; ) { 1215 OS << *I; 1216 if (++I < E) OS << ", "; 1217 } 1218 1219 OS << ">"; 1220 break; 1221 } 1222 case Token: 1223 OS << "'" << getToken() << "'"; 1224 break; 1225 } 1226} 1227 1228/// @name Auto-generated Match Functions 1229/// { 1230 1231static unsigned MatchRegisterName(StringRef Name); 1232 1233/// } 1234 1235bool ARMAsmParser::ParseRegister(unsigned &RegNo, 1236 SMLoc &StartLoc, SMLoc &EndLoc) { 1237 RegNo = tryParseRegister(); 1238 1239 return (RegNo == (unsigned)-1); 1240} 1241 1242/// Try to parse a register name. The token must be an Identifier when called, 1243/// and if it is a register name the token is eaten and the register number is 1244/// returned. Otherwise return -1. 1245/// 1246int ARMAsmParser::tryParseRegister() { 1247 const AsmToken &Tok = Parser.getTok(); 1248 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1249 1250 // FIXME: Validate register for the current architecture; we have to do 1251 // validation later, so maybe there is no need for this here. 1252 std::string upperCase = Tok.getString().str(); 1253 std::string lowerCase = LowercaseString(upperCase); 1254 unsigned RegNum = MatchRegisterName(lowerCase); 1255 if (!RegNum) { 1256 RegNum = StringSwitch<unsigned>(lowerCase) 1257 .Case("r13", ARM::SP) 1258 .Case("r14", ARM::LR) 1259 .Case("r15", ARM::PC) 1260 .Case("ip", ARM::R12) 1261 .Default(0); 1262 } 1263 if (!RegNum) return -1; 1264 1265 Parser.Lex(); // Eat identifier token. 1266 return RegNum; 1267} 1268 1269// Try to parse a shifter (e.g., "lsl <amt>"). On success, return 0. 1270// If a recoverable error occurs, return 1. If an irrecoverable error 1271// occurs, return -1. An irrecoverable error is one where tokens have been 1272// consumed in the process of trying to parse the shifter (i.e., when it is 1273// indeed a shifter operand, but malformed). 1274int ARMAsmParser::tryParseShiftRegister( 1275 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1276 SMLoc S = Parser.getTok().getLoc(); 1277 const AsmToken &Tok = Parser.getTok(); 1278 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1279 1280 std::string upperCase = Tok.getString().str(); 1281 std::string lowerCase = LowercaseString(upperCase); 1282 ARM_AM::ShiftOpc ShiftTy = StringSwitch<ARM_AM::ShiftOpc>(lowerCase) 1283 .Case("lsl", ARM_AM::lsl) 1284 .Case("lsr", ARM_AM::lsr) 1285 .Case("asr", ARM_AM::asr) 1286 .Case("ror", ARM_AM::ror) 1287 .Case("rrx", ARM_AM::rrx) 1288 .Default(ARM_AM::no_shift); 1289 1290 if (ShiftTy == ARM_AM::no_shift) 1291 return 1; 1292 1293 Parser.Lex(); // Eat the operator. 1294 1295 // The source register for the shift has already been added to the 1296 // operand list, so we need to pop it off and combine it into the shifted 1297 // register operand instead. 1298 OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val()); 1299 if (!PrevOp->isReg()) 1300 return Error(PrevOp->getStartLoc(), "shift must be of a register"); 1301 int SrcReg = PrevOp->getReg(); 1302 int64_t Imm = 0; 1303 int ShiftReg = 0; 1304 if (ShiftTy == ARM_AM::rrx) { 1305 // RRX Doesn't have an explicit shift amount. The encoder expects 1306 // the shift register to be the same as the source register. Seems odd, 1307 // but OK. 1308 ShiftReg = SrcReg; 1309 } else { 1310 // Figure out if this is shifted by a constant or a register (for non-RRX). 1311 if (Parser.getTok().is(AsmToken::Hash)) { 1312 Parser.Lex(); // Eat hash. 1313 SMLoc ImmLoc = Parser.getTok().getLoc(); 1314 const MCExpr *ShiftExpr = 0; 1315 if (getParser().ParseExpression(ShiftExpr)) { 1316 Error(ImmLoc, "invalid immediate shift value"); 1317 return -1; 1318 } 1319 // The expression must be evaluatable as an immediate. 1320 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr); 1321 if (!CE) { 1322 Error(ImmLoc, "invalid immediate shift value"); 1323 return -1; 1324 } 1325 // Range check the immediate. 1326 // lsl, ror: 0 <= imm <= 31 1327 // lsr, asr: 0 <= imm <= 32 1328 Imm = CE->getValue(); 1329 if (Imm < 0 || 1330 ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) || 1331 ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) { 1332 Error(ImmLoc, "immediate shift value out of range"); 1333 return -1; 1334 } 1335 } else if (Parser.getTok().is(AsmToken::Identifier)) { 1336 ShiftReg = tryParseRegister(); 1337 SMLoc L = Parser.getTok().getLoc(); 1338 if (ShiftReg == -1) { 1339 Error (L, "expected immediate or register in shift operand"); 1340 return -1; 1341 } 1342 } else { 1343 Error (Parser.getTok().getLoc(), 1344 "expected immediate or register in shift operand"); 1345 return -1; 1346 } 1347 } 1348 1349 if (ShiftReg && ShiftTy != ARM_AM::rrx) 1350 Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg, 1351 ShiftReg, Imm, 1352 S, Parser.getTok().getLoc())); 1353 else 1354 Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm, 1355 S, Parser.getTok().getLoc())); 1356 1357 return 0; 1358} 1359 1360 1361/// Try to parse a register name. The token must be an Identifier when called. 1362/// If it's a register, an AsmOperand is created. Another AsmOperand is created 1363/// if there is a "writeback". 'true' if it's not a register. 1364/// 1365/// TODO this is likely to change to allow different register types and or to 1366/// parse for a specific register type. 1367bool ARMAsmParser:: 1368tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1369 SMLoc S = Parser.getTok().getLoc(); 1370 int RegNo = tryParseRegister(); 1371 if (RegNo == -1) 1372 return true; 1373 1374 Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc())); 1375 1376 const AsmToken &ExclaimTok = Parser.getTok(); 1377 if (ExclaimTok.is(AsmToken::Exclaim)) { 1378 Operands.push_back(ARMOperand::CreateToken(ExclaimTok.getString(), 1379 ExclaimTok.getLoc())); 1380 Parser.Lex(); // Eat exclaim token 1381 } 1382 1383 return false; 1384} 1385 1386/// MatchCoprocessorOperandName - Try to parse an coprocessor related 1387/// instruction with a symbolic operand name. Example: "p1", "p7", "c3", 1388/// "c5", ... 1389static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) { 1390 // Use the same layout as the tablegen'erated register name matcher. Ugly, 1391 // but efficient. 1392 switch (Name.size()) { 1393 default: break; 1394 case 2: 1395 if (Name[0] != CoprocOp) 1396 return -1; 1397 switch (Name[1]) { 1398 default: return -1; 1399 case '0': return 0; 1400 case '1': return 1; 1401 case '2': return 2; 1402 case '3': return 3; 1403 case '4': return 4; 1404 case '5': return 5; 1405 case '6': return 6; 1406 case '7': return 7; 1407 case '8': return 8; 1408 case '9': return 9; 1409 } 1410 break; 1411 case 3: 1412 if (Name[0] != CoprocOp || Name[1] != '1') 1413 return -1; 1414 switch (Name[2]) { 1415 default: return -1; 1416 case '0': return 10; 1417 case '1': return 11; 1418 case '2': return 12; 1419 case '3': return 13; 1420 case '4': return 14; 1421 case '5': return 15; 1422 } 1423 break; 1424 } 1425 1426 return -1; 1427} 1428 1429/// parseCoprocNumOperand - Try to parse an coprocessor number operand. The 1430/// token must be an Identifier when called, and if it is a coprocessor 1431/// number, the token is eaten and the operand is added to the operand list. 1432ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1433parseCoprocNumOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1434 SMLoc S = Parser.getTok().getLoc(); 1435 const AsmToken &Tok = Parser.getTok(); 1436 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1437 1438 int Num = MatchCoprocessorOperandName(Tok.getString(), 'p'); 1439 if (Num == -1) 1440 return MatchOperand_NoMatch; 1441 1442 Parser.Lex(); // Eat identifier token. 1443 Operands.push_back(ARMOperand::CreateCoprocNum(Num, S)); 1444 return MatchOperand_Success; 1445} 1446 1447/// parseCoprocRegOperand - Try to parse an coprocessor register operand. The 1448/// token must be an Identifier when called, and if it is a coprocessor 1449/// number, the token is eaten and the operand is added to the operand list. 1450ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1451parseCoprocRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1452 SMLoc S = Parser.getTok().getLoc(); 1453 const AsmToken &Tok = Parser.getTok(); 1454 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1455 1456 int Reg = MatchCoprocessorOperandName(Tok.getString(), 'c'); 1457 if (Reg == -1) 1458 return MatchOperand_NoMatch; 1459 1460 Parser.Lex(); // Eat identifier token. 1461 Operands.push_back(ARMOperand::CreateCoprocReg(Reg, S)); 1462 return MatchOperand_Success; 1463} 1464 1465/// Parse a register list, return it if successful else return null. The first 1466/// token must be a '{' when called. 1467bool ARMAsmParser:: 1468parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1469 assert(Parser.getTok().is(AsmToken::LCurly) && 1470 "Token is not a Left Curly Brace"); 1471 SMLoc S = Parser.getTok().getLoc(); 1472 1473 // Read the rest of the registers in the list. 1474 unsigned PrevRegNum = 0; 1475 SmallVector<std::pair<unsigned, SMLoc>, 32> Registers; 1476 1477 do { 1478 bool IsRange = Parser.getTok().is(AsmToken::Minus); 1479 Parser.Lex(); // Eat non-identifier token. 1480 1481 const AsmToken &RegTok = Parser.getTok(); 1482 SMLoc RegLoc = RegTok.getLoc(); 1483 if (RegTok.isNot(AsmToken::Identifier)) { 1484 Error(RegLoc, "register expected"); 1485 return true; 1486 } 1487 1488 int RegNum = tryParseRegister(); 1489 if (RegNum == -1) { 1490 Error(RegLoc, "register expected"); 1491 return true; 1492 } 1493 1494 if (IsRange) { 1495 int Reg = PrevRegNum; 1496 do { 1497 ++Reg; 1498 Registers.push_back(std::make_pair(Reg, RegLoc)); 1499 } while (Reg != RegNum); 1500 } else { 1501 Registers.push_back(std::make_pair(RegNum, RegLoc)); 1502 } 1503 1504 PrevRegNum = RegNum; 1505 } while (Parser.getTok().is(AsmToken::Comma) || 1506 Parser.getTok().is(AsmToken::Minus)); 1507 1508 // Process the right curly brace of the list. 1509 const AsmToken &RCurlyTok = Parser.getTok(); 1510 if (RCurlyTok.isNot(AsmToken::RCurly)) { 1511 Error(RCurlyTok.getLoc(), "'}' expected"); 1512 return true; 1513 } 1514 1515 SMLoc E = RCurlyTok.getLoc(); 1516 Parser.Lex(); // Eat right curly brace token. 1517 1518 // Verify the register list. 1519 SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator 1520 RI = Registers.begin(), RE = Registers.end(); 1521 1522 unsigned HighRegNum = getARMRegisterNumbering(RI->first); 1523 bool EmittedWarning = false; 1524 1525 DenseMap<unsigned, bool> RegMap; 1526 RegMap[HighRegNum] = true; 1527 1528 for (++RI; RI != RE; ++RI) { 1529 const std::pair<unsigned, SMLoc> &RegInfo = *RI; 1530 unsigned Reg = getARMRegisterNumbering(RegInfo.first); 1531 1532 if (RegMap[Reg]) { 1533 Error(RegInfo.second, "register duplicated in register list"); 1534 return true; 1535 } 1536 1537 if (!EmittedWarning && Reg < HighRegNum) 1538 Warning(RegInfo.second, 1539 "register not in ascending order in register list"); 1540 1541 RegMap[Reg] = true; 1542 HighRegNum = std::max(Reg, HighRegNum); 1543 } 1544 1545 Operands.push_back(ARMOperand::CreateRegList(Registers, S, E)); 1546 return false; 1547} 1548 1549/// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options. 1550ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1551parseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1552 SMLoc S = Parser.getTok().getLoc(); 1553 const AsmToken &Tok = Parser.getTok(); 1554 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1555 StringRef OptStr = Tok.getString(); 1556 1557 unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size())) 1558 .Case("sy", ARM_MB::SY) 1559 .Case("st", ARM_MB::ST) 1560 .Case("sh", ARM_MB::ISH) 1561 .Case("ish", ARM_MB::ISH) 1562 .Case("shst", ARM_MB::ISHST) 1563 .Case("ishst", ARM_MB::ISHST) 1564 .Case("nsh", ARM_MB::NSH) 1565 .Case("un", ARM_MB::NSH) 1566 .Case("nshst", ARM_MB::NSHST) 1567 .Case("unst", ARM_MB::NSHST) 1568 .Case("osh", ARM_MB::OSH) 1569 .Case("oshst", ARM_MB::OSHST) 1570 .Default(~0U); 1571 1572 if (Opt == ~0U) 1573 return MatchOperand_NoMatch; 1574 1575 Parser.Lex(); // Eat identifier token. 1576 Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S)); 1577 return MatchOperand_Success; 1578} 1579 1580/// parseProcIFlagsOperand - Try to parse iflags from CPS instruction. 1581ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1582parseProcIFlagsOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1583 SMLoc S = Parser.getTok().getLoc(); 1584 const AsmToken &Tok = Parser.getTok(); 1585 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1586 StringRef IFlagsStr = Tok.getString(); 1587 1588 unsigned IFlags = 0; 1589 for (int i = 0, e = IFlagsStr.size(); i != e; ++i) { 1590 unsigned Flag = StringSwitch<unsigned>(IFlagsStr.substr(i, 1)) 1591 .Case("a", ARM_PROC::A) 1592 .Case("i", ARM_PROC::I) 1593 .Case("f", ARM_PROC::F) 1594 .Default(~0U); 1595 1596 // If some specific iflag is already set, it means that some letter is 1597 // present more than once, this is not acceptable. 1598 if (Flag == ~0U || (IFlags & Flag)) 1599 return MatchOperand_NoMatch; 1600 1601 IFlags |= Flag; 1602 } 1603 1604 Parser.Lex(); // Eat identifier token. 1605 Operands.push_back(ARMOperand::CreateProcIFlags((ARM_PROC::IFlags)IFlags, S)); 1606 return MatchOperand_Success; 1607} 1608 1609/// parseMSRMaskOperand - Try to parse mask flags from MSR instruction. 1610ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1611parseMSRMaskOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1612 SMLoc S = Parser.getTok().getLoc(); 1613 const AsmToken &Tok = Parser.getTok(); 1614 assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier"); 1615 StringRef Mask = Tok.getString(); 1616 1617 // Split spec_reg from flag, example: CPSR_sxf => "CPSR" and "sxf" 1618 size_t Start = 0, Next = Mask.find('_'); 1619 StringRef Flags = ""; 1620 std::string SpecReg = LowercaseString(Mask.slice(Start, Next)); 1621 if (Next != StringRef::npos) 1622 Flags = Mask.slice(Next+1, Mask.size()); 1623 1624 // FlagsVal contains the complete mask: 1625 // 3-0: Mask 1626 // 4: Special Reg (cpsr, apsr => 0; spsr => 1) 1627 unsigned FlagsVal = 0; 1628 1629 if (SpecReg == "apsr") { 1630 FlagsVal = StringSwitch<unsigned>(Flags) 1631 .Case("nzcvq", 0x8) // same as CPSR_f 1632 .Case("g", 0x4) // same as CPSR_s 1633 .Case("nzcvqg", 0xc) // same as CPSR_fs 1634 .Default(~0U); 1635 1636 if (FlagsVal == ~0U) { 1637 if (!Flags.empty()) 1638 return MatchOperand_NoMatch; 1639 else 1640 FlagsVal = 0; // No flag 1641 } 1642 } else if (SpecReg == "cpsr" || SpecReg == "spsr") { 1643 if (Flags == "all") // cpsr_all is an alias for cpsr_fc 1644 Flags = "fc"; 1645 for (int i = 0, e = Flags.size(); i != e; ++i) { 1646 unsigned Flag = StringSwitch<unsigned>(Flags.substr(i, 1)) 1647 .Case("c", 1) 1648 .Case("x", 2) 1649 .Case("s", 4) 1650 .Case("f", 8) 1651 .Default(~0U); 1652 1653 // If some specific flag is already set, it means that some letter is 1654 // present more than once, this is not acceptable. 1655 if (FlagsVal == ~0U || (FlagsVal & Flag)) 1656 return MatchOperand_NoMatch; 1657 FlagsVal |= Flag; 1658 } 1659 } else // No match for special register. 1660 return MatchOperand_NoMatch; 1661 1662 // Special register without flags are equivalent to "fc" flags. 1663 if (!FlagsVal) 1664 FlagsVal = 0x9; 1665 1666 // Bit 4: Special Reg (cpsr, apsr => 0; spsr => 1) 1667 if (SpecReg == "spsr") 1668 FlagsVal |= 16; 1669 1670 Parser.Lex(); // Eat identifier token. 1671 Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S)); 1672 return MatchOperand_Success; 1673} 1674 1675/// parseMemMode2Operand - Try to parse memory addressing mode 2 operand. 1676ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1677parseMemMode2Operand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1678 assert(Parser.getTok().is(AsmToken::LBrac) && "Token is not a \"[\""); 1679 1680 if (parseMemory(Operands, ARMII::AddrMode2)) 1681 return MatchOperand_NoMatch; 1682 1683 return MatchOperand_Success; 1684} 1685 1686/// parseMemMode3Operand - Try to parse memory addressing mode 3 operand. 1687ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1688parseMemMode3Operand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1689 assert(Parser.getTok().is(AsmToken::LBrac) && "Token is not a \"[\""); 1690 1691 if (parseMemory(Operands, ARMII::AddrMode3)) 1692 return MatchOperand_NoMatch; 1693 1694 return MatchOperand_Success; 1695} 1696 1697ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1698parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands, StringRef Op, 1699 int Low, int High) { 1700 const AsmToken &Tok = Parser.getTok(); 1701 if (Tok.isNot(AsmToken::Identifier)) { 1702 Error(Parser.getTok().getLoc(), Op + " operand expected."); 1703 return MatchOperand_ParseFail; 1704 } 1705 StringRef ShiftName = Tok.getString(); 1706 std::string LowerOp = LowercaseString(Op); 1707 std::string UpperOp = UppercaseString(Op); 1708 if (ShiftName != LowerOp && ShiftName != UpperOp) { 1709 Error(Parser.getTok().getLoc(), Op + " operand expected."); 1710 return MatchOperand_ParseFail; 1711 } 1712 Parser.Lex(); // Eat shift type token. 1713 1714 // There must be a '#' and a shift amount. 1715 if (Parser.getTok().isNot(AsmToken::Hash)) { 1716 Error(Parser.getTok().getLoc(), "'#' expected"); 1717 return MatchOperand_ParseFail; 1718 } 1719 Parser.Lex(); // Eat hash token. 1720 1721 const MCExpr *ShiftAmount; 1722 SMLoc Loc = Parser.getTok().getLoc(); 1723 if (getParser().ParseExpression(ShiftAmount)) { 1724 Error(Loc, "illegal expression"); 1725 return MatchOperand_ParseFail; 1726 } 1727 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 1728 if (!CE) { 1729 Error(Loc, "constant expression expected"); 1730 return MatchOperand_ParseFail; 1731 } 1732 int Val = CE->getValue(); 1733 if (Val < Low || Val > High) { 1734 Error(Loc, "immediate value out of range"); 1735 return MatchOperand_ParseFail; 1736 } 1737 1738 Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc())); 1739 1740 return MatchOperand_Success; 1741} 1742 1743ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1744parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1745 const AsmToken &Tok = Parser.getTok(); 1746 SMLoc S = Tok.getLoc(); 1747 if (Tok.isNot(AsmToken::Identifier)) { 1748 Error(Tok.getLoc(), "'be' or 'le' operand expected"); 1749 return MatchOperand_ParseFail; 1750 } 1751 int Val = StringSwitch<int>(Tok.getString()) 1752 .Case("be", 1) 1753 .Case("le", 0) 1754 .Default(-1); 1755 Parser.Lex(); // Eat the token. 1756 1757 if (Val == -1) { 1758 Error(Tok.getLoc(), "'be' or 'le' operand expected"); 1759 return MatchOperand_ParseFail; 1760 } 1761 Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val, 1762 getContext()), 1763 S, Parser.getTok().getLoc())); 1764 return MatchOperand_Success; 1765} 1766 1767/// parseShifterImm - Parse the shifter immediate operand for SSAT/USAT 1768/// instructions. Legal values are: 1769/// lsl #n 'n' in [0,31] 1770/// asr #n 'n' in [1,32] 1771/// n == 32 encoded as n == 0. 1772ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1773parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1774 const AsmToken &Tok = Parser.getTok(); 1775 SMLoc S = Tok.getLoc(); 1776 if (Tok.isNot(AsmToken::Identifier)) { 1777 Error(S, "shift operator 'asr' or 'lsl' expected"); 1778 return MatchOperand_ParseFail; 1779 } 1780 StringRef ShiftName = Tok.getString(); 1781 bool isASR; 1782 if (ShiftName == "lsl" || ShiftName == "LSL") 1783 isASR = false; 1784 else if (ShiftName == "asr" || ShiftName == "ASR") 1785 isASR = true; 1786 else { 1787 Error(S, "shift operator 'asr' or 'lsl' expected"); 1788 return MatchOperand_ParseFail; 1789 } 1790 Parser.Lex(); // Eat the operator. 1791 1792 // A '#' and a shift amount. 1793 if (Parser.getTok().isNot(AsmToken::Hash)) { 1794 Error(Parser.getTok().getLoc(), "'#' expected"); 1795 return MatchOperand_ParseFail; 1796 } 1797 Parser.Lex(); // Eat hash token. 1798 1799 const MCExpr *ShiftAmount; 1800 SMLoc E = Parser.getTok().getLoc(); 1801 if (getParser().ParseExpression(ShiftAmount)) { 1802 Error(E, "malformed shift expression"); 1803 return MatchOperand_ParseFail; 1804 } 1805 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 1806 if (!CE) { 1807 Error(E, "shift amount must be an immediate"); 1808 return MatchOperand_ParseFail; 1809 } 1810 1811 int64_t Val = CE->getValue(); 1812 if (isASR) { 1813 // Shift amount must be in [1,32] 1814 if (Val < 1 || Val > 32) { 1815 Error(E, "'asr' shift amount must be in range [1,32]"); 1816 return MatchOperand_ParseFail; 1817 } 1818 // asr #32 encoded as asr #0. 1819 if (Val == 32) Val = 0; 1820 } else { 1821 // Shift amount must be in [1,32] 1822 if (Val < 0 || Val > 31) { 1823 Error(E, "'lsr' shift amount must be in range [0,31]"); 1824 return MatchOperand_ParseFail; 1825 } 1826 } 1827 1828 E = Parser.getTok().getLoc(); 1829 Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E)); 1830 1831 return MatchOperand_Success; 1832} 1833 1834/// parseRotImm - Parse the shifter immediate operand for SXTB/UXTB family 1835/// of instructions. Legal values are: 1836/// ror #n 'n' in {0, 8, 16, 24} 1837ARMAsmParser::OperandMatchResultTy ARMAsmParser:: 1838parseRotImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1839 const AsmToken &Tok = Parser.getTok(); 1840 SMLoc S = Tok.getLoc(); 1841 if (Tok.isNot(AsmToken::Identifier)) { 1842 Error(S, "rotate operator 'ror' expected"); 1843 return MatchOperand_ParseFail; 1844 } 1845 StringRef ShiftName = Tok.getString(); 1846 if (ShiftName != "ror" && ShiftName != "ROR") { 1847 Error(S, "rotate operator 'ror' expected"); 1848 return MatchOperand_ParseFail; 1849 } 1850 Parser.Lex(); // Eat the operator. 1851 1852 // A '#' and a rotate amount. 1853 if (Parser.getTok().isNot(AsmToken::Hash)) { 1854 Error(Parser.getTok().getLoc(), "'#' expected"); 1855 return MatchOperand_ParseFail; 1856 } 1857 Parser.Lex(); // Eat hash token. 1858 1859 const MCExpr *ShiftAmount; 1860 SMLoc E = Parser.getTok().getLoc(); 1861 if (getParser().ParseExpression(ShiftAmount)) { 1862 Error(E, "malformed rotate expression"); 1863 return MatchOperand_ParseFail; 1864 } 1865 const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount); 1866 if (!CE) { 1867 Error(E, "rotate amount must be an immediate"); 1868 return MatchOperand_ParseFail; 1869 } 1870 1871 int64_t Val = CE->getValue(); 1872 // Shift amount must be in {0, 8, 16, 24} (0 is undocumented extension) 1873 // normally, zero is represented in asm by omitting the rotate operand 1874 // entirely. 1875 if (Val != 8 && Val != 16 && Val != 24 && Val != 0) { 1876 Error(E, "'ror' rotate amount must be 8, 16, or 24"); 1877 return MatchOperand_ParseFail; 1878 } 1879 1880 E = Parser.getTok().getLoc(); 1881 Operands.push_back(ARMOperand::CreateRotImm(Val, S, E)); 1882 1883 return MatchOperand_Success; 1884} 1885 1886/// cvtLdWriteBackRegAddrMode2 - Convert parsed operands to MCInst. 1887/// Needed here because the Asm Gen Matcher can't handle properly tied operands 1888/// when they refer multiple MIOperands inside a single one. 1889bool ARMAsmParser:: 1890cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 1891 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1892 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 1893 1894 // Create a writeback register dummy placeholder. 1895 Inst.addOperand(MCOperand::CreateImm(0)); 1896 1897 ((ARMOperand*)Operands[3])->addMemMode2Operands(Inst, 3); 1898 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 1899 return true; 1900} 1901 1902/// cvtStWriteBackRegAddrMode2 - Convert parsed operands to MCInst. 1903/// Needed here because the Asm Gen Matcher can't handle properly tied operands 1904/// when they refer multiple MIOperands inside a single one. 1905bool ARMAsmParser:: 1906cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode, 1907 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1908 // Create a writeback register dummy placeholder. 1909 Inst.addOperand(MCOperand::CreateImm(0)); 1910 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 1911 ((ARMOperand*)Operands[3])->addMemMode2Operands(Inst, 3); 1912 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 1913 return true; 1914} 1915 1916/// cvtLdWriteBackRegAddrMode3 - Convert parsed operands to MCInst. 1917/// Needed here because the Asm Gen Matcher can't handle properly tied operands 1918/// when they refer multiple MIOperands inside a single one. 1919bool ARMAsmParser:: 1920cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 1921 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1922 // Create a writeback register dummy placeholder. 1923 Inst.addOperand(MCOperand::CreateImm(0)); 1924 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 1925 ((ARMOperand*)Operands[3])->addMemMode3Operands(Inst, 3); 1926 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 1927 return true; 1928} 1929 1930/// cvtStWriteBackRegAddrMode3 - Convert parsed operands to MCInst. 1931/// Needed here because the Asm Gen Matcher can't handle properly tied operands 1932/// when they refer multiple MIOperands inside a single one. 1933bool ARMAsmParser:: 1934cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode, 1935 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1936 // Create a writeback register dummy placeholder. 1937 Inst.addOperand(MCOperand::CreateImm(0)); 1938 ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1); 1939 ((ARMOperand*)Operands[3])->addMemMode3Operands(Inst, 3); 1940 ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2); 1941 return true; 1942} 1943 1944/// Parse an ARM memory expression, return false if successful else return true 1945/// or an error. The first token must be a '[' when called. 1946/// 1947/// TODO Only preindexing and postindexing addressing are started, unindexed 1948/// with option, etc are still to do. 1949bool ARMAsmParser:: 1950parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands, 1951 ARMII::AddrMode AddrMode = ARMII::AddrModeNone) { 1952 SMLoc S, E; 1953 assert(Parser.getTok().is(AsmToken::LBrac) && 1954 "Token is not a Left Bracket"); 1955 S = Parser.getTok().getLoc(); 1956 Parser.Lex(); // Eat left bracket token. 1957 1958 const AsmToken &BaseRegTok = Parser.getTok(); 1959 if (BaseRegTok.isNot(AsmToken::Identifier)) { 1960 Error(BaseRegTok.getLoc(), "register expected"); 1961 return true; 1962 } 1963 int BaseRegNum = tryParseRegister(); 1964 if (BaseRegNum == -1) { 1965 Error(BaseRegTok.getLoc(), "register expected"); 1966 return true; 1967 } 1968 1969 // The next token must either be a comma or a closing bracket. 1970 const AsmToken &Tok = Parser.getTok(); 1971 if (!Tok.is(AsmToken::Comma) && !Tok.is(AsmToken::RBrac)) 1972 return true; 1973 1974 bool Preindexed = false; 1975 bool Postindexed = false; 1976 bool OffsetIsReg = false; 1977 bool Negative = false; 1978 bool Writeback = false; 1979 ARMOperand *WBOp = 0; 1980 int OffsetRegNum = -1; 1981 bool OffsetRegShifted = false; 1982 enum ARM_AM::ShiftOpc ShiftType = ARM_AM::lsl; 1983 const MCExpr *ShiftAmount = 0; 1984 const MCExpr *Offset = 0; 1985 1986 // First look for preindexed address forms, that is after the "[Rn" we now 1987 // have to see if the next token is a comma. 1988 if (Tok.is(AsmToken::Comma)) { 1989 Preindexed = true; 1990 Parser.Lex(); // Eat comma token. 1991 1992 if (parseMemoryOffsetReg(Negative, OffsetRegShifted, ShiftType, ShiftAmount, 1993 Offset, OffsetIsReg, OffsetRegNum, E)) 1994 return true; 1995 const AsmToken &RBracTok = Parser.getTok(); 1996 if (RBracTok.isNot(AsmToken::RBrac)) { 1997 Error(RBracTok.getLoc(), "']' expected"); 1998 return true; 1999 } 2000 E = RBracTok.getLoc(); 2001 Parser.Lex(); // Eat right bracket token. 2002 2003 const AsmToken &ExclaimTok = Parser.getTok(); 2004 if (ExclaimTok.is(AsmToken::Exclaim)) { 2005 // None of addrmode3 instruction uses "!" 2006 if (AddrMode == ARMII::AddrMode3) 2007 return true; 2008 2009 WBOp = ARMOperand::CreateToken(ExclaimTok.getString(), 2010 ExclaimTok.getLoc()); 2011 Writeback = true; 2012 Parser.Lex(); // Eat exclaim token 2013 } else { // In addressing mode 2, pre-indexed mode always end with "!" 2014 if (AddrMode == ARMII::AddrMode2) 2015 Preindexed = false; 2016 } 2017 } else { 2018 // The "[Rn" we have so far was not followed by a comma. 2019 2020 // If there's anything other than the right brace, this is a post indexing 2021 // addressing form. 2022 E = Tok.getLoc(); 2023 Parser.Lex(); // Eat right bracket token. 2024 2025 const AsmToken &NextTok = Parser.getTok(); 2026 2027 if (NextTok.isNot(AsmToken::EndOfStatement)) { 2028 Postindexed = true; 2029 Writeback = true; 2030 2031 if (NextTok.isNot(AsmToken::Comma)) { 2032 Error(NextTok.getLoc(), "',' expected"); 2033 return true; 2034 } 2035 2036 Parser.Lex(); // Eat comma token. 2037 2038 if (parseMemoryOffsetReg(Negative, OffsetRegShifted, ShiftType, 2039 ShiftAmount, Offset, OffsetIsReg, OffsetRegNum, 2040 E)) 2041 return true; 2042 } 2043 } 2044 2045 // Force Offset to exist if used. 2046 if (!OffsetIsReg) { 2047 if (!Offset) 2048 Offset = MCConstantExpr::Create(0, getContext()); 2049 } else { 2050 if (AddrMode == ARMII::AddrMode3 && OffsetRegShifted) { 2051 Error(E, "shift amount not supported"); 2052 return true; 2053 } 2054 } 2055 2056 Operands.push_back(ARMOperand::CreateMem(AddrMode, BaseRegNum, OffsetIsReg, 2057 Offset, OffsetRegNum, OffsetRegShifted, 2058 ShiftType, ShiftAmount, Preindexed, 2059 Postindexed, Negative, Writeback, S, E)); 2060 if (WBOp) 2061 Operands.push_back(WBOp); 2062 2063 return false; 2064} 2065 2066/// Parse the offset of a memory operand after we have seen "[Rn," or "[Rn]," 2067/// we will parse the following (were +/- means that a plus or minus is 2068/// optional): 2069/// +/-Rm 2070/// +/-Rm, shift 2071/// #offset 2072/// we return false on success or an error otherwise. 2073bool ARMAsmParser::parseMemoryOffsetReg(bool &Negative, 2074 bool &OffsetRegShifted, 2075 enum ARM_AM::ShiftOpc &ShiftType, 2076 const MCExpr *&ShiftAmount, 2077 const MCExpr *&Offset, 2078 bool &OffsetIsReg, 2079 int &OffsetRegNum, 2080 SMLoc &E) { 2081 Negative = false; 2082 OffsetRegShifted = false; 2083 OffsetIsReg = false; 2084 OffsetRegNum = -1; 2085 const AsmToken &NextTok = Parser.getTok(); 2086 E = NextTok.getLoc(); 2087 if (NextTok.is(AsmToken::Plus)) 2088 Parser.Lex(); // Eat plus token. 2089 else if (NextTok.is(AsmToken::Minus)) { 2090 Negative = true; 2091 Parser.Lex(); // Eat minus token 2092 } 2093 // See if there is a register following the "[Rn," or "[Rn]," we have so far. 2094 const AsmToken &OffsetRegTok = Parser.getTok(); 2095 if (OffsetRegTok.is(AsmToken::Identifier)) { 2096 SMLoc CurLoc = OffsetRegTok.getLoc(); 2097 OffsetRegNum = tryParseRegister(); 2098 if (OffsetRegNum != -1) { 2099 OffsetIsReg = true; 2100 E = CurLoc; 2101 } 2102 } 2103 2104 // If we parsed a register as the offset then there can be a shift after that. 2105 if (OffsetRegNum != -1) { 2106 // Look for a comma then a shift 2107 const AsmToken &Tok = Parser.getTok(); 2108 if (Tok.is(AsmToken::Comma)) { 2109 Parser.Lex(); // Eat comma token. 2110 2111 const AsmToken &Tok = Parser.getTok(); 2112 if (parseShift(ShiftType, ShiftAmount, E)) 2113 return Error(Tok.getLoc(), "shift expected"); 2114 OffsetRegShifted = true; 2115 } 2116 } 2117 else { // the "[Rn," or "[Rn,]" we have so far was not followed by "Rm" 2118 // Look for #offset following the "[Rn," or "[Rn]," 2119 const AsmToken &HashTok = Parser.getTok(); 2120 if (HashTok.isNot(AsmToken::Hash)) 2121 return Error(HashTok.getLoc(), "'#' expected"); 2122 2123 Parser.Lex(); // Eat hash token. 2124 2125 if (getParser().ParseExpression(Offset)) 2126 return true; 2127 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2128 } 2129 return false; 2130} 2131 2132/// parseShift as one of these two: 2133/// ( lsl | lsr | asr | ror ) , # shift_amount 2134/// rrx 2135/// and returns true if it parses a shift otherwise it returns false. 2136bool ARMAsmParser::parseShift(ARM_AM::ShiftOpc &St, 2137 const MCExpr *&ShiftAmount, SMLoc &E) { 2138 const AsmToken &Tok = Parser.getTok(); 2139 if (Tok.isNot(AsmToken::Identifier)) 2140 return true; 2141 StringRef ShiftName = Tok.getString(); 2142 if (ShiftName == "lsl" || ShiftName == "LSL") 2143 St = ARM_AM::lsl; 2144 else if (ShiftName == "lsr" || ShiftName == "LSR") 2145 St = ARM_AM::lsr; 2146 else if (ShiftName == "asr" || ShiftName == "ASR") 2147 St = ARM_AM::asr; 2148 else if (ShiftName == "ror" || ShiftName == "ROR") 2149 St = ARM_AM::ror; 2150 else if (ShiftName == "rrx" || ShiftName == "RRX") 2151 St = ARM_AM::rrx; 2152 else 2153 return true; 2154 Parser.Lex(); // Eat shift type token. 2155 2156 // Rrx stands alone. 2157 if (St == ARM_AM::rrx) 2158 return false; 2159 2160 // Otherwise, there must be a '#' and a shift amount. 2161 const AsmToken &HashTok = Parser.getTok(); 2162 if (HashTok.isNot(AsmToken::Hash)) 2163 return Error(HashTok.getLoc(), "'#' expected"); 2164 Parser.Lex(); // Eat hash token. 2165 2166 if (getParser().ParseExpression(ShiftAmount)) 2167 return true; 2168 2169 return false; 2170} 2171 2172/// Parse a arm instruction operand. For now this parses the operand regardless 2173/// of the mnemonic. 2174bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands, 2175 StringRef Mnemonic) { 2176 SMLoc S, E; 2177 2178 // Check if the current operand has a custom associated parser, if so, try to 2179 // custom parse the operand, or fallback to the general approach. 2180 OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic); 2181 if (ResTy == MatchOperand_Success) 2182 return false; 2183 // If there wasn't a custom match, try the generic matcher below. Otherwise, 2184 // there was a match, but an error occurred, in which case, just return that 2185 // the operand parsing failed. 2186 if (ResTy == MatchOperand_ParseFail) 2187 return true; 2188 2189 switch (getLexer().getKind()) { 2190 default: 2191 Error(Parser.getTok().getLoc(), "unexpected token in operand"); 2192 return true; 2193 case AsmToken::Identifier: { 2194 if (!tryParseRegisterWithWriteBack(Operands)) 2195 return false; 2196 int Res = tryParseShiftRegister(Operands); 2197 if (Res == 0) // success 2198 return false; 2199 else if (Res == -1) // irrecoverable error 2200 return true; 2201 2202 // Fall though for the Identifier case that is not a register or a 2203 // special name. 2204 } 2205 case AsmToken::Integer: // things like 1f and 2b as a branch targets 2206 case AsmToken::Dot: { // . as a branch target 2207 // This was not a register so parse other operands that start with an 2208 // identifier (like labels) as expressions and create them as immediates. 2209 const MCExpr *IdVal; 2210 S = Parser.getTok().getLoc(); 2211 if (getParser().ParseExpression(IdVal)) 2212 return true; 2213 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2214 Operands.push_back(ARMOperand::CreateImm(IdVal, S, E)); 2215 return false; 2216 } 2217 case AsmToken::LBrac: 2218 return parseMemory(Operands); 2219 case AsmToken::LCurly: 2220 return parseRegisterList(Operands); 2221 case AsmToken::Hash: 2222 // #42 -> immediate. 2223 // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate 2224 S = Parser.getTok().getLoc(); 2225 Parser.Lex(); 2226 const MCExpr *ImmVal; 2227 if (getParser().ParseExpression(ImmVal)) 2228 return true; 2229 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2230 Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E)); 2231 return false; 2232 case AsmToken::Colon: { 2233 // ":lower16:" and ":upper16:" expression prefixes 2234 // FIXME: Check it's an expression prefix, 2235 // e.g. (FOO - :lower16:BAR) isn't legal. 2236 ARMMCExpr::VariantKind RefKind; 2237 if (parsePrefix(RefKind)) 2238 return true; 2239 2240 const MCExpr *SubExprVal; 2241 if (getParser().ParseExpression(SubExprVal)) 2242 return true; 2243 2244 const MCExpr *ExprVal = ARMMCExpr::Create(RefKind, SubExprVal, 2245 getContext()); 2246 E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 2247 Operands.push_back(ARMOperand::CreateImm(ExprVal, S, E)); 2248 return false; 2249 } 2250 } 2251} 2252 2253// parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e. 2254// :lower16: and :upper16:. 2255bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) { 2256 RefKind = ARMMCExpr::VK_ARM_None; 2257 2258 // :lower16: and :upper16: modifiers 2259 assert(getLexer().is(AsmToken::Colon) && "expected a :"); 2260 Parser.Lex(); // Eat ':' 2261 2262 if (getLexer().isNot(AsmToken::Identifier)) { 2263 Error(Parser.getTok().getLoc(), "expected prefix identifier in operand"); 2264 return true; 2265 } 2266 2267 StringRef IDVal = Parser.getTok().getIdentifier(); 2268 if (IDVal == "lower16") { 2269 RefKind = ARMMCExpr::VK_ARM_LO16; 2270 } else if (IDVal == "upper16") { 2271 RefKind = ARMMCExpr::VK_ARM_HI16; 2272 } else { 2273 Error(Parser.getTok().getLoc(), "unexpected prefix in operand"); 2274 return true; 2275 } 2276 Parser.Lex(); 2277 2278 if (getLexer().isNot(AsmToken::Colon)) { 2279 Error(Parser.getTok().getLoc(), "unexpected token after prefix"); 2280 return true; 2281 } 2282 Parser.Lex(); // Eat the last ':' 2283 return false; 2284} 2285 2286const MCExpr * 2287ARMAsmParser::applyPrefixToExpr(const MCExpr *E, 2288 MCSymbolRefExpr::VariantKind Variant) { 2289 // Recurse over the given expression, rebuilding it to apply the given variant 2290 // to the leftmost symbol. 2291 if (Variant == MCSymbolRefExpr::VK_None) 2292 return E; 2293 2294 switch (E->getKind()) { 2295 case MCExpr::Target: 2296 llvm_unreachable("Can't handle target expr yet"); 2297 case MCExpr::Constant: 2298 llvm_unreachable("Can't handle lower16/upper16 of constant yet"); 2299 2300 case MCExpr::SymbolRef: { 2301 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 2302 2303 if (SRE->getKind() != MCSymbolRefExpr::VK_None) 2304 return 0; 2305 2306 return MCSymbolRefExpr::Create(&SRE->getSymbol(), Variant, getContext()); 2307 } 2308 2309 case MCExpr::Unary: 2310 llvm_unreachable("Can't handle unary expressions yet"); 2311 2312 case MCExpr::Binary: { 2313 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 2314 const MCExpr *LHS = applyPrefixToExpr(BE->getLHS(), Variant); 2315 const MCExpr *RHS = BE->getRHS(); 2316 if (!LHS) 2317 return 0; 2318 2319 return MCBinaryExpr::Create(BE->getOpcode(), LHS, RHS, getContext()); 2320 } 2321 } 2322 2323 assert(0 && "Invalid expression kind!"); 2324 return 0; 2325} 2326 2327/// \brief Given a mnemonic, split out possible predication code and carry 2328/// setting letters to form a canonical mnemonic and flags. 2329// 2330// FIXME: Would be nice to autogen this. 2331StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic, 2332 unsigned &PredicationCode, 2333 bool &CarrySetting, 2334 unsigned &ProcessorIMod) { 2335 PredicationCode = ARMCC::AL; 2336 CarrySetting = false; 2337 ProcessorIMod = 0; 2338 2339 // Ignore some mnemonics we know aren't predicated forms. 2340 // 2341 // FIXME: Would be nice to autogen this. 2342 if ((Mnemonic == "movs" && isThumb()) || 2343 Mnemonic == "teq" || Mnemonic == "vceq" || Mnemonic == "svc" || 2344 Mnemonic == "mls" || Mnemonic == "smmls" || Mnemonic == "vcls" || 2345 Mnemonic == "vmls" || Mnemonic == "vnmls" || Mnemonic == "vacge" || 2346 Mnemonic == "vcge" || Mnemonic == "vclt" || Mnemonic == "vacgt" || 2347 Mnemonic == "vcgt" || Mnemonic == "vcle" || Mnemonic == "smlal" || 2348 Mnemonic == "umaal" || Mnemonic == "umlal" || Mnemonic == "vabal" || 2349 Mnemonic == "vmlal" || Mnemonic == "vpadal" || Mnemonic == "vqdmlal") 2350 return Mnemonic; 2351 2352 // First, split out any predication code. Ignore mnemonics we know aren't 2353 // predicated but do have a carry-set and so weren't caught above. 2354 if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" && 2355 Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" && 2356 Mnemonic != "umlals" && Mnemonic != "umulls") { 2357 unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2)) 2358 .Case("eq", ARMCC::EQ) 2359 .Case("ne", ARMCC::NE) 2360 .Case("hs", ARMCC::HS) 2361 .Case("cs", ARMCC::HS) 2362 .Case("lo", ARMCC::LO) 2363 .Case("cc", ARMCC::LO) 2364 .Case("mi", ARMCC::MI) 2365 .Case("pl", ARMCC::PL) 2366 .Case("vs", ARMCC::VS) 2367 .Case("vc", ARMCC::VC) 2368 .Case("hi", ARMCC::HI) 2369 .Case("ls", ARMCC::LS) 2370 .Case("ge", ARMCC::GE) 2371 .Case("lt", ARMCC::LT) 2372 .Case("gt", ARMCC::GT) 2373 .Case("le", ARMCC::LE) 2374 .Case("al", ARMCC::AL) 2375 .Default(~0U); 2376 if (CC != ~0U) { 2377 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2); 2378 PredicationCode = CC; 2379 } 2380 } 2381 2382 // Next, determine if we have a carry setting bit. We explicitly ignore all 2383 // the instructions we know end in 's'. 2384 if (Mnemonic.endswith("s") && 2385 !(Mnemonic == "asrs" || Mnemonic == "cps" || Mnemonic == "mls" || 2386 Mnemonic == "mrs" || Mnemonic == "smmls" || Mnemonic == "vabs" || 2387 Mnemonic == "vcls" || Mnemonic == "vmls" || Mnemonic == "vmrs" || 2388 Mnemonic == "vnmls" || Mnemonic == "vqabs" || Mnemonic == "vrecps" || 2389 Mnemonic == "vrsqrts" || (Mnemonic == "movs" && isThumb()))) { 2390 Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1); 2391 CarrySetting = true; 2392 } 2393 2394 // The "cps" instruction can have a interrupt mode operand which is glued into 2395 // the mnemonic. Check if this is the case, split it and parse the imod op 2396 if (Mnemonic.startswith("cps")) { 2397 // Split out any imod code. 2398 unsigned IMod = 2399 StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2)) 2400 .Case("ie", ARM_PROC::IE) 2401 .Case("id", ARM_PROC::ID) 2402 .Default(~0U); 2403 if (IMod != ~0U) { 2404 Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2); 2405 ProcessorIMod = IMod; 2406 } 2407 } 2408 2409 return Mnemonic; 2410} 2411 2412/// \brief Given a canonical mnemonic, determine if the instruction ever allows 2413/// inclusion of carry set or predication code operands. 2414// 2415// FIXME: It would be nice to autogen this. 2416void ARMAsmParser:: 2417getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet, 2418 bool &CanAcceptPredicationCode) { 2419 if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" || 2420 Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" || 2421 Mnemonic == "smull" || Mnemonic == "add" || Mnemonic == "adc" || 2422 Mnemonic == "mul" || Mnemonic == "bic" || Mnemonic == "asr" || 2423 Mnemonic == "umlal" || Mnemonic == "orr" || Mnemonic == "mvn" || 2424 Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" || 2425 Mnemonic == "sbc" || Mnemonic == "mla" || Mnemonic == "umull" || 2426 Mnemonic == "eor" || Mnemonic == "smlal" || 2427 (Mnemonic == "mov" && !isThumbOne())) { 2428 CanAcceptCarrySet = true; 2429 } else { 2430 CanAcceptCarrySet = false; 2431 } 2432 2433 if (Mnemonic == "cbnz" || Mnemonic == "setend" || Mnemonic == "dmb" || 2434 Mnemonic == "cps" || Mnemonic == "mcr2" || Mnemonic == "it" || 2435 Mnemonic == "mcrr2" || Mnemonic == "cbz" || Mnemonic == "cdp2" || 2436 Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" || 2437 Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "clrex" || 2438 Mnemonic == "setend" || 2439 Mnemonic.startswith("cps") || (Mnemonic == "movs" && isThumb())) { 2440 CanAcceptPredicationCode = false; 2441 } else { 2442 CanAcceptPredicationCode = true; 2443 } 2444 2445 if (isThumb()) 2446 if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" || 2447 Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp") 2448 CanAcceptPredicationCode = false; 2449} 2450 2451/// Parse an arm instruction mnemonic followed by its operands. 2452bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc, 2453 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2454 // Create the leading tokens for the mnemonic, split by '.' characters. 2455 size_t Start = 0, Next = Name.find('.'); 2456 StringRef Mnemonic = Name.slice(Start, Next); 2457 2458 // Split out the predication code and carry setting flag from the mnemonic. 2459 unsigned PredicationCode; 2460 unsigned ProcessorIMod; 2461 bool CarrySetting; 2462 Mnemonic = splitMnemonic(Mnemonic, PredicationCode, CarrySetting, 2463 ProcessorIMod); 2464 2465 Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc)); 2466 2467 // FIXME: This is all a pretty gross hack. We should automatically handle 2468 // optional operands like this via tblgen. 2469 2470 // Next, add the CCOut and ConditionCode operands, if needed. 2471 // 2472 // For mnemonics which can ever incorporate a carry setting bit or predication 2473 // code, our matching model involves us always generating CCOut and 2474 // ConditionCode operands to match the mnemonic "as written" and then we let 2475 // the matcher deal with finding the right instruction or generating an 2476 // appropriate error. 2477 bool CanAcceptCarrySet, CanAcceptPredicationCode; 2478 getMnemonicAcceptInfo(Mnemonic, CanAcceptCarrySet, CanAcceptPredicationCode); 2479 2480 // If we had a carry-set on an instruction that can't do that, issue an 2481 // error. 2482 if (!CanAcceptCarrySet && CarrySetting) { 2483 Parser.EatToEndOfStatement(); 2484 return Error(NameLoc, "instruction '" + Mnemonic + 2485 "' can not set flags, but 's' suffix specified"); 2486 } 2487 // If we had a predication code on an instruction that can't do that, issue an 2488 // error. 2489 if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) { 2490 Parser.EatToEndOfStatement(); 2491 return Error(NameLoc, "instruction '" + Mnemonic + 2492 "' is not predicable, but condition code specified"); 2493 } 2494 2495 // Add the carry setting operand, if necessary. 2496 // 2497 // FIXME: It would be awesome if we could somehow invent a location such that 2498 // match errors on this operand would print a nice diagnostic about how the 2499 // 's' character in the mnemonic resulted in a CCOut operand. 2500 if (CanAcceptCarrySet) 2501 Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0, 2502 NameLoc)); 2503 2504 // Add the predication code operand, if necessary. 2505 if (CanAcceptPredicationCode) { 2506 Operands.push_back(ARMOperand::CreateCondCode( 2507 ARMCC::CondCodes(PredicationCode), NameLoc)); 2508 } 2509 2510 // Add the processor imod operand, if necessary. 2511 if (ProcessorIMod) { 2512 Operands.push_back(ARMOperand::CreateImm( 2513 MCConstantExpr::Create(ProcessorIMod, getContext()), 2514 NameLoc, NameLoc)); 2515 } else { 2516 // This mnemonic can't ever accept a imod, but the user wrote 2517 // one (or misspelled another mnemonic). 2518 2519 // FIXME: Issue a nice error. 2520 } 2521 2522 // Add the remaining tokens in the mnemonic. 2523 while (Next != StringRef::npos) { 2524 Start = Next; 2525 Next = Name.find('.', Start + 1); 2526 StringRef ExtraToken = Name.slice(Start, Next); 2527 2528 Operands.push_back(ARMOperand::CreateToken(ExtraToken, NameLoc)); 2529 } 2530 2531 // Read the remaining operands. 2532 if (getLexer().isNot(AsmToken::EndOfStatement)) { 2533 // Read the first operand. 2534 if (parseOperand(Operands, Mnemonic)) { 2535 Parser.EatToEndOfStatement(); 2536 return true; 2537 } 2538 2539 while (getLexer().is(AsmToken::Comma)) { 2540 Parser.Lex(); // Eat the comma. 2541 2542 // Parse and remember the operand. 2543 if (parseOperand(Operands, Mnemonic)) { 2544 Parser.EatToEndOfStatement(); 2545 return true; 2546 } 2547 } 2548 } 2549 2550 if (getLexer().isNot(AsmToken::EndOfStatement)) { 2551 Parser.EatToEndOfStatement(); 2552 return TokError("unexpected token in argument list"); 2553 } 2554 2555 Parser.Lex(); // Consume the EndOfStatement 2556 2557 2558 // The 'mov' mnemonic is special. One variant has a cc_out operand, while 2559 // another does not. Specifically, the MOVW instruction does not. So we 2560 // special case it here and remove the defaulted (non-setting) cc_out 2561 // operand if that's the instruction we're trying to match. 2562 // 2563 // We do this post-processing of the explicit operands rather than just 2564 // conditionally adding the cc_out in the first place because we need 2565 // to check the type of the parsed immediate operand. 2566 if (Mnemonic == "mov" && Operands.size() > 4 && 2567 !static_cast<ARMOperand*>(Operands[4])->isARMSOImm() && 2568 static_cast<ARMOperand*>(Operands[4])->isImm0_65535Expr() && 2569 static_cast<ARMOperand*>(Operands[1])->getReg() == 0) { 2570 ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]); 2571 Operands.erase(Operands.begin() + 1); 2572 delete Op; 2573 } 2574 2575 return false; 2576} 2577 2578// Validate context-sensitive operand constraints. 2579// FIXME: We would really like to be able to tablegen'erate this. 2580bool ARMAsmParser:: 2581validateInstruction(MCInst &Inst, 2582 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 2583 switch (Inst.getOpcode()) { 2584 case ARM::LDREXD: { 2585 // Rt2 must be Rt + 1. 2586 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg()); 2587 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 2588 if (Rt2 != Rt + 1) 2589 return Error(Operands[3]->getStartLoc(), 2590 "destination operands must be sequential"); 2591 return false; 2592 } 2593 case ARM::STREXD: { 2594 // Rt2 must be Rt + 1. 2595 unsigned Rt = getARMRegisterNumbering(Inst.getOperand(1).getReg()); 2596 unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(2).getReg()); 2597 if (Rt2 != Rt + 1) 2598 return Error(Operands[4]->getStartLoc(), 2599 "source operands must be sequential"); 2600 return false; 2601 } 2602 case ARM::SBFX: 2603 case ARM::UBFX: { 2604 // width must be in range [1, 32-lsb] 2605 unsigned lsb = Inst.getOperand(2).getImm(); 2606 unsigned widthm1 = Inst.getOperand(3).getImm(); 2607 if (widthm1 >= 32 - lsb) 2608 return Error(Operands[5]->getStartLoc(), 2609 "bitfield width must be in range [1,32-lsb]"); 2610 } 2611 } 2612 2613 return false; 2614} 2615 2616bool ARMAsmParser:: 2617MatchAndEmitInstruction(SMLoc IDLoc, 2618 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 2619 MCStreamer &Out) { 2620 MCInst Inst; 2621 unsigned ErrorInfo; 2622 MatchResultTy MatchResult; 2623 MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo); 2624 switch (MatchResult) { 2625 case Match_Success: 2626 // Context sensitive operand constraints aren't handled by the matcher, 2627 // so check them here. 2628 if (validateInstruction(Inst, Operands)) 2629 return true; 2630 2631 Out.EmitInstruction(Inst); 2632 return false; 2633 case Match_MissingFeature: 2634 Error(IDLoc, "instruction requires a CPU feature not currently enabled"); 2635 return true; 2636 case Match_InvalidOperand: { 2637 SMLoc ErrorLoc = IDLoc; 2638 if (ErrorInfo != ~0U) { 2639 if (ErrorInfo >= Operands.size()) 2640 return Error(IDLoc, "too few operands for instruction"); 2641 2642 ErrorLoc = ((ARMOperand*)Operands[ErrorInfo])->getStartLoc(); 2643 if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc; 2644 } 2645 2646 return Error(ErrorLoc, "invalid operand for instruction"); 2647 } 2648 case Match_MnemonicFail: 2649 return Error(IDLoc, "unrecognized instruction mnemonic"); 2650 case Match_ConversionFail: 2651 return Error(IDLoc, "unable to convert operands to instruction"); 2652 } 2653 2654 llvm_unreachable("Implement any new match types added!"); 2655 return true; 2656} 2657 2658/// parseDirective parses the arm specific directives 2659bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) { 2660 StringRef IDVal = DirectiveID.getIdentifier(); 2661 if (IDVal == ".word") 2662 return parseDirectiveWord(4, DirectiveID.getLoc()); 2663 else if (IDVal == ".thumb") 2664 return parseDirectiveThumb(DirectiveID.getLoc()); 2665 else if (IDVal == ".thumb_func") 2666 return parseDirectiveThumbFunc(DirectiveID.getLoc()); 2667 else if (IDVal == ".code") 2668 return parseDirectiveCode(DirectiveID.getLoc()); 2669 else if (IDVal == ".syntax") 2670 return parseDirectiveSyntax(DirectiveID.getLoc()); 2671 return true; 2672} 2673 2674/// parseDirectiveWord 2675/// ::= .word [ expression (, expression)* ] 2676bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) { 2677 if (getLexer().isNot(AsmToken::EndOfStatement)) { 2678 for (;;) { 2679 const MCExpr *Value; 2680 if (getParser().ParseExpression(Value)) 2681 return true; 2682 2683 getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/); 2684 2685 if (getLexer().is(AsmToken::EndOfStatement)) 2686 break; 2687 2688 // FIXME: Improve diagnostic. 2689 if (getLexer().isNot(AsmToken::Comma)) 2690 return Error(L, "unexpected token in directive"); 2691 Parser.Lex(); 2692 } 2693 } 2694 2695 Parser.Lex(); 2696 return false; 2697} 2698 2699/// parseDirectiveThumb 2700/// ::= .thumb 2701bool ARMAsmParser::parseDirectiveThumb(SMLoc L) { 2702 if (getLexer().isNot(AsmToken::EndOfStatement)) 2703 return Error(L, "unexpected token in directive"); 2704 Parser.Lex(); 2705 2706 // TODO: set thumb mode 2707 // TODO: tell the MC streamer the mode 2708 // getParser().getStreamer().Emit???(); 2709 return false; 2710} 2711 2712/// parseDirectiveThumbFunc 2713/// ::= .thumbfunc symbol_name 2714bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) { 2715 const MCAsmInfo &MAI = getParser().getStreamer().getContext().getAsmInfo(); 2716 bool isMachO = MAI.hasSubsectionsViaSymbols(); 2717 StringRef Name; 2718 2719 // Darwin asm has function name after .thumb_func direction 2720 // ELF doesn't 2721 if (isMachO) { 2722 const AsmToken &Tok = Parser.getTok(); 2723 if (Tok.isNot(AsmToken::Identifier) && Tok.isNot(AsmToken::String)) 2724 return Error(L, "unexpected token in .thumb_func directive"); 2725 Name = Tok.getString(); 2726 Parser.Lex(); // Consume the identifier token. 2727 } 2728 2729 if (getLexer().isNot(AsmToken::EndOfStatement)) 2730 return Error(L, "unexpected token in directive"); 2731 Parser.Lex(); 2732 2733 // FIXME: assuming function name will be the line following .thumb_func 2734 if (!isMachO) { 2735 Name = Parser.getTok().getString(); 2736 } 2737 2738 // Mark symbol as a thumb symbol. 2739 MCSymbol *Func = getParser().getContext().GetOrCreateSymbol(Name); 2740 getParser().getStreamer().EmitThumbFunc(Func); 2741 return false; 2742} 2743 2744/// parseDirectiveSyntax 2745/// ::= .syntax unified | divided 2746bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) { 2747 const AsmToken &Tok = Parser.getTok(); 2748 if (Tok.isNot(AsmToken::Identifier)) 2749 return Error(L, "unexpected token in .syntax directive"); 2750 StringRef Mode = Tok.getString(); 2751 if (Mode == "unified" || Mode == "UNIFIED") 2752 Parser.Lex(); 2753 else if (Mode == "divided" || Mode == "DIVIDED") 2754 return Error(L, "'.syntax divided' arm asssembly not supported"); 2755 else 2756 return Error(L, "unrecognized syntax mode in .syntax directive"); 2757 2758 if (getLexer().isNot(AsmToken::EndOfStatement)) 2759 return Error(Parser.getTok().getLoc(), "unexpected token in directive"); 2760 Parser.Lex(); 2761 2762 // TODO tell the MC streamer the mode 2763 // getParser().getStreamer().Emit???(); 2764 return false; 2765} 2766 2767/// parseDirectiveCode 2768/// ::= .code 16 | 32 2769bool ARMAsmParser::parseDirectiveCode(SMLoc L) { 2770 const AsmToken &Tok = Parser.getTok(); 2771 if (Tok.isNot(AsmToken::Integer)) 2772 return Error(L, "unexpected token in .code directive"); 2773 int64_t Val = Parser.getTok().getIntVal(); 2774 if (Val == 16) 2775 Parser.Lex(); 2776 else if (Val == 32) 2777 Parser.Lex(); 2778 else 2779 return Error(L, "invalid operand to .code directive"); 2780 2781 if (getLexer().isNot(AsmToken::EndOfStatement)) 2782 return Error(Parser.getTok().getLoc(), "unexpected token in directive"); 2783 Parser.Lex(); 2784 2785 if (Val == 16) { 2786 if (!isThumb()) { 2787 SwitchMode(); 2788 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16); 2789 } 2790 } else { 2791 if (isThumb()) { 2792 SwitchMode(); 2793 getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32); 2794 } 2795 } 2796 2797 return false; 2798} 2799 2800extern "C" void LLVMInitializeARMAsmLexer(); 2801 2802/// Force static initialization. 2803extern "C" void LLVMInitializeARMAsmParser() { 2804 RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget); 2805 RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget); 2806 LLVMInitializeARMAsmLexer(); 2807} 2808 2809#define GET_REGISTER_MATCHER 2810#define GET_MATCHER_IMPLEMENTATION 2811#include "ARMGenAsmMatcher.inc" 2812