blob: ac5481aed6c05eb7f6d6da3dcec0d211de1fb3ae [file] [log] [blame]
Misha Brukmanffe99682005-02-05 02:24:26 +00001//===- AlphaInstrFormats.td - Alpha Instruction Formats ----*- tablegen -*-===//
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +00002//
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
Andrew Lenharth7b698672005-10-20 00:28:31 +000020def u8imm : Operand<i64>;
21def s14imm : Operand<i64>;
22def s16imm : Operand<i64>;
23def s21imm : Operand<i64>;
Andrew Lenharth02daecc2005-07-22 20:50:29 +000024def s64imm : Operand<i64>;
25
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000026//===----------------------------------------------------------------------===//
27// Instruction format superclass
28//===----------------------------------------------------------------------===//
Andrew Lenharth97a7fcf2005-11-09 19:17:08 +000029// Alpha instruction baseline
30class InstAlphaAlt<bits<6> op, string asmstr> : Instruction {
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000031 field bits<32> Inst;
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000032 let Namespace = "Alpha";
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000033 let AsmString = asmstr;
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000034 let Inst{31-26} = op;
35}
36
Andrew Lenharth97a7fcf2005-11-09 19:17:08 +000037class InstAlpha<bits<6> op, dag OL, string asmstr>
38: InstAlphaAlt<op, asmstr> { // Alpha instruction baseline
39 let OperandList = OL;
40}
41
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000042//3.3.1
Andrew Lenharthb9aaea32005-12-24 07:34:33 +000043class MForm<bits<6> opcode, bit store, bit load, string asmstr, list<dag> pattern>
Andrew Lenharth636e1ae2005-12-24 03:41:56 +000044 : InstAlphaAlt<opcode, asmstr> {
45 let Pattern = pattern;
Andrew Lenharthb9aaea32005-12-24 07:34:33 +000046 let isStore = store;
47 let isLoad = load;
Andrew Lenharth153f8082006-01-26 03:22:07 +000048 let Defs = [R28]; //We may use this for frame index calculations, so reserve it here
Andrew Lenharth636e1ae2005-12-24 03:41:56 +000049
50 bits<5> Ra;
51 bits<16> disp;
52 bits<5> Rb;
53
54 let Inst{25-21} = Ra;
55 let Inst{20-16} = Rb;
56 let Inst{15-0} = disp;
57}
Andrew Lenharth6db615d2005-11-30 07:19:56 +000058
Andrew Lenharth01aa5632005-11-11 16:47:30 +000059class MfcForm<bits<6> opcode, bits<16> fc, string asmstr>
Andrew Lenharth34380b72006-01-16 21:22:38 +000060 : InstAlpha<opcode, (ops GPRC:$RA), asmstr> {
Andrew Lenharth01aa5632005-11-11 16:47:30 +000061 bits<5> Ra;
Andrew Lenharth01aa5632005-11-11 16:47:30 +000062
63 let Inst{25-21} = Ra;
Andrew Lenharth34380b72006-01-16 21:22:38 +000064 let Inst{20-16} = 0;
Andrew Lenharth01aa5632005-11-11 16:47:30 +000065 let Inst{15-0} = fc;
66}
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000067
Andrew Lenharth02daecc2005-07-22 20:50:29 +000068class MbrForm<bits<6> opcode, bits<2> TB, dag OL, string asmstr> : InstAlpha<opcode, OL, asmstr> {
69 bits<5> Ra;
70 bits<5> Rb;
71 bits<14> disp;
72
73 let Inst{25-21} = Ra;
74 let Inst{20-16} = Rb;
75 let Inst{15-14} = TB;
76 let Inst{13-0} = disp;
77}
78
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +000079//3.3.2
Andrew Lenharthf5200932005-12-25 17:36:48 +000080def target : Operand<OtherVT> {}
Andrew Lenharth29b7ef02005-12-06 20:40:34 +000081let isBranch = 1, isTerminator = 1 in
Andrew Lenharthf5200932005-12-25 17:36:48 +000082class BFormD<bits<6> opcode, string asmstr, list<dag> pattern>
83 : InstAlpha<opcode, (ops target:$DISP), asmstr> {
84 let Pattern = pattern;
85
86 bits<5> Ra;
Andrew Lenharth5a990412005-10-22 22:06:58 +000087 bits<21> disp;
88
89 let Inst{25-21} = Ra;
90 let Inst{20-0} = disp;
91}
Andrew Lenharth6bec63a2006-01-01 22:16:14 +000092let isBranch = 1, isTerminator = 1 in
93class BFormDG<bits<6> opcode, string asmstr, list<dag> pattern>
94 : InstAlpha<opcode, (ops GPRC:$RA, target:$DISP), asmstr> {
95 let Pattern = pattern;
96
97 bits<5> Ra;
98 bits<21> disp;
99
100 let Inst{25-21} = Ra;
101 let Inst{20-0} = disp;
102}
Andrew Lenharth02daecc2005-07-22 20:50:29 +0000103
104let isBranch = 1, isTerminator = 1 in
Andrew Lenharth6bec63a2006-01-01 22:16:14 +0000105class FBForm<bits<6> opcode, string asmstr, list<dag> pattern>
106 : InstAlpha<opcode, (ops F8RC:$RA, target:$DISP), asmstr> {
107 let Pattern = pattern;
108
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000109 bits<5> Ra;
110 bits<21> disp;
111
112 let Inst{25-21} = Ra;
113 let Inst{20-0} = disp;
114}
115
116//3.3.3
Andrew Lenharth7b698672005-10-20 00:28:31 +0000117class OForm<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern>
Andrew Lenharth02daecc2005-07-22 20:50:29 +0000118 : InstAlpha<opcode, (ops GPRC:$RC, GPRC:$RA, GPRC:$RB), asmstr> {
Andrew Lenharth7b698672005-10-20 00:28:31 +0000119 let Pattern = pattern;
120
Andrew Lenharth02daecc2005-07-22 20:50:29 +0000121 bits<5> Rc;
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000122 bits<5> Ra;
123 bits<5> Rb;
Andrew Lenharth02daecc2005-07-22 20:50:29 +0000124 bits<7> Function = fun;
125
126 let Inst{25-21} = Ra;
127 let Inst{20-16} = Rb;
128 let Inst{15-13} = 0;
129 let Inst{12} = 0;
130 let Inst{11-5} = Function;
131 let Inst{4-0} = Rc;
132}
133
Andrew Lenhartha6a23b52005-10-20 23:58:36 +0000134class OForm2<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern>
Andrew Lenharthd4c0ed72005-10-20 19:39:24 +0000135 : InstAlpha<opcode, (ops GPRC:$RC, GPRC:$RB), asmstr> {
136 let Pattern = pattern;
137
138 bits<5> Rc;
139 bits<5> Rb;
140 bits<7> Function = fun;
141
Andrew Lenharth5a990412005-10-22 22:06:58 +0000142 let Inst{25-21} = 31;
Andrew Lenharthd4c0ed72005-10-20 19:39:24 +0000143 let Inst{20-16} = Rb;
144 let Inst{15-13} = 0;
145 let Inst{12} = 0;
146 let Inst{11-5} = Function;
147 let Inst{4-0} = Rc;
148}
149
Andrew Lenharthe788bbf2005-12-06 00:33:53 +0000150class OForm4<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern>
Andrew Lenharth3c7c4d72005-12-05 23:19:44 +0000151 : InstAlphaAlt<opcode, asmstr> {
152 let Pattern = pattern;
153
154 bits<5> Rc;
155 bits<5> Rb;
156 bits<5> Ra;
157 bits<7> Function = fun;
158
159 let isTwoAddress = 1;
160 let Inst{25-21} = Ra;
161 let Inst{20-16} = Rb;
162 let Inst{15-13} = 0;
163 let Inst{12} = 0;
164 let Inst{11-5} = Function;
165 let Inst{4-0} = Rc;
166}
167
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000168
Andrew Lenharth7b698672005-10-20 00:28:31 +0000169class OFormL<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern>
Andrew Lenharth02daecc2005-07-22 20:50:29 +0000170 : InstAlpha<opcode, (ops GPRC:$RC, GPRC:$RA, u8imm:$L), asmstr> {
Andrew Lenharth7b698672005-10-20 00:28:31 +0000171 let Pattern = pattern;
172
Andrew Lenharth02daecc2005-07-22 20:50:29 +0000173 bits<5> Rc;
174 bits<5> Ra;
175 bits<8> LIT;
176 bits<7> Function = fun;
177
178 let Inst{25-21} = Ra;
179 let Inst{20-13} = LIT;
180 let Inst{12} = 1;
181 let Inst{11-5} = Function;
182 let Inst{4-0} = Rc;
183}
184
Andrew Lenhartha6a23b52005-10-20 23:58:36 +0000185class OForm4L<bits<6> opcode, bits<7> fun, string asmstr>
186 : InstAlpha<opcode, (ops GPRC:$RDEST, GPRC:$RSRC2, u8imm:$L, GPRC:$RCOND), asmstr> {
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000187 bits<5> Rc;
Andrew Lenhartha6a23b52005-10-20 23:58:36 +0000188 bits<8> LIT;
189 bits<5> Ra;
190 bits<7> Function = fun;
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000191
Andrew Lenhartha6a23b52005-10-20 23:58:36 +0000192 let isTwoAddress = 1;
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000193 let Inst{25-21} = Ra;
194 let Inst{20-13} = LIT;
195 let Inst{12} = 1;
196 let Inst{11-5} = Function;
197 let Inst{4-0} = Rc;
198}
199
200//3.3.4
Andrew Lenharth97a7fcf2005-11-09 19:17:08 +0000201class FPForm<bits<6> opcode, bits<11> fun, string asmstr, list<dag> pattern>
202 : InstAlphaAlt<opcode, asmstr> {
203 let Pattern = pattern;
204
Andrew Lenharth1ec48e82005-07-28 18:14:47 +0000205 bits<5> Fc;
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000206 bits<5> Fa;
207 bits<5> Fb;
Andrew Lenharth5ae5f812005-01-26 21:54:09 +0000208 bits<11> Function = fun;
Andrew Lenharth1ec48e82005-07-28 18:14:47 +0000209
210 let Inst{25-21} = Fa;
211 let Inst{20-16} = Fb;
212 let Inst{15-5} = Function;
213 let Inst{4-0} = Fc;
214}
215
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000216//3.3.5
217class PALForm<bits<6> opcode, dag OL, string asmstr> : InstAlpha<opcode, OL, asmstr> {
218 bits<26> Function;
219
220 let Inst{25-0} = Function;
221}
222
223
224// Pseudo instructions.
Andrew Lenharth0294e332005-11-22 04:20:06 +0000225class PseudoInstAlpha<dag OL, string nm, list<dag> pattern> : InstAlpha<0, OL, nm> {
226 let Pattern = pattern;
227
Andrew Lenhartha1b5ca22005-01-22 23:41:55 +0000228}