[FastISel][AArch64] Optimize compare-and-branch for i1 to use 'tbz'.
[oota-llvm.git] / test / CodeGen / AArch64 / aarch64-be-bv.ll
1 ; RUN: llc -mtriple=aarch64_be--linux-gnu < %s | FileCheck %s
2
3 @vec_v8i16 = global <8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>
4
5 ; CHECK-LABEL: movi_modimm_t1:
6 define i16 @movi_modimm_t1() nounwind {
7   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
8   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].4s, #0x1
9   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
10   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
11   %in = load <8 x i16>* @vec_v8i16
12   %rv = add <8 x i16> %in, <i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0>
13   %el = extractelement <8 x i16> %rv, i32 0
14   ret i16 %el
15 }
16
17 ; CHECK-LABEL: movi_modimm_t2:
18 define i16 @movi_modimm_t2() nounwind {
19   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
20   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].4s, #0x1, lsl #8
21   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
22   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
23   %in = load <8 x i16>* @vec_v8i16
24   %rv = add <8 x i16> %in, <i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0>
25   %el = extractelement <8 x i16> %rv, i32 0
26   ret i16 %el
27 }
28
29 ; CHECK-LABEL: movi_modimm_t3:
30 define i16 @movi_modimm_t3() nounwind {
31   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
32   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].4s, #0x1, lsl #16
33   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
34   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
35   %in = load <8 x i16>* @vec_v8i16
36   %rv = add <8 x i16> %in, <i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1>
37   %el = extractelement <8 x i16> %rv, i32 0
38   ret i16 %el
39 }
40
41 ; CHECK-LABEL: movi_modimm_t4:
42 define i16 @movi_modimm_t4() nounwind {
43   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
44   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].4s, #0x1, lsl #24
45   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
46   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
47   %in = load <8 x i16>* @vec_v8i16
48   %rv = add <8 x i16> %in, <i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256>
49   %el = extractelement <8 x i16> %rv, i32 0
50   ret i16 %el
51 }
52
53 ; CHECK-LABEL: movi_modimm_t5:
54 define i16 @movi_modimm_t5() nounwind {
55   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
56   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].8h, #0x1
57   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
58   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
59   %in = load <8 x i16>* @vec_v8i16
60   %rv = add <8 x i16> %in, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
61   %el = extractelement <8 x i16> %rv, i32 0
62   ret i16 %el
63 }
64
65 ; CHECK-LABEL: movi_modimm_t6:
66 define i16 @movi_modimm_t6() nounwind {
67   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
68   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].8h, #0x1, lsl #8
69   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
70   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
71   %in = load <8 x i16>* @vec_v8i16
72   %rv = add <8 x i16> %in, <i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256>
73   %el = extractelement <8 x i16> %rv, i32 0
74   ret i16 %el
75 }
76
77 ; CHECK-LABEL: movi_modimm_t7:
78 define i16 @movi_modimm_t7() nounwind {
79   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
80   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].4s, #0x1, msl #8
81   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
82   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
83   %in = load <8 x i16>* @vec_v8i16
84   %rv = add <8 x i16> %in, <i16 511, i16 0, i16 511, i16 0, i16 511, i16 0, i16 511, i16 0>
85   %el = extractelement <8 x i16> %rv, i32 0
86   ret i16 %el
87 }
88
89 ; CHECK-LABEL: movi_modimm_t8:
90 define i16 @movi_modimm_t8() nounwind {
91   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
92   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].4s, #0x1, msl #16
93   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
94   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
95   %in = load <8 x i16>* @vec_v8i16
96   %rv = add <8 x i16> %in, <i16 65535, i16 1, i16 65535, i16 1, i16 65535, i16 1, i16 65535, i16 1>
97   %el = extractelement <8 x i16> %rv, i32 0
98   ret i16 %el
99 }
100
101 ; CHECK-LABEL: movi_modimm_t9:
102 define i16 @movi_modimm_t9() nounwind {
103   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
104   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].16b, #0x1
105   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
106   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
107   %in = load <8 x i16>* @vec_v8i16
108   %rv = add <8 x i16> %in, <i16 257, i16 257, i16 257, i16 257, i16 257, i16 257, i16 257, i16 257>
109   %el = extractelement <8 x i16> %rv, i32 0
110   ret i16 %el
111 }
112
113 ; CHECK-LABEL: movi_modimm_t10:
114 define i16 @movi_modimm_t10() nounwind {
115   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
116   ; CHECK-NEXT:    movi    v[[REG2:[0-9]+]].2d, #0x00ffff0000ffff
117   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
118   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
119   %in = load <8 x i16>* @vec_v8i16
120   %rv = add <8 x i16> %in, <i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0>
121   %el = extractelement <8 x i16> %rv, i32 0
122   ret i16 %el
123 }
124
125 ; CHECK-LABEL: fmov_modimm_t11:
126 define i16 @fmov_modimm_t11() nounwind {
127   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
128   ; CHECK-NEXT:    fmov    v[[REG2:[0-9]+]].4s, #3.00000000
129   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
130   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
131   %in = load <8 x i16>* @vec_v8i16
132   %rv = add <8 x i16> %in, <i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448>
133   %el = extractelement <8 x i16> %rv, i32 0
134   ret i16 %el
135 }
136
137 ; CHECK-LABEL: fmov_modimm_t12:
138 define i16 @fmov_modimm_t12() nounwind {
139   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
140   ; CHECK-NEXT:    fmov    v[[REG2:[0-9]+]].2d, #0.17968750
141   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
142   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
143   %in = load <8 x i16>* @vec_v8i16
144   %rv = add <8 x i16> %in, <i16 0, i16 0, i16 0, i16 16327, i16 0, i16 0, i16 0, i16 16327>
145   %el = extractelement <8 x i16> %rv, i32 0
146   ret i16 %el
147 }
148
149 ; CHECK-LABEL: mvni_modimm_t1:
150 define i16 @mvni_modimm_t1() nounwind {
151   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
152   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].4s, #0x1
153   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
154   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
155   %in = load <8 x i16>* @vec_v8i16
156   %rv = add <8 x i16> %in, <i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535>
157   %el = extractelement <8 x i16> %rv, i32 0
158   ret i16 %el
159 }
160
161 ; CHECK-LABEL: mvni_modimm_t2:
162 define i16 @mvni_modimm_t2() nounwind {
163   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
164   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].4s, #0x1, lsl #8
165   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
166   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
167   %in = load <8 x i16>* @vec_v8i16
168   %rv = add <8 x i16> %in, <i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535>
169   %el = extractelement <8 x i16> %rv, i32 0
170   ret i16 %el
171 }
172
173 ; CHECK-LABEL: mvni_modimm_t3:
174 define i16 @mvni_modimm_t3() nounwind {
175   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
176   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].4s, #0x1, lsl #16
177   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
178   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
179   %in = load <8 x i16>* @vec_v8i16
180   %rv = add <8 x i16> %in, <i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534>
181   %el = extractelement <8 x i16> %rv, i32 0
182   ret i16 %el
183 }
184
185 ; CHECK-LABEL: mvni_modimm_t4:
186 define i16 @mvni_modimm_t4() nounwind {
187   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
188   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].4s, #0x1, lsl #24
189   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
190   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
191   %in = load <8 x i16>* @vec_v8i16
192   %rv = add <8 x i16> %in, <i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279>
193   %el = extractelement <8 x i16> %rv, i32 0
194   ret i16 %el
195 }
196
197 ; CHECK-LABEL: mvni_modimm_t5:
198 define i16 @mvni_modimm_t5() nounwind {
199   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
200   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].8h, #0x1
201   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
202   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
203   %in = load <8 x i16>* @vec_v8i16
204   %rv = add <8 x i16> %in, <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534>
205   %el = extractelement <8 x i16> %rv, i32 0
206   ret i16 %el
207 }
208
209 ; CHECK-LABEL: mvni_modimm_t6:
210 define i16 @mvni_modimm_t6() nounwind {
211   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
212   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].8h, #0x1, lsl #8
213   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
214   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
215   %in = load <8 x i16>* @vec_v8i16
216   %rv = add <8 x i16> %in, <i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279>
217   %el = extractelement <8 x i16> %rv, i32 0
218   ret i16 %el
219 }
220
221 ; CHECK-LABEL: mvni_modimm_t7:
222 define i16 @mvni_modimm_t7() nounwind {
223   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
224   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].4s, #0x1, msl #8
225   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
226   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
227   %in = load <8 x i16>* @vec_v8i16
228   %rv = add <8 x i16> %in, <i16 65024, i16 65535, i16 65024, i16 65535, i16 65024, i16 65535, i16 65024, i16 65535>
229   %el = extractelement <8 x i16> %rv, i32 0
230   ret i16 %el
231 }
232
233 ; CHECK-LABEL: mvni_modimm_t8:
234 define i16 @mvni_modimm_t8() nounwind {
235   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
236   ; CHECK-NEXT:    mvni    v[[REG2:[0-9]+]].4s, #0x1, msl #16
237   ; CHECK-NEXT:    add     v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
238   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
239   %in = load <8 x i16>* @vec_v8i16
240   %rv = add <8 x i16> %in, <i16 0, i16 65534, i16 0, i16 65534, i16 0, i16 65534, i16 0, i16 65534>
241   %el = extractelement <8 x i16> %rv, i32 0
242   ret i16 %el
243 }
244
245 ; CHECK-LABEL: bic_modimm_t1:
246 define i16 @bic_modimm_t1() nounwind {
247   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
248   ; CHECK-NEXT:    bic     v[[REG2:[0-9]+]].4s, #0x1
249   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
250   %in = load <8 x i16>* @vec_v8i16
251   %rv = and <8 x i16> %in, <i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535>
252   %el = extractelement <8 x i16> %rv, i32 0
253   ret i16 %el
254 }
255
256 ; CHECK-LABEL: bic_modimm_t2:
257 define i16 @bic_modimm_t2() nounwind {
258   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
259   ; CHECK-NEXT:    bic     v[[REG2:[0-9]+]].4s, #0x1, lsl #8
260   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
261   %in = load <8 x i16>* @vec_v8i16
262   %rv = and <8 x i16> %in, <i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535>
263   %el = extractelement <8 x i16> %rv, i32 0
264   ret i16 %el
265 }
266
267 ; CHECK-LABEL: bic_modimm_t3:
268 define i16 @bic_modimm_t3() nounwind {
269   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
270   ; CHECK-NEXT:    bic     v[[REG2:[0-9]+]].4s, #0x1, lsl #16
271   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
272   %in = load <8 x i16>* @vec_v8i16
273   %rv = and <8 x i16> %in, <i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534>
274   %el = extractelement <8 x i16> %rv, i32 0
275   ret i16 %el
276 }
277
278 ; CHECK-LABEL: bic_modimm_t4:
279 define i16 @bic_modimm_t4() nounwind {
280   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
281   ; CHECK-NEXT:    bic     v[[REG2:[0-9]+]].4s, #0x1, lsl #24
282   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
283   %in = load <8 x i16>* @vec_v8i16
284   %rv = and <8 x i16> %in, <i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279>
285   %el = extractelement <8 x i16> %rv, i32 0
286   ret i16 %el
287 }
288
289 ; CHECK-LABEL: bic_modimm_t5:
290 define i16 @bic_modimm_t5() nounwind {
291   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
292   ; CHECK-NEXT:    bic     v[[REG2:[0-9]+]].8h, #0x1
293   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
294   %in = load <8 x i16>* @vec_v8i16
295   %rv = and <8 x i16> %in, <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534>
296   %el = extractelement <8 x i16> %rv, i32 0
297   ret i16 %el
298 }
299
300 ; CHECK-LABEL: bic_modimm_t6:
301 define i16 @bic_modimm_t6() nounwind {
302   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
303   ; CHECK-NEXT:    bic     v[[REG2:[0-9]+]].8h, #0x1, lsl #8
304   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
305   %in = load <8 x i16>* @vec_v8i16
306   %rv = and <8 x i16> %in, <i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279>
307   %el = extractelement <8 x i16> %rv, i32 0
308   ret i16 %el
309 }
310
311 ; CHECK-LABEL: orr_modimm_t1:
312 define i16 @orr_modimm_t1() nounwind {
313   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
314   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].4s, #0x1
315   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
316   %in = load <8 x i16>* @vec_v8i16
317   %rv = or <8 x i16> %in, <i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0>
318   %el = extractelement <8 x i16> %rv, i32 0
319   ret i16 %el
320 }
321
322 ; CHECK-LABEL: orr_modimm_t2:
323 define i16 @orr_modimm_t2() nounwind {
324   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
325   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].4s, #0x1, lsl #8
326   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
327   %in = load <8 x i16>* @vec_v8i16
328   %rv = or <8 x i16> %in, <i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0>
329   %el = extractelement <8 x i16> %rv, i32 0
330   ret i16 %el
331 }
332
333 ; CHECK-LABEL: orr_modimm_t3:
334 define i16 @orr_modimm_t3() nounwind {
335   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
336   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].4s, #0x1, lsl #16
337   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
338   %in = load <8 x i16>* @vec_v8i16
339   %rv = or <8 x i16> %in, <i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1>
340   %el = extractelement <8 x i16> %rv, i32 0
341   ret i16 %el
342 }
343
344 ; CHECK-LABEL: orr_modimm_t4:
345 define i16 @orr_modimm_t4() nounwind {
346   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
347   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].4s, #0x1, lsl #24
348   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
349   %in = load <8 x i16>* @vec_v8i16
350   %rv = or <8 x i16> %in, <i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256>
351   %el = extractelement <8 x i16> %rv, i32 0
352   ret i16 %el
353 }
354
355 ; CHECK-LABEL: orr_modimm_t5:
356 define i16 @orr_modimm_t5() nounwind {
357   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
358   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].8h, #0x1
359   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
360   %in = load <8 x i16>* @vec_v8i16
361   %rv = or <8 x i16> %in, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
362   %el = extractelement <8 x i16> %rv, i32 0
363   ret i16 %el
364 }
365
366 ; CHECK-LABEL: orr_modimm_t6:
367 define i16 @orr_modimm_t6() nounwind {
368   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
369   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].8h, #0x1, lsl #8
370   ; CHECK-NEXT:    umov    w{{[0-9]+}}, v[[REG1]].h[0]
371   %in = load <8 x i16>* @vec_v8i16
372   %rv = or <8 x i16> %in, <i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256>
373   %el = extractelement <8 x i16> %rv, i32 0
374   ret i16 %el
375 }
376
377 declare i8 @f_v8i8(<8 x i8> %arg)
378 declare i16 @f_v4i16(<4 x i16> %arg)
379 declare i32 @f_v2i32(<2 x i32> %arg)
380 declare i64 @f_v1i64(<1 x i64> %arg)
381 declare i8 @f_v16i8(<16 x i8> %arg)
382 declare i16 @f_v8i16(<8 x i16> %arg)
383 declare i32 @f_v4i32(<4 x i32> %arg)
384 declare i64 @f_v2i64(<2 x i64> %arg)
385
386 ; CHECK-LABEL: modimm_t1_call:
387 define void @modimm_t1_call() {
388   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8
389   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
390   ; CHECK-NEXT:    bl      f_v8i8
391   call i8 @f_v8i8(<8 x i8> <i8 8, i8 0, i8 0, i8 0, i8 8, i8 0, i8 0, i8 0>)
392   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7
393   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
394   ; CHECK-NEXT:    bl      f_v4i16
395   call i16 @f_v4i16(<4 x i16> <i16 7, i16 0, i16 7, i16 0>)
396   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6
397   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
398   ; CHECK-NEXT:    bl      f_v2i32
399   call i32 @f_v2i32(<2 x i32> <i32 6, i32 6>)
400   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5
401   ; CHECK-NEXT:    bl      f_v1i64
402   call i64 @f_v1i64(<1 x i64> <i64 21474836485>)
403   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5
404   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
405   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
406   ; CHECK-NEXT:    bl      f_v16i8
407   call i8 @f_v16i8(<16 x i8> <i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0>)
408   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4
409   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
410   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
411   ; CHECK-NEXT:    bl      f_v8i16
412   call i16 @f_v8i16(<8 x i16> <i16 4, i16 0, i16 4, i16 0, i16 4, i16 0, i16 4, i16 0>)
413   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3
414   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
415   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
416   ; CHECK-NEXT:    bl      f_v4i32
417   call i32 @f_v4i32(<4 x i32> <i32 3, i32 3, i32 3, i32 3>)
418   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2
419   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
420   ; CHECK-NEXT:    bl      f_v2i64
421   call i64 @f_v2i64(<2 x i64> <i64 8589934594, i64 8589934594>)
422
423   ret void
424 }
425
426 ; CHECK-LABEL: modimm_t2_call:
427 define void @modimm_t2_call() {
428   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, lsl #8
429   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
430   ; CHECK-NEXT:    bl      f_v8i8
431   call i8 @f_v8i8(<8 x i8> <i8 0, i8 8, i8 0, i8 0, i8 0, i8 8, i8 0, i8 0>)
432   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, lsl #8
433   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
434   ; CHECK-NEXT:    bl      f_v4i16
435   call i16 @f_v4i16(<4 x i16> <i16 1792, i16 0, i16 1792, i16 0>)
436   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, lsl #8
437   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
438   ; CHECK-NEXT:    bl      f_v2i32
439   call i32 @f_v2i32(<2 x i32> <i32 1536, i32 1536>)
440   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, lsl #8
441   ; CHECK-NEXT:    bl      f_v1i64
442   call i64 @f_v1i64(<1 x i64> <i64 5497558140160>)
443   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, lsl #8
444   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
445   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
446   ; CHECK-NEXT:    bl      f_v16i8
447   call i8 @f_v16i8(<16 x i8> <i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0>)
448   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, lsl #8
449   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
450   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
451   ; CHECK-NEXT:    bl      f_v8i16
452   call i16 @f_v8i16(<8 x i16> <i16 1024, i16 0, i16 1024, i16 0, i16 1024, i16 0, i16 1024, i16 0>)
453   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, lsl #8
454   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
455   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
456   ; CHECK-NEXT:    bl      f_v4i32
457   call i32 @f_v4i32(<4 x i32> <i32 768, i32 768, i32 768, i32 768>)
458   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, lsl #8
459   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
460   ; CHECK-NEXT:    bl      f_v2i64
461   call i64 @f_v2i64(<2 x i64> <i64 2199023256064, i64 2199023256064>)
462
463   ret void
464 }
465
466 ; CHECK-LABEL: modimm_t3_call:
467 define void @modimm_t3_call() {
468   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, lsl #16
469   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
470   ; CHECK-NEXT:    bl      f_v8i8
471   call i8 @f_v8i8(<8 x i8> <i8 0, i8 0, i8 8, i8 0, i8 0, i8 0, i8 8, i8 0>)
472   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, lsl #16
473   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
474   ; CHECK-NEXT:    bl      f_v4i16
475   call i16 @f_v4i16(<4 x i16> <i16 0, i16 7, i16 0, i16 7>)
476   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, lsl #16
477   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
478   ; CHECK-NEXT:    bl      f_v2i32
479   call i32 @f_v2i32(<2 x i32> <i32 393216, i32 393216>)
480   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, lsl #16
481   ; CHECK-NEXT:    bl      f_v1i64
482   call i64 @f_v1i64(<1 x i64> <i64 1407374883880960>)
483   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, lsl #16
484   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
485   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
486   ; CHECK-NEXT:    bl      f_v16i8
487   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0>)
488   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, lsl #16
489   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
490   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
491   ; CHECK-NEXT:    bl      f_v8i16
492   call i16 @f_v8i16(<8 x i16> <i16 0, i16 4, i16 0, i16 4, i16 0, i16 4, i16 0, i16 4>)
493   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, lsl #16
494   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
495   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
496   ; CHECK-NEXT:    bl      f_v4i32
497   call i32 @f_v4i32(<4 x i32> <i32 196608, i32 196608, i32 196608, i32 196608>)
498   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, lsl #16
499   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
500   ; CHECK-NEXT:    bl      f_v2i64
501   call i64 @f_v2i64(<2 x i64> <i64 562949953552384, i64 562949953552384>)
502
503   ret void
504 }
505
506 ; CHECK-LABEL: modimm_t4_call:
507 define void @modimm_t4_call() {
508   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, lsl #24
509   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
510   ; CHECK-NEXT:    bl      f_v8i8
511   call i8 @f_v8i8(<8 x i8> <i8 0, i8 0, i8 0, i8 8, i8 0, i8 0, i8 0, i8 8>)
512   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, lsl #24
513   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
514   ; CHECK-NEXT:    bl      f_v4i16
515   call i16 @f_v4i16(<4 x i16> <i16 0, i16 1792, i16 0, i16 1792>)
516   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, lsl #24
517   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
518   ; CHECK-NEXT:    bl      f_v2i32
519   call i32 @f_v2i32(<2 x i32> <i32 100663296, i32 100663296>)
520   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, lsl #24
521   ; CHECK-NEXT:    bl      f_v1i64
522   call i64 @f_v1i64(<1 x i64> <i64 360287970273525760>)
523   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, lsl #24
524   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
525   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
526   ; CHECK-NEXT:    bl      f_v16i8
527   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5>)
528   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, lsl #24
529   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
530   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
531   ; CHECK-NEXT:    bl      f_v8i16
532   call i16 @f_v8i16(<8 x i16> <i16 0, i16 1024, i16 0, i16 1024, i16 0, i16 1024, i16 0, i16 1024>)
533   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, lsl #24
534   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
535   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
536   ; CHECK-NEXT:    bl      f_v4i32
537   call i32 @f_v4i32(<4 x i32> <i32 50331648, i32 50331648, i32 50331648, i32 50331648>)
538   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, lsl #24
539   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
540   ; CHECK-NEXT:    bl      f_v2i64
541   call i64 @f_v2i64(<2 x i64> <i64 144115188109410304, i64 144115188109410304>)
542
543   ret void
544 }
545
546 ; CHECK-LABEL: modimm_t5_call:
547 define void @modimm_t5_call() {
548   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x8
549   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
550   ; CHECK-NEXT:    bl      f_v8i8
551   call i8 @f_v8i8(<8 x i8> <i8 8, i8 0, i8 8, i8 0, i8 8, i8 0, i8 8, i8 0>)
552   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x7
553   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
554   ; CHECK-NEXT:    bl      f_v4i16
555   call i16 @f_v4i16(<4 x i16> <i16 7, i16 7, i16 7, i16 7>)
556   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x6
557   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
558   ; CHECK-NEXT:    bl      f_v2i32
559   call i32 @f_v2i32(<2 x i32> <i32 393222, i32 393222>)
560   ; CHECK:         movi    v{{[0-9]+}}.4h, #0x5
561   ; CHECK-NEXT:    bl      f_v1i64
562   call i64 @f_v1i64(<1 x i64> <i64 1407396358717445>)
563   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x5
564   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
565   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
566   ; CHECK-NEXT:    bl      f_v16i8
567   call i8 @f_v16i8(<16 x i8> <i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0>)
568   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x4
569   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
570   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
571   ; CHECK-NEXT:    bl      f_v8i16
572   call i16 @f_v8i16(<8 x i16> <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>)
573   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x3
574   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
575   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
576   ; CHECK-NEXT:    bl      f_v4i32
577   call i32 @f_v4i32(<4 x i32> <i32 196611, i32 196611, i32 196611, i32 196611>)
578   ; CHECK:         movi    v[[REG:[0-9]+]].8h, #0x2
579   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
580   ; CHECK-NEXT:    bl      f_v2i64
581   call i64 @f_v2i64(<2 x i64> <i64 562958543486978, i64 562958543486978>)
582
583   ret void
584 }
585
586 ; CHECK-LABEL: modimm_t6_call:
587 define void @modimm_t6_call() {
588   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x8, lsl #8
589   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
590   ; CHECK-NEXT:    bl      f_v8i8
591   call i8 @f_v8i8(<8 x i8> <i8 0, i8 8, i8 0, i8 8, i8 0, i8 8, i8 0, i8 8>)
592   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x7, lsl #8
593   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
594   ; CHECK-NEXT:    bl      f_v4i16
595   call i16 @f_v4i16(<4 x i16> <i16 1792, i16 1792, i16 1792, i16 1792>)
596   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x6, lsl #8
597   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
598   ; CHECK-NEXT:    bl      f_v2i32
599   call i32 @f_v2i32(<2 x i32> <i32 100664832, i32 100664832>)
600   ; CHECK:         movi    v{{[0-9]+}}.4h, #0x5, lsl #8
601   ; CHECK-NEXT:    bl      f_v1i64
602   call i64 @f_v1i64(<1 x i64> <i64 360293467831665920>)
603   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x5, lsl #8
604   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
605   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
606   ; CHECK-NEXT:    bl      f_v16i8
607   call i8 @f_v16i8(<16 x i8> <i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5>)
608   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x4, lsl #8
609   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
610   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
611   ; CHECK-NEXT:    bl      f_v8i16
612   call i16 @f_v8i16(<8 x i16> <i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024>)
613   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x3, lsl #8
614   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
615   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
616   ; CHECK-NEXT:    bl      f_v4i32
617   call i32 @f_v4i32(<4 x i32> <i32 50332416, i32 50332416, i32 50332416, i32 50332416>)
618   ; CHECK:         movi    v[[REG:[0-9]+]].8h, #0x2, lsl #8
619   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
620   ; CHECK-NEXT:    bl      f_v2i64
621   call i64 @f_v2i64(<2 x i64> <i64 144117387132666368, i64 144117387132666368>)
622
623   ret void
624 }
625
626 ; CHECK-LABEL: modimm_t7_call:
627 define void @modimm_t7_call() {
628   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, msl #8
629   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
630   ; CHECK-NEXT:    bl      f_v8i8
631   call i8 @f_v8i8(<8 x i8> <i8 255, i8 8, i8 0, i8 0, i8 255, i8 8, i8 0, i8 0>)
632   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, msl #8
633   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
634   ; CHECK-NEXT:    bl      f_v4i16
635   call i16 @f_v4i16(<4 x i16> <i16 2047, i16 0, i16 2047, i16 0>)
636   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, msl #8
637   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
638   ; CHECK-NEXT:    bl      f_v2i32
639   call i32 @f_v2i32(<2 x i32> <i32 1791, i32 1791>)
640   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, msl #8
641   ; CHECK-NEXT:    bl      f_v1i64
642   call i64 @f_v1i64(<1 x i64> <i64 6592774800895>)
643   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, msl #8
644   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
645   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
646   ; CHECK-NEXT:    bl      f_v16i8
647   call i8 @f_v16i8(<16 x i8> <i8 255, i8 5, i8 0, i8 0, i8 255, i8 5, i8 0, i8 0, i8 255, i8 5, i8 0, i8 0, i8 255, i8 5, i8 0, i8 0>)
648   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, msl #8
649   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
650   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
651   ; CHECK-NEXT:    bl      f_v8i16
652   call i16 @f_v8i16(<8 x i16> <i16 1279, i16 0, i16 1279, i16 0, i16 1279, i16 0, i16 1279, i16 0>)
653   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, msl #8
654   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
655   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
656   ; CHECK-NEXT:    bl      f_v4i32
657   call i32 @f_v4i32(<4 x i32> <i32 1023, i32 1023, i32 1023, i32 1023>)
658   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, msl #8
659   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
660   ; CHECK-NEXT:    bl      f_v2i64
661   call i64 @f_v2i64(<2 x i64> <i64 3294239916799, i64 3294239916799>)
662
663   ret void
664 }
665
666 ; CHECK-LABEL: modimm_t8_call:
667 define void @modimm_t8_call() {
668   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, msl #16
669   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
670   ; CHECK-NEXT:    bl      f_v8i8
671   call i8 @f_v8i8(<8 x i8> <i8 255, i8 255, i8 8, i8 0, i8 255, i8 255, i8 8, i8 0>)
672   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, msl #16
673   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
674   ; CHECK-NEXT:    bl      f_v4i16
675   call i16 @f_v4i16(<4 x i16> <i16 65535, i16 7, i16 65535, i16 7>)
676   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, msl #16
677   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
678   ; CHECK-NEXT:    bl      f_v2i32
679   call i32 @f_v2i32(<2 x i32> <i32 458751, i32 458751>)
680   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, msl #16
681   ; CHECK-NEXT:    bl      f_v1i64
682   call i64 @f_v1i64(<1 x i64> <i64 1688845565689855>)
683   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, msl #16
684   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
685   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
686   ; CHECK-NEXT:    bl      f_v16i8
687   call i8 @f_v16i8(<16 x i8> <i8 255, i8 255, i8 5, i8 0, i8 255, i8 255, i8 5, i8 0, i8 255, i8 255, i8 5, i8 0, i8 255, i8 255, i8 5, i8 0>)
688   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, msl #16
689   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
690   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
691   ; CHECK-NEXT:    bl      f_v8i16
692   call i16 @f_v8i16(<8 x i16> <i16 65535, i16 4, i16 65535, i16 4, i16 65535, i16 4, i16 65535, i16 4>)
693   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, msl #16
694   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
695   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
696   ; CHECK-NEXT:    bl      f_v4i32
697   call i32 @f_v4i32(<4 x i32> <i32 262143, i32 262143, i32 262143, i32 262143>)
698   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, msl #16
699   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
700   ; CHECK-NEXT:    bl      f_v2i64
701   call i64 @f_v2i64(<2 x i64> <i64 844420635361279, i64 844420635361279>)
702
703   ret void
704 }
705
706 ; CHECK-LABEL: modimm_t9_call:
707 define void @modimm_t9_call() {
708   ; CHECK:         movi    v[[REG1:[0-9]+]].8b, #0x8
709   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
710   ; CHECK-NEXT:    bl      f_v8i8
711   call i8 @f_v8i8(<8 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>)
712   ; CHECK:         movi    v[[REG1:[0-9]+]].8b, #0x7
713   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
714   ; CHECK-NEXT:    bl      f_v4i16
715   call i16 @f_v4i16(<4 x i16> <i16 1799, i16 1799, i16 1799, i16 1799>)
716   ; CHECK:         movi    v[[REG1:[0-9]+]].8b, #0x6
717   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
718   ; CHECK-NEXT:    bl      f_v2i32
719   call i32 @f_v2i32(<2 x i32> <i32 101058054, i32 101058054>)
720   ; CHECK:         movi    v[[REG1:[0-9]+]].16b, #0x5
721   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
722   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
723   ; CHECK-NEXT:    bl      f_v16i8
724   call i8 @f_v16i8(<16 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>)
725   ; CHECK:         movi    v[[REG1:[0-9]+]].16b, #0x4
726   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
727   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
728   ; CHECK-NEXT:    bl      f_v8i16
729   call i16 @f_v8i16(<8 x i16> <i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028>)
730   ; CHECK:         movi    v[[REG1:[0-9]+]].16b, #0x3
731   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
732   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
733   ; CHECK-NEXT:    bl      f_v4i32
734   call i32 @f_v4i32(<4 x i32> <i32 50529027, i32 50529027, i32 50529027, i32 50529027>)
735
736   ret void
737 }
738
739 ; CHECK-LABEL: modimm_t10_call:
740 define void @modimm_t10_call() {
741   ; CHECK:         movi    d[[REG1:[0-9]+]], #0x0000ff000000ff
742   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
743   ; CHECK-NEXT:    bl      f_v8i8
744   call i8 @f_v8i8(<8 x i8> <i8 -1, i8 0, i8 0, i8 0, i8 -1, i8 0, i8 0, i8 0>)
745   ; CHECK:         movi    d[[REG1:[0-9]+]], #0x00ffff0000ffff
746   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
747   ; CHECK-NEXT:    bl      f_v4i16
748   call i16 @f_v4i16(<4 x i16> <i16 -1, i16 0, i16 -1, i16 0>)
749   ; CHECK:         movi    d[[REG1:[0-9]+]], #0xffffffffffffffff
750   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
751   ; CHECK-NEXT:    bl      f_v2i32
752   call i32 @f_v2i32(<2 x i32> <i32 -1, i32 -1>)
753   ; CHECK:         movi    v[[REG1:[0-9]+]].2d, #0xffffff00ffffff
754   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
755   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
756   ; CHECK-NEXT:    bl      f_v16i8
757   call i8 @f_v16i8(<16 x i8> <i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0>)
758   ; CHECK:         movi    v[[REG1:[0-9]+]].2d, #0xffffffffffff0000
759   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
760   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
761   ; CHECK-NEXT:    bl      f_v8i16
762   call i16 @f_v8i16(<8 x i16> <i16 0, i16 -1, i16 -1, i16 -1, i16 0, i16 -1, i16 -1, i16 -1>)
763   ; CHECK:         movi    v[[REG1:[0-9]+]].2d, #0xffffffff00000000
764   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
765   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
766   ; CHECK-NEXT:    bl      f_v4i32
767   call i32 @f_v4i32(<4 x i32> <i32 0, i32 -1, i32 0, i32 -1>)
768
769   ret void
770 }
771
772 ; CHECK-LABEL: modimm_t11_call:
773 define void @modimm_t11_call() {
774   ; CHECK:         fmov    v[[REG1:[0-9]+]].2s, #4.00000000
775   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
776   ; CHECK-NEXT:    bl      f_v8i8
777   call i8 @f_v8i8(<8 x i8> <i8 0, i8 0, i8 128, i8 64, i8 0, i8 0, i8 128, i8 64>)
778   ; CHECK:         fmov    v[[REG1:[0-9]+]].2s, #3.75000000
779   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
780   ; CHECK-NEXT:    bl      f_v4i16
781   call i16 @f_v4i16(<4 x i16> <i16 0, i16 16496, i16 0, i16 16496>)
782   ; CHECK:         fmov    v[[REG1:[0-9]+]].2s, #3.50000000
783   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
784   ; CHECK-NEXT:    bl      f_v2i32
785   call i32 @f_v2i32(<2 x i32> <i32 1080033280, i32 1080033280>)
786   ; CHECK:         fmov    v{{[0-9]+}}.2s, #0.39062500
787   ; CHECK-NEXT:    bl      f_v1i64
788   call i64 @f_v1i64(<1 x i64> <i64 4523865826746957824>)
789   ; CHECK:         fmov    v[[REG1:[0-9]+]].4s, #3.25000000
790   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
791   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
792   ; CHECK-NEXT:    bl      f_v16i8
793   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 80, i8 64, i8 0, i8 0, i8 80, i8 64, i8 0, i8 0, i8 80, i8 64, i8 0, i8 0, i8 80, i8 64>)
794   ; CHECK:         fmov    v[[REG1:[0-9]+]].4s, #3.00000000
795   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
796   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
797   ; CHECK-NEXT:    bl      f_v8i16
798   call i16 @f_v8i16(<8 x i16> <i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448>)
799   ; CHECK:         fmov    v[[REG1:[0-9]+]].4s, #2.75000000
800   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
801   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
802   ; CHECK-NEXT:    bl      f_v4i32
803   call i32 @f_v4i32(<4 x i32> <i32 1076887552, i32 1076887552, i32 1076887552, i32 1076887552>)
804   ; CHECK:         fmov    v[[REG:[0-9]+]].4s, #2.5000000
805   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
806   ; CHECK-NEXT:    bl      f_v2i64
807   call i64 @f_v2i64(<2 x i64> <i64 4620693218757967872, i64 4620693218757967872>)
808
809   ret void
810 }
811
812 ; CHECK-LABEL: modimm_t12_call:
813 define void @modimm_t12_call() {
814   ; CHECK:         fmov    v[[REG1:[0-9]+]].2d, #0.18750000
815   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
816   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
817   ; CHECK-NEXT:    bl      f_v16i8
818   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 200, i8 63, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 200, i8 63>)
819   ; CHECK:         fmov    v[[REG1:[0-9]+]].2d, #0.17968750
820   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
821   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
822   ; CHECK-NEXT:    bl      f_v8i16
823   call i16 @f_v8i16(<8 x i16> <i16 0, i16 0, i16 0, i16 16327, i16 0, i16 0, i16 0, i16 16327>)
824   ; CHECK:         fmov    v[[REG1:[0-9]+]].2d, #0.17187500
825   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
826   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
827   ; CHECK-NEXT:    bl      f_v4i32
828   call i32 @f_v4i32(<4 x i32> <i32 0, i32 1069940736, i32 0, i32 1069940736>)
829
830   ret void
831 }