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