blob: 0853272f7280e31c3f220b0702b6fb7d841aa46f [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===- MipsRegisterInfo.td - Mips Register defs -----------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11// Describe MIPS instructions format
12//
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +000013// CPU INSTRUCTION FORMATS
Dan Gohmanf17a25c2007-07-18 16:29:46 +000014//
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
Bruno Cardoso Lopesd5c93b02007-08-18 02:01:28 +000025class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
26 InstrItinClass itin>: Instruction
Dan Gohmanf17a25c2007-07-18 16:29:46 +000027{
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
Evan Chengb783fa32007-07-19 01:14:50 +000037 dag OutOperandList = outs;
Bruno Cardoso Lopesd5c93b02007-08-18 02:01:28 +000038 dag InOperandList = ins;
39
Dan Gohmanf17a25c2007-07-18 16:29:46 +000040 let AsmString = asmstr;
41 let Pattern = pattern;
Bruno Cardoso Lopes75971a02007-08-21 16:06:45 +000042 let Itinerary = itin;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000043}
44
Bruno Cardoso Lopes2cacce92007-10-09 02:55:31 +000045// Mips Pseudo Instructions Format
Bruno Cardoso Lopesed7723d2008-06-06 00:58:26 +000046class MipsPseudo<dag outs, dag ins, string asmstr, list<dag> pattern>:
Bruno Cardoso Lopes2cacce92007-10-09 02:55:31 +000047 MipsInst<outs, ins, asmstr, pattern, IIPseudo>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000048
49//===----------------------------------------------------------------------===//
50// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
51//===----------------------------------------------------------------------===//
52
Evan Chengb783fa32007-07-19 01:14:50 +000053class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
Bruno Cardoso Lopesd5c93b02007-08-18 02:01:28 +000054 list<dag> pattern, InstrItinClass itin>:
55 MipsInst<outs, ins, asmstr, pattern, itin>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000056{
57 bits<5> rd;
58 bits<5> rs;
59 bits<5> rt;
60 bits<5> shamt;
61 bits<6> funct;
62
63 let opcode = op;
64 let funct = _funct;
65
66 let Inst{25-21} = rs;
67 let Inst{20-16} = rt;
68 let Inst{15-11} = rd;
69 let Inst{10-6} = shamt;
70 let Inst{5-0} = funct;
71}
72
73//===----------------------------------------------------------------------===//
74// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
75//===----------------------------------------------------------------------===//
76
Bruno Cardoso Lopesd5c93b02007-08-18 02:01:28 +000077class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
78 InstrItinClass itin>: MipsInst<outs, ins, asmstr, pattern, itin>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000079{
80 bits<5> rt;
81 bits<5> rs;
82 bits<16> imm16;
83
84 let opcode = op;
85
86 let Inst{25-21} = rs;
87 let Inst{20-16} = rt;
88 let Inst{15-0} = imm16;
89}
90
91//===----------------------------------------------------------------------===//
92// Format J instruction class in Mips : <|opcode|address|>
93//===----------------------------------------------------------------------===//
94
Bruno Cardoso Lopesd5c93b02007-08-18 02:01:28 +000095class FJ<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
96 InstrItinClass itin>: MipsInst<outs, ins, asmstr, pattern, itin>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000097{
98 bits<26> addr;
99
100 let opcode = op;
101
102 let Inst{25-0} = addr;
103}
Bruno Cardoso Lopes2cacce92007-10-09 02:55:31 +0000104
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000105//===----------------------------------------------------------------------===//
106//
Bruno Cardoso Lopes68011702008-07-09 04:45:36 +0000107// FLOATING POINT INSTRUCTION FORMATS
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000108//
109// opcode - operation code.
110// fs - src reg.
111// ft - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
112// fd - dst reg, only used on 3 regs instr.
113// fmt - double or single precision.
114// funct - combined with opcode field give us an operation code.
115//
116//===----------------------------------------------------------------------===//
117
118//===----------------------------------------------------------------------===//
119// Format FR instruction class in Mips : <|opcode|fmt|ft|fs|fd|funct|>
120//===----------------------------------------------------------------------===//
121
122class FFR<bits<6> op, bits<6> _funct, bits<5> _fmt, dag outs, dag ins,
Bruno Cardoso Lopes4fb1f542008-07-05 19:05:21 +0000123 string asmstr, list<dag> pattern> :
124 MipsInst<outs, ins, asmstr, pattern, NoItinerary>
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000125{
126 bits<5> fd;
127 bits<5> fs;
128 bits<5> ft;
129 bits<5> fmt;
130 bits<6> funct;
131
132 let opcode = op;
133 let funct = _funct;
134 let fmt = _fmt;
135
136 let Inst{25-21} = fmt;
137 let Inst{20-16} = ft;
138 let Inst{15-11} = fs;
139 let Inst{10-6} = fd;
140 let Inst{5-0} = funct;
141}
142
143//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes4fb1f542008-07-05 19:05:21 +0000144// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000145//===----------------------------------------------------------------------===//
146
Bruno Cardoso Lopes4fb1f542008-07-05 19:05:21 +0000147class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
148 MipsInst<outs, ins, asmstr, pattern, NoItinerary>
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000149{
150 bits<5> ft;
Bruno Cardoso Lopes4fb1f542008-07-05 19:05:21 +0000151 bits<5> base;
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000152 bits<16> imm16;
153
154 let opcode = op;
Bruno Cardoso Lopes4fb1f542008-07-05 19:05:21 +0000155
156 let Inst{25-21} = base;
157 let Inst{20-16} = ft;
158 let Inst{15-0} = imm16;
159}
160
161//===----------------------------------------------------------------------===//
162// Compare instruction class in Mips : <|010001|fmt|ft|fs|0000011|condcode|>
163//===----------------------------------------------------------------------===//
164
165class FCC<bits<5> _fmt, dag outs, dag ins, string asmstr, list<dag> pattern> :
166 MipsInst<outs, ins, asmstr, pattern, NoItinerary>
167{
168 bits<5> fs;
169 bits<5> ft;
170 bits<4> cc;
171 bits<5> fmt;
172
173 let opcode = 0x11;
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000174 let fmt = _fmt;
175
176 let Inst{25-21} = fmt;
177 let Inst{20-16} = ft;
Bruno Cardoso Lopes4fb1f542008-07-05 19:05:21 +0000178 let Inst{15-11} = fs;
179 let Inst{10-6} = 0;
180 let Inst{5-4} = 0b11;
181 let Inst{3-0} = cc;
Bruno Cardoso Lopes60727e32008-06-08 01:39:36 +0000182}