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