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