xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonOperands.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- HexagonImmediates.td - Hexagon immediate processing -*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illnois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdef s32ImmOperand : AsmOperandClass { let Name = "s32Imm"; }
11*9880d681SAndroid Build Coastguard Workerdef s23_2ImmOperand : AsmOperandClass { let Name = "s23_2Imm"; }
12*9880d681SAndroid Build Coastguard Workerdef s8ImmOperand : AsmOperandClass { let Name = "s8Imm"; }
13*9880d681SAndroid Build Coastguard Workerdef s8Imm64Operand : AsmOperandClass { let Name = "s8Imm64"; }
14*9880d681SAndroid Build Coastguard Workerdef s6ImmOperand : AsmOperandClass { let Name = "s6Imm"; }
15*9880d681SAndroid Build Coastguard Workerdef s4ImmOperand : AsmOperandClass { let Name = "s4Imm"; }
16*9880d681SAndroid Build Coastguard Workerdef s4_0ImmOperand : AsmOperandClass { let Name = "s4_0Imm"; }
17*9880d681SAndroid Build Coastguard Workerdef s4_1ImmOperand : AsmOperandClass { let Name = "s4_1Imm"; }
18*9880d681SAndroid Build Coastguard Workerdef s4_2ImmOperand : AsmOperandClass { let Name = "s4_2Imm"; }
19*9880d681SAndroid Build Coastguard Workerdef s4_3ImmOperand : AsmOperandClass { let Name = "s4_3Imm"; }
20*9880d681SAndroid Build Coastguard Workerdef s4_6ImmOperand : AsmOperandClass { let Name = "s4_6Imm"; }
21*9880d681SAndroid Build Coastguard Workerdef s3_6ImmOperand : AsmOperandClass { let Name = "s3_6Imm"; }
22*9880d681SAndroid Build Coastguard Workerdef u64ImmOperand : AsmOperandClass { let Name = "u64Imm"; }
23*9880d681SAndroid Build Coastguard Workerdef u32ImmOperand : AsmOperandClass { let Name = "u32Imm"; }
24*9880d681SAndroid Build Coastguard Workerdef u26_6ImmOperand : AsmOperandClass { let Name = "u26_6Imm"; }
25*9880d681SAndroid Build Coastguard Workerdef u16ImmOperand : AsmOperandClass { let Name = "u16Imm"; }
26*9880d681SAndroid Build Coastguard Workerdef u16_0ImmOperand : AsmOperandClass { let Name = "u16_0Imm"; }
27*9880d681SAndroid Build Coastguard Workerdef u16_1ImmOperand : AsmOperandClass { let Name = "u16_1Imm"; }
28*9880d681SAndroid Build Coastguard Workerdef u16_2ImmOperand : AsmOperandClass { let Name = "u16_2Imm"; }
29*9880d681SAndroid Build Coastguard Workerdef u16_3ImmOperand : AsmOperandClass { let Name = "u16_3Imm"; }
30*9880d681SAndroid Build Coastguard Workerdef u11_3ImmOperand : AsmOperandClass { let Name = "u11_3Imm"; }
31*9880d681SAndroid Build Coastguard Workerdef u10ImmOperand : AsmOperandClass { let Name = "u10Imm"; }
32*9880d681SAndroid Build Coastguard Workerdef u9ImmOperand : AsmOperandClass { let Name = "u9Imm"; }
33*9880d681SAndroid Build Coastguard Workerdef u8ImmOperand : AsmOperandClass { let Name = "u8Imm"; }
34*9880d681SAndroid Build Coastguard Workerdef u7ImmOperand : AsmOperandClass { let Name = "u7Imm"; }
35*9880d681SAndroid Build Coastguard Workerdef u6ImmOperand : AsmOperandClass { let Name = "u6Imm"; }
36*9880d681SAndroid Build Coastguard Workerdef u6_0ImmOperand : AsmOperandClass { let Name = "u6_0Imm"; }
37*9880d681SAndroid Build Coastguard Workerdef u6_1ImmOperand : AsmOperandClass { let Name = "u6_1Imm"; }
38*9880d681SAndroid Build Coastguard Workerdef u6_2ImmOperand : AsmOperandClass { let Name = "u6_2Imm"; }
39*9880d681SAndroid Build Coastguard Workerdef u6_3ImmOperand : AsmOperandClass { let Name = "u6_3Imm"; }
40*9880d681SAndroid Build Coastguard Workerdef u5ImmOperand : AsmOperandClass { let Name = "u5Imm"; }
41*9880d681SAndroid Build Coastguard Workerdef u4ImmOperand : AsmOperandClass { let Name = "u4Imm"; }
42*9880d681SAndroid Build Coastguard Workerdef u3ImmOperand : AsmOperandClass { let Name = "u3Imm"; }
43*9880d681SAndroid Build Coastguard Workerdef u2ImmOperand : AsmOperandClass { let Name = "u2Imm"; }
44*9880d681SAndroid Build Coastguard Workerdef u1ImmOperand : AsmOperandClass { let Name = "u1Imm"; }
45*9880d681SAndroid Build Coastguard Workerdef n8ImmOperand : AsmOperandClass { let Name = "n8Imm"; }
46*9880d681SAndroid Build Coastguard Worker// Immediate operands.
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_IMMEDIATE",
49*9880d681SAndroid Build Coastguard Worker    DecoderMethod = "unsignedImmDecoder" in {
50*9880d681SAndroid Build Coastguard Worker  def s32Imm : Operand<i32> { let ParserMatchClass = s32ImmOperand;
51*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s32ImmDecoder"; }
52*9880d681SAndroid Build Coastguard Worker  def s23_2Imm : Operand<i32> { let ParserMatchClass = s23_2ImmOperand; }
53*9880d681SAndroid Build Coastguard Worker  def s8Imm : Operand<i32> { let ParserMatchClass = s8ImmOperand;
54*9880d681SAndroid Build Coastguard Worker                             let DecoderMethod = "s8ImmDecoder"; }
55*9880d681SAndroid Build Coastguard Worker  def s8Imm64 : Operand<i64>  { let ParserMatchClass = s8Imm64Operand;
56*9880d681SAndroid Build Coastguard Worker                                let DecoderMethod = "s8ImmDecoder"; }
57*9880d681SAndroid Build Coastguard Worker  def s6Imm : Operand<i32> { let ParserMatchClass = s6ImmOperand;
58*9880d681SAndroid Build Coastguard Worker                             let DecoderMethod = "s6_0ImmDecoder"; }
59*9880d681SAndroid Build Coastguard Worker  def s6_3Imm : Operand<i32>;
60*9880d681SAndroid Build Coastguard Worker  def s4Imm : Operand<i32> { let ParserMatchClass = s4ImmOperand;
61*9880d681SAndroid Build Coastguard Worker                             let DecoderMethod = "s4_0ImmDecoder"; }
62*9880d681SAndroid Build Coastguard Worker  def s4_0Imm : Operand<i32> { let ParserMatchClass = s4_0ImmOperand;
63*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s4_0ImmDecoder"; }
64*9880d681SAndroid Build Coastguard Worker  def s4_1Imm : Operand<i32> { let ParserMatchClass = s4_1ImmOperand;
65*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s4_1ImmDecoder"; }
66*9880d681SAndroid Build Coastguard Worker  def s4_2Imm : Operand<i32> { let ParserMatchClass = s4_2ImmOperand;
67*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s4_2ImmDecoder"; }
68*9880d681SAndroid Build Coastguard Worker  def s4_3Imm : Operand<i32> { let ParserMatchClass = s4_3ImmOperand;
69*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s4_3ImmDecoder"; }
70*9880d681SAndroid Build Coastguard Worker  def u64Imm : Operand<i64> { let ParserMatchClass = u64ImmOperand; }
71*9880d681SAndroid Build Coastguard Worker  def u32Imm : Operand<i32> { let ParserMatchClass = u32ImmOperand; }
72*9880d681SAndroid Build Coastguard Worker  def u26_6Imm : Operand<i32> { let ParserMatchClass = u26_6ImmOperand; }
73*9880d681SAndroid Build Coastguard Worker  def u16Imm : Operand<i32> { let ParserMatchClass = u16ImmOperand; }
74*9880d681SAndroid Build Coastguard Worker  def u16_0Imm : Operand<i32> { let ParserMatchClass = u16_0ImmOperand; }
75*9880d681SAndroid Build Coastguard Worker  def u16_1Imm : Operand<i32> { let ParserMatchClass = u16_1ImmOperand; }
76*9880d681SAndroid Build Coastguard Worker  def u16_2Imm : Operand<i32> { let ParserMatchClass = u16_2ImmOperand; }
77*9880d681SAndroid Build Coastguard Worker  def u16_3Imm : Operand<i32> { let ParserMatchClass = u16_3ImmOperand; }
78*9880d681SAndroid Build Coastguard Worker  def u11_3Imm : Operand<i32> { let ParserMatchClass = u11_3ImmOperand; }
79*9880d681SAndroid Build Coastguard Worker  def u10Imm : Operand<i32> { let ParserMatchClass = u10ImmOperand; }
80*9880d681SAndroid Build Coastguard Worker  def u9Imm : Operand<i32> { let ParserMatchClass = u9ImmOperand; }
81*9880d681SAndroid Build Coastguard Worker  def u8Imm : Operand<i32> { let ParserMatchClass = u8ImmOperand; }
82*9880d681SAndroid Build Coastguard Worker  def u7Imm : Operand<i32> { let ParserMatchClass = u7ImmOperand; }
83*9880d681SAndroid Build Coastguard Worker  def u6Imm : Operand<i32> { let ParserMatchClass = u6ImmOperand; }
84*9880d681SAndroid Build Coastguard Worker  def u6_0Imm : Operand<i32> { let ParserMatchClass = u6_0ImmOperand; }
85*9880d681SAndroid Build Coastguard Worker  def u6_1Imm : Operand<i32> { let ParserMatchClass = u6_1ImmOperand; }
86*9880d681SAndroid Build Coastguard Worker  def u6_2Imm : Operand<i32> { let ParserMatchClass = u6_2ImmOperand; }
87*9880d681SAndroid Build Coastguard Worker  def u6_3Imm : Operand<i32> { let ParserMatchClass = u6_3ImmOperand; }
88*9880d681SAndroid Build Coastguard Worker  def u5Imm : Operand<i32> { let ParserMatchClass = u5ImmOperand; }
89*9880d681SAndroid Build Coastguard Worker  def u5_0Imm : Operand<i32>;
90*9880d681SAndroid Build Coastguard Worker  def u5_1Imm : Operand<i32>;
91*9880d681SAndroid Build Coastguard Worker  def u5_2Imm : Operand<i32>;
92*9880d681SAndroid Build Coastguard Worker  def u5_3Imm : Operand<i32>;
93*9880d681SAndroid Build Coastguard Worker  def u4Imm : Operand<i32> { let ParserMatchClass = u4ImmOperand; }
94*9880d681SAndroid Build Coastguard Worker  def u4_0Imm : Operand<i32>;
95*9880d681SAndroid Build Coastguard Worker  def u4_1Imm : Operand<i32>;
96*9880d681SAndroid Build Coastguard Worker  def u4_2Imm : Operand<i32>;
97*9880d681SAndroid Build Coastguard Worker  def u4_3Imm : Operand<i32>;
98*9880d681SAndroid Build Coastguard Worker  def u3Imm : Operand<i32> { let ParserMatchClass = u3ImmOperand; }
99*9880d681SAndroid Build Coastguard Worker  def u3_0Imm : Operand<i32>;
100*9880d681SAndroid Build Coastguard Worker  def u3_1Imm : Operand<i32>;
101*9880d681SAndroid Build Coastguard Worker  def u3_2Imm : Operand<i32>;
102*9880d681SAndroid Build Coastguard Worker  def u3_3Imm : Operand<i32>;
103*9880d681SAndroid Build Coastguard Worker  def u2Imm : Operand<i32> { let ParserMatchClass = u2ImmOperand; }
104*9880d681SAndroid Build Coastguard Worker  def u1Imm : Operand<i32> { let ParserMatchClass = u1ImmOperand; }
105*9880d681SAndroid Build Coastguard Worker  def n8Imm : Operand<i32> { let ParserMatchClass = n8ImmOperand; }
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_IMMEDIATE" in {
109*9880d681SAndroid Build Coastguard Worker  def s4_6Imm : Operand<i32> { let ParserMatchClass = s4_6ImmOperand;
110*9880d681SAndroid Build Coastguard Worker                               let PrintMethod = "prints4_6ImmOperand";
111*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s4_6ImmDecoder";}
112*9880d681SAndroid Build Coastguard Worker  def s4_7Imm : Operand<i32> { let PrintMethod = "prints4_7ImmOperand";
113*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s4_6ImmDecoder";}
114*9880d681SAndroid Build Coastguard Worker  def s3_6Imm : Operand<i32> { let ParserMatchClass = s3_6ImmOperand;
115*9880d681SAndroid Build Coastguard Worker                               let PrintMethod = "prints3_6ImmOperand";
116*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s3_6ImmDecoder";}
117*9880d681SAndroid Build Coastguard Worker  def s3_7Imm : Operand<i32> { let PrintMethod = "prints3_7ImmOperand";
118*9880d681SAndroid Build Coastguard Worker                               let DecoderMethod = "s3_6ImmDecoder";}
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker//
122*9880d681SAndroid Build Coastguard Worker// Immediate predicates
123*9880d681SAndroid Build Coastguard Worker//
124*9880d681SAndroid Build Coastguard Workerdef s32ImmPred  : PatLeaf<(i32 imm), [{
125*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
126*9880d681SAndroid Build Coastguard Worker  return isInt<32>(v);
127*9880d681SAndroid Build Coastguard Worker}]>;
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerdef s32_0ImmPred  : PatLeaf<(i32 imm), [{
130*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
131*9880d681SAndroid Build Coastguard Worker  return isInt<32>(v);
132*9880d681SAndroid Build Coastguard Worker}]>;
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdef s31_1ImmPred  : PatLeaf<(i32 imm), [{
135*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
136*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<31,1>(v);
137*9880d681SAndroid Build Coastguard Worker}]>;
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdef s30_2ImmPred  : PatLeaf<(i32 imm), [{
140*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
141*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<30,2>(v);
142*9880d681SAndroid Build Coastguard Worker}]>;
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdef s29_3ImmPred  : PatLeaf<(i32 imm), [{
145*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
146*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<29,3>(v);
147*9880d681SAndroid Build Coastguard Worker}]>;
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdef s16ImmPred  : PatLeaf<(i32 imm), [{
150*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
151*9880d681SAndroid Build Coastguard Worker  return isInt<16>(v);
152*9880d681SAndroid Build Coastguard Worker}]>;
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdef s11_0ImmPred  : PatLeaf<(i32 imm), [{
155*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
156*9880d681SAndroid Build Coastguard Worker  return isInt<11>(v);
157*9880d681SAndroid Build Coastguard Worker}]>;
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdef s11_1ImmPred  : PatLeaf<(i32 imm), [{
160*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
161*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<11,1>(v);
162*9880d681SAndroid Build Coastguard Worker}]>;
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdef s11_2ImmPred  : PatLeaf<(i32 imm), [{
165*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
166*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<11,2>(v);
167*9880d681SAndroid Build Coastguard Worker}]>;
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerdef s11_3ImmPred  : PatLeaf<(i32 imm), [{
170*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
171*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<11,3>(v);
172*9880d681SAndroid Build Coastguard Worker}]>;
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerdef s10ImmPred  : PatLeaf<(i32 imm), [{
175*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
176*9880d681SAndroid Build Coastguard Worker  return isInt<10>(v);
177*9880d681SAndroid Build Coastguard Worker}]>;
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdef s8ImmPred  : PatLeaf<(i32 imm), [{
180*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
181*9880d681SAndroid Build Coastguard Worker  return isInt<8>(v);
182*9880d681SAndroid Build Coastguard Worker}]>;
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdef s8Imm64Pred  : PatLeaf<(i64 imm), [{
185*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
186*9880d681SAndroid Build Coastguard Worker  return isInt<8>(v);
187*9880d681SAndroid Build Coastguard Worker}]>;
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdef s6ImmPred  : PatLeaf<(i32 imm), [{
190*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
191*9880d681SAndroid Build Coastguard Worker  return isInt<6>(v);
192*9880d681SAndroid Build Coastguard Worker}]>;
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdef s4_0ImmPred  : PatLeaf<(i32 imm), [{
195*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
196*9880d681SAndroid Build Coastguard Worker  return isInt<4>(v);
197*9880d681SAndroid Build Coastguard Worker}]>;
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdef s4_1ImmPred  : PatLeaf<(i32 imm), [{
200*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
201*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<4,1>(v);
202*9880d681SAndroid Build Coastguard Worker}]>;
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerdef s4_2ImmPred  : PatLeaf<(i32 imm), [{
205*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
206*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<4,2>(v);
207*9880d681SAndroid Build Coastguard Worker}]>;
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdef s4_3ImmPred  : PatLeaf<(i32 imm), [{
210*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
211*9880d681SAndroid Build Coastguard Worker  return isShiftedInt<4,3>(v);
212*9880d681SAndroid Build Coastguard Worker}]>;
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdef u64ImmPred  : PatLeaf<(i64 imm), [{
215*9880d681SAndroid Build Coastguard Worker  // Adding "N ||" to suppress gcc unused warning.
216*9880d681SAndroid Build Coastguard Worker  return (N || true);
217*9880d681SAndroid Build Coastguard Worker}]>;
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerdef u32ImmPred  : PatLeaf<(i32 imm), [{
220*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
221*9880d681SAndroid Build Coastguard Worker  return isUInt<32>(v);
222*9880d681SAndroid Build Coastguard Worker}]>;
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Workerdef u32_0ImmPred  : PatLeaf<(i32 imm), [{
225*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
226*9880d681SAndroid Build Coastguard Worker  return isUInt<32>(v);
227*9880d681SAndroid Build Coastguard Worker}]>;
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerdef u31_1ImmPred  : PatLeaf<(i32 imm), [{
230*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
231*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<31,1>(v);
232*9880d681SAndroid Build Coastguard Worker}]>;
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerdef u30_2ImmPred  : PatLeaf<(i32 imm), [{
235*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
236*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<30,2>(v);
237*9880d681SAndroid Build Coastguard Worker}]>;
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdef u29_3ImmPred  : PatLeaf<(i32 imm), [{
240*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
241*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<29,3>(v);
242*9880d681SAndroid Build Coastguard Worker}]>;
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerdef u26_6ImmPred  : PatLeaf<(i32 imm), [{
245*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
246*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<26,6>(v);
247*9880d681SAndroid Build Coastguard Worker}]>;
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerdef u16_0ImmPred  : PatLeaf<(i32 imm), [{
250*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
251*9880d681SAndroid Build Coastguard Worker  return isUInt<16>(v);
252*9880d681SAndroid Build Coastguard Worker}]>;
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerdef u16_1ImmPred  : PatLeaf<(i32 imm), [{
255*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
256*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<16,1>(v);
257*9880d681SAndroid Build Coastguard Worker}]>;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdef u16_2ImmPred  : PatLeaf<(i32 imm), [{
260*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
261*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<16,2>(v);
262*9880d681SAndroid Build Coastguard Worker}]>;
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerdef u11_3ImmPred : PatLeaf<(i32 imm), [{
265*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
266*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<11,3>(v);
267*9880d681SAndroid Build Coastguard Worker}]>;
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdef u10ImmPred  : PatLeaf<(i32 imm), [{
270*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
271*9880d681SAndroid Build Coastguard Worker  return isUInt<10>(v);
272*9880d681SAndroid Build Coastguard Worker}]>;
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Workerdef u9ImmPred  : PatLeaf<(i32 imm), [{
275*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
276*9880d681SAndroid Build Coastguard Worker  return isUInt<9>(v);
277*9880d681SAndroid Build Coastguard Worker}]>;
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Workerdef u8ImmPred  : PatLeaf<(i32 imm), [{
280*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
281*9880d681SAndroid Build Coastguard Worker  return isUInt<8>(v);
282*9880d681SAndroid Build Coastguard Worker}]>;
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Workerdef u7StrictPosImmPred : ImmLeaf<i32, [{
285*9880d681SAndroid Build Coastguard Worker  // u7StrictPosImmPred predicate - True if the immediate fits in an 7-bit
286*9880d681SAndroid Build Coastguard Worker  // unsigned field and is strictly greater than 0.
287*9880d681SAndroid Build Coastguard Worker  return isUInt<7>(Imm) && Imm > 0;
288*9880d681SAndroid Build Coastguard Worker}]>;
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Workerdef u7ImmPred  : PatLeaf<(i32 imm), [{
291*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
292*9880d681SAndroid Build Coastguard Worker  return isUInt<7>(v);
293*9880d681SAndroid Build Coastguard Worker}]>;
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerdef u6ImmPred  : PatLeaf<(i32 imm), [{
296*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
297*9880d681SAndroid Build Coastguard Worker  return isUInt<6>(v);
298*9880d681SAndroid Build Coastguard Worker}]>;
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdef u6_0ImmPred  : PatLeaf<(i32 imm), [{
301*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
302*9880d681SAndroid Build Coastguard Worker  return isUInt<6>(v);
303*9880d681SAndroid Build Coastguard Worker}]>;
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerdef u6_1ImmPred  : PatLeaf<(i32 imm), [{
306*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
307*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<6,1>(v);
308*9880d681SAndroid Build Coastguard Worker}]>;
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Workerdef u6_2ImmPred  : PatLeaf<(i32 imm), [{
311*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
312*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<6,2>(v);
313*9880d681SAndroid Build Coastguard Worker}]>;
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdef u6_3ImmPred  : PatLeaf<(i32 imm), [{
316*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
317*9880d681SAndroid Build Coastguard Worker  return isShiftedUInt<6,3>(v);
318*9880d681SAndroid Build Coastguard Worker}]>;
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerdef u5ImmPred  : PatLeaf<(i32 imm), [{
321*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
322*9880d681SAndroid Build Coastguard Worker  return isUInt<5>(v);
323*9880d681SAndroid Build Coastguard Worker}]>;
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerdef u4ImmPred  : PatLeaf<(i32 imm), [{
326*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
327*9880d681SAndroid Build Coastguard Worker  return isUInt<4>(v);
328*9880d681SAndroid Build Coastguard Worker}]>;
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerdef u3ImmPred  : PatLeaf<(i32 imm), [{
331*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
332*9880d681SAndroid Build Coastguard Worker  return isUInt<3>(v);
333*9880d681SAndroid Build Coastguard Worker}]>;
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerdef u2ImmPred  : PatLeaf<(i32 imm), [{
336*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
337*9880d681SAndroid Build Coastguard Worker  return isUInt<2>(v);
338*9880d681SAndroid Build Coastguard Worker}]>;
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerdef u1ImmPred  : PatLeaf<(i1 imm), [{
341*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
342*9880d681SAndroid Build Coastguard Worker  return isUInt<1>(v);
343*9880d681SAndroid Build Coastguard Worker}]>;
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Workerdef u1ImmPred32  : PatLeaf<(i32 imm), [{
346*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
347*9880d681SAndroid Build Coastguard Worker  return isUInt<1>(v);
348*9880d681SAndroid Build Coastguard Worker}]>;
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Workerdef m5BImmPred  : PatLeaf<(i32 imm), [{
351*9880d681SAndroid Build Coastguard Worker  // m5BImmPred predicate - True if the (char) number is in range -1 .. -31
352*9880d681SAndroid Build Coastguard Worker  // and will fit in a 5 bit field when made positive, for use in memops.
353*9880d681SAndroid Build Coastguard Worker  // this is specific to the zero extending of a negative by CombineInstr
354*9880d681SAndroid Build Coastguard Worker  int8_t v = (int8_t)N->getSExtValue();
355*9880d681SAndroid Build Coastguard Worker  return (-31 <= v && v <= -1);
356*9880d681SAndroid Build Coastguard Worker}]>;
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Workerdef m5HImmPred  : PatLeaf<(i32 imm), [{
359*9880d681SAndroid Build Coastguard Worker  // m5HImmPred predicate - True if the (short) number is in range -1 .. -31
360*9880d681SAndroid Build Coastguard Worker  // and will fit in a 5 bit field when made positive, for use in memops.
361*9880d681SAndroid Build Coastguard Worker  // this is specific to the zero extending of a negative by CombineInstr
362*9880d681SAndroid Build Coastguard Worker  int16_t v = (int16_t)N->getSExtValue();
363*9880d681SAndroid Build Coastguard Worker  return (-31 <= v && v <= -1);
364*9880d681SAndroid Build Coastguard Worker}]>;
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Workerdef m5ImmPred  : PatLeaf<(i32 imm), [{
367*9880d681SAndroid Build Coastguard Worker  // m5ImmPred predicate - True if the number is in range -1 .. -31
368*9880d681SAndroid Build Coastguard Worker  // and will fit in a 5 bit field when made positive, for use in memops.
369*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
370*9880d681SAndroid Build Coastguard Worker  return (-31 <= v && v <= -1);
371*9880d681SAndroid Build Coastguard Worker}]>;
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker//InN means negative integers in [-(2^N - 1), 0]
374*9880d681SAndroid Build Coastguard Workerdef n8ImmPred  : PatLeaf<(i32 imm), [{
375*9880d681SAndroid Build Coastguard Worker  // n8ImmPred predicate - True if the immediate fits in a 8-bit signed
376*9880d681SAndroid Build Coastguard Worker  // field.
377*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
378*9880d681SAndroid Build Coastguard Worker  return (-255 <= v && v <= 0);
379*9880d681SAndroid Build Coastguard Worker}]>;
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Workerdef nOneImmPred  : PatLeaf<(i32 imm), [{
382*9880d681SAndroid Build Coastguard Worker  // nOneImmPred predicate - True if the immediate is -1.
383*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
384*9880d681SAndroid Build Coastguard Worker  return (-1 == v);
385*9880d681SAndroid Build Coastguard Worker}]>;
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdef Set5ImmPred : PatLeaf<(i32 imm), [{
388*9880d681SAndroid Build Coastguard Worker  // Set5ImmPred predicate - True if the number is in the series of values.
389*9880d681SAndroid Build Coastguard Worker  // [ 2^0, 2^1, ... 2^31 ]
390*9880d681SAndroid Build Coastguard Worker  // For use in setbit immediate.
391*9880d681SAndroid Build Coastguard Worker  uint32_t v = (int32_t)N->getSExtValue();
392*9880d681SAndroid Build Coastguard Worker  // Constrain to 32 bits, and then check for single bit.
393*9880d681SAndroid Build Coastguard Worker  return ImmIsSingleBit(v);
394*9880d681SAndroid Build Coastguard Worker}]>;
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workerdef Clr5ImmPred : PatLeaf<(i32 imm), [{
397*9880d681SAndroid Build Coastguard Worker  // Clr5ImmPred predicate - True if the number is in the series of
398*9880d681SAndroid Build Coastguard Worker  // bit negated values.
399*9880d681SAndroid Build Coastguard Worker  // [ 2^0, 2^1, ... 2^31 ]
400*9880d681SAndroid Build Coastguard Worker  // For use in clrbit immediate.
401*9880d681SAndroid Build Coastguard Worker  // Note: we are bit NOTing the value.
402*9880d681SAndroid Build Coastguard Worker  uint32_t v = ~ (int32_t)N->getSExtValue();
403*9880d681SAndroid Build Coastguard Worker  // Constrain to 32 bits, and then check for single bit.
404*9880d681SAndroid Build Coastguard Worker  return ImmIsSingleBit(v);
405*9880d681SAndroid Build Coastguard Worker}]>;
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Workerdef SetClr5ImmPred : PatLeaf<(i32 imm), [{
408*9880d681SAndroid Build Coastguard Worker  // True if the immediate is in range 0..31.
409*9880d681SAndroid Build Coastguard Worker  int32_t v = (int32_t)N->getSExtValue();
410*9880d681SAndroid Build Coastguard Worker  return (v >= 0 && v <= 31);
411*9880d681SAndroid Build Coastguard Worker}]>;
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Workerdef Set4ImmPred : PatLeaf<(i32 imm), [{
414*9880d681SAndroid Build Coastguard Worker  // Set4ImmPred predicate - True if the number is in the series of values:
415*9880d681SAndroid Build Coastguard Worker  // [ 2^0, 2^1, ... 2^15 ].
416*9880d681SAndroid Build Coastguard Worker  // For use in setbit immediate.
417*9880d681SAndroid Build Coastguard Worker  uint16_t v = (int16_t)N->getSExtValue();
418*9880d681SAndroid Build Coastguard Worker  // Constrain to 16 bits, and then check for single bit.
419*9880d681SAndroid Build Coastguard Worker  return ImmIsSingleBit(v);
420*9880d681SAndroid Build Coastguard Worker}]>;
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Workerdef Clr4ImmPred : PatLeaf<(i32 imm), [{
423*9880d681SAndroid Build Coastguard Worker  // Clr4ImmPred predicate - True if the number is in the series of
424*9880d681SAndroid Build Coastguard Worker  // bit negated values:
425*9880d681SAndroid Build Coastguard Worker  // [ 2^0, 2^1, ... 2^15 ].
426*9880d681SAndroid Build Coastguard Worker  // For use in setbit and clrbit immediate.
427*9880d681SAndroid Build Coastguard Worker  uint16_t v = ~ (int16_t)N->getSExtValue();
428*9880d681SAndroid Build Coastguard Worker  // Constrain to 16 bits, and then check for single bit.
429*9880d681SAndroid Build Coastguard Worker  return ImmIsSingleBit(v);
430*9880d681SAndroid Build Coastguard Worker}]>;
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Workerdef SetClr4ImmPred : PatLeaf<(i32 imm), [{
433*9880d681SAndroid Build Coastguard Worker  // True if the immediate is in the range 0..15.
434*9880d681SAndroid Build Coastguard Worker  int16_t v = (int16_t)N->getSExtValue();
435*9880d681SAndroid Build Coastguard Worker  return (v >= 0 && v <= 15);
436*9880d681SAndroid Build Coastguard Worker}]>;
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Workerdef Set3ImmPred : PatLeaf<(i32 imm), [{
439*9880d681SAndroid Build Coastguard Worker  // True if the number is in the series of values: [ 2^0, 2^1, ... 2^7 ].
440*9880d681SAndroid Build Coastguard Worker  // For use in setbit immediate.
441*9880d681SAndroid Build Coastguard Worker  uint8_t v = (int8_t)N->getSExtValue();
442*9880d681SAndroid Build Coastguard Worker  // Constrain to 8 bits, and then check for single bit.
443*9880d681SAndroid Build Coastguard Worker  return ImmIsSingleBit(v);
444*9880d681SAndroid Build Coastguard Worker}]>;
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Workerdef Clr3ImmPred : PatLeaf<(i32 imm), [{
447*9880d681SAndroid Build Coastguard Worker  // True if the number is in the series of bit negated values: [ 2^0, 2^1, ... 2^7 ].
448*9880d681SAndroid Build Coastguard Worker  // For use in setbit and clrbit immediate.
449*9880d681SAndroid Build Coastguard Worker  uint8_t v = ~ (int8_t)N->getSExtValue();
450*9880d681SAndroid Build Coastguard Worker  // Constrain to 8 bits, and then check for single bit.
451*9880d681SAndroid Build Coastguard Worker  return ImmIsSingleBit(v);
452*9880d681SAndroid Build Coastguard Worker}]>;
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Workerdef SetClr3ImmPred : PatLeaf<(i32 imm), [{
455*9880d681SAndroid Build Coastguard Worker  // True if the immediate is in the range  0..7.
456*9880d681SAndroid Build Coastguard Worker  int8_t v = (int8_t)N->getSExtValue();
457*9880d681SAndroid Build Coastguard Worker  return (v >= 0 && v <= 7);
458*9880d681SAndroid Build Coastguard Worker}]>;
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker// Extendable immediate operands.
462*9880d681SAndroid Build Coastguard Workerdef f32ExtOperand : AsmOperandClass { let Name = "f32Ext"; }
463*9880d681SAndroid Build Coastguard Workerdef s16ExtOperand : AsmOperandClass { let Name = "s16Ext"; }
464*9880d681SAndroid Build Coastguard Workerdef s12ExtOperand : AsmOperandClass { let Name = "s12Ext"; }
465*9880d681SAndroid Build Coastguard Workerdef s10ExtOperand : AsmOperandClass { let Name = "s10Ext"; }
466*9880d681SAndroid Build Coastguard Workerdef s9ExtOperand : AsmOperandClass { let Name = "s9Ext"; }
467*9880d681SAndroid Build Coastguard Workerdef s8ExtOperand : AsmOperandClass { let Name = "s8Ext"; }
468*9880d681SAndroid Build Coastguard Workerdef s7ExtOperand : AsmOperandClass { let Name = "s7Ext"; }
469*9880d681SAndroid Build Coastguard Workerdef s6ExtOperand : AsmOperandClass { let Name = "s6Ext"; }
470*9880d681SAndroid Build Coastguard Workerdef s11_0ExtOperand : AsmOperandClass { let Name = "s11_0Ext"; }
471*9880d681SAndroid Build Coastguard Workerdef s11_1ExtOperand : AsmOperandClass { let Name = "s11_1Ext"; }
472*9880d681SAndroid Build Coastguard Workerdef s11_2ExtOperand : AsmOperandClass { let Name = "s11_2Ext"; }
473*9880d681SAndroid Build Coastguard Workerdef s11_3ExtOperand : AsmOperandClass { let Name = "s11_3Ext"; }
474*9880d681SAndroid Build Coastguard Workerdef u6ExtOperand : AsmOperandClass { let Name = "u6Ext"; }
475*9880d681SAndroid Build Coastguard Workerdef u7ExtOperand : AsmOperandClass { let Name = "u7Ext"; }
476*9880d681SAndroid Build Coastguard Workerdef u8ExtOperand : AsmOperandClass { let Name = "u8Ext"; }
477*9880d681SAndroid Build Coastguard Workerdef u9ExtOperand : AsmOperandClass { let Name = "u9Ext"; }
478*9880d681SAndroid Build Coastguard Workerdef u10ExtOperand : AsmOperandClass { let Name = "u10Ext"; }
479*9880d681SAndroid Build Coastguard Workerdef u6_0ExtOperand : AsmOperandClass { let Name = "u6_0Ext"; }
480*9880d681SAndroid Build Coastguard Workerdef u6_1ExtOperand : AsmOperandClass { let Name = "u6_1Ext"; }
481*9880d681SAndroid Build Coastguard Workerdef u6_2ExtOperand : AsmOperandClass { let Name = "u6_2Ext"; }
482*9880d681SAndroid Build Coastguard Workerdef u6_3ExtOperand : AsmOperandClass { let Name = "u6_3Ext"; }
483*9880d681SAndroid Build Coastguard Workerdef u32MustExtOperand : AsmOperandClass { let Name = "u32MustExt"; }
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_IMMEDIATE", PrintMethod = "printExtOperand",
488*9880d681SAndroid Build Coastguard Worker    DecoderMethod = "unsignedImmDecoder" in {
489*9880d681SAndroid Build Coastguard Worker  def f32Ext : Operand<f32> { let ParserMatchClass = f32ExtOperand; }
490*9880d681SAndroid Build Coastguard Worker  def s16Ext : Operand<i32> { let ParserMatchClass = s16ExtOperand;
491*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s16ImmDecoder"; }
492*9880d681SAndroid Build Coastguard Worker  def s12Ext : Operand<i32> { let ParserMatchClass = s12ExtOperand;
493*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s12ImmDecoder"; }
494*9880d681SAndroid Build Coastguard Worker  def s11_0Ext : Operand<i32> { let ParserMatchClass = s11_0ExtOperand;
495*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s11_0ImmDecoder"; }
496*9880d681SAndroid Build Coastguard Worker  def s11_1Ext : Operand<i32> { let ParserMatchClass = s11_1ExtOperand;
497*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s11_1ImmDecoder"; }
498*9880d681SAndroid Build Coastguard Worker  def s11_2Ext : Operand<i32> { let ParserMatchClass = s11_2ExtOperand;
499*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s11_2ImmDecoder"; }
500*9880d681SAndroid Build Coastguard Worker  def s11_3Ext : Operand<i32> { let ParserMatchClass = s11_3ExtOperand;
501*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s11_3ImmDecoder"; }
502*9880d681SAndroid Build Coastguard Worker  def s10Ext : Operand<i32> { let ParserMatchClass = s10ExtOperand;
503*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s10ImmDecoder"; }
504*9880d681SAndroid Build Coastguard Worker  def s9Ext : Operand<i32> { let ParserMatchClass = s9ExtOperand;
505*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s90ImmDecoder"; }
506*9880d681SAndroid Build Coastguard Worker  def s8Ext : Operand<i32> { let ParserMatchClass = s8ExtOperand;
507*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s8ImmDecoder"; }
508*9880d681SAndroid Build Coastguard Worker  def s7Ext : Operand<i32> { let ParserMatchClass = s7ExtOperand; }
509*9880d681SAndroid Build Coastguard Worker  def s6Ext : Operand<i32> { let ParserMatchClass = s6ExtOperand;
510*9880d681SAndroid Build Coastguard Worker                              let DecoderMethod = "s6_0ImmDecoder"; }
511*9880d681SAndroid Build Coastguard Worker  def u6Ext : Operand<i32> { let ParserMatchClass = u6ExtOperand; }
512*9880d681SAndroid Build Coastguard Worker  def u7Ext : Operand<i32> { let ParserMatchClass = u7ExtOperand; }
513*9880d681SAndroid Build Coastguard Worker  def u8Ext : Operand<i32> { let ParserMatchClass = u8ExtOperand; }
514*9880d681SAndroid Build Coastguard Worker  def u9Ext : Operand<i32> { let ParserMatchClass = u9ExtOperand; }
515*9880d681SAndroid Build Coastguard Worker  def u10Ext : Operand<i32> { let ParserMatchClass = u10ExtOperand; }
516*9880d681SAndroid Build Coastguard Worker  def u6_0Ext : Operand<i32> { let ParserMatchClass = u6_0ExtOperand; }
517*9880d681SAndroid Build Coastguard Worker  def u6_1Ext : Operand<i32> { let ParserMatchClass = u6_1ExtOperand; }
518*9880d681SAndroid Build Coastguard Worker  def u6_2Ext : Operand<i32> { let ParserMatchClass = u6_2ExtOperand; }
519*9880d681SAndroid Build Coastguard Worker  def u6_3Ext : Operand<i32> { let ParserMatchClass = u6_3ExtOperand; }
520*9880d681SAndroid Build Coastguard Worker  def u32MustExt : Operand<i32> { let ParserMatchClass = u32MustExtOperand; }
521*9880d681SAndroid Build Coastguard Worker}
522*9880d681SAndroid Build Coastguard Worker
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Workerdef s4_7ImmPred  : PatLeaf<(i32 imm), [{
525*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
526*9880d681SAndroid Build Coastguard Worker  if (HST->hasV60TOps())
527*9880d681SAndroid Build Coastguard Worker    // Return true if the immediate can fit in a 10-bit sign extended field and
528*9880d681SAndroid Build Coastguard Worker    // is 128-byte aligned.
529*9880d681SAndroid Build Coastguard Worker    return isShiftedInt<4,7>(v);
530*9880d681SAndroid Build Coastguard Worker  return false;
531*9880d681SAndroid Build Coastguard Worker}]>;
532*9880d681SAndroid Build Coastguard Worker
533*9880d681SAndroid Build Coastguard Workerdef s3_7ImmPred  : PatLeaf<(i32 imm), [{
534*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
535*9880d681SAndroid Build Coastguard Worker  if (HST->hasV60TOps())
536*9880d681SAndroid Build Coastguard Worker    // Return true if the immediate can fit in a 9-bit sign extended field and
537*9880d681SAndroid Build Coastguard Worker    // is 128-byte aligned.
538*9880d681SAndroid Build Coastguard Worker    return isShiftedInt<3,7>(v);
539*9880d681SAndroid Build Coastguard Worker  return false;
540*9880d681SAndroid Build Coastguard Worker}]>;
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Workerdef s4_6ImmPred  : PatLeaf<(i32 imm), [{
543*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
544*9880d681SAndroid Build Coastguard Worker  if (HST->hasV60TOps())
545*9880d681SAndroid Build Coastguard Worker    // Return true if the immediate can fit in a 10-bit sign extended field and
546*9880d681SAndroid Build Coastguard Worker    // is 64-byte aligned.
547*9880d681SAndroid Build Coastguard Worker    return isShiftedInt<4,6>(v);
548*9880d681SAndroid Build Coastguard Worker  return false;
549*9880d681SAndroid Build Coastguard Worker}]>;
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Workerdef s3_6ImmPred  : PatLeaf<(i32 imm), [{
552*9880d681SAndroid Build Coastguard Worker  int64_t v = (int64_t)N->getSExtValue();
553*9880d681SAndroid Build Coastguard Worker  if (HST->hasV60TOps())
554*9880d681SAndroid Build Coastguard Worker    // Return true if the immediate can fit in a 9-bit sign extended field and
555*9880d681SAndroid Build Coastguard Worker    // is 64-byte aligned.
556*9880d681SAndroid Build Coastguard Worker    return isShiftedInt<3,6>(v);
557*9880d681SAndroid Build Coastguard Worker  return false;
558*9880d681SAndroid Build Coastguard Worker}]>;
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Worker
561*9880d681SAndroid Build Coastguard Worker// This complex pattern exists only to create a machine instruction operand
562*9880d681SAndroid Build Coastguard Worker// of type "frame index". There doesn't seem to be a way to do that directly
563*9880d681SAndroid Build Coastguard Worker// in the patterns.
564*9880d681SAndroid Build Coastguard Workerdef AddrFI : ComplexPattern<i32, 1, "SelectAddrFI", [frameindex], []>;
565*9880d681SAndroid Build Coastguard Worker
566*9880d681SAndroid Build Coastguard Worker// These complex patterns are not strictly necessary, since global address
567*9880d681SAndroid Build Coastguard Worker// folding will happen during DAG combining. For distinguishing between GA
568*9880d681SAndroid Build Coastguard Worker// and GP, pat frags with HexagonCONST32 and HexagonCONST32_GP can be used.
569*9880d681SAndroid Build Coastguard Workerdef AddrGA : ComplexPattern<i32, 1, "SelectAddrGA", [], []>;
570*9880d681SAndroid Build Coastguard Workerdef AddrGP : ComplexPattern<i32, 1, "SelectAddrGP", [], []>;
571*9880d681SAndroid Build Coastguard Worker
572*9880d681SAndroid Build Coastguard Worker// Address operands.
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Workerlet PrintMethod = "printGlobalOperand" in {
575*9880d681SAndroid Build Coastguard Worker  def globaladdress : Operand<i32>;
576*9880d681SAndroid Build Coastguard Worker  def globaladdressExt : Operand<i32>;
577*9880d681SAndroid Build Coastguard Worker}
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Workerlet PrintMethod = "printJumpTable" in
580*9880d681SAndroid Build Coastguard Workerdef jumptablebase : Operand<i32>;
581*9880d681SAndroid Build Coastguard Worker
582*9880d681SAndroid Build Coastguard Workerdef brtarget : Operand<OtherVT> {
583*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "brtargetDecoder";
584*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBrtarget";
585*9880d681SAndroid Build Coastguard Worker}
586*9880d681SAndroid Build Coastguard Workerdef brtargetExt : Operand<OtherVT> {
587*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "brtargetDecoder";
588*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBrtarget";
589*9880d681SAndroid Build Coastguard Worker}
590*9880d681SAndroid Build Coastguard Workerdef calltarget : Operand<i32> {
591*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "brtargetDecoder";
592*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBrtarget";
593*9880d681SAndroid Build Coastguard Worker}
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Workerdef bblabel : Operand<i32>;
596*9880d681SAndroid Build Coastguard Workerdef bbl     : SDNode<"ISD::BasicBlock", SDTPtrLeaf, [], "BasicBlockSDNode">;
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Worker// Return true if for a 32 to 64-bit sign-extended load.
599*9880d681SAndroid Build Coastguard Workerdef is_sext_i32 : PatLeaf<(i64 DoubleRegs:$src1), [{
600*9880d681SAndroid Build Coastguard Worker  LoadSDNode *LD = dyn_cast<LoadSDNode>(N);
601*9880d681SAndroid Build Coastguard Worker  if (!LD)
602*9880d681SAndroid Build Coastguard Worker    return false;
603*9880d681SAndroid Build Coastguard Worker  return LD->getExtensionType() == ISD::SEXTLOAD &&
604*9880d681SAndroid Build Coastguard Worker         LD->getMemoryVT().getScalarType() == MVT::i32;
605*9880d681SAndroid Build Coastguard Worker}]>;
606