blob: 29a7ac825f171e59464958b769afb43f5265706c [file] [log] [blame]
Jia Liuc5707112012-02-17 08:55:11 +00001//===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===//
Rafael Espindolafddf8042012-01-11 03:56:41 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "MCTargetDesc/MipsMCTargetDesc.h"
11#include "llvm/MC/MCParser/MCAsmLexer.h"
12#include "llvm/MC/MCTargetAsmParser.h"
13#include "llvm/Support/TargetRegistry.h"
Akira Hatanaka72e9b6a2012-08-17 20:16:42 +000014#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
15#include "llvm/MC/MCTargetAsmParser.h"
16#include "llvm/MC/MCInst.h"
17#include "llvm/MC/MCExpr.h"
18#include "llvm/Support/MathExtras.h"
Rafael Espindolafddf8042012-01-11 03:56:41 +000019
20using namespace llvm;
21
22namespace {
23class MipsAsmParser : public MCTargetAsmParser {
Akira Hatanaka72e9b6a2012-08-17 20:16:42 +000024
25#define GET_ASSEMBLER_HEADER
26#include "MipsGenAsmMatcher.inc"
27
Rafael Espindolafddf8042012-01-11 03:56:41 +000028 bool MatchAndEmitInstruction(SMLoc IDLoc,
29 SmallVectorImpl<MCParsedAsmOperand*> &Operands,
30 MCStreamer &Out);
31
32 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
33
34 bool ParseInstruction(StringRef Name, SMLoc NameLoc,
Akira Hatanaka72e9b6a2012-08-17 20:16:42 +000035 SmallVectorImpl<MCParsedAsmOperand*> &Operands);
Rafael Espindolafddf8042012-01-11 03:56:41 +000036
37 bool ParseDirective(AsmToken DirectiveID);
38
Akira Hatanaka72e9b6a2012-08-17 20:16:42 +000039 OperandMatchResultTy parseMemOperand(SmallVectorImpl<MCParsedAsmOperand*>&);
Chad Rosier038f3e32012-09-03 18:47:45 +000040
Chad Rosier5d637d72012-09-05 01:15:43 +000041 unsigned getMCInstOperandNum(unsigned Kind, MCInst &Inst,
Chad Rosier038f3e32012-09-03 18:47:45 +000042 const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
Chad Rosier2cc97de2012-09-03 20:31:23 +000043 unsigned OperandNum, unsigned &NumMCOperands);
Chad Rosier038f3e32012-09-03 18:47:45 +000044
Rafael Espindolafddf8042012-01-11 03:56:41 +000045public:
46 MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
47 : MCTargetAsmParser() {
48 }
49
50};
51}
52
Akira Hatanaka72e9b6a2012-08-17 20:16:42 +000053namespace {
54
55/// MipsOperand - Instances of this class represent a parsed Mips machine
56/// instruction.
57class MipsOperand : public MCParsedAsmOperand {
58 enum KindTy {
59 k_CondCode,
60 k_CoprocNum,
61 k_Immediate,
62 k_Memory,
63 k_PostIndexRegister,
64 k_Register,
65 k_Token
66 } Kind;
67
68 MipsOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
69public:
70 void addRegOperands(MCInst &Inst, unsigned N) const {
71 llvm_unreachable("unimplemented!");
72 }
73 void addExpr(MCInst &Inst, const MCExpr *Expr) const{
74 llvm_unreachable("unimplemented!");
75 }
76 void addImmOperands(MCInst &Inst, unsigned N) const {
77 llvm_unreachable("unimplemented!");
78 }
79 void addMemOperands(MCInst &Inst, unsigned N) const {
80 llvm_unreachable("unimplemented!");
81 }
82
83 bool isReg() const { return Kind == k_Register; }
84 bool isImm() const { return Kind == k_Immediate; }
85 bool isToken() const { return Kind == k_Token; }
86 bool isMem() const { return Kind == k_Memory; }
87
88 StringRef getToken() const {
89 assert(Kind == k_Token && "Invalid access!");
90 return "";
91 }
92
93 unsigned getReg() const {
94 assert((Kind == k_Register) && "Invalid access!");
95 return 0;
96 }
97
98 virtual void print(raw_ostream &OS) const {
99 llvm_unreachable("unimplemented!");
100 }
101};
102}
103
Chad Rosier038f3e32012-09-03 18:47:45 +0000104unsigned MipsAsmParser::
Chad Rosier5d637d72012-09-05 01:15:43 +0000105getMCInstOperandNum(unsigned Kind, MCInst &Inst,
Chad Rosier038f3e32012-09-03 18:47:45 +0000106 const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
Chad Rosier2cc97de2012-09-03 20:31:23 +0000107 unsigned OperandNum, unsigned &NumMCOperands) {
Chad Rosier5d637d72012-09-05 01:15:43 +0000108 assert (0 && "getMCInstOperandNum() not supported by the Mips target.");
Chad Rosierefeaae82012-09-03 19:04:35 +0000109 // The Mips backend doesn't currently include the matcher implementation, so
Chad Rosier5d637d72012-09-05 01:15:43 +0000110 // the getMCInstOperandNumImpl() is undefined. This is a temporary
Chad Rosierefeaae82012-09-03 19:04:35 +0000111 // work around.
Chad Rosier2cc97de2012-09-03 20:31:23 +0000112 NumMCOperands = 0;
Chad Rosier038f3e32012-09-03 18:47:45 +0000113 return 0;
114}
115
Rafael Espindolafddf8042012-01-11 03:56:41 +0000116bool MipsAsmParser::
117MatchAndEmitInstruction(SMLoc IDLoc,
118 SmallVectorImpl<MCParsedAsmOperand*> &Operands,
119 MCStreamer &Out) {
120 return true;
121}
122
123bool MipsAsmParser::
124ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) {
125 return true;
126}
127
128bool MipsAsmParser::
129ParseInstruction(StringRef Name, SMLoc NameLoc,
130 SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
131 return true;
132}
133
134bool MipsAsmParser::
135ParseDirective(AsmToken DirectiveID) {
136 return true;
137}
138
Akira Hatanaka72e9b6a2012-08-17 20:16:42 +0000139MipsAsmParser::OperandMatchResultTy MipsAsmParser::
140 parseMemOperand(SmallVectorImpl<MCParsedAsmOperand*>&) {
141 return MatchOperand_ParseFail;
142}
143
Rafael Espindolafddf8042012-01-11 03:56:41 +0000144extern "C" void LLVMInitializeMipsAsmParser() {
145 RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget);
146 RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget);
147 RegisterMCAsmParser<MipsAsmParser> A(TheMips64Target);
148 RegisterMCAsmParser<MipsAsmParser> B(TheMips64elTarget);
149}