136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- SparcAsmParser.cpp - Parse Sparc assembly to MCInst instructions --===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/SparcMCTargetDesc.h" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/SparcMCExpr.h" 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/STLExtras.h" 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCContext.h" 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCInst.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCObjectFileInfo.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCParser/MCParsedAsmOperand.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCStreamer.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCSubtargetInfo.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCSymbol.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCTargetAsmParser.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/TargetRegistry.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The generated AsmMatcher SparcGenAsmMatcher uses "Sparc" as the target 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// namespace. But SPARC backend uses "SP" as its namespace. 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm { 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines namespace Sparc { 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines using namespace SP; 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace { 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass SparcOperand; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass SparcAsmParser : public MCTargetAsmParser { 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSubtargetInfo &STI; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCAsmParser &Parser; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @name Auto-generated Match Functions 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// { 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define GET_ASSEMBLER_HEADER 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "SparcGenAsmMatcher.inc" 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// } 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // public interface of the MCTargetAsmParser. 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OperandVector &Operands, MCStreamer &Out, 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned &ErrorInfo, 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool MatchingInlineAsm) override; 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override; 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SMLoc NameLoc, OperandVector &Operands) override; 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool ParseDirective(AsmToken DirectiveID) override; 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned validateTargetOperandClass(MCParsedAsmOperand &Op, 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned Kind) override; 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Custom parse functions for Sparc specific operands. 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OperandMatchResultTy parseMEMOperand(OperandVector &Operands); 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OperandMatchResultTy parseOperand(OperandVector &Operands, StringRef Name); 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OperandMatchResultTy 67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Operand, 68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool isCall = false); 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OperandMatchResultTy parseBranchModifiers(OperandVector &Operands); 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // returns true if Tok is matched to a register and returns register in RegNo. 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool matchRegisterName(const AsmToken &Tok, unsigned &RegNo, 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &RegKind); 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool matchSparcAsmModifiers(const MCExpr *&EVal, SMLoc &EndLoc); 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool parseDirectiveWord(unsigned Size, SMLoc L); 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool is64Bit() const { return STI.getTargetTriple().startswith("sparcv9"); } 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SparcAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser, 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCInstrInfo &MII, 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCTargetOptions &Options) 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : MCTargetAsmParser(), STI(sti), Parser(parser) { 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Initialize the set of available features. 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static unsigned IntRegs[32] = { 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::G0, Sparc::G1, Sparc::G2, Sparc::G3, 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::G4, Sparc::G5, Sparc::G6, Sparc::G7, 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::O0, Sparc::O1, Sparc::O2, Sparc::O3, 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::O4, Sparc::O5, Sparc::O6, Sparc::O7, 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::L0, Sparc::L1, Sparc::L2, Sparc::L3, 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::L4, Sparc::L5, Sparc::L6, Sparc::L7, 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::I0, Sparc::I1, Sparc::I2, Sparc::I3, 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::I4, Sparc::I5, Sparc::I6, Sparc::I7 }; 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static unsigned FloatRegs[32] = { 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F0, Sparc::F1, Sparc::F2, Sparc::F3, 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F4, Sparc::F5, Sparc::F6, Sparc::F7, 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F8, Sparc::F9, Sparc::F10, Sparc::F11, 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F12, Sparc::F13, Sparc::F14, Sparc::F15, 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F16, Sparc::F17, Sparc::F18, Sparc::F19, 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F20, Sparc::F21, Sparc::F22, Sparc::F23, 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F24, Sparc::F25, Sparc::F26, Sparc::F27, 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::F28, Sparc::F29, Sparc::F30, Sparc::F31 }; 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static unsigned DoubleRegs[32] = { 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D0, Sparc::D1, Sparc::D2, Sparc::D3, 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D4, Sparc::D5, Sparc::D6, Sparc::D7, 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D8, Sparc::D7, Sparc::D8, Sparc::D9, 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D12, Sparc::D13, Sparc::D14, Sparc::D15, 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D16, Sparc::D17, Sparc::D18, Sparc::D19, 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D20, Sparc::D21, Sparc::D22, Sparc::D23, 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D24, Sparc::D25, Sparc::D26, Sparc::D27, 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::D28, Sparc::D29, Sparc::D30, Sparc::D31 }; 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static unsigned QuadFPRegs[32] = { 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::Q0, Sparc::Q1, Sparc::Q2, Sparc::Q3, 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::Q4, Sparc::Q5, Sparc::Q6, Sparc::Q7, 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::Q8, Sparc::Q9, Sparc::Q10, Sparc::Q11, 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Sparc::Q12, Sparc::Q13, Sparc::Q14, Sparc::Q15 }; 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// SparcOperand - Instances of this class represent a parsed Sparc machine 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// instruction. 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass SparcOperand : public MCParsedAsmOperand { 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines enum RegisterKind { 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_None, 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_IntReg, 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_FloatReg, 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_DoubleReg, 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_QuadReg, 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_CCReg, 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines rk_Y 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines enum KindTy { 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines k_Token, 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines k_Register, 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines k_Immediate, 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines k_MemoryReg, 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines k_MemoryImm 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } Kind; 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc StartLoc, EndLoc; 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct Token { 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *Data; 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Length; 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct RegOp { 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNum; 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegisterKind Kind; 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct ImmOp { 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Val; 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct MemOp { 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Base; 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned OffsetReg; 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Off; 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines union { 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct Token Tok; 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct RegOp Reg; 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct ImmOp Imm; 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct MemOp Mem; 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 179cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SparcOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {} 180cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isToken() const override { return Kind == k_Token; } 182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isReg() const override { return Kind == k_Register; } 183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isImm() const override { return Kind == k_Immediate; } 184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isMem() const override { return isMEMrr() || isMEMri(); } 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMEMrr() const { return Kind == k_MemoryReg; } 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMEMri() const { return Kind == k_MemoryImm; } 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isFloatReg() const { 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Kind == k_Register && Reg.Kind == rk_FloatReg); 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isFloatOrDoubleReg() const { 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Kind == k_Register && (Reg.Kind == rk_FloatReg 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines || Reg.Kind == rk_DoubleReg)); 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getToken() const { 19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == k_Token && "Invalid access!"); 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return StringRef(Tok.Data, Tok.Length); 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getReg() const override { 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((Kind == k_Register) && "Invalid access!"); 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Reg.RegNum; 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *getImm() const { 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((Kind == k_Immediate) && "Invalid access!"); 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Imm.Val; 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemBase() const { 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((Kind == k_MemoryReg || Kind == k_MemoryImm) && "Invalid access!"); 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.Base; 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemOffsetReg() const { 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((Kind == k_MemoryReg) && "Invalid access!"); 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.OffsetReg; 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *getMemOff() const { 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((Kind == k_MemoryImm) && "Invalid access!"); 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.Off; 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getStartLoc - Get the location of the first token of this operand. 229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SMLoc getStartLoc() const override { 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return StartLoc; 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getEndLoc - Get the location of the last token of this operand. 233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SMLoc getEndLoc() const override { 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return EndLoc; 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void print(raw_ostream &OS) const override { 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (Kind) { 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case k_Token: OS << "Token: " << getToken() << "\n"; break; 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case k_Register: OS << "Reg: #" << getReg() << "\n"; break; 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case k_Immediate: OS << "Imm: " << getImm() << "\n"; break; 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case k_MemoryReg: OS << "Mem: " << getMemBase() << "+" 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << getMemOffsetReg() << "\n"; break; 244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case k_MemoryImm: assert(getMemOff() != nullptr); 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "Mem: " << getMemBase() 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << "+" << *getMemOff() 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << "\n"; break; 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addRegOperands(MCInst &Inst, unsigned N) const { 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getReg())); 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addImmOperands(MCInst &Inst, unsigned N) const { 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Expr = getImm(); 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addExpr(Inst, Expr); 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addExpr(MCInst &Inst, const MCExpr *Expr) const{ 26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediate when possible. Null MCExpr = 0. 264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Expr) 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateImm(0)); 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateExpr(Expr)); 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addMEMrrOperands(MCInst &Inst, unsigned N) const { 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 2 && "Invalid number of operands!"); 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemBase())); 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(getMemOffsetReg() != 0 && "Invalid offset"); 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemOffsetReg())); 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addMEMriOperands(MCInst &Inst, unsigned N) const { 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 2 && "Invalid number of operands!"); 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemBase())); 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Expr = getMemOff(); 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addExpr(Inst, Expr); 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 290cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<SparcOperand> CreateToken(StringRef Str, SMLoc S) { 291cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Op = make_unique<SparcOperand>(k_Token); 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Tok.Data = Str.data(); 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Tok.Length = Str.size(); 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->StartLoc = S; 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->EndLoc = S; 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<SparcOperand> CreateReg(unsigned RegNum, unsigned Kind, 300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SMLoc S, SMLoc E) { 301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Op = make_unique<SparcOperand>(k_Register); 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Reg.RegNum = RegNum; 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Reg.Kind = (SparcOperand::RegisterKind)Kind; 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->StartLoc = S; 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->EndLoc = E; 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<SparcOperand> CreateImm(const MCExpr *Val, SMLoc S, 310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SMLoc E) { 311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Op = make_unique<SparcOperand>(k_Immediate); 31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Imm.Val = Val; 31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->StartLoc = S; 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->EndLoc = E; 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 318cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static bool MorphToDoubleReg(SparcOperand &Op) { 319cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned Reg = Op.getReg(); 320cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines assert(Op.Reg.Kind == rk_FloatReg); 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned regIdx = Reg - Sparc::F0; 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (regIdx % 2 || regIdx > 31) 323cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 324cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Op.Reg.RegNum = DoubleRegs[regIdx / 2]; 325cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Op.Reg.Kind = rk_DoubleReg; 326cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 329cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static bool MorphToQuadReg(SparcOperand &Op) { 330cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned Reg = Op.getReg(); 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned regIdx = 0; 332cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines switch (Op.Reg.Kind) { 333cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines default: llvm_unreachable("Unexpected register kind!"); 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case rk_FloatReg: 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines regIdx = Reg - Sparc::F0; 33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (regIdx % 4 || regIdx > 31) 337cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Reg = QuadFPRegs[regIdx / 4]; 33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case rk_DoubleReg: 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines regIdx = Reg - Sparc::D0; 34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (regIdx % 2 || regIdx > 31) 343cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Reg = QuadFPRegs[regIdx / 2]; 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 347cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Op.Reg.RegNum = Reg; 348cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Op.Reg.Kind = rk_QuadReg; 349cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 352cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<SparcOperand> 353cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MorphToMEMrr(unsigned Base, std::unique_ptr<SparcOperand> Op) { 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned offsetReg = Op->getReg(); 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Kind = k_MemoryReg; 35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.Base = Base; 35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.OffsetReg = offsetReg; 358dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Op->Mem.Off = nullptr; 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<SparcOperand> 363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines CreateMEMri(unsigned Base, const MCExpr *Off, SMLoc S, SMLoc E) { 364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Op = make_unique<SparcOperand>(k_MemoryImm); 36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.Base = Base; 36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.OffsetReg = 0; 36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.Off = Off; 36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->StartLoc = S; 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->EndLoc = E; 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 373cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<SparcOperand> 374cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MorphToMEMri(unsigned Base, std::unique_ptr<SparcOperand> Op) { 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Imm = Op->getImm(); 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Kind = k_MemoryImm; 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.Base = Base; 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.OffsetReg = 0; 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op->Mem.Off = Imm; 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 386cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool SparcAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 387cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OperandVector &Operands, 388cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCStreamer &Out, 389cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned &ErrorInfo, 390cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool MatchingInlineAsm) { 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCInst Inst; 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<MCInst, 8> Instructions; 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo, 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MatchingInlineAsm); 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (MatchResult) { 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Match_Success: { 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.setLoc(IDLoc); 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Out.EmitInstruction(Inst, STI); 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Match_MissingFeature: 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(IDLoc, 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "instruction requires a CPU feature not currently enabled"); 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Match_InvalidOperand: { 41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc ErrorLoc = IDLoc; 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ErrorInfo != ~0U) { 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ErrorInfo >= Operands.size()) 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(IDLoc, "too few operands for instruction"); 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 415cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ErrorLoc = ((SparcOperand &)*Operands[ErrorInfo]).getStartLoc(); 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ErrorLoc == SMLoc()) 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ErrorLoc = IDLoc; 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(ErrorLoc, "invalid operand for instruction"); 42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Match_MnemonicFail: 42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(IDLoc, "invalid instruction mnemonic"); 42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool SparcAsmParser:: 42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) 43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines{ 43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const AsmToken &Tok = Parser.getTok(); 43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StartLoc = Tok.getLoc(); 43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EndLoc = Tok.getEndLoc(); 43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = 0; 43536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().getKind() != AsmToken::Percent) 43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); 43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned regKind = SparcOperand::rk_None; 43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (matchRegisterName(Tok, RegNo, regKind)) { 44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); 44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 44336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(StartLoc, "invalid register name"); 44536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 44636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic void applyMnemonicAliases(StringRef &Mnemonic, unsigned Features, 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned VariantID); 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool SparcAsmParser::ParseInstruction(ParseInstructionInfo &Info, 451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef Name, SMLoc NameLoc, 452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OperandVector &Operands) { 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // First operand in MCInst is instruction mnemonic. 45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Operands.push_back(SparcOperand::CreateToken(Name, NameLoc)); 45636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // apply mnemonic aliases, if any, so that we can parse operands correctly. 45836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines applyMnemonicAliases(Name, getAvailableFeatures(), 0); 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().isNot(AsmToken::EndOfStatement)) { 46136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Read the first operand. 46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().is(AsmToken::Comma)) { 46336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (parseBranchModifiers(Operands) != MatchOperand_Success) { 46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc Loc = getLexer().getLoc(); 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.eatToEndOfStatement(); 46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(Loc, "unexpected token"); 46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (parseOperand(Operands, Name) != MatchOperand_Success) { 47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc Loc = getLexer().getLoc(); 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.eatToEndOfStatement(); 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(Loc, "unexpected token"); 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines while (getLexer().is(AsmToken::Comma)) { 47636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the comma. 47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Parse and remember the operand. 47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (parseOperand(Operands, Name) != MatchOperand_Success) { 47936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc Loc = getLexer().getLoc(); 48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.eatToEndOfStatement(); 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(Loc, "unexpected token"); 48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().isNot(AsmToken::EndOfStatement)) { 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc Loc = getLexer().getLoc(); 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.eatToEndOfStatement(); 48836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(Loc, "unexpected token"); 48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Consume the EndOfStatement. 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 49436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool SparcAsmParser:: 49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesParseDirective(AsmToken DirectiveID) 49636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines{ 49736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef IDVal = DirectiveID.getString(); 49836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 49936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (IDVal == ".byte") 50036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return parseDirectiveWord(1, DirectiveID.getLoc()); 50136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 50236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (IDVal == ".half") 50336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return parseDirectiveWord(2, DirectiveID.getLoc()); 50436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 50536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (IDVal == ".word") 50636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return parseDirectiveWord(4, DirectiveID.getLoc()); 50736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 50836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (IDVal == ".nword") 50936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return parseDirectiveWord(is64Bit() ? 8 : 4, DirectiveID.getLoc()); 51036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 51136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (is64Bit() && IDVal == ".xword") 51236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return parseDirectiveWord(8, DirectiveID.getLoc()); 51336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 51436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (IDVal == ".register") { 51536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // For now, ignore .register directive. 51636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.eatToEndOfStatement(); 51736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 51836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 51936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Let the MC layer to handle other directives. 52136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 52236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 52336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool SparcAsmParser:: parseDirectiveWord(unsigned Size, SMLoc L) { 52536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().isNot(AsmToken::EndOfStatement)) { 52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (;;) { 52736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Value; 52836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getParser().parseExpression(Value)) 52936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 53036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getParser().getStreamer().EmitValue(Value, Size); 53236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().is(AsmToken::EndOfStatement)) 53436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 53536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: Improve diagnostic. 53736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().isNot(AsmToken::Comma)) 53836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Error(L, "unexpected token in directive"); 53936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); 54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 54236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); 54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 546cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::OperandMatchResultTy 547cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::parseMEMOperand(OperandVector &Operands) { 54836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc S, E; 55036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned BaseReg = 0; 55136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ParseRegister(BaseReg, S, E)) { 55336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_NoMatch; 55436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 55536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (getLexer().getKind()) { 55736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: return MatchOperand_NoMatch; 55836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::Comma: 56036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::RBrac: 56136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::EndOfStatement: 562dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Operands.push_back(SparcOperand::CreateMEMri(BaseReg, nullptr, S, E)); 56336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_Success; 56436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 56536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken:: Plus: 56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the '+' 56736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 56836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::Minus: 56936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 57036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 57136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 572cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::unique_ptr<SparcOperand> Offset; 57336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OperandMatchResultTy ResTy = parseSparcAsmOperand(Offset); 57436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ResTy != MatchOperand_Success || !Offset) 57536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_NoMatch; 57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 577cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Operands.push_back( 578cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Offset->isImm() ? SparcOperand::MorphToMEMri(BaseReg, std::move(Offset)) 579cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : SparcOperand::MorphToMEMrr(BaseReg, std::move(Offset))); 58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 58136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_Success; 58236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 584cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::OperandMatchResultTy 585cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) { 58636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 58736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic); 58836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 58936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If there wasn't a custom match, try the generic matcher below. Otherwise, 59036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // there was a match, but an error occurred, in which case, just return that 59136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // the operand parsing failed. 59236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ResTy == MatchOperand_Success || ResTy == MatchOperand_ParseFail) 59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return ResTy; 59436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 59536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().is(AsmToken::LBrac)) { 59636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Memory operand 59736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Operands.push_back(SparcOperand::CreateToken("[", 59836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.getTok().getLoc())); 59936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the [ 60036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 60136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Mnemonic == "cas" || Mnemonic == "casx") { 60236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc S = Parser.getTok().getLoc(); 60336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (getLexer().getKind() != AsmToken::Percent) 60436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_NoMatch; 60536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // eat % 60636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 60736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNo, RegKind; 60836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!matchRegisterName(Parser.getTok(), RegNo, RegKind)) 60936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_NoMatch; 61036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 61136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the identifier token. 61236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer()-1); 61336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Operands.push_back(SparcOperand::CreateReg(RegNo, RegKind, S, E)); 61436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ResTy = MatchOperand_Success; 61536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 61636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ResTy = parseMEMOperand(Operands); 61736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 61836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 61936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ResTy != MatchOperand_Success) 62036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return ResTy; 62136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 62236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!getLexer().is(AsmToken::RBrac)) 62336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_ParseFail; 62436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 62536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Operands.push_back(SparcOperand::CreateToken("]", 62636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.getTok().getLoc())); 62736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the ] 62836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_Success; 62936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 63036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 631cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::unique_ptr<SparcOperand> Op; 63236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 63336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ResTy = parseSparcAsmOperand(Op, (Mnemonic == "call")); 63436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ResTy != MatchOperand_Success || !Op) 63536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_ParseFail; 63636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 63736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Push the parsed operand into the list of operands 638cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Operands.push_back(std::move(Op)); 63936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 64036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_Success; 64136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 64236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 64336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSparcAsmParser::OperandMatchResultTy 644cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Op, 645cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool isCall) { 64636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 64736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc S = Parser.getTok().getLoc(); 64836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 64936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *EVal; 65036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 651dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Op = nullptr; 65236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (getLexer().getKind()) { 65336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: break; 65436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 65536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::Percent: 65636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the '%'. 65736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNo; 65836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegKind; 65936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (matchRegisterName(Parser.getTok(), RegNo, RegKind)) { 66036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef name = Parser.getTok().getString(); 66136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the identifier token. 66236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 66336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (RegNo) { 66436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 66536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateReg(RegNo, RegKind, S, E); 66636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 66736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::Y: 66836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateToken("%y", S); 66936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 67036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 67136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::ICC: 67236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name == "xcc") 67336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateToken("%xcc", S); 67436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 67536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateToken("%icc", S); 67636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 67736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 67836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 68036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (matchSparcAsmModifiers(EVal, E)) { 68136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateImm(EVal, S, E); 68336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 68436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 68536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 68636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::Minus: 68736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::Integer: 68836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!getParser().parseExpression(EVal, E)) 68936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateImm(EVal, S, E); 69036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 69136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 69236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case AsmToken::Identifier: { 69336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Identifier; 69436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!getParser().parseIdentifier(Identifier)) { 69536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 69636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *Sym = getContext().GetOrCreateSymbol(Identifier); 69736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 69836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, 69936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getContext()); 70036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (isCall && 70136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_) 70236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res = SparcMCExpr::Create(SparcMCExpr::VK_Sparc_WPLT30, Res, 70336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getContext()); 70436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op = SparcOperand::CreateImm(Res, S, E); 70536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 70636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 70736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 70836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 70936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Op) ? MatchOperand_Success : MatchOperand_ParseFail; 71036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 71136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 712cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::OperandMatchResultTy 713cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcAsmParser::parseBranchModifiers(OperandVector &Operands) { 71436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 71536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // parse (,a|,pn|,pt)+ 71636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 71736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines while (getLexer().is(AsmToken::Comma)) { 71836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 71936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the comma 72036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 72136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!getLexer().is(AsmToken::Identifier)) 72236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_ParseFail; 72336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef modName = Parser.getTok().getString(); 72436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (modName == "a" || modName == "pn" || modName == "pt") { 72536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Operands.push_back(SparcOperand::CreateToken(modName, 72636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.getTok().getLoc())); 72736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // eat the identifier. 72836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 72936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 73036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MatchOperand_Success; 73136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 73236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 73336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool SparcAsmParser::matchRegisterName(const AsmToken &Tok, 73436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &RegNo, 73536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &RegKind) 73636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines{ 73736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t intVal = 0; 73836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = 0; 73936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_None; 74036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Tok.is(AsmToken::Identifier)) { 74136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef name = Tok.getString(); 74236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 74336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %fp 74436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.equals("fp")) { 74536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = Sparc::I6; 74636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 74736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 74836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 74936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %sp 75036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.equals("sp")) { 75136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = Sparc::O6; 75236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 75336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 75436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 75536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 75636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.equals("y")) { 75736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = Sparc::Y; 75836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_Y; 75936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 76036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 76136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 76236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.equals("icc")) { 76336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = Sparc::ICC; 76436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_CCReg; 76536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 76636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 76736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 76836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.equals("xcc")) { 76936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME:: check 64bit. 77036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = Sparc::ICC; 77136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_CCReg; 77236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 77336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 77436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 77536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %fcc0 - %fcc3 77636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 3).equals_lower("fcc") 77736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(3).getAsInteger(10, intVal) 77836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && intVal < 4) { 77936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: check 64bit and handle %fcc1 - %fcc3 78036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = Sparc::FCC0 + intVal; 78136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_CCReg; 78236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 78336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 78436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 78536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %g0 - %g7 78636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("g") 78736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1).getAsInteger(10, intVal) 78836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && intVal < 8) { 78936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = IntRegs[intVal]; 79036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 79136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 79236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 79336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %o0 - %o7 79436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("o") 79536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1).getAsInteger(10, intVal) 79636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && intVal < 8) { 79736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = IntRegs[8 + intVal]; 79836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 79936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 80036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 80136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("l") 80236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1).getAsInteger(10, intVal) 80336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && intVal < 8) { 80436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = IntRegs[16 + intVal]; 80536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 80636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 80736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 80836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("i") 80936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1).getAsInteger(10, intVal) 81036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && intVal < 8) { 81136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = IntRegs[24 + intVal]; 81236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 81336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 81436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 81536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %f0 - %f31 81636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("f") 81736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1, 2).getAsInteger(10, intVal) && intVal < 32) { 81836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = FloatRegs[intVal]; 81936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_FloatReg; 82036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 82136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 82236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %f32 - %f62 82336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("f") 82436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1, 2).getAsInteger(10, intVal) 82536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && intVal >= 32 && intVal <= 62 && (intVal % 2 == 0)) { 82636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: Check V9 82736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = DoubleRegs[intVal/2]; 82836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_DoubleReg; 82936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 83036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 83136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 83236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // %r0 - %r31 83336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (name.substr(0, 1).equals_lower("r") 83436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines && !name.substr(1, 2).getAsInteger(10, intVal) && intVal < 31) { 83536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = IntRegs[intVal]; 83636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegKind = SparcOperand::rk_IntReg; 83736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 83836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 84036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic bool hasGOTReference(const MCExpr *Expr) { 84436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (Expr->getKind()) { 84536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCExpr::Target: 84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const SparcMCExpr *SE = dyn_cast<SparcMCExpr>(Expr)) 84736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return hasGOTReference(SE->getSubExpr()); 84836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 84936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 85036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCExpr::Constant: 85136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 85236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 85336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCExpr::Binary: { 85436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr); 85536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return hasGOTReference(BE->getLHS()) || hasGOTReference(BE->getRHS()); 85636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 85736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 85836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCExpr::SymbolRef: { 85936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr); 86036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (SymRef.getSymbol().getName() == "_GLOBAL_OFFSET_TABLE_"); 86136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 86236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 86336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCExpr::Unary: 86436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return hasGOTReference(cast<MCUnaryExpr>(Expr)->getSubExpr()); 86536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 86636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 86736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 86836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 86936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool SparcAsmParser::matchSparcAsmModifiers(const MCExpr *&EVal, 87036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc &EndLoc) 87136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines{ 87236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AsmToken Tok = Parser.getTok(); 87336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Tok.is(AsmToken::Identifier)) 87436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 87536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 87636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef name = Tok.getString(); 87736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 87836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SparcMCExpr::VariantKind VK = SparcMCExpr::parseVariantKind(name); 87936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 88036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (VK == SparcMCExpr::VK_Sparc_None) 88136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 88236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 88336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the identifier. 88436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Parser.getTok().getKind() != AsmToken::LParen) 88536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 88636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 88736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Parser.Lex(); // Eat the LParen token. 88836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *subExpr; 88936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Parser.parseParenExpression(subExpr, EndLoc)) 89036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 89136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 89236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isPIC = getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_; 89336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 89436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch(VK) { 89536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: break; 89636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case SparcMCExpr::VK_Sparc_LO: 89736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VK = (hasGOTReference(subExpr) 89836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ? SparcMCExpr::VK_Sparc_PC10 89936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : (isPIC ? SparcMCExpr::VK_Sparc_GOT10 : VK)); 90036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 90136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case SparcMCExpr::VK_Sparc_HI: 90236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VK = (hasGOTReference(subExpr) 90336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ? SparcMCExpr::VK_Sparc_PC22 90436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : (isPIC ? SparcMCExpr::VK_Sparc_GOT22 : VK)); 90536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 90636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 90736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 90836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EVal = SparcMCExpr::Create(VK, subExpr, getContext()); 90936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 91036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 91136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 91236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 91336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesextern "C" void LLVMInitializeSparcAsmParser() { 91436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegisterMCAsmParser<SparcAsmParser> A(TheSparcTarget); 91536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegisterMCAsmParser<SparcAsmParser> B(TheSparcV9Target); 91636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 91736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 91836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define GET_REGISTER_MATCHER 91936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define GET_MATCHER_IMPLEMENTATION 92036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "SparcGenAsmMatcher.inc" 92136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 922cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesunsigned SparcAsmParser::validateTargetOperandClass(MCParsedAsmOperand &GOp, 923cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned Kind) { 924cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SparcOperand &Op = (SparcOperand &)GOp; 925cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (Op.isFloatOrDoubleReg()) { 92636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (Kind) { 92736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: break; 92836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCK_DFPRegs: 929cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!Op.isFloatReg() || SparcOperand::MorphToDoubleReg(Op)) 93036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MCTargetAsmParser::Match_Success; 93136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 93236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCK_QFPRegs: 93336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (SparcOperand::MorphToQuadReg(Op)) 93436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MCTargetAsmParser::Match_Success; 93536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 93636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 93736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 93836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Match_InvalidOperand; 93936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 940