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