MipsInstrFormats.td revision a8de1c1be01fd32b16f018e3e9f55c90edc9d862
1//===- MipsInstrFormats.td - Mips Instruction Formats ------*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11//  Describe MIPS instructions format
12//
13//  CPU INSTRUCTION FORMATS
14//
15//  opcode  - operation code.
16//  rs      - src reg.
17//  rt      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
18//  rd      - dst reg, only used on 3 regs instr.
19//  shamt   - only used on shift instructions, contains the shift amount.
20//  funct   - combined with opcode field give us an operation code.
21//
22//===----------------------------------------------------------------------===//
23
24// Generic Mips Format
25class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
26               InstrItinClass itin>: Instruction
27{
28  field bits<32> Inst;
29
30  let Namespace = "Mips";
31
32  bits<6> opcode;
33
34  // Top 5 bits are the 'opcode' field
35  let Inst{31-26} = opcode;
36
37  dag OutOperandList = outs;
38  dag InOperandList  = ins;
39
40  let AsmString   = asmstr;
41  let Pattern     = pattern;
42  let Itinerary   = itin;
43}
44
45// Mips Pseudo Instructions Format
46class MipsPseudo<dag outs, dag ins, string asmstr, list<dag> pattern>:
47      MipsInst<outs, ins, asmstr, pattern, IIPseudo> {
48  let isPseudo = 1;
49}
50
51//===----------------------------------------------------------------------===//
52// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
53//===----------------------------------------------------------------------===//
54
55class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
56         list<dag> pattern, InstrItinClass itin>:
57      MipsInst<outs, ins, asmstr, pattern, itin>
58{
59  bits<5>  rd;
60  bits<5>  rs;
61  bits<5>  rt;
62  bits<5>  shamt;
63  bits<6>  funct;
64
65  let opcode = op;
66  let funct  = _funct;
67
68  let Inst{25-21} = rs;
69  let Inst{20-16} = rt;
70  let Inst{15-11} = rd;
71  let Inst{10-6}  = shamt;
72  let Inst{5-0}   = funct;
73}
74
75//===----------------------------------------------------------------------===//
76// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
77//===----------------------------------------------------------------------===//
78
79class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
80         InstrItinClass itin>: MipsInst<outs, ins, asmstr, pattern, itin>
81{
82  bits<5>  rt;
83  bits<5>  rs;
84  bits<16> imm16;
85
86  let opcode = op;
87
88  let Inst{25-21} = rs;
89  let Inst{20-16} = rt;
90  let Inst{15-0}  = imm16;
91}
92
93//===----------------------------------------------------------------------===//
94// Format J instruction class in Mips : <|opcode|address|>
95//===----------------------------------------------------------------------===//
96
97class FJ<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
98         InstrItinClass itin>: MipsInst<outs, ins, asmstr, pattern, itin>
99{
100  bits<26> addr;
101
102  let opcode = op;
103
104  let Inst{25-0} = addr;
105}
106
107//===----------------------------------------------------------------------===//
108//
109//  FLOATING POINT INSTRUCTION FORMATS
110//
111//  opcode  - operation code.
112//  fs      - src reg.
113//  ft      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
114//  fd      - dst reg, only used on 3 regs instr.
115//  fmt     - double or single precision.
116//  funct   - combined with opcode field give us an operation code.
117//
118//===----------------------------------------------------------------------===//
119
120//===----------------------------------------------------------------------===//
121// Format FR instruction class in Mips : <|opcode|fmt|ft|fs|fd|funct|>
122//===----------------------------------------------------------------------===//
123
124class FFR<bits<6> op, bits<6> _funct, bits<5> _fmt, dag outs, dag ins,
125          string asmstr, list<dag> pattern> :
126          MipsInst<outs, ins, asmstr, pattern, NoItinerary>
127{
128  bits<5>  fd;
129  bits<5>  fs;
130  bits<5>  ft;
131  bits<5>  fmt;
132  bits<6>  funct;
133
134  let opcode = op;
135  let funct  = _funct;
136  let fmt    = _fmt;
137
138  let Inst{25-21} = fmt;
139  let Inst{20-16} = ft;
140  let Inst{15-11} = fs;
141  let Inst{10-6}  = fd;
142  let Inst{5-0}   = funct;
143}
144
145//===----------------------------------------------------------------------===//
146// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
147//===----------------------------------------------------------------------===//
148
149class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
150          MipsInst<outs, ins, asmstr, pattern, NoItinerary>
151{
152  bits<5>  ft;
153  bits<5>  base;
154  bits<16> imm16;
155
156  let opcode = op;
157
158  let Inst{25-21} = base;
159  let Inst{20-16} = ft;
160  let Inst{15-0}  = imm16;
161}
162
163//===----------------------------------------------------------------------===//
164// Compare instruction class in Mips : <|010001|fmt|ft|fs|0000011|condcode|>
165//===----------------------------------------------------------------------===//
166
167class FCC<bits<5> _fmt, dag outs, dag ins, string asmstr, list<dag> pattern> :
168          MipsInst<outs, ins, asmstr, pattern, NoItinerary>
169{
170  bits<5>  fs;
171  bits<5>  ft;
172  bits<4>  cc;
173  bits<5>  fmt;
174
175  let opcode = 0x11;
176  let fmt    = _fmt;
177
178  let Inst{25-21} = fmt;
179  let Inst{20-16} = ft;
180  let Inst{15-11} = fs;
181  let Inst{10-6}  = 0;
182  let Inst{5-4}   = 0b11;
183  let Inst{3-0}   = cc;
184}
185
186
187class FCMOV<bits<1> _tf, dag outs, dag ins, string asmstr,
188            list<dag> pattern> :
189  MipsInst<outs, ins, asmstr, pattern, NoItinerary>
190{
191  bits<5>  rd;
192  bits<5>  rs;
193  bits<3>  N;
194  bits<1>  tf;
195
196  let opcode = 0;
197  let tf = _tf;
198
199  let Inst{25-21} = rs;
200  let Inst{20-18} = N;
201  let Inst{17} = 0;
202  let Inst{16} = tf;
203  let Inst{15-11} = rd;
204  let Inst{10-6}  = 0;
205  let Inst{5-0}   = 1;
206}
207
208class FFCMOV<bits<5> _fmt, bits<1> _tf, dag outs, dag ins, string asmstr,
209             list<dag> pattern> :
210  MipsInst<outs, ins, asmstr, pattern, NoItinerary>
211{
212  bits<5>  fd;
213  bits<5>  fs;
214  bits<3>  N;
215  bits<5>  fmt;
216  bits<1>  tf;
217
218  let opcode = 17;
219  let fmt = _fmt;
220  let tf = _tf;
221
222  let Inst{25-21} = fmt;
223  let Inst{20-18} = N;
224  let Inst{17} = 0;
225  let Inst{16} = tf;
226  let Inst{15-11} = fs;
227  let Inst{10-6}  = fd;
228  let Inst{5-0}   = 17;
229}
230
231// FP unary instructions without patterns.
232class FFR1<bits<6> funct, bits<5> fmt, string opstr, string fmtstr,
233           RegisterClass DstRC, RegisterClass SrcRC> :
234  FFR<0x11, funct, fmt, (outs DstRC:$fd), (ins SrcRC:$fs),
235      !strconcat(opstr, ".", fmtstr, "\t$fd, $fs"), []> {
236  let ft = 0;
237}
238
239// FP unary instructions with patterns.
240class FFR1P<bits<6> funct, bits<5> fmt, string opstr, string fmtstr,
241            RegisterClass DstRC, RegisterClass SrcRC, SDNode OpNode> :
242  FFR<0x11, funct, fmt, (outs DstRC:$fd), (ins SrcRC:$fs),
243      !strconcat(opstr, ".", fmtstr, "\t$fd, $fs"),
244      [(set DstRC:$fd, (OpNode SrcRC:$fs))]> {
245  let ft = 0;
246}
247
248