clean this function up some
[oota-llvm.git] / lib / Target / Alpha / AlphaInstrFormats.td
1 //===- AlphaInstrFormats.td - Alpha Instruction Formats ----*- tablegen -*-===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 //
11 //===----------------------------------------------------------------------===//
12
13 //3.3:
14 //Memory
15 //Branch
16 //Operate
17 //Floating-point
18 //PALcode
19
20 def u8imm   : Operand<i64>;
21 def s14imm  : Operand<i64>;
22 def s16imm  : Operand<i64>;
23 def s21imm  : Operand<i64>;
24 def s64imm  : Operand<i64>;
25
26 //===----------------------------------------------------------------------===//
27 // Instruction format superclass
28 //===----------------------------------------------------------------------===//
29 // Alpha instruction baseline
30 class InstAlphaAlt<bits<6> op, string asmstr> : Instruction {
31   field bits<32> Inst;
32   let Namespace = "Alpha";
33   let AsmString = asmstr;
34   let Inst{31-26} = op;
35 }
36
37 class InstAlpha<bits<6> op, dag OL, string asmstr> 
38 : InstAlphaAlt<op, asmstr> { // Alpha instruction baseline
39   let OperandList = OL;
40 }
41
42 //3.3.1
43 class MForm<bits<6> opcode, bit store, bit load, string asmstr, list<dag> pattern> 
44         : InstAlphaAlt<opcode, asmstr> {
45   let Pattern = pattern;
46   let isStore = store;
47   let isLoad = load;
48
49   bits<5> Ra;
50   bits<16> disp;
51   bits<5> Rb;
52
53   let Inst{25-21} = Ra;
54   let Inst{20-16} = Rb;
55   let Inst{15-0} = disp;
56 }
57 class MFormAlt<bits<6> opcode, string asmstr> 
58         : InstAlphaAlt<opcode, asmstr> {
59   bits<5> Ra;
60   bits<16> disp;
61   bits<5> Rb;
62
63   let Inst{25-21} = Ra;
64   let Inst{20-16} = Rb;
65   let Inst{15-0} = disp;
66 }
67 class MfcForm<bits<6> opcode, bits<16> fc, string asmstr> 
68         : InstAlpha<opcode, (ops GPRC:$RA, GPRC:$RB), asmstr> {
69   bits<5> Ra;
70   bits<5> Rb;
71
72   let Inst{25-21} = Ra;
73   let Inst{20-16} = Rb;
74   let Inst{15-0} = fc;
75 }
76
77 class MbrForm<bits<6> opcode, bits<2> TB, dag OL, string asmstr> : InstAlpha<opcode, OL, asmstr> {
78   bits<5> Ra;
79   bits<5> Rb;
80   bits<14> disp;
81
82   let Inst{25-21} = Ra;
83   let Inst{20-16} = Rb;
84   let Inst{15-14} = TB;
85   let Inst{13-0} = disp;
86 }
87
88 //3.3.2
89 let isBranch = 1, isTerminator = 1 in
90 class BForm<bits<6> opcode, string asmstr> 
91     : InstAlpha<opcode, (ops GPRC:$RA, s21imm:$DISP), asmstr> {
92   bits<5> Ra;
93   bits<21> disp;
94
95   let Inst{25-21} = Ra;
96   let Inst{20-0} = disp;
97 }
98 def target : Operand<OtherVT> {}
99 let isBranch = 1, isTerminator = 1 in
100 class BFormD<bits<6> opcode, string asmstr, list<dag> pattern> 
101     : InstAlpha<opcode, (ops target:$DISP), asmstr> {
102   let Pattern = pattern;
103
104   bits<5> Ra;
105   bits<21> disp;
106
107   let Inst{25-21} = Ra;
108   let Inst{20-0} = disp;
109 }
110
111 let isBranch = 1, isTerminator = 1 in
112 class FBForm<bits<6> opcode, string asmstr> 
113     : InstAlpha<opcode, (ops F8RC:$RA, s21imm:$DISP), asmstr> {
114   bits<5> Ra;
115   bits<21> disp;
116
117   let Inst{25-21} = Ra;
118   let Inst{20-0} = disp;
119 }
120
121 //3.3.3
122 class OForm<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern> 
123         : InstAlpha<opcode, (ops GPRC:$RC, GPRC:$RA, GPRC:$RB), asmstr> {
124   let Pattern = pattern;
125
126   bits<5> Rc;
127   bits<5> Ra;
128   bits<5> Rb;
129   bits<7> Function = fun;
130
131   let Inst{25-21} = Ra;
132   let Inst{20-16} = Rb;
133   let Inst{15-13} = 0;
134   let Inst{12} = 0;
135   let Inst{11-5} = Function;
136   let Inst{4-0} = Rc;
137 }
138
139 class OForm2<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern> 
140         : InstAlpha<opcode, (ops GPRC:$RC, GPRC:$RB), asmstr> {
141   let Pattern = pattern;
142
143   bits<5> Rc;
144   bits<5> Rb;
145   bits<7> Function = fun;
146
147   let Inst{25-21} = 31;
148   let Inst{20-16} = Rb;
149   let Inst{15-13} = 0;
150   let Inst{12} = 0;
151   let Inst{11-5} = Function;
152   let Inst{4-0} = Rc;
153 }
154
155 class OForm4<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern> 
156         : InstAlphaAlt<opcode, asmstr> {
157   let Pattern = pattern;
158
159   bits<5> Rc;
160   bits<5> Rb;
161   bits<5> Ra;
162   bits<7> Function = fun;
163
164   let isTwoAddress = 1;
165   let Inst{25-21} = Ra;
166   let Inst{20-16} = Rb;
167   let Inst{15-13} = 0;
168   let Inst{12} = 0;
169   let Inst{11-5} = Function;
170   let Inst{4-0} = Rc;
171 }
172
173
174 class OFormL<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern> 
175         : InstAlpha<opcode, (ops GPRC:$RC, GPRC:$RA, u8imm:$L), asmstr> {
176   let Pattern = pattern;
177
178   bits<5> Rc;
179   bits<5> Ra;
180   bits<8> LIT;
181   bits<7> Function = fun;
182
183   let Inst{25-21} = Ra;
184   let Inst{20-13} = LIT;
185   let Inst{12} = 1;
186   let Inst{11-5} = Function;
187   let Inst{4-0} = Rc;
188 }
189
190 class OForm4L<bits<6> opcode, bits<7> fun, string asmstr> 
191         : InstAlpha<opcode, (ops GPRC:$RDEST, GPRC:$RSRC2, u8imm:$L, GPRC:$RCOND), asmstr> {
192   bits<5> Rc;
193   bits<8> LIT;
194   bits<5> Ra;
195   bits<7> Function = fun;
196
197   let isTwoAddress = 1;
198   let Inst{25-21} = Ra;
199   let Inst{20-13} = LIT;
200   let Inst{12} = 1;
201   let Inst{11-5} = Function;
202   let Inst{4-0} = Rc;
203 }
204
205 //3.3.4
206 class FPForm<bits<6> opcode, bits<11> fun, string asmstr, list<dag> pattern> 
207         : InstAlphaAlt<opcode, asmstr> {
208   let Pattern = pattern;
209
210   bits<5> Fc;
211   bits<5> Fa;
212   bits<5> Fb;
213   bits<11> Function = fun;
214
215   let Inst{25-21} = Fa;
216   let Inst{20-16} = Fb;
217   let Inst{15-5} = Function;
218   let Inst{4-0} = Fc;
219 }
220
221 //3.3.5
222 class PALForm<bits<6> opcode, dag OL, string asmstr> : InstAlpha<opcode, OL, asmstr> {
223   bits<26> Function;
224
225   let Inst{25-0} = Function;
226 }
227
228
229 // Pseudo instructions.
230 class PseudoInstAlpha<dag OL, string nm, list<dag> pattern> : InstAlpha<0, OL, nm>  {
231   let Pattern = pattern;
232
233 }