137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===-- AMDGPUAsmParser.cpp - Parse SI asm to MCInst instructions ----------===//
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//                     The LLVM Compiler Infrastructure
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source
637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details.
737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
11cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "MCTargetDesc/AMDGPUTargetStreamer.h"
12cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "Utils/AMDGPUBaseInfo.h"
13cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "AMDKernelCodeT.h"
140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "SIDefines.h"
150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "llvm/ADT/APFloat.h"
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/SmallString.h"
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/SmallVector.h"
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/STLExtras.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/StringSwitch.h"
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/Twine.h"
2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCContext.h"
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCExpr.h"
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCInst.h"
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCInstrInfo.h"
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCParser/MCAsmLexer.h"
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCParser/MCAsmParser.h"
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCRegisterInfo.h"
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCStreamer.h"
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCSubtargetInfo.h"
31cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/MC/MCSymbolELF.h"
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCTargetAsmParser.h"
33cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/Support/ELF.h"
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/SourceMgr.h"
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/TargetRegistry.h"
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/raw_ostream.h"
370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "llvm/Support/Debug.h"
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesusing namespace llvm;
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace {
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstruct OptionalOperand;
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass AMDGPUOperand : public MCParsedAsmOperand {
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  enum KindTy {
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Token,
480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Immediate,
490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Register,
500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Expression
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } Kind;
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc StartLoc, EndLoc;
540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  AMDGPUOperand(enum KindTy K) : MCParsedAsmOperand(), Kind(K) {}
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  MCContext *Ctx;
590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  enum ImmTy {
610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyNone,
620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyDSOffset0,
630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyDSOffset1,
640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyGDS,
650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyOffset,
660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyGLC,
670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTySLC,
680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyTFE,
690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyClamp,
700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTyOMod
710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  };
720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct TokOp {
7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    const char *Data;
7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned Length;
7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct ImmOp {
790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    bool IsFPImm;
800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ImmTy Type;
8137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    int64_t Val;
8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  struct RegOp {
850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    unsigned RegNo;
860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    int Modifiers;
870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    const MCRegisterInfo *TRI;
88cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    const MCSubtargetInfo *STI;
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    bool IsForcedVOP3;
900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  };
910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
9237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  union {
9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    TokOp Tok;
9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ImmOp Imm;
950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    RegOp Reg;
960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    const MCExpr *Expr;
9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void addImmOperands(MCInst &Inst, unsigned N) const {
1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(getImm()));
10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
1020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef getToken() const {
10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return StringRef(Tok.Data, Tok.Length);
10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
1060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void addRegOperands(MCInst &Inst, unsigned N) const {
108cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(AMDGPU::getMCReg(getReg(), *Reg.STI)));
1090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void addRegOrImmOperands(MCInst &Inst, unsigned N) const {
1120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (isReg())
1130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      addRegOperands(Inst, N);
1140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    else
1150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      addImmOperands(Inst, N);
1160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void addRegWithInputModsOperands(MCInst &Inst, unsigned N) const {
1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(
1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Reg.Modifiers == -1 ? 0 : Reg.Modifiers));
1210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    addRegOperands(Inst, N);
1220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void addSoppBrTargetOperands(MCInst &Inst, unsigned N) const {
1250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (isImm())
1260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      addImmOperands(Inst, N);
1270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    else {
1280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      assert(isExpr());
1296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createExpr(Expr));
1300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
1310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool defaultTokenHasSuffix() const {
1340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    StringRef Token(Tok.Data, Tok.Length);
1350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Token.endswith("_e32") || Token.endswith("_e64");
1370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isToken() const override {
14037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Kind == Token;
14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
14237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
14337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isImm() const override {
14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Kind == Immediate;
14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isInlineImm() const {
1480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    float F = BitsToFloat(Imm.Val);
1490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // TODO: Add 0.5pi for VI
1500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isImm() && ((Imm.Val <= 64 && Imm.Val >= -16) ||
1510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar           (F == 0.0 || F == 0.5 || F == -0.5 || F == 1.0 || F == -1.0 ||
1520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar           F == 2.0 || F == -2.0 || F == 4.0 || F == -4.0));
1530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isDSOffset0() const {
1560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    assert(isImm());
1570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Imm.Type == ImmTyDSOffset0;
1580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isDSOffset1() const {
1610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    assert(isImm());
1620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Imm.Type == ImmTyDSOffset1;
1630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int64_t getImm() const {
16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Imm.Val;
16737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  enum ImmTy getImmTy() const {
1700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    assert(isImm());
1710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Imm.Type;
1720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool isRegKind() const {
1756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return Kind == Register;
1766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
1776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isReg() const override {
1790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Kind == Register && Reg.Modifiers == -1;
1800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isRegWithInputMods() const {
1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return Kind == Register && (Reg.IsForcedVOP3 || Reg.Modifiers != -1);
1840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
1860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void setModifiers(unsigned Mods) {
1870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    assert(isReg());
1880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Reg.Modifiers = Mods;
18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasModifiers() const {
1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    assert(isRegKind());
1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return Reg.Modifiers != -1;
1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned getReg() const override {
1970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Reg.RegNo;
1980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
1990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isRegOrImm() const {
2010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isReg() || isImm();
2020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isRegClass(unsigned RCID) const {
2050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Reg.TRI->getRegClass(RCID).contains(getReg());
2060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isSCSrc32() const {
2090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isInlineImm() || (isReg() && isRegClass(AMDGPU::SReg_32RegClassID));
2100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isSSrc32() const {
2130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isImm() || (isReg() && isRegClass(AMDGPU::SReg_32RegClassID));
2140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isSSrc64() const {
2170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isImm() || isInlineImm() ||
2180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar           (isReg() && isRegClass(AMDGPU::SReg_64RegClassID));
2190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
221cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isSCSrc64() const {
222cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return (isReg() && isRegClass(AMDGPU::SReg_64RegClassID)) || isInlineImm();
223cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
224cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
2250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isVCSrc32() const {
2260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isInlineImm() || (isReg() && isRegClass(AMDGPU::VS_32RegClassID));
2270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isVCSrc64() const {
2300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isInlineImm() || (isReg() && isRegClass(AMDGPU::VS_64RegClassID));
2310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isVSrc32() const {
2340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isImm() || (isReg() && isRegClass(AMDGPU::VS_32RegClassID));
2350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isVSrc64() const {
2380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isImm() || (isReg() && isRegClass(AMDGPU::VS_64RegClassID));
23937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
24037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
24137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isMem() const override {
24237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
24337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
24437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isExpr() const {
2460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Kind == Expression;
2470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isSoppBrTarget() const {
2500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return isExpr() || isImm();
2510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
2520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  SMLoc getStartLoc() const override {
2540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return StartLoc;
25537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
25637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
25737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  SMLoc getEndLoc() const override {
2580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return EndLoc;
25937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
26037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
261cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void print(raw_ostream &OS) const override {
262cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    switch (Kind) {
263cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case Register:
264cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      OS << "<register " << getReg() << " mods: " << Reg.Modifiers << '>';
265cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      break;
266cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case Immediate:
267cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      OS << getImm();
268cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      break;
269cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case Token:
270cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      OS << '\'' << getToken() << '\'';
271cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      break;
272cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case Expression:
273cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      OS << "<expr " << *Expr << '>';
274cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      break;
275cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    }
276cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
27737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  static std::unique_ptr<AMDGPUOperand> CreateImm(int64_t Val, SMLoc Loc,
2790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                  enum ImmTy Type = ImmTyNone,
2800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                  bool IsFPImm = false) {
28137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    auto Op = llvm::make_unique<AMDGPUOperand>(Immediate);
28237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Op->Imm.Val = Val;
2830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->Imm.IsFPImm = IsFPImm;
2840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->Imm.Type = Type;
2850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->StartLoc = Loc;
2860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->EndLoc = Loc;
28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Op;
28837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  static std::unique_ptr<AMDGPUOperand> CreateToken(StringRef Str, SMLoc Loc,
2910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                           bool HasExplicitEncodingSize = true) {
29237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    auto Res = llvm::make_unique<AMDGPUOperand>(Token);
29337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Res->Tok.Data = Str.data();
29437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Res->Tok.Length = Str.size();
2950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Res->StartLoc = Loc;
2960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Res->EndLoc = Loc;
29737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Res;
29837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
29937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  static std::unique_ptr<AMDGPUOperand> CreateReg(unsigned RegNo, SMLoc S,
3010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                  SMLoc E,
3026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                  const MCRegisterInfo *TRI,
303cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                                  const MCSubtargetInfo *STI,
3046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                  bool ForceVOP3) {
3050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    auto Op = llvm::make_unique<AMDGPUOperand>(Register);
3060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->Reg.RegNo = RegNo;
3070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->Reg.TRI = TRI;
308cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Op->Reg.STI = STI;
3090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->Reg.Modifiers = -1;
3106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Op->Reg.IsForcedVOP3 = ForceVOP3;
3110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->StartLoc = S;
3120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->EndLoc = E;
3130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Op;
3140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
3150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
3160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  static std::unique_ptr<AMDGPUOperand> CreateExpr(const class MCExpr *Expr, SMLoc S) {
3170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    auto Op = llvm::make_unique<AMDGPUOperand>(Expression);
3180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->Expr = Expr;
3190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->StartLoc = S;
3200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Op->EndLoc = S;
3210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Op;
3220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
3230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
3240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isDSOffset() const;
3250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isDSOffset01() const;
32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isSWaitCnt() const;
3270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool isMubufOffset() const;
328cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isSMRDOffset() const;
329cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isSMRDLiteralOffset() const;
33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines};
33137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass AMDGPUAsmParser : public MCTargetAsmParser {
3330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  const MCInstrInfo &MII;
3340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  MCAsmParser &Parser;
3350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
3360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned ForcedEncodingSize;
337cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
338cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isSI() const {
339cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return AMDGPU::isSI(getSTI());
340cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
341cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
342cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isCI() const {
343cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return AMDGPU::isCI(getSTI());
344cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
345cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
346cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isVI() const {
347cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return AMDGPU::isVI(getSTI());
348cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
349cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
350cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool hasSGPR102_SGPR103() const {
351cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return !isVI();
352cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
353cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
3540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  /// @name Auto-generated Match Functions
3550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  /// {
3560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
3570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#define GET_ASSEMBLER_HEADER
3580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "AMDGPUGenAsmMatcher.inc"
3590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
3600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  /// }
3610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
362cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarprivate:
363cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveMajorMinor(uint32_t &Major, uint32_t &Minor);
364cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveHSACodeObjectVersion();
365cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveHSACodeObjectISA();
366cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseAMDKernelCodeTValue(StringRef ID, amd_kernel_code_t &Header);
367cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveAMDKernelCodeT();
368cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseSectionDirectiveHSAText();
369cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool subtargetHasRegister(const MCRegisterInfo &MRI, unsigned RegNo) const;
370cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveAMDGPUHsaKernel();
371cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveAMDGPUHsaModuleGlobal();
372cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseDirectiveAMDGPUHsaProgramGlobal();
373cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseSectionDirectiveHSADataGlobalAgent();
374cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseSectionDirectiveHSADataGlobalProgram();
375cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool ParseSectionDirectiveHSARodataReadonlyAgent();
376cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
3770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarpublic:
378cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarpublic:
379cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  enum AMDGPUMatchResultTy {
380cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Match_PreferE32 = FIRST_TARGET_MATCH_RESULT_TY
381cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  };
382cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
383cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  AMDGPUAsmParser(const MCSubtargetInfo &STI, MCAsmParser &_Parser,
3840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar               const MCInstrInfo &MII,
3850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar               const MCTargetOptions &Options)
386cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      : MCTargetAsmParser(Options, STI), MII(MII), Parser(_Parser),
387cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        ForcedEncodingSize(0) {
388cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    MCAsmParserExtension::Initialize(Parser);
3890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
390cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    if (getSTI().getFeatureBits().none()) {
3910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // Set default features.
392cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      copySTI().ToggleFeature("SOUTHERN_ISLANDS");
3930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
3940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
395cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits()));
396cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
397cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
398cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  AMDGPUTargetStreamer &getTargetStreamer() {
399cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
400cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return static_cast<AMDGPUTargetStreamer &>(TS);
4010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
4020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned getForcedEncodingSize() const {
4040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ForcedEncodingSize;
4050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
4060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void setForcedEncodingSize(unsigned Size) {
4080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ForcedEncodingSize = Size;
4090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
4100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool isForcedVOP3() const {
4126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return ForcedEncodingSize == 64;
4136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
4146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
4160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned checkTargetMatchPredicate(MCInst &Inst) override;
4170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
4180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               OperandVector &Operands, MCStreamer &Out,
4190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               uint64_t &ErrorInfo,
4200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               bool MatchingInlineAsm) override;
4210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool ParseDirective(AsmToken DirectiveID) override;
4220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseOperand(OperandVector &Operands, StringRef Mnemonic);
4230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
4240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                        SMLoc NameLoc, OperandVector &Operands) override;
4250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseIntWithPrefix(const char *Prefix, int64_t &Int,
4270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                          int64_t Default = 0);
4280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseIntWithPrefix(const char *Prefix,
4290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                          OperandVector &Operands,
4300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                          enum AMDGPUOperand::ImmTy ImmTy =
4310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                      AMDGPUOperand::ImmTyNone);
4320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseNamedBit(const char *Name, OperandVector &Operands,
4330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                     enum AMDGPUOperand::ImmTy ImmTy =
4340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                      AMDGPUOperand::ImmTyNone);
4350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseOptionalOps(
4360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                   const ArrayRef<OptionalOperand> &OptionalOps,
4370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                   OperandVector &Operands);
4380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void cvtDSOffset01(MCInst &Inst, const OperandVector &Operands);
4410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void cvtDS(MCInst &Inst, const OperandVector &Operands);
4420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseDSOptionalOps(OperandVector &Operands);
4430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseDSOff01OptionalOps(OperandVector &Operands);
4440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseDSOffsetOptional(OperandVector &Operands);
4450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool parseCnt(int64_t &IntVal);
4470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseSWaitCntOps(OperandVector &Operands);
4480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseSOppBrTarget(OperandVector &Operands);
4490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OperandMatchResultTy parseFlatOptionalOps(OperandVector &Operands);
4516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OperandMatchResultTy parseFlatAtomicOptionalOps(OperandVector &Operands);
4526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void cvtFlat(MCInst &Inst, const OperandVector &Operands);
4536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void cvtMubuf(MCInst &Inst, const OperandVector &Operands);
4550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseOffset(OperandVector &Operands);
4560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseMubufOptionalOps(OperandVector &Operands);
4570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseGLC(OperandVector &Operands);
4580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseSLC(OperandVector &Operands);
4590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseTFE(OperandVector &Operands);
4600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseDMask(OperandVector &Operands);
4620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseUNorm(OperandVector &Operands);
4630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseR128(OperandVector &Operands);
4640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void cvtVOP3(MCInst &Inst, const OperandVector &Operands);
4660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  OperandMatchResultTy parseVOP3OptionalOps(OperandVector &Operands);
4670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar};
4680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstruct OptionalOperand {
4700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  const char *Name;
4710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  AMDGPUOperand::ImmTy Type;
4720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool IsBit;
4730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  int64_t Default;
4740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool (*ConvertResult)(int64_t&);
4750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar};
4760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
4780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
479cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic int getRegClass(bool IsVgpr, unsigned RegWidth) {
4800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (IsVgpr) {
4810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    switch (RegWidth) {
482cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      default: return -1;
4830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case 1: return AMDGPU::VGPR_32RegClassID;
4840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case 2: return AMDGPU::VReg_64RegClassID;
4850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case 3: return AMDGPU::VReg_96RegClassID;
4860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case 4: return AMDGPU::VReg_128RegClassID;
4870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case 8: return AMDGPU::VReg_256RegClassID;
4880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case 16: return AMDGPU::VReg_512RegClassID;
4890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
4900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
4910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
4920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  switch (RegWidth) {
493cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    default: return -1;
4940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case 1: return AMDGPU::SGPR_32RegClassID;
4950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case 2: return AMDGPU::SGPR_64RegClassID;
4960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case 4: return AMDGPU::SReg_128RegClassID;
4970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case 8: return AMDGPU::SReg_256RegClassID;
4980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case 16: return AMDGPU::SReg_512RegClassID;
4990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
5000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
5010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
502cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic unsigned getRegForName(StringRef RegName) {
5030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return StringSwitch<unsigned>(RegName)
5050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("exec", AMDGPU::EXEC)
5060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("vcc", AMDGPU::VCC)
507cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    .Case("flat_scratch", AMDGPU::FLAT_SCR)
5080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("m0", AMDGPU::M0)
5090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("scc", AMDGPU::SCC)
510cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    .Case("flat_scratch_lo", AMDGPU::FLAT_SCR_LO)
511cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    .Case("flat_scratch_hi", AMDGPU::FLAT_SCR_HI)
5120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("vcc_lo", AMDGPU::VCC_LO)
5130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("vcc_hi", AMDGPU::VCC_HI)
5140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("exec_lo", AMDGPU::EXEC_LO)
5150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Case("exec_hi", AMDGPU::EXEC_HI)
5160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    .Default(0);
51737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
51837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
51937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool AMDGPUAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) {
5200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  const AsmToken Tok = Parser.getTok();
5210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  StartLoc = Tok.getLoc();
5220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  EndLoc = Tok.getEndLoc();
523cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  const MCRegisterInfo *TRI = getContext().getRegisterInfo();
524cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
525cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef RegName = Tok.getString();
5260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  RegNo = getRegForName(RegName);
5270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (RegNo) {
5290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
530cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return !subtargetHasRegister(*TRI, RegNo);
5310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
5320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // Match vgprs and sgprs
5340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (RegName[0] != 's' && RegName[0] != 'v')
5350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
5360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool IsVgpr = RegName[0] == 'v';
5380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned RegWidth;
5390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned RegIndexInClass;
5400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (RegName.size() > 1) {
5410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // We have a 32-bit register
5420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    RegWidth = 1;
5430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (RegName.substr(1).getAsInteger(10, RegIndexInClass))
5440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
5450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
5460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  } else {
5470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // We have a register greater than 32-bits.
5480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    int64_t RegLo, RegHi;
5500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
5510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (getLexer().isNot(AsmToken::LBrac))
5520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
5530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
5550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (getParser().parseAbsoluteExpression(RegLo))
5560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
5570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (getLexer().isNot(AsmToken::Colon))
5590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
5600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
5620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (getParser().parseAbsoluteExpression(RegHi))
5630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
5640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (getLexer().isNot(AsmToken::RBrac))
5660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
5670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
5690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    RegWidth = (RegHi - RegLo) + 1;
5700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (IsVgpr) {
5710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // VGPR registers aren't aligned.
5720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      RegIndexInClass = RegLo;
5730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    } else {
5740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // SGPR registers are aligned.  Max alignment is 4 dwords.
575cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      unsigned Size = std::min(RegWidth, 4u);
576cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      if (RegLo % Size != 0)
577cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        return true;
578cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
579cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      RegIndexInClass = RegLo / Size;
5800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
5810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
5820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
583cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  int RCID = getRegClass(IsVgpr, RegWidth);
584cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (RCID == -1)
5850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
586cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
587cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  const MCRegisterClass RC = TRI->getRegClass(RCID);
588cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (RegIndexInClass >= RC.getNumRegs())
589cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return true;
590cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
591cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  RegNo = RC.getRegister(RegIndexInClass);
592cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return !subtargetHasRegister(*TRI, RegNo);
5930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
5940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarunsigned AMDGPUAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
5960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  uint64_t TSFlags = MII.get(Inst.getOpcode()).TSFlags;
5980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if ((getForcedEncodingSize() == 32 && (TSFlags & SIInstrFlags::VOP3)) ||
6000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      (getForcedEncodingSize() == 64 && !(TSFlags & SIInstrFlags::VOP3)))
6010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Match_InvalidOperand;
6020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
603cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if ((TSFlags & SIInstrFlags::VOP3) &&
604cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      (TSFlags & SIInstrFlags::VOPAsmPrefer32Bit) &&
605cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      getForcedEncodingSize() != 64)
606cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return Match_PreferE32;
607cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
6080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return Match_Success;
60937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
61037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
61137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
61237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool AMDGPUAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
61337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                              OperandVector &Operands,
61437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                              MCStreamer &Out,
61537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                              uint64_t &ErrorInfo,
61637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                              bool MatchingInlineAsm) {
61737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCInst Inst;
61837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
61937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  switch (MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm)) {
6200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    default: break;
6210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case Match_Success:
6220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Inst.setLoc(IDLoc);
623cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      Out.EmitInstruction(Inst, getSTI());
6240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return false;
6250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case Match_MissingFeature:
6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return Error(IDLoc, "instruction not supported on this GPU");
6270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
6280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case Match_MnemonicFail:
6290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return Error(IDLoc, "unrecognized instruction mnemonic");
6300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
6310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case Match_InvalidOperand: {
6320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      SMLoc ErrorLoc = IDLoc;
6330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (ErrorInfo != ~0ULL) {
6340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (ErrorInfo >= Operands.size()) {
6356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          if (isForcedVOP3()) {
6366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            // If 64-bit encoding has been forced we can end up with no
6376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            // clamp or omod operands if none of the registers have modifiers,
6386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            // so we need to add these to the operand list.
6396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            AMDGPUOperand &LastOp =
6406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                ((AMDGPUOperand &)*Operands[Operands.size() - 1]);
6416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            if (LastOp.isRegKind() ||
6426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar               (LastOp.isImm() &&
6436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                LastOp.getImmTy() != AMDGPUOperand::ImmTyNone)) {
6446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              SMLoc S = Parser.getTok().getLoc();
6456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              Operands.push_back(AMDGPUOperand::CreateImm(0, S,
6466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                 AMDGPUOperand::ImmTyClamp));
6476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              Operands.push_back(AMDGPUOperand::CreateImm(0, S,
6486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                 AMDGPUOperand::ImmTyOMod));
6496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              bool Res = MatchAndEmitInstruction(IDLoc, Opcode, Operands,
6506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                 Out, ErrorInfo,
6516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                 MatchingInlineAsm);
6526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar              if (!Res)
6536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                return Res;
6546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            }
6556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          }
6570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          return Error(IDLoc, "too few operands for instruction");
6580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        }
659ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
6600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        ErrorLoc = ((AMDGPUOperand &)*Operands[ErrorInfo]).getStartLoc();
6610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (ErrorLoc == SMLoc())
6620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          ErrorLoc = IDLoc;
6630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      }
6640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return Error(ErrorLoc, "invalid operand for instruction");
66537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
666cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case Match_PreferE32:
667cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return Error(IDLoc, "internal error: instruction without _e64 suffix "
668cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                          "should be encoded as e32");
66937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
67037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  llvm_unreachable("Implement any new match types added!");
67137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
67237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
673cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveMajorMinor(uint32_t &Major,
674cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                               uint32_t &Minor) {
675cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Integer))
676cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("invalid major version");
677cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
678cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Major = getLexer().getTok().getIntVal();
679cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
680cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
681cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Comma))
682cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("minor version number required, comma expected");
683cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
684cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
685cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Integer))
686cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("invalid minor version");
687cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
688cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Minor = getLexer().getTok().getIntVal();
689cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
690cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
691cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
692cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
693cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
694cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveHSACodeObjectVersion() {
695cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
696cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t Major;
697cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t Minor;
698cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
699cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (ParseDirectiveMajorMinor(Major, Minor))
700cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return true;
701cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
702cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getTargetStreamer().EmitDirectiveHSACodeObjectVersion(Major, Minor);
703cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
704cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
705cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
706cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveHSACodeObjectISA() {
707cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
708cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t Major;
709cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t Minor;
710cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t Stepping;
711cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef VendorName;
712cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef ArchName;
713cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
714cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // If this directive has no arguments, then use the ISA version for the
715cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // targeted GPU.
716cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().is(AsmToken::EndOfStatement)) {
717cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    AMDGPU::IsaVersion Isa = AMDGPU::getIsaVersion(getSTI().getFeatureBits());
718cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    getTargetStreamer().EmitDirectiveHSACodeObjectISA(Isa.Major, Isa.Minor,
719cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                                      Isa.Stepping,
720cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                                      "AMD", "AMDGPU");
721cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return false;
722cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
723cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
724cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
725cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (ParseDirectiveMajorMinor(Major, Minor))
726cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return true;
727cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
728cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Comma))
729cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("stepping version number required, comma expected");
730cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
731cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
732cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Integer))
733cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("invalid stepping version");
734cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
735cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Stepping = getLexer().getTok().getIntVal();
736cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
737cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
738cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Comma))
739cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("vendor name required, comma expected");
740cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
741cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
742cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::String))
743cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("invalid vendor name");
744cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
745cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  VendorName = getLexer().getTok().getStringContents();
746cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
747cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
748cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Comma))
749cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("arch name required, comma expected");
750cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
751cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
752cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::String))
753cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("invalid arch name");
754cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
755cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  ArchName = getLexer().getTok().getStringContents();
756cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
757cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
758cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getTargetStreamer().EmitDirectiveHSACodeObjectISA(Major, Minor, Stepping,
759cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                                    VendorName, ArchName);
760cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
761cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
762cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
763cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseAMDKernelCodeTValue(StringRef ID,
764cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                               amd_kernel_code_t &Header) {
765cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
766cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Equal))
767cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("expected '='");
768cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
769cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
770cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Integer))
771cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("amd_kernel_code_t values must be integers");
772cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
773cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint64_t Value = getLexer().getTok().getIntVal();
774cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
775cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
776cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (ID == "kernel_code_version_major")
777cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.amd_kernel_code_version_major = Value;
778cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "kernel_code_version_minor")
779cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.amd_kernel_code_version_minor = Value;
780cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "machine_kind")
781cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.amd_machine_kind = Value;
782cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "machine_version_major")
783cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.amd_machine_version_major = Value;
784cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "machine_version_minor")
785cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.amd_machine_version_minor = Value;
786cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "machine_version_stepping")
787cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.amd_machine_version_stepping = Value;
788cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "kernel_code_entry_byte_offset")
789cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.kernel_code_entry_byte_offset = Value;
790cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "kernel_code_prefetch_byte_size")
791cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.kernel_code_prefetch_byte_size = Value;
792cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "max_scratch_backing_memory_byte_size")
793cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.max_scratch_backing_memory_byte_size = Value;
794cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_vgprs")
795cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_VGPRS(Value);
796cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_sgprs")
797cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_SGPRS(Value);
798cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_priority")
799cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_PRIORITY(Value);
800cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_float_mode")
801cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_FLOAT_MODE(Value);
802cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_priv")
803cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_PRIV(Value);
804cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_dx10_clamp")
805cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_DX10_CLAMP(Value);
806cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_debug_mode")
807cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_DEBUG_MODE(Value);
808cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc1_ieee_mode")
809cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= S_00B848_IEEE_MODE(Value);
810cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_scratch_en")
811cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_SCRATCH_EN(Value) << 32);
812cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_user_sgpr")
813cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_USER_SGPR(Value) << 32);
814cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_tgid_x_en")
815cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_TGID_X_EN(Value) << 32);
816cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_tgid_y_en")
817cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_TGID_Y_EN(Value) << 32);
818cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_tgid_z_en")
819cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_TGID_Z_EN(Value) << 32);
820cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_tg_size_en")
821cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_TG_SIZE_EN(Value) << 32);
822cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_tidig_comp_cnt")
823cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |=
824cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (S_00B84C_TIDIG_COMP_CNT(Value) << 32);
825cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_excp_en_msb")
826cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |=
827cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (S_00B84C_EXCP_EN_MSB(Value) << 32);
828cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_lds_size")
829cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_LDS_SIZE(Value) << 32);
830cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_rsrc2_excp_en")
831cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers |= (S_00B84C_EXCP_EN(Value) << 32);
832cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "compute_pgm_resource_registers")
833cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.compute_pgm_resource_registers = Value;
834cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_private_segment_buffer")
835cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
836cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT);
837cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_dispatch_ptr")
838cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
839cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_SHIFT);
840cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_queue_ptr")
841cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
842cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_SHIFT);
843cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_kernarg_segment_ptr")
844cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
845cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT);
846cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_dispatch_id")
847cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
848cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_SHIFT);
849cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_flat_scratch_init")
850cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
851cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT);
852cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_private_segment_size")
853cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
854cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT);
855cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_grid_workgroup_count_x")
856cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
857cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X_SHIFT);
858cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_grid_workgroup_count_y")
859cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
860cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y_SHIFT);
861cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_sgpr_grid_workgroup_count_z")
862cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
863cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z_SHIFT);
864cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "enable_ordered_append_gds")
865cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
866cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_ENABLE_ORDERED_APPEND_GDS_SHIFT);
867cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "private_element_size")
868cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
869cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_PRIVATE_ELEMENT_SIZE_SHIFT);
870cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "is_ptr64")
871cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
872cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_IS_PTR64_SHIFT);
873cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "is_dynamic_callstack")
874cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
875cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_IS_DYNAMIC_CALLSTACK_SHIFT);
876cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "is_debug_enabled")
877cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
878cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_IS_DEBUG_SUPPORTED_SHIFT);
879cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "is_xnack_enabled")
880cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.code_properties |=
881cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        (Value << AMD_CODE_PROPERTY_IS_XNACK_SUPPORTED_SHIFT);
882cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "workitem_private_segment_byte_size")
883cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.workitem_private_segment_byte_size = Value;
884cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "workgroup_group_segment_byte_size")
885cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.workgroup_group_segment_byte_size = Value;
886cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "gds_segment_byte_size")
887cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.gds_segment_byte_size = Value;
888cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "kernarg_segment_byte_size")
889cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.kernarg_segment_byte_size = Value;
890cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "workgroup_fbarrier_count")
891cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.workgroup_fbarrier_count = Value;
892cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "wavefront_sgpr_count")
893cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.wavefront_sgpr_count = Value;
894cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "workitem_vgpr_count")
895cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.workitem_vgpr_count = Value;
896cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "reserved_vgpr_first")
897cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.reserved_vgpr_first = Value;
898cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "reserved_vgpr_count")
899cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.reserved_vgpr_count = Value;
900cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "reserved_sgpr_first")
901cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.reserved_sgpr_first = Value;
902cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "reserved_sgpr_count")
903cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.reserved_sgpr_count = Value;
904cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "debug_wavefront_private_segment_offset_sgpr")
905cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.debug_wavefront_private_segment_offset_sgpr = Value;
906cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "debug_private_segment_buffer_sgpr")
907cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.debug_private_segment_buffer_sgpr = Value;
908cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "kernarg_segment_alignment")
909cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.kernarg_segment_alignment = Value;
910cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "group_segment_alignment")
911cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.group_segment_alignment = Value;
912cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "private_segment_alignment")
913cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.private_segment_alignment = Value;
914cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "wavefront_size")
915cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.wavefront_size = Value;
916cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "call_convention")
917cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.call_convention = Value;
918cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else if (ID == "runtime_loader_kernel_symbol")
919cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Header.runtime_loader_kernel_symbol = Value;
920cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  else
921cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("amd_kernel_code_t value not recognized.");
922cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
923cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
924cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
925cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
926cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveAMDKernelCodeT() {
927cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
928cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  amd_kernel_code_t Header;
929cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  AMDGPU::initDefaultAMDKernelCodeT(Header, getSTI().getFeatureBits());
930cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
931cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  while (true) {
932cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
933cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    if (getLexer().isNot(AsmToken::EndOfStatement))
934cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return TokError("amd_kernel_code_t values must begin on a new line");
935cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
936cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    // Lex EndOfStatement.  This is in a while loop, because lexing a comment
937cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    // will set the current token to EndOfStatement.
938cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    while(getLexer().is(AsmToken::EndOfStatement))
939cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      Lex();
940cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
941cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    if (getLexer().isNot(AsmToken::Identifier))
942cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return TokError("expected value identifier or .end_amd_kernel_code_t");
943cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
944cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    StringRef ID = getLexer().getTok().getIdentifier();
945cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Lex();
946cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
947cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    if (ID == ".end_amd_kernel_code_t")
948cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      break;
949cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
950cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    if (ParseAMDKernelCodeTValue(ID, Header))
951cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return true;
952cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
953cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
954cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getTargetStreamer().EmitAMDKernelCodeT(Header);
955cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
956cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
957cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
958cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
959cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseSectionDirectiveHSAText() {
960cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getParser().getStreamer().SwitchSection(
961cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      AMDGPU::getHSATextSection(getContext()));
962cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
963cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
964cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
965cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveAMDGPUHsaKernel() {
966cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Identifier))
967cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("expected symbol name");
968cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
969cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef KernelName = Parser.getTok().getString();
970cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
971cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getTargetStreamer().EmitAMDGPUSymbolType(KernelName,
972cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                           ELF::STT_AMDGPU_HSA_KERNEL);
973cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
974cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
975cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
976cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
977cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveAMDGPUHsaModuleGlobal() {
978cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Identifier))
979cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("expected symbol name");
980cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
981cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef GlobalName = Parser.getTok().getIdentifier();
982cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
983cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getTargetStreamer().EmitAMDGPUHsaModuleScopeGlobal(GlobalName);
984cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
985cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
986cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
987cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
988cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseDirectiveAMDGPUHsaProgramGlobal() {
989cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::Identifier))
990cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return TokError("expected symbol name");
991cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
992cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef GlobalName = Parser.getTok().getIdentifier();
993cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
994cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getTargetStreamer().EmitAMDGPUHsaProgramScopeGlobal(GlobalName);
995cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Lex();
996cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
997cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
998cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
999cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseSectionDirectiveHSADataGlobalAgent() {
1000cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getParser().getStreamer().SwitchSection(
1001cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      AMDGPU::getHSADataGlobalAgentSection(getContext()));
1002cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
1003cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
1004cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1005cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseSectionDirectiveHSADataGlobalProgram() {
1006cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getParser().getStreamer().SwitchSection(
1007cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      AMDGPU::getHSADataGlobalProgramSection(getContext()));
1008cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
1009cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
1010cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1011cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::ParseSectionDirectiveHSARodataReadonlyAgent() {
1012cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  getParser().getStreamer().SwitchSection(
1013cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      AMDGPU::getHSARodataReadonlyAgentSection(getContext()));
1014cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return false;
1015cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
1016cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
101737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool AMDGPUAsmParser::ParseDirective(AsmToken DirectiveID) {
1018cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef IDVal = DirectiveID.getString();
1019cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1020cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".hsa_code_object_version")
1021cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseDirectiveHSACodeObjectVersion();
1022cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1023cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".hsa_code_object_isa")
1024cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseDirectiveHSACodeObjectISA();
1025cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1026cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".amd_kernel_code_t")
1027cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseDirectiveAMDKernelCodeT();
1028cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1029cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".hsatext" || IDVal == ".text")
1030cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseSectionDirectiveHSAText();
1031cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1032cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".amdgpu_hsa_kernel")
1033cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseDirectiveAMDGPUHsaKernel();
1034cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1035cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".amdgpu_hsa_module_global")
1036cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseDirectiveAMDGPUHsaModuleGlobal();
1037cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1038cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".amdgpu_hsa_program_global")
1039cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseDirectiveAMDGPUHsaProgramGlobal();
1040cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1041cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".hsadata_global_agent")
1042cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseSectionDirectiveHSADataGlobalAgent();
1043cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1044cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".hsadata_global_program")
1045cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseSectionDirectiveHSADataGlobalProgram();
1046cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1047cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (IDVal == ".hsarodata_readonly_agent")
1048cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return ParseSectionDirectiveHSARodataReadonlyAgent();
1049cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1050cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return true;
1051cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
1052cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1053cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUAsmParser::subtargetHasRegister(const MCRegisterInfo &MRI,
1054cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                           unsigned RegNo) const {
1055cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (isCI())
1056cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    return true;
1057cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1058cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (isSI()) {
1059cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    // No flat_scr
1060cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    switch (RegNo) {
1061cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case AMDGPU::FLAT_SCR:
1062cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case AMDGPU::FLAT_SCR_LO:
1063cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    case AMDGPU::FLAT_SCR_HI:
1064cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return false;
1065cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    default:
1066cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return true;
1067cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    }
1068cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
1069cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1070cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // VI only has 102 SGPRs, so make sure we aren't trying to use the 2 more that
1071cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // SI/CI have.
1072cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  for (MCRegAliasIterator R(AMDGPU::SGPR102_SGPR103, &MRI, true);
1073cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar       R.isValid(); ++R) {
1074cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    if (*R == RegNo)
1075cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      return false;
1076cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
1077cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
107837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return true;
107937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
108037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
10810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic bool operandsHaveModifiers(const OperandVector &Operands) {
10820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
10830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
10840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    const AMDGPUOperand &Op = ((AMDGPUOperand&)*Operands[i]);
10856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Op.isRegKind() && Op.hasModifiers())
10860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
10870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isImm() && (Op.getImmTy() == AMDGPUOperand::ImmTyOMod ||
10880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                       Op.getImmTy() == AMDGPUOperand::ImmTyClamp))
10890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
10900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
10910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return false;
10920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
10930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
109437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesAMDGPUAsmParser::OperandMatchResultTy
109537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesAMDGPUAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
109637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
109737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Try to parse with a custom parser
109837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
109937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
110037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // If we successfully parsed the operand or if there as an error parsing,
110137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // we are done.
11020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  //
11030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // If we are parsing after we reach EndOfStatement then this means we
11040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // are appending default values to the Operands list.  This is only done
11050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // by custom parser, so we shouldn't continue on to the generic parsing.
11060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (ResTy == MatchOperand_Success || ResTy == MatchOperand_ParseFail ||
11070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      getLexer().is(AsmToken::EndOfStatement))
110837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return ResTy;
110937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool Negate = false, Abs = false;
11110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (getLexer().getKind()== AsmToken::Minus) {
11120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
11130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Negate = true;
11140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
11150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (getLexer().getKind() == AsmToken::Pipe) {
11170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Parser.Lex();
11180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Abs = true;
11190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
11200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
112137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  switch(getLexer().getKind()) {
112237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case AsmToken::Integer: {
11230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      SMLoc S = Parser.getTok().getLoc();
112437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      int64_t IntVal;
112537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (getParser().parseAbsoluteExpression(IntVal))
112637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MatchOperand_ParseFail;
1127cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      if (!isInt<32>(IntVal) && !isUInt<32>(IntVal)) {
11280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        Error(S, "invalid immediate: only 32-bit values are legal");
11290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_ParseFail;
11300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      }
11310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (Negate)
11330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        IntVal *= -1;
11340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Operands.push_back(AMDGPUOperand::CreateImm(IntVal, S));
113537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MatchOperand_Success;
113637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
11370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case AsmToken::Real: {
11380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // FIXME: We should emit an error if a double precisions floating-point
11390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // value is used.  I'm not sure the best way to detect this.
11400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      SMLoc S = Parser.getTok().getLoc();
11410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      int64_t IntVal;
11420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (getParser().parseAbsoluteExpression(IntVal))
11430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_ParseFail;
11440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      APFloat F((float)BitsToDouble(IntVal));
11460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (Negate)
11470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        F.changeSign();
11480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Operands.push_back(
11490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          AMDGPUOperand::CreateImm(F.bitcastToAPInt().getZExtValue(), S));
11500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return MatchOperand_Success;
11510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
11520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case AsmToken::Identifier: {
11530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      SMLoc S, E;
11540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      unsigned RegNo;
11550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (!ParseRegister(RegNo, S, E)) {
11560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        bool HasModifiers = operandsHaveModifiers(Operands);
11580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        unsigned Modifiers = 0;
11590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (Negate)
11610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Modifiers |= 0x1;
11620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (Abs) {
11640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          if (getLexer().getKind() != AsmToken::Pipe)
11650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar            return MatchOperand_ParseFail;
11660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Parser.Lex();
11670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Modifiers |= 0x2;
11680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        }
11690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (Modifiers && !HasModifiers) {
11710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          // We are adding a modifier to src1 or src2 and previous sources
11720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          // don't have modifiers, so we need to go back and empty modifers
11730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          // for each previous source.
11740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          for (unsigned PrevRegIdx = Operands.size() - 1; PrevRegIdx > 1;
11750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar               --PrevRegIdx) {
11760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar            AMDGPUOperand &RegOp = ((AMDGPUOperand&)*Operands[PrevRegIdx]);
11780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar            RegOp.setModifiers(0);
11790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          }
11800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        }
11810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        Operands.push_back(AMDGPUOperand::CreateReg(
1184cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar            RegNo, S, E, getContext().getRegisterInfo(), &getSTI(),
11856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar            isForcedVOP3()));
11860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (HasModifiers || Modifiers) {
11880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          AMDGPUOperand &RegOp = ((AMDGPUOperand&)*Operands[Operands.size() - 1]);
11890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          RegOp.setModifiers(Modifiers);
11900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
11910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        }
11920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar     }  else {
11930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Operands.push_back(AMDGPUOperand::CreateToken(Parser.getTok().getString(),
11940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                    S));
11950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Parser.Lex();
11960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar     }
11970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar     return MatchOperand_Success;
11980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
119937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    default:
120037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MatchOperand_NoMatch;
120137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
120237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
120337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
120437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool AMDGPUAsmParser::ParseInstruction(ParseInstructionInfo &Info,
120537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                       StringRef Name,
120637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                       SMLoc NameLoc, OperandVector &Operands) {
12070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // Clear any forced encodings from the previous instruction.
12090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  setForcedEncodingSize(0);
12100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Name.endswith("_e64"))
12120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    setForcedEncodingSize(64);
12130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  else if (Name.endswith("_e32"))
12140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    setForcedEncodingSize(32);
12150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
121637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Add the instruction mnemonic
121737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Operands.push_back(AMDGPUOperand::CreateToken(Name, NameLoc));
121837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
12190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  while (!getLexer().is(AsmToken::EndOfStatement)) {
12200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUAsmParser::OperandMatchResultTy Res = parseOperand(Operands, Name);
12210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Eat the comma or space if there is one.
12230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (getLexer().is(AsmToken::Comma))
12240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Parser.Lex();
122537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
12260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    switch (Res) {
12270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case MatchOperand_Success: break;
12280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case MatchOperand_ParseFail: return Error(getLexer().getLoc(),
12290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                                "failed parsing operand.");
12300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case MatchOperand_NoMatch: return Error(getLexer().getLoc(),
12310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                              "not a valid operand.");
12320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
123337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
12340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // Once we reach end of statement, continue parsing so we can add default
12360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // values for optional arguments.
12370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  AMDGPUAsmParser::OperandMatchResultTy Res;
12380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  while ((Res = parseOperand(Operands, Name)) != MatchOperand_NoMatch) {
12390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Res != MatchOperand_Success)
12400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return Error(getLexer().getLoc(), "failed parsing operand.");
12410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
12420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return false;
12430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
12440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
12460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar// Utility functions
12470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
12480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
12500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseIntWithPrefix(const char *Prefix, int64_t &Int,
12510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                    int64_t Default) {
12520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // We are at the end of the statement, and this is a default argument, so
12540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // use a default value.
12550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (getLexer().is(AsmToken::EndOfStatement)) {
12560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Int = Default;
12570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MatchOperand_Success;
12580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
12590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  switch(getLexer().getKind()) {
12610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    default: return MatchOperand_NoMatch;
12620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case AsmToken::Identifier: {
12630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      StringRef OffsetName = Parser.getTok().getString();
12640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (!OffsetName.equals(Prefix))
12650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_NoMatch;
12660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Parser.Lex();
12680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (getLexer().isNot(AsmToken::Colon))
12690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_ParseFail;
12700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Parser.Lex();
12720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (getLexer().isNot(AsmToken::Integer))
12730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_ParseFail;
12740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (getParser().parseAbsoluteExpression(Int))
12760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_ParseFail;
12770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      break;
12780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
12790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
12800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return MatchOperand_Success;
12810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
12820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
12840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseIntWithPrefix(const char *Prefix, OperandVector &Operands,
12850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                    enum AMDGPUOperand::ImmTy ImmTy) {
12860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc S = Parser.getTok().getLoc();
12880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  int64_t Offset = 0;
12890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  AMDGPUAsmParser::OperandMatchResultTy Res = parseIntWithPrefix(Prefix, Offset);
12910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Res != MatchOperand_Success)
12920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Res;
12930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Operands.push_back(AMDGPUOperand::CreateImm(Offset, S, ImmTy));
12950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return MatchOperand_Success;
12960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
12970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
12980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
12990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseNamedBit(const char *Name, OperandVector &Operands,
13000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               enum AMDGPUOperand::ImmTy ImmTy) {
13010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  int64_t Bit = 0;
13020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc S = Parser.getTok().getLoc();
13030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // We are at the end of the statement, and this is a default argument, so
13050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // use a default value.
13060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (getLexer().isNot(AsmToken::EndOfStatement)) {
13070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    switch(getLexer().getKind()) {
13080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      case AsmToken::Identifier: {
13090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        StringRef Tok = Parser.getTok().getString();
13100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (Tok == Name) {
13110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Bit = 1;
13120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Parser.Lex();
13130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        } else if (Tok.startswith("no") && Tok.endswith(Name)) {
13140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Bit = 0;
13150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Parser.Lex();
13160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        } else {
13170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          return MatchOperand_NoMatch;
13180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        }
13190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        break;
13200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      }
13210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      default:
13220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_NoMatch;
13230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
13240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
13250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Operands.push_back(AMDGPUOperand::CreateImm(Bit, S, ImmTy));
13270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return MatchOperand_Success;
13280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
13290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic bool operandsHasOptionalOp(const OperandVector &Operands,
13310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                  const OptionalOperand &OOp) {
13320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (unsigned i = 0; i < Operands.size(); i++) {
13330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    const AMDGPUOperand &ParsedOp = ((const AMDGPUOperand &)*Operands[i]);
13340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if ((ParsedOp.isImm() && ParsedOp.getImmTy() == OOp.Type) ||
13350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        (ParsedOp.isToken() && ParsedOp.getToken() == OOp.Name))
13360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
13370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
13390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return false;
13400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
13410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
13430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseOptionalOps(const ArrayRef<OptionalOperand> &OptionalOps,
13440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                   OperandVector &Operands) {
13450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc S = Parser.getTok().getLoc();
13460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (const OptionalOperand &Op : OptionalOps) {
13470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (operandsHasOptionalOp(Operands, Op))
13480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
13490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUAsmParser::OperandMatchResultTy Res;
13500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    int64_t Value;
13510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.IsBit) {
13520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Res = parseNamedBit(Op.Name, Operands, Op.Type);
13530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (Res == MatchOperand_NoMatch)
13540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        continue;
13550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return Res;
13560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
13570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Res = parseIntWithPrefix(Op.Name, Value, Op.Default);
13590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Res == MatchOperand_NoMatch)
13610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
13620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Res != MatchOperand_Success)
13640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return Res;
13650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.ConvertResult && !Op.ConvertResult(Value)) {
13670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return MatchOperand_ParseFail;
13680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
13690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Operands.push_back(AMDGPUOperand::CreateImm(Value, S, Op.Type));
13710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MatchOperand_Success;
13720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
13730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return MatchOperand_NoMatch;
13740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
13750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
13770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar// ds
13780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
13790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic const OptionalOperand DSOptionalOps [] = {
13810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"offset",  AMDGPUOperand::ImmTyOffset, false, 0, nullptr},
13820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"gds",     AMDGPUOperand::ImmTyGDS, true, 0, nullptr}
13830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar};
13840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic const OptionalOperand DSOptionalOpsOff01 [] = {
13860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"offset0", AMDGPUOperand::ImmTyDSOffset0, false, 0, nullptr},
13870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"offset1", AMDGPUOperand::ImmTyDSOffset1, false, 0, nullptr},
13880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"gds",     AMDGPUOperand::ImmTyGDS, true, 0, nullptr}
13890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar};
13900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
13910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
13920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseDSOptionalOps(OperandVector &Operands) {
13930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseOptionalOps(DSOptionalOps, Operands);
13940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
13950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
13960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseDSOff01OptionalOps(OperandVector &Operands) {
13970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseOptionalOps(DSOptionalOpsOff01, Operands);
13980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
13990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
14010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseDSOffsetOptional(OperandVector &Operands) {
14020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc S = Parser.getTok().getLoc();
14030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  AMDGPUAsmParser::OperandMatchResultTy Res =
14040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    parseIntWithPrefix("offset", Operands, AMDGPUOperand::ImmTyOffset);
14050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Res == MatchOperand_NoMatch) {
14060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Operands.push_back(AMDGPUOperand::CreateImm(0, S,
14070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                       AMDGPUOperand::ImmTyOffset));
14080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Res = MatchOperand_Success;
14090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
14100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return Res;
14110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
14120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarbool AMDGPUOperand::isDSOffset() const {
14140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return isImm() && isUInt<16>(getImm());
14150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
14160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarbool AMDGPUOperand::isDSOffset01() const {
14180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return isImm() && isUInt<8>(getImm());
14190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
14200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid AMDGPUAsmParser::cvtDSOffset01(MCInst &Inst,
14220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                    const OperandVector &Operands) {
14230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  std::map<enum AMDGPUOperand::ImmTy, unsigned> OptionalIdx;
14250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (unsigned i = 1, e = Operands.size(); i != e; ++i) {
14270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[i]);
14280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Add the register arguments
14300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isReg()) {
14310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Op.addRegOperands(Inst, 1);
14320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
14330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
14340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Handle optional arguments
14360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    OptionalIdx[Op.getImmTy()] = i;
14370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
14380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Offset0Idx = OptionalIdx[AMDGPUOperand::ImmTyDSOffset0];
14400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Offset1Idx = OptionalIdx[AMDGPUOperand::ImmTyDSOffset1];
14410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned GDSIdx = OptionalIdx[AMDGPUOperand::ImmTyGDS];
14420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[Offset0Idx]).addImmOperands(Inst, 1); // offset0
14440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[Offset1Idx]).addImmOperands(Inst, 1); // offset1
14450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[GDSIdx]).addImmOperands(Inst, 1); // gds
14466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(AMDGPU::M0)); // m0
144737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
144837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
14490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid AMDGPUAsmParser::cvtDS(MCInst &Inst, const OperandVector &Operands) {
14500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  std::map<enum AMDGPUOperand::ImmTy, unsigned> OptionalIdx;
14520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool GDSOnly = false;
14530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (unsigned i = 1, e = Operands.size(); i != e; ++i) {
14550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[i]);
14560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Add the register arguments
14580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isReg()) {
14590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Op.addRegOperands(Inst, 1);
14600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
14610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
14620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isToken() && Op.getToken() == "gds") {
14640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      GDSOnly = true;
14650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
14660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
14670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Handle optional arguments
14690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    OptionalIdx[Op.getImmTy()] = i;
14700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
14710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned OffsetIdx = OptionalIdx[AMDGPUOperand::ImmTyOffset];
14730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[OffsetIdx]).addImmOperands(Inst, 1); // offset
14740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (!GDSOnly) {
14760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    unsigned GDSIdx = OptionalIdx[AMDGPUOperand::ImmTyGDS];
14770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ((AMDGPUOperand &)*Operands[GDSIdx]).addImmOperands(Inst, 1); // gds
14780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
14796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(AMDGPU::M0)); // m0
14800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
14810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
14820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
148337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
148437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// s_waitcnt
148537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
148637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
148737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool AMDGPUAsmParser::parseCnt(int64_t &IntVal) {
148837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef CntName = Parser.getTok().getString();
148937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int64_t CntVal;
149037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
149137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Parser.Lex();
149237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (getLexer().isNot(AsmToken::LParen))
149337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return true;
149437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
149537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Parser.Lex();
149637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (getLexer().isNot(AsmToken::Integer))
149737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return true;
149837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
149937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (getParser().parseAbsoluteExpression(CntVal))
150037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return true;
150137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
150237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (getLexer().isNot(AsmToken::RParen))
150337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return true;
150437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
150537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Parser.Lex();
150637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (getLexer().is(AsmToken::Amp) || getLexer().is(AsmToken::Comma))
150737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Parser.Lex();
150837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
150937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int CntShift;
151037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int CntMask;
151137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
151237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (CntName == "vmcnt") {
151337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CntMask = 0xf;
151437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CntShift = 0;
151537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } else if (CntName == "expcnt") {
151637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CntMask = 0x7;
151737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CntShift = 4;
151837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } else if (CntName == "lgkmcnt") {
151937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CntMask = 0x7;
152037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CntShift = 8;
152137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } else {
152237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return true;
152337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
152437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
152537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  IntVal &= ~(CntMask << CntShift);
152637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  IntVal |= (CntVal << CntShift);
152737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return false;
152837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
152937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
153037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesAMDGPUAsmParser::OperandMatchResultTy
153137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesAMDGPUAsmParser::parseSWaitCntOps(OperandVector &Operands) {
153237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Disable all counters by default.
153337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // vmcnt   [3:0]
153437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // expcnt  [6:4]
153537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // lgkmcnt [10:8]
153637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int64_t CntVal = 0x77f;
15370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc S = Parser.getTok().getLoc();
153837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
153937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  switch(getLexer().getKind()) {
154037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    default: return MatchOperand_ParseFail;
154137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case AsmToken::Integer:
154237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // The operand can be an integer value.
154337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (getParser().parseAbsoluteExpression(CntVal))
154437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MatchOperand_ParseFail;
154537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
154637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
154737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case AsmToken::Identifier:
154837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      do {
154937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        if (parseCnt(CntVal))
155037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          return MatchOperand_ParseFail;
155137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      } while(getLexer().isNot(AsmToken::EndOfStatement));
155237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
155337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
15540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Operands.push_back(AMDGPUOperand::CreateImm(CntVal, S));
155537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return MatchOperand_Success;
155637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
155737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
155837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool AMDGPUOperand::isSWaitCnt() const {
155937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return isImm();
156037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
156137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
15630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar// sopp branch targets
15640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
15650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
15660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
15670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseSOppBrTarget(OperandVector &Operands) {
15680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  SMLoc S = Parser.getTok().getLoc();
15690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
15700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  switch (getLexer().getKind()) {
15710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    default: return MatchOperand_ParseFail;
15720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case AsmToken::Integer: {
15730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      int64_t Imm;
15740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (getParser().parseAbsoluteExpression(Imm))
15750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        return MatchOperand_ParseFail;
15760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Operands.push_back(AMDGPUOperand::CreateImm(Imm, S));
15770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return MatchOperand_Success;
15780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
15790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
15800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    case AsmToken::Identifier:
15810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Operands.push_back(AMDGPUOperand::CreateExpr(
15826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          MCSymbolRefExpr::create(getContext().getOrCreateSymbol(
15830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                  Parser.getTok().getString()), getContext()), S));
15840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Parser.Lex();
15850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return MatchOperand_Success;
15860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
15870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
15880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
15890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
15906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// flat
15916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
15926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
15936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const OptionalOperand FlatOptionalOps [] = {
15946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"glc",    AMDGPUOperand::ImmTyGLC, true, 0, nullptr},
15956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"slc",    AMDGPUOperand::ImmTySLC, true, 0, nullptr},
15966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"tfe",    AMDGPUOperand::ImmTyTFE, true, 0, nullptr}
15976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
15986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
15996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const OptionalOperand FlatAtomicOptionalOps [] = {
16006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"slc",    AMDGPUOperand::ImmTySLC, true, 0, nullptr},
16016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"tfe",    AMDGPUOperand::ImmTyTFE, true, 0, nullptr}
16026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
16036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarAMDGPUAsmParser::parseFlatOptionalOps(OperandVector &Operands) {
16066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return parseOptionalOps(FlatOptionalOps, Operands);
16076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
16086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarAMDGPUAsmParser::parseFlatAtomicOptionalOps(OperandVector &Operands) {
16116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return parseOptionalOps(FlatAtomicOptionalOps, Operands);
16126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
16136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid AMDGPUAsmParser::cvtFlat(MCInst &Inst,
16156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                               const OperandVector &Operands) {
16166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  std::map<AMDGPUOperand::ImmTy, unsigned> OptionalIdx;
16176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (unsigned i = 1, e = Operands.size(); i != e; ++i) {
16196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[i]);
16206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Add the register arguments
16226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Op.isReg()) {
16236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Op.addRegOperands(Inst, 1);
16246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      continue;
16256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
16266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Handle 'glc' token which is sometimes hard-coded into the
16286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // asm string.  There are no MCInst operands for these.
16296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Op.isToken())
16306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      continue;
16316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Handle optional arguments
16336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OptionalIdx[Op.getImmTy()] = i;
16346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
16366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // flat atomic instructions don't have a glc argument.
16386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (OptionalIdx.count(AMDGPUOperand::ImmTyGLC)) {
16396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    unsigned GLCIdx = OptionalIdx[AMDGPUOperand::ImmTyGLC];
16406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((AMDGPUOperand &)*Operands[GLCIdx]).addImmOperands(Inst, 1);
16416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
16426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SLCIdx = OptionalIdx[AMDGPUOperand::ImmTySLC];
16446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned TFEIdx = OptionalIdx[AMDGPUOperand::ImmTyTFE];
16456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[SLCIdx]).addImmOperands(Inst, 1);
16476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[TFEIdx]).addImmOperands(Inst, 1);
16486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
16496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
16506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
16510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar// mubuf
16520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
16530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic const OptionalOperand MubufOptionalOps [] = {
16550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"offset", AMDGPUOperand::ImmTyOffset, false, 0, nullptr},
16560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"glc",    AMDGPUOperand::ImmTyGLC, true, 0, nullptr},
16570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"slc",    AMDGPUOperand::ImmTySLC, true, 0, nullptr},
16580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"tfe",    AMDGPUOperand::ImmTyTFE, true, 0, nullptr}
16590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar};
16600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseMubufOptionalOps(OperandVector &Operands) {
16630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseOptionalOps(MubufOptionalOps, Operands);
16640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
16650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseOffset(OperandVector &Operands) {
16680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseIntWithPrefix("offset", Operands);
16690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
16700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseGLC(OperandVector &Operands) {
16730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseNamedBit("glc", Operands);
16740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
16750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseSLC(OperandVector &Operands) {
16780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseNamedBit("slc", Operands);
16790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
16800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
16820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseTFE(OperandVector &Operands) {
16830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseNamedBit("tfe", Operands);
16840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
16850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarbool AMDGPUOperand::isMubufOffset() const {
16870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return isImm() && isUInt<12>(getImm());
16880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
16890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid AMDGPUAsmParser::cvtMubuf(MCInst &Inst,
16910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               const OperandVector &Operands) {
16920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  std::map<enum AMDGPUOperand::ImmTy, unsigned> OptionalIdx;
16930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (unsigned i = 1, e = Operands.size(); i != e; ++i) {
16950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[i]);
16960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
16970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Add the register arguments
16980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isReg()) {
16990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Op.addRegOperands(Inst, 1);
17000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
17010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
17020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Handle the case where soffset is an immediate
17040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isImm() && Op.getImmTy() == AMDGPUOperand::ImmTyNone) {
17050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Op.addImmOperands(Inst, 1);
17060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
17070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
17080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Handle tokens like 'offen' which are sometimes hard-coded into the
17100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // asm string.  There are no MCInst operands for these.
17110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Op.isToken()) {
17120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      continue;
17130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
17140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    assert(Op.isImm());
17150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Handle optional arguments
17170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    OptionalIdx[Op.getImmTy()] = i;
17180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
17190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  assert(OptionalIdx.size() == 4);
17210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned OffsetIdx = OptionalIdx[AMDGPUOperand::ImmTyOffset];
17230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned GLCIdx = OptionalIdx[AMDGPUOperand::ImmTyGLC];
17240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned SLCIdx = OptionalIdx[AMDGPUOperand::ImmTySLC];
17250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned TFEIdx = OptionalIdx[AMDGPUOperand::ImmTyTFE];
17260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[OffsetIdx]).addImmOperands(Inst, 1);
17280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[GLCIdx]).addImmOperands(Inst, 1);
17290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[SLCIdx]).addImmOperands(Inst, 1);
17300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ((AMDGPUOperand &)*Operands[TFEIdx]).addImmOperands(Inst, 1);
17310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
17320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
17340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar// mimg
17350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
17360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
17380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseDMask(OperandVector &Operands) {
17390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseIntWithPrefix("dmask", Operands);
17400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
17410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
17430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseUNorm(OperandVector &Operands) {
17440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseNamedBit("unorm", Operands);
17450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
17460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
17480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseR128(OperandVector &Operands) {
17490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return parseNamedBit("r128", Operands);
17500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
17510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
1753cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// smrd
1754cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
1755cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1756cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUOperand::isSMRDOffset() const {
1757cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1758cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // FIXME: Support 20-bit offsets on VI.  We need to to pass subtarget
1759cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // information here.
1760cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return isImm() && isUInt<8>(getImm());
1761cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
1762cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1763cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool AMDGPUOperand::isSMRDLiteralOffset() const {
1764cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // 32-bit literals are only supported on CI and we only want to use them
1765cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // when the offset is > 8-bits.
1766cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return isImm() && !isUInt<8>(getImm()) && isUInt<32>(getImm());
1767cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}
1768cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1769cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
17700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar// vop3
17710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
17720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic bool ConvertOmodMul(int64_t &Mul) {
17740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Mul != 1 && Mul != 2 && Mul != 4)
17750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return false;
17760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Mul >>= 1;
17780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return true;
17790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
17800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic bool ConvertOmodDiv(int64_t &Div) {
17820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Div == 1) {
17830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Div = 0;
17840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
17850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
17860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Div == 2) {
17880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    Div = 3;
17890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
17900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
17910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return false;
17930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
17940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
17950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic const OptionalOperand VOP3OptionalOps [] = {
17960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"clamp", AMDGPUOperand::ImmTyClamp, true, 0, nullptr},
17970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"mul",   AMDGPUOperand::ImmTyOMod, false, 1, ConvertOmodMul},
17980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  {"div",   AMDGPUOperand::ImmTyOMod, false, 1, ConvertOmodDiv},
17990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar};
18000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic bool isVOP3(OperandVector &Operands) {
18020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (operandsHaveModifiers(Operands))
18030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
18040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  AMDGPUOperand &DstOp = ((AMDGPUOperand&)*Operands[1]);
18060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (DstOp.isReg() && DstOp.isRegClass(AMDGPU::SGPR_64RegClassID))
18080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
18090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Operands.size() >= 5)
18110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return true;
18120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Operands.size() > 3) {
18140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUOperand &Src1Op = ((AMDGPUOperand&)*Operands[3]);
18150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (Src1Op.getReg() && (Src1Op.isRegClass(AMDGPU::SReg_32RegClassID) ||
18160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                            Src1Op.isRegClass(AMDGPU::SReg_64RegClassID)))
18170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return true;
18180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
18190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return false;
18200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
18210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::OperandMatchResultTy
18230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarAMDGPUAsmParser::parseVOP3OptionalOps(OperandVector &Operands) {
18240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // The value returned by this function may change after parsing
18260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // an operand so store the original value here.
18270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool HasModifiers = operandsHaveModifiers(Operands);
18280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool IsVOP3 = isVOP3(Operands);
18300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (HasModifiers || IsVOP3 ||
18310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      getLexer().isNot(AsmToken::EndOfStatement) ||
18320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      getForcedEncodingSize() == 64) {
18330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    AMDGPUAsmParser::OperandMatchResultTy Res =
18350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        parseOptionalOps(VOP3OptionalOps, Operands);
18360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (!HasModifiers && Res == MatchOperand_Success) {
18380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // We have added a modifier operation, so we need to make sure all
18390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // previous register operands have modifiers
18400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      for (unsigned i = 2, e = Operands.size(); i != e; ++i) {
18410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        AMDGPUOperand &Op = ((AMDGPUOperand&)*Operands[i]);
18420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        if (Op.isReg())
18430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar          Op.setModifiers(0);
18440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      }
18450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
18460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return Res;
18470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
18480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return MatchOperand_NoMatch;
18490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
18500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid AMDGPUAsmParser::cvtVOP3(MCInst &Inst, const OperandVector &Operands) {
1852cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
1853cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  unsigned i = 1;
1854cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  const MCInstrDesc &Desc = MII.get(Inst.getOpcode());
1855cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  if (Desc.getNumDefs() > 0) {
1856cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    ((AMDGPUOperand &)*Operands[i++]).addRegOperands(Inst, 1);
1857cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
18580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  std::map<enum AMDGPUOperand::ImmTy, unsigned> OptionalIdx;
18600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (operandsHaveModifiers(Operands)) {
18620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    for (unsigned e = Operands.size(); i != e; ++i) {
18630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[i]);
18640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (Op.isRegWithInputMods()) {
18660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        ((AMDGPUOperand &)*Operands[i]).addRegWithInputModsOperands(Inst, 2);
18670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        continue;
18680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      }
18690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      OptionalIdx[Op.getImmTy()] = i;
18700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
18710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    unsigned ClampIdx = OptionalIdx[AMDGPUOperand::ImmTyClamp];
18730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    unsigned OModIdx = OptionalIdx[AMDGPUOperand::ImmTyOMod];
18740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
18750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ((AMDGPUOperand &)*Operands[ClampIdx]).addImmOperands(Inst, 1);
18760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    ((AMDGPUOperand &)*Operands[OModIdx]).addImmOperands(Inst, 1);
18770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  } else {
18780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    for (unsigned e = Operands.size(); i != e; ++i)
18790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      ((AMDGPUOperand &)*Operands[i]).addRegOrImmOperands(Inst, 1);
18800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
18810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
18820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
188337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// Force static initialization.
18846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarextern "C" void LLVMInitializeAMDGPUAsmParser() {
188537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  RegisterMCAsmParser<AMDGPUAsmParser> A(TheAMDGPUTarget);
1886ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  RegisterMCAsmParser<AMDGPUAsmParser> B(TheGCNTarget);
188737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
188837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
188937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define GET_REGISTER_MATCHER
189037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define GET_MATCHER_IMPLEMENTATION
189137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "AMDGPUGenAsmMatcher.inc"
189237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1893