• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//===- HexagonImmediates.td - Hexagon immediate processing -*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illnois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// From IA64's InstrInfo file
11def s32Imm : Operand<i32> {
12  // For now, we use a generic print function for all operands.
13  let PrintMethod = "printImmOperand";
14}
15
16def s16Imm : Operand<i32> {
17  let PrintMethod = "printImmOperand";
18}
19
20def s12Imm : Operand<i32> {
21  // For now, we use a generic print function for all operands.
22  let PrintMethod = "printImmOperand";
23}
24
25def s11Imm : Operand<i32> {
26  // For now, we use a generic print function for all operands.
27  let PrintMethod = "printImmOperand";
28}
29
30def s11_0Imm : Operand<i32> {
31  // For now, we use a generic print function for all operands.
32  let PrintMethod = "printImmOperand";
33}
34
35def s11_1Imm : Operand<i32> {
36  // For now, we use a generic print function for all operands.
37  let PrintMethod = "printImmOperand";
38}
39
40def s11_2Imm : Operand<i32> {
41  // For now, we use a generic print function for all operands.
42  let PrintMethod = "printImmOperand";
43}
44
45def s11_3Imm : Operand<i32> {
46  // For now, we use a generic print function for all operands.
47  let PrintMethod = "printImmOperand";
48}
49
50def s10Imm : Operand<i32> {
51  // For now, we use a generic print function for all operands.
52  let PrintMethod = "printImmOperand";
53}
54
55def s9Imm : Operand<i32> {
56  // For now, we use a generic print function for all operands.
57  let PrintMethod = "printImmOperand";
58}
59
60def s8Imm : Operand<i32> {
61  // For now, we use a generic print function for all operands.
62  let PrintMethod = "printImmOperand";
63}
64
65def s8Imm64 : Operand<i64> {
66  // For now, we use a generic print function for all operands.
67  let PrintMethod = "printImmOperand";
68}
69
70def s6Imm : Operand<i32> {
71  // For now, we use a generic print function for all operands.
72  let PrintMethod = "printImmOperand";
73}
74
75def s4Imm : Operand<i32> {
76  // For now, we use a generic print function for all operands.
77  let PrintMethod = "printImmOperand";
78}
79
80def s4_0Imm : Operand<i32> {
81  // For now, we use a generic print function for all operands.
82  let PrintMethod = "printImmOperand";
83}
84
85def s4_1Imm : Operand<i32> {
86  // For now, we use a generic print function for all operands.
87  let PrintMethod = "printImmOperand";
88}
89
90def s4_2Imm : Operand<i32> {
91  // For now, we use a generic print function for all operands.
92  let PrintMethod = "printImmOperand";
93}
94
95def s4_3Imm : Operand<i32> {
96  // For now, we use a generic print function for all operands.
97  let PrintMethod = "printImmOperand";
98}
99
100def u64Imm : Operand<i64> {
101  // For now, we use a generic print function for all operands.
102  let PrintMethod = "printImmOperand";
103}
104
105def u32Imm : Operand<i32> {
106  // For now, we use a generic print function for all operands.
107  let PrintMethod = "printImmOperand";
108}
109
110def u16Imm : Operand<i32> {
111  // For now, we use a generic print function for all operands.
112  let PrintMethod = "printImmOperand";
113}
114
115def u16_0Imm : Operand<i32> {
116  // For now, we use a generic print function for all operands.
117  let PrintMethod = "printImmOperand";
118}
119
120def u16_1Imm : Operand<i32> {
121  // For now, we use a generic print function for all operands.
122  let PrintMethod = "printImmOperand";
123}
124
125def u16_2Imm : Operand<i32> {
126  // For now, we use a generic print function for all operands.
127  let PrintMethod = "printImmOperand";
128}
129
130def u11_3Imm : Operand<i32> {
131  // For now, we use a generic print function for all operands.
132  let PrintMethod = "printImmOperand";
133}
134
135def u10Imm : Operand<i32> {
136  // For now, we use a generic print function for all operands.
137  let PrintMethod = "printImmOperand";
138}
139
140def u9Imm : Operand<i32> {
141  // For now, we use a generic print function for all operands.
142  let PrintMethod = "printImmOperand";
143}
144
145def u8Imm : Operand<i32> {
146  // For now, we use a generic print function for all operands.
147  let PrintMethod = "printImmOperand";
148}
149
150def u7Imm : Operand<i32> {
151  // For now, we use a generic print function for all operands.
152  let PrintMethod = "printImmOperand";
153}
154
155def u6Imm : Operand<i32> {
156  // For now, we use a generic print function for all operands.
157  let PrintMethod = "printImmOperand";
158}
159
160def u6_0Imm : Operand<i32> {
161  // For now, we use a generic print function for all operands.
162  let PrintMethod = "printImmOperand";
163}
164
165def u6_1Imm : Operand<i32> {
166  // For now, we use a generic print function for all operands.
167  let PrintMethod = "printImmOperand";
168}
169
170def u6_2Imm : Operand<i32> {
171  // For now, we use a generic print function for all operands.
172  let PrintMethod = "printImmOperand";
173}
174
175def u6_3Imm : Operand<i32> {
176  // For now, we use a generic print function for all operands.
177  let PrintMethod = "printImmOperand";
178}
179
180def u5Imm : Operand<i32> {
181  // For now, we use a generic print function for all operands.
182  let PrintMethod = "printImmOperand";
183}
184
185def u4Imm : Operand<i32> {
186  // For now, we use a generic print function for all operands.
187  let PrintMethod = "printImmOperand";
188}
189
190def u3Imm : Operand<i32> {
191  // For now, we use a generic print function for all operands.
192  let PrintMethod = "printImmOperand";
193}
194
195def u2Imm : Operand<i32> {
196  // For now, we use a generic print function for all operands.
197  let PrintMethod = "printImmOperand";
198}
199
200def u1Imm : Operand<i32> {
201  // For now, we use a generic print function for all operands.
202  let PrintMethod = "printImmOperand";
203}
204
205def n8Imm : Operand<i32> {
206  // For now, we use a generic print function for all operands.
207  let PrintMethod = "printImmOperand";
208}
209
210def m6Imm : Operand<i32> {
211  // For now, we use a generic print function for all operands.
212  let PrintMethod = "printImmOperand";
213}
214
215def nOneImm : Operand<i32> {
216  // For now, we use a generic print function for all operands.
217  let PrintMethod = "printNOneImmOperand";
218}
219
220//
221// Immediate predicates
222//
223def s32ImmPred  : PatLeaf<(i32 imm), [{
224  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
225  // field.
226  int64_t v = (int64_t)N->getSExtValue();
227  return isInt<32>(v);
228}]>;
229
230def s32_24ImmPred  : PatLeaf<(i32 imm), [{
231  // s32_24ImmPred predicate - True if the immediate fits in a 32-bit sign
232  // extended field that is a multiple of 0x1000000.
233  int64_t v = (int64_t)N->getSExtValue();
234  return isShiftedInt<32,24>(v);
235}]>;
236
237def s32_16s8ImmPred  : PatLeaf<(i32 imm), [{
238  // s32_16s8ImmPred predicate - True if the immediate fits in a 32-bit sign
239  // extended field that is a multiple of 0x10000.
240  int64_t v = (int64_t)N->getSExtValue();
241  return isShiftedInt<24,16>(v);
242}]>;
243
244def s16ImmPred  : PatLeaf<(i32 imm), [{
245  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
246  // field.
247  int64_t v = (int64_t)N->getSExtValue();
248  return isInt<16>(v);
249}]>;
250
251
252def s13ImmPred  : PatLeaf<(i32 imm), [{
253  // immS13 predicate - True if the immediate fits in a 13-bit sign extended
254  // field.
255  int64_t v = (int64_t)N->getSExtValue();
256  return isInt<13>(v);
257}]>;
258
259
260def s12ImmPred  : PatLeaf<(i32 imm), [{
261  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
262  // field.
263  int64_t v = (int64_t)N->getSExtValue();
264  return isInt<12>(v);
265}]>;
266
267def s11_0ImmPred  : PatLeaf<(i32 imm), [{
268  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
269  // field.
270  int64_t v = (int64_t)N->getSExtValue();
271  return isInt<11>(v);
272}]>;
273
274
275def s11_1ImmPred  : PatLeaf<(i32 imm), [{
276  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
277  // field.
278  int64_t v = (int64_t)N->getSExtValue();
279  return isShiftedInt<11,1>(v);
280}]>;
281
282
283def s11_2ImmPred  : PatLeaf<(i32 imm), [{
284  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
285  // field.
286  int64_t v = (int64_t)N->getSExtValue();
287  return isShiftedInt<11,2>(v);
288}]>;
289
290
291def s11_3ImmPred  : PatLeaf<(i32 imm), [{
292  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
293  // field.
294  int64_t v = (int64_t)N->getSExtValue();
295  return isShiftedInt<11,3>(v);
296}]>;
297
298
299def s10ImmPred  : PatLeaf<(i32 imm), [{
300  // s10ImmPred predicate - True if the immediate fits in a 10-bit sign extended
301  // field.
302  int64_t v = (int64_t)N->getSExtValue();
303  return isInt<10>(v);
304}]>;
305
306
307def s9ImmPred  : PatLeaf<(i32 imm), [{
308  // s9ImmPred predicate - True if the immediate fits in a 9-bit sign extended
309  // field.
310  int64_t v = (int64_t)N->getSExtValue();
311  return isInt<9>(v);
312}]>;
313
314
315def s8ImmPred  : PatLeaf<(i32 imm), [{
316  // s8ImmPred predicate - True if the immediate fits in a 8-bit sign extended
317  // field.
318  int64_t v = (int64_t)N->getSExtValue();
319  return isInt<8>(v);
320}]>;
321
322
323def s8Imm64Pred  : PatLeaf<(i64 imm), [{
324  // s8ImmPred predicate - True if the immediate fits in a 8-bit sign extended
325  // field.
326  int64_t v = (int64_t)N->getSExtValue();
327  return isInt<8>(v);
328}]>;
329
330
331def s6ImmPred  : PatLeaf<(i32 imm), [{
332  // s6ImmPred predicate - True if the immediate fits in a 6-bit sign extended
333  // field.
334  int64_t v = (int64_t)N->getSExtValue();
335  return isInt<6>(v);
336}]>;
337
338
339def s4_0ImmPred  : PatLeaf<(i32 imm), [{
340  // s4_0ImmPred predicate - True if the immediate fits in a 4-bit sign extended
341  // field.
342  int64_t v = (int64_t)N->getSExtValue();
343  return isInt<4>(v);
344}]>;
345
346
347def s4_1ImmPred  : PatLeaf<(i32 imm), [{
348  // s4_1ImmPred predicate - True if the immediate fits in a 4-bit sign extended
349  // field of 2.
350  int64_t v = (int64_t)N->getSExtValue();
351  return isShiftedInt<4,1>(v);
352}]>;
353
354
355def s4_2ImmPred  : PatLeaf<(i32 imm), [{
356  // s4_2ImmPred predicate - True if the immediate fits in a 4-bit sign extended
357  // field that is a multiple of 4.
358  int64_t v = (int64_t)N->getSExtValue();
359  return isShiftedInt<4,2>(v);
360}]>;
361
362
363def s4_3ImmPred  : PatLeaf<(i32 imm), [{
364  // s4_3ImmPred predicate - True if the immediate fits in a 4-bit sign extended
365  // field that is a multiple of 8.
366  int64_t v = (int64_t)N->getSExtValue();
367  return isShiftedInt<4,3>(v);
368}]>;
369
370
371def u64ImmPred  : PatLeaf<(i64 imm), [{
372  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
373  // field.
374  // Adding "N ||" to supress gcc unused warning.
375  return (N || true);
376}]>;
377
378def u32ImmPred  : PatLeaf<(i32 imm), [{
379  // immS16 predicate - True if the immediate fits in a 16-bit sign extended
380  // field.
381  int64_t v = (int64_t)N->getSExtValue();
382  return isUInt<32>(v);
383}]>;
384
385def u16ImmPred  : PatLeaf<(i32 imm), [{
386  // u16ImmPred predicate - True if the immediate fits in a 16-bit unsigned
387  // field.
388  int64_t v = (int64_t)N->getSExtValue();
389  return isUInt<16>(v);
390}]>;
391
392def u16_s8ImmPred  : PatLeaf<(i32 imm), [{
393  // u16_s8ImmPred predicate - True if the immediate fits in a 16-bit sign
394  // extended s8 field.
395  int64_t v = (int64_t)N->getSExtValue();
396  return isShiftedUInt<16,8>(v);
397}]>;
398
399def u9ImmPred  : PatLeaf<(i32 imm), [{
400  // u9ImmPred predicate - True if the immediate fits in a 9-bit unsigned
401  // field.
402  int64_t v = (int64_t)N->getSExtValue();
403  return isUInt<9>(v);
404}]>;
405
406
407def u8ImmPred  : PatLeaf<(i32 imm), [{
408  // u8ImmPred predicate - True if the immediate fits in a 8-bit unsigned
409  // field.
410  int64_t v = (int64_t)N->getSExtValue();
411  return isUInt<8>(v);
412}]>;
413
414def u7ImmPred  : PatLeaf<(i32 imm), [{
415  // u7ImmPred predicate - True if the immediate fits in a 8-bit unsigned
416  // field.
417  int64_t v = (int64_t)N->getSExtValue();
418  return isUInt<7>(v);
419}]>;
420
421
422def u6ImmPred  : PatLeaf<(i32 imm), [{
423  // u6ImmPred predicate - True if the immediate fits in a 6-bit unsigned
424  // field.
425  int64_t v = (int64_t)N->getSExtValue();
426  return isUInt<6>(v);
427}]>;
428
429def u6_0ImmPred  : PatLeaf<(i32 imm), [{
430  // u6_0ImmPred predicate - True if the immediate fits in a 6-bit unsigned
431  // field. Same as u6ImmPred.
432  int64_t v = (int64_t)N->getSExtValue();
433  return isUInt<6>(v);
434}]>;
435
436def u6_1ImmPred  : PatLeaf<(i32 imm), [{
437  // u6_1ImmPred predicate - True if the immediate fits in a 6-bit unsigned
438  // field that is 1 bit alinged - multiple of 2.
439  int64_t v = (int64_t)N->getSExtValue();
440  return isShiftedUInt<6,1>(v);
441}]>;
442
443def u6_2ImmPred  : PatLeaf<(i32 imm), [{
444  // u6_2ImmPred predicate - True if the immediate fits in a 6-bit unsigned
445  // field that is 2 bits alinged - multiple of 4.
446  int64_t v = (int64_t)N->getSExtValue();
447  return isShiftedUInt<6,2>(v);
448}]>;
449
450def u6_3ImmPred  : PatLeaf<(i32 imm), [{
451  // u6_3ImmPred predicate - True if the immediate fits in a 6-bit unsigned
452  // field that is 3 bits alinged - multiple of 8.
453  int64_t v = (int64_t)N->getSExtValue();
454  return isShiftedUInt<6,3>(v);
455}]>;
456
457def u5ImmPred  : PatLeaf<(i32 imm), [{
458  // u5ImmPred predicate - True if the immediate fits in a 5-bit unsigned
459  // field.
460  int64_t v = (int64_t)N->getSExtValue();
461  return isUInt<5>(v);
462}]>;
463
464
465def u3ImmPred  : PatLeaf<(i32 imm), [{
466  // u3ImmPred predicate - True if the immediate fits in a 3-bit unsigned
467  // field.
468  int64_t v = (int64_t)N->getSExtValue();
469  return isUInt<3>(v);
470}]>;
471
472
473def u2ImmPred  : PatLeaf<(i32 imm), [{
474  // u2ImmPred predicate - True if the immediate fits in a 2-bit unsigned
475  // field.
476  int64_t v = (int64_t)N->getSExtValue();
477  return isUInt<2>(v);
478}]>;
479
480
481def u1ImmPred  : PatLeaf<(i1 imm), [{
482  // u1ImmPred predicate - True if the immediate fits in a 1-bit unsigned
483  // field.
484  int64_t v = (int64_t)N->getSExtValue();
485  return isUInt<1>(v);
486}]>;
487
488def m6ImmPred  : PatLeaf<(i32 imm), [{
489  // m6ImmPred predicate - True if the immediate is negative and fits in
490  // a 6-bit negative number.
491  int64_t v = (int64_t)N->getSExtValue();
492  return isInt<6>(v);
493}]>;
494
495//InN means negative integers in [-(2^N - 1), 0]
496def n8ImmPred  : PatLeaf<(i32 imm), [{
497  // n8ImmPred predicate - True if the immediate fits in a 8-bit signed
498  // field.
499  int64_t v = (int64_t)N->getSExtValue();
500  return (-255 <= v && v <= 0);
501}]>;
502
503def nOneImmPred  : PatLeaf<(i32 imm), [{
504  // nOneImmPred predicate - True if the immediate is -1.
505  int64_t v = (int64_t)N->getSExtValue();
506  return (-1 == v);
507}]>;
508
509