Revert 42908 for now.
[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 def u64imm  : Operand<i64>;
26
27 //===----------------------------------------------------------------------===//
28 // Instruction format superclass
29 //===----------------------------------------------------------------------===//
30 // Alpha instruction baseline
31 class InstAlpha<bits<6> op, string asmstr, InstrItinClass itin> : Instruction {
32   field bits<32> Inst;
33   let Namespace = "Alpha";
34   let AsmString = asmstr;
35   let Inst{31-26} = op;
36   let Itinerary = itin;
37 }
38
39
40 //3.3.1
41 class MForm<bits<6> opcode, bit store, bit load, string asmstr, list<dag> pattern, InstrItinClass itin> 
42         : InstAlpha<opcode, asmstr, itin> {
43   let Pattern = pattern;
44   let isStore = store;
45   let isLoad = load;
46   let Defs = [R28]; //We may use this for frame index calculations, so reserve it here
47
48   bits<5> Ra;
49   bits<16> disp;
50   bits<5> Rb;
51
52   let Inst{25-21} = Ra;
53   let Inst{20-16} = Rb;
54   let Inst{15-0} = disp;
55 }
56 class MfcForm<bits<6> opcode, bits<16> fc, string asmstr, InstrItinClass itin> 
57         : InstAlpha<opcode, asmstr, itin> {    
58   bits<5> Ra;
59
60   let OutOperandList = (ops GPRC:$RA);
61   let InOperandList = (ops);
62   let Inst{25-21} = Ra;
63   let Inst{20-16} = 0;
64   let Inst{15-0} = fc;
65 }
66
67 class MbrForm<bits<6> opcode, bits<2> TB, dag OL, string asmstr, InstrItinClass itin>
68     : InstAlpha<opcode, asmstr, itin> {
69   bits<5> Ra;
70   bits<5> Rb;
71   bits<14> disp;
72
73   let OutOperandList = (ops);
74   let InOperandList = OL;
75
76   let Inst{25-21} = Ra;
77   let Inst{20-16} = Rb;
78   let Inst{15-14} = TB;
79   let Inst{13-0} = disp;
80 }
81 class MbrpForm<bits<6> opcode, bits<2> TB, dag OL, string asmstr, list<dag> pattern, InstrItinClass itin>
82     : InstAlpha<opcode, asmstr, itin> {
83   let Pattern=pattern;
84   bits<5> Ra;
85   bits<5> Rb;
86   bits<14> disp;
87
88   let OutOperandList = (ops);
89   let InOperandList = OL;
90
91   let Inst{25-21} = Ra;
92   let Inst{20-16} = Rb;
93   let Inst{15-14} = TB;
94   let Inst{13-0} = disp;
95 }
96
97 //3.3.2
98 def target : Operand<OtherVT> {}
99
100 let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in {
101 class BFormN<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
102    : InstAlpha<opcode, asmstr, itin> {
103   let OutOperandList = (ops);
104   let InOperandList = OL;
105   bits<64> Opc; //dummy
106   bits<5> Ra;
107   bits<21> disp;
108
109   let Inst{25-21} = Ra;
110   let Inst{20-0} = disp;
111 }
112 }
113
114 let isBranch = 1, isTerminator = 1 in
115 class BFormD<bits<6> opcode, string asmstr, list<dag> pattern, InstrItinClass itin> 
116     : InstAlpha<opcode, asmstr, itin> {
117   let Pattern = pattern;
118   let OutOperandList = (ops);
119   let InOperandList = (ops target:$DISP);
120   bits<5> Ra;
121   bits<21> disp;
122
123   let Inst{25-21} = Ra;
124   let Inst{20-0} = disp;
125 }
126
127 //3.3.3
128 class OForm<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> 
129     : InstAlpha<opcode, asmstr, itin> {
130   let Pattern = pattern;
131   let OutOperandList = (outs GPRC:$RC);
132   let InOperandList = (ins GPRC:$RA, GPRC:$RB);
133
134   bits<5> Rc;
135   bits<5> Ra;
136   bits<5> Rb;
137   bits<7> Function = fun;
138
139   let Inst{25-21} = Ra;
140   let Inst{20-16} = Rb;
141   let Inst{15-13} = 0;
142   let Inst{12} = 0;
143   let Inst{11-5} = Function;
144   let Inst{4-0} = Rc;
145 }
146
147 class OForm2<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> 
148     : InstAlpha<opcode, asmstr, itin> {
149   let Pattern = pattern;
150   let OutOperandList = (outs GPRC:$RC);
151   let InOperandList = (ins GPRC:$RB);
152
153   bits<5> Rc;
154   bits<5> Rb;
155   bits<7> Function = fun;
156
157   let Inst{25-21} = 31;
158   let Inst{20-16} = Rb;
159   let Inst{15-13} = 0;
160   let Inst{12} = 0;
161   let Inst{11-5} = Function;
162   let Inst{4-0} = Rc;
163 }
164
165 class OForm4<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> 
166     : InstAlpha<opcode, asmstr, itin> {
167   let Pattern = pattern;
168   let OutOperandList = (outs GPRC:$RDEST);
169   let InOperandList = (ins GPRC:$RCOND, GPRC:$RTRUE, GPRC:$RFALSE);
170   let Constraints = "$RFALSE = $RDEST";
171   let DisableEncoding = "$RFALSE";
172
173   bits<5> Rc;
174   bits<5> Ra;
175   bits<5> Rb;
176   bits<7> Function = fun;
177
178 //  let isTwoAddress = 1;
179   let Inst{25-21} = Ra;
180   let Inst{20-16} = Rb;
181   let Inst{15-13} = 0;
182   let Inst{12} = 0;
183   let Inst{11-5} = Function;
184   let Inst{4-0} = Rc;
185 }
186
187
188 class OFormL<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> 
189     : InstAlpha<opcode, asmstr, itin> {
190   let Pattern = pattern;
191   let OutOperandList = (outs GPRC:$RC);
192   let InOperandList = (ins GPRC:$RA, u8imm:$L);
193
194   bits<5> Rc;
195   bits<5> Ra;
196   bits<8> LIT;
197   bits<7> Function = fun;
198
199   let Inst{25-21} = Ra;
200   let Inst{20-13} = LIT;
201   let Inst{12} = 1;
202   let Inst{11-5} = Function;
203   let Inst{4-0} = Rc;
204 }
205
206 class OForm4L<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> 
207     : InstAlpha<opcode, asmstr, itin> {
208   let Pattern = pattern;
209   let OutOperandList = (outs GPRC:$RDEST);
210   let InOperandList = (ins GPRC:$RCOND, s64imm:$RTRUE, GPRC:$RFALSE);
211   let Constraints = "$RFALSE = $RDEST";
212   let DisableEncoding = "$RFALSE";
213
214   bits<5> Rc;
215   bits<5> Ra;
216   bits<8> LIT;
217   bits<7> Function = fun;
218
219 //  let isTwoAddress = 1;
220   let Inst{25-21} = Ra;
221   let Inst{20-13} = LIT;
222   let Inst{12} = 1;
223   let Inst{11-5} = Function;
224   let Inst{4-0} = Rc;
225 }
226
227 //3.3.4
228 class FPForm<bits<6> opcode, bits<11> fun, string asmstr, list<dag> pattern, InstrItinClass itin> 
229     : InstAlpha<opcode, asmstr, itin> {
230   let Pattern = pattern;
231
232   bits<5> Fc;
233   bits<5> Fa;
234   bits<5> Fb;
235   bits<11> Function = fun;
236
237   let Inst{25-21} = Fa;
238   let Inst{20-16} = Fb;
239   let Inst{15-5} = Function;
240   let Inst{4-0} = Fc;
241 }
242
243 //3.3.5
244 class PALForm<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
245     : InstAlpha<opcode, asmstr, itin> {
246   let OutOperandList = (ops);
247   let InOperandList = OL;
248   bits<26> Function;
249
250   let Inst{25-0} = Function;
251 }
252
253
254 // Pseudo instructions.
255 class PseudoInstAlpha<dag OOL, dag IOL, string nm, list<dag> pattern, InstrItinClass itin> 
256     : InstAlpha<0, nm, itin>  {
257   let OutOperandList = OOL;
258   let InOperandList = IOL;
259   let Pattern = pattern;
260
261 }