1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -S -emit-llvm -o - %s | opt -S -mem2reg | FileCheck --check-prefix=LE %s
3 // RUN: %clang_cc1 -triple thumbebv8.1m.main-arm-none-eabi -target-feature +mve -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -S -emit-llvm -o - %s | opt -S -mem2reg | FileCheck --check-prefix=BE %s
4 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -DPOLYMORPHIC -S -emit-llvm -o - %s | opt -S -mem2reg | FileCheck --check-prefix=LE %s
5 // RUN: %clang_cc1 -triple thumbebv8.1m.main-arm-none-eabi -target-feature +mve -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -DPOLYMORPHIC -S -emit-llvm -o - %s | opt -S -mem2reg | FileCheck --check-prefix=BE %s
6
7 #include <arm_mve.h>
8
9 // LE-LABEL: @test_vmovnbq_s16(
10 // LE-NEXT: entry:
11 // LE-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
12 // LE-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16>
13 // LE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> [[TMP1]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
14 // LE-NEXT: [[TMP3:%.*]] = trunc <16 x i16> [[TMP2]] to <16 x i8>
15 // LE-NEXT: ret <16 x i8> [[TMP3]]
16 //
17 // BE-LABEL: @test_vmovnbq_s16(
18 // BE-NEXT: entry:
19 // BE-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
20 // BE-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[TMP0]])
21 // BE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> [[TMP1]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
22 // BE-NEXT: [[TMP3:%.*]] = trunc <16 x i16> [[TMP2]] to <16 x i8>
23 // BE-NEXT: ret <16 x i8> [[TMP3]]
24 //
test_vmovnbq_s16(int8x16_t a,int16x8_t b)25 int8x16_t test_vmovnbq_s16(int8x16_t a, int16x8_t b)
26 {
27 #ifdef POLYMORPHIC
28 return vmovnbq(a, b);
29 #else /* POLYMORPHIC */
30 return vmovnbq_s16(a, b);
31 #endif /* POLYMORPHIC */
32 }
33
34 // LE-LABEL: @test_vmovnbq_s32(
35 // LE-NEXT: entry:
36 // LE-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
37 // LE-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[TMP0]] to <4 x i32>
38 // LE-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[TMP1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
39 // LE-NEXT: [[TMP3:%.*]] = trunc <8 x i32> [[TMP2]] to <8 x i16>
40 // LE-NEXT: ret <8 x i16> [[TMP3]]
41 //
42 // BE-LABEL: @test_vmovnbq_s32(
43 // BE-NEXT: entry:
44 // BE-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
45 // BE-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[TMP0]])
46 // BE-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[TMP1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
47 // BE-NEXT: [[TMP3:%.*]] = trunc <8 x i32> [[TMP2]] to <8 x i16>
48 // BE-NEXT: ret <8 x i16> [[TMP3]]
49 //
test_vmovnbq_s32(int16x8_t a,int32x4_t b)50 int16x8_t test_vmovnbq_s32(int16x8_t a, int32x4_t b)
51 {
52 #ifdef POLYMORPHIC
53 return vmovnbq(a, b);
54 #else /* POLYMORPHIC */
55 return vmovnbq_s32(a, b);
56 #endif /* POLYMORPHIC */
57 }
58
59 // LE-LABEL: @test_vmovnbq_u16(
60 // LE-NEXT: entry:
61 // LE-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
62 // LE-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16>
63 // LE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> [[TMP1]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
64 // LE-NEXT: [[TMP3:%.*]] = trunc <16 x i16> [[TMP2]] to <16 x i8>
65 // LE-NEXT: ret <16 x i8> [[TMP3]]
66 //
67 // BE-LABEL: @test_vmovnbq_u16(
68 // BE-NEXT: entry:
69 // BE-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
70 // BE-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[TMP0]])
71 // BE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> [[TMP1]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
72 // BE-NEXT: [[TMP3:%.*]] = trunc <16 x i16> [[TMP2]] to <16 x i8>
73 // BE-NEXT: ret <16 x i8> [[TMP3]]
74 //
test_vmovnbq_u16(uint8x16_t a,uint16x8_t b)75 uint8x16_t test_vmovnbq_u16(uint8x16_t a, uint16x8_t b)
76 {
77 #ifdef POLYMORPHIC
78 return vmovnbq(a, b);
79 #else /* POLYMORPHIC */
80 return vmovnbq_u16(a, b);
81 #endif /* POLYMORPHIC */
82 }
83
84 // LE-LABEL: @test_vmovnbq_u32(
85 // LE-NEXT: entry:
86 // LE-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
87 // LE-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[TMP0]] to <4 x i32>
88 // LE-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[TMP1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
89 // LE-NEXT: [[TMP3:%.*]] = trunc <8 x i32> [[TMP2]] to <8 x i16>
90 // LE-NEXT: ret <8 x i16> [[TMP3]]
91 //
92 // BE-LABEL: @test_vmovnbq_u32(
93 // BE-NEXT: entry:
94 // BE-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
95 // BE-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[TMP0]])
96 // BE-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[TMP1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
97 // BE-NEXT: [[TMP3:%.*]] = trunc <8 x i32> [[TMP2]] to <8 x i16>
98 // BE-NEXT: ret <8 x i16> [[TMP3]]
99 //
test_vmovnbq_u32(uint16x8_t a,uint32x4_t b)100 uint16x8_t test_vmovnbq_u32(uint16x8_t a, uint32x4_t b)
101 {
102 #ifdef POLYMORPHIC
103 return vmovnbq(a, b);
104 #else /* POLYMORPHIC */
105 return vmovnbq_u32(a, b);
106 #endif /* POLYMORPHIC */
107 }
108
109 // LE-LABEL: @test_vmovntq_s16(
110 // LE-NEXT: entry:
111 // LE-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
112 // LE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[TMP0]], <8 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
113 // LE-NEXT: [[TMP2:%.*]] = trunc <16 x i16> [[TMP1]] to <16 x i8>
114 // LE-NEXT: ret <16 x i8> [[TMP2]]
115 //
116 // BE-LABEL: @test_vmovntq_s16(
117 // BE-NEXT: entry:
118 // BE-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[A:%.*]])
119 // BE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[TMP0]], <8 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
120 // BE-NEXT: [[TMP2:%.*]] = trunc <16 x i16> [[TMP1]] to <16 x i8>
121 // BE-NEXT: ret <16 x i8> [[TMP2]]
122 //
test_vmovntq_s16(int8x16_t a,int16x8_t b)123 int8x16_t test_vmovntq_s16(int8x16_t a, int16x8_t b)
124 {
125 #ifdef POLYMORPHIC
126 return vmovntq(a, b);
127 #else /* POLYMORPHIC */
128 return vmovntq_s16(a, b);
129 #endif /* POLYMORPHIC */
130 }
131
132 // LE-LABEL: @test_vmovntq_s32(
133 // LE-NEXT: entry:
134 // LE-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
135 // LE-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
136 // LE-NEXT: [[TMP2:%.*]] = trunc <8 x i32> [[TMP1]] to <8 x i16>
137 // LE-NEXT: ret <8 x i16> [[TMP2]]
138 //
139 // BE-LABEL: @test_vmovntq_s32(
140 // BE-NEXT: entry:
141 // BE-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[A:%.*]])
142 // BE-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
143 // BE-NEXT: [[TMP2:%.*]] = trunc <8 x i32> [[TMP1]] to <8 x i16>
144 // BE-NEXT: ret <8 x i16> [[TMP2]]
145 //
test_vmovntq_s32(int16x8_t a,int32x4_t b)146 int16x8_t test_vmovntq_s32(int16x8_t a, int32x4_t b)
147 {
148 #ifdef POLYMORPHIC
149 return vmovntq(a, b);
150 #else /* POLYMORPHIC */
151 return vmovntq_s32(a, b);
152 #endif /* POLYMORPHIC */
153 }
154
155 // LE-LABEL: @test_vmovntq_u16(
156 // LE-NEXT: entry:
157 // LE-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
158 // LE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[TMP0]], <8 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
159 // LE-NEXT: [[TMP2:%.*]] = trunc <16 x i16> [[TMP1]] to <16 x i8>
160 // LE-NEXT: ret <16 x i8> [[TMP2]]
161 //
162 // BE-LABEL: @test_vmovntq_u16(
163 // BE-NEXT: entry:
164 // BE-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[A:%.*]])
165 // BE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[TMP0]], <8 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
166 // BE-NEXT: [[TMP2:%.*]] = trunc <16 x i16> [[TMP1]] to <16 x i8>
167 // BE-NEXT: ret <16 x i8> [[TMP2]]
168 //
test_vmovntq_u16(uint8x16_t a,uint16x8_t b)169 uint8x16_t test_vmovntq_u16(uint8x16_t a, uint16x8_t b)
170 {
171 #ifdef POLYMORPHIC
172 return vmovntq(a, b);
173 #else /* POLYMORPHIC */
174 return vmovntq_u16(a, b);
175 #endif /* POLYMORPHIC */
176 }
177
178 // LE-LABEL: @test_vmovntq_u32(
179 // LE-NEXT: entry:
180 // LE-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
181 // LE-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
182 // LE-NEXT: [[TMP2:%.*]] = trunc <8 x i32> [[TMP1]] to <8 x i16>
183 // LE-NEXT: ret <8 x i16> [[TMP2]]
184 //
185 // BE-LABEL: @test_vmovntq_u32(
186 // BE-NEXT: entry:
187 // BE-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[A:%.*]])
188 // BE-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
189 // BE-NEXT: [[TMP2:%.*]] = trunc <8 x i32> [[TMP1]] to <8 x i16>
190 // BE-NEXT: ret <8 x i16> [[TMP2]]
191 //
test_vmovntq_u32(uint16x8_t a,uint32x4_t b)192 uint16x8_t test_vmovntq_u32(uint16x8_t a, uint32x4_t b)
193 {
194 #ifdef POLYMORPHIC
195 return vmovntq(a, b);
196 #else /* POLYMORPHIC */
197 return vmovntq_u32(a, b);
198 #endif /* POLYMORPHIC */
199 }
200
201 // LE-LABEL: @test_vmovnbq_m_s16(
202 // LE-NEXT: entry:
203 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
204 // LE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
205 // LE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 0, <8 x i1> [[TMP1]])
206 // LE-NEXT: ret <16 x i8> [[TMP2]]
207 //
208 // BE-LABEL: @test_vmovnbq_m_s16(
209 // BE-NEXT: entry:
210 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
211 // BE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
212 // BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 0, <8 x i1> [[TMP1]])
213 // BE-NEXT: ret <16 x i8> [[TMP2]]
214 //
test_vmovnbq_m_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)215 int8x16_t test_vmovnbq_m_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
216 {
217 #ifdef POLYMORPHIC
218 return vmovnbq_m(a, b, p);
219 #else /* POLYMORPHIC */
220 return vmovnbq_m_s16(a, b, p);
221 #endif /* POLYMORPHIC */
222 }
223
224 // LE-LABEL: @test_vmovnbq_m_s32(
225 // LE-NEXT: entry:
226 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
227 // LE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
228 // LE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 0, <4 x i1> [[TMP1]])
229 // LE-NEXT: ret <8 x i16> [[TMP2]]
230 //
231 // BE-LABEL: @test_vmovnbq_m_s32(
232 // BE-NEXT: entry:
233 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
234 // BE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
235 // BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 0, <4 x i1> [[TMP1]])
236 // BE-NEXT: ret <8 x i16> [[TMP2]]
237 //
test_vmovnbq_m_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)238 int16x8_t test_vmovnbq_m_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
239 {
240 #ifdef POLYMORPHIC
241 return vmovnbq_m(a, b, p);
242 #else /* POLYMORPHIC */
243 return vmovnbq_m_s32(a, b, p);
244 #endif /* POLYMORPHIC */
245 }
246
247 // LE-LABEL: @test_vmovnbq_m_u16(
248 // LE-NEXT: entry:
249 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
250 // LE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
251 // LE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 0, <8 x i1> [[TMP1]])
252 // LE-NEXT: ret <16 x i8> [[TMP2]]
253 //
254 // BE-LABEL: @test_vmovnbq_m_u16(
255 // BE-NEXT: entry:
256 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
257 // BE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
258 // BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 0, <8 x i1> [[TMP1]])
259 // BE-NEXT: ret <16 x i8> [[TMP2]]
260 //
test_vmovnbq_m_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)261 uint8x16_t test_vmovnbq_m_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
262 {
263 #ifdef POLYMORPHIC
264 return vmovnbq_m(a, b, p);
265 #else /* POLYMORPHIC */
266 return vmovnbq_m_u16(a, b, p);
267 #endif /* POLYMORPHIC */
268 }
269
270 // LE-LABEL: @test_vmovnbq_m_u32(
271 // LE-NEXT: entry:
272 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
273 // LE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
274 // LE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 0, <4 x i1> [[TMP1]])
275 // LE-NEXT: ret <8 x i16> [[TMP2]]
276 //
277 // BE-LABEL: @test_vmovnbq_m_u32(
278 // BE-NEXT: entry:
279 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
280 // BE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
281 // BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 0, <4 x i1> [[TMP1]])
282 // BE-NEXT: ret <8 x i16> [[TMP2]]
283 //
test_vmovnbq_m_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)284 uint16x8_t test_vmovnbq_m_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
285 {
286 #ifdef POLYMORPHIC
287 return vmovnbq_m(a, b, p);
288 #else /* POLYMORPHIC */
289 return vmovnbq_m_u32(a, b, p);
290 #endif /* POLYMORPHIC */
291 }
292
293 // LE-LABEL: @test_vmovntq_m_s16(
294 // LE-NEXT: entry:
295 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
296 // LE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
297 // LE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, <8 x i1> [[TMP1]])
298 // LE-NEXT: ret <16 x i8> [[TMP2]]
299 //
300 // BE-LABEL: @test_vmovntq_m_s16(
301 // BE-NEXT: entry:
302 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
303 // BE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
304 // BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, <8 x i1> [[TMP1]])
305 // BE-NEXT: ret <16 x i8> [[TMP2]]
306 //
test_vmovntq_m_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)307 int8x16_t test_vmovntq_m_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
308 {
309 #ifdef POLYMORPHIC
310 return vmovntq_m(a, b, p);
311 #else /* POLYMORPHIC */
312 return vmovntq_m_s16(a, b, p);
313 #endif /* POLYMORPHIC */
314 }
315
316 // LE-LABEL: @test_vmovntq_m_s32(
317 // LE-NEXT: entry:
318 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
319 // LE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
320 // LE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, <4 x i1> [[TMP1]])
321 // LE-NEXT: ret <8 x i16> [[TMP2]]
322 //
323 // BE-LABEL: @test_vmovntq_m_s32(
324 // BE-NEXT: entry:
325 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
326 // BE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
327 // BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, <4 x i1> [[TMP1]])
328 // BE-NEXT: ret <8 x i16> [[TMP2]]
329 //
test_vmovntq_m_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)330 int16x8_t test_vmovntq_m_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
331 {
332 #ifdef POLYMORPHIC
333 return vmovntq_m(a, b, p);
334 #else /* POLYMORPHIC */
335 return vmovntq_m_s32(a, b, p);
336 #endif /* POLYMORPHIC */
337 }
338
339 // LE-LABEL: @test_vmovntq_m_u16(
340 // LE-NEXT: entry:
341 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
342 // LE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
343 // LE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, <8 x i1> [[TMP1]])
344 // LE-NEXT: ret <16 x i8> [[TMP2]]
345 //
346 // BE-LABEL: @test_vmovntq_m_u16(
347 // BE-NEXT: entry:
348 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
349 // BE-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
350 // BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vmovn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, <8 x i1> [[TMP1]])
351 // BE-NEXT: ret <16 x i8> [[TMP2]]
352 //
test_vmovntq_m_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)353 uint8x16_t test_vmovntq_m_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
354 {
355 #ifdef POLYMORPHIC
356 return vmovntq_m(a, b, p);
357 #else /* POLYMORPHIC */
358 return vmovntq_m_u16(a, b, p);
359 #endif /* POLYMORPHIC */
360 }
361
362 // LE-LABEL: @test_vmovntq_m_u32(
363 // LE-NEXT: entry:
364 // LE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
365 // LE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
366 // LE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, <4 x i1> [[TMP1]])
367 // LE-NEXT: ret <8 x i16> [[TMP2]]
368 //
369 // BE-LABEL: @test_vmovntq_m_u32(
370 // BE-NEXT: entry:
371 // BE-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
372 // BE-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
373 // BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, <4 x i1> [[TMP1]])
374 // BE-NEXT: ret <8 x i16> [[TMP2]]
375 //
test_vmovntq_m_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)376 uint16x8_t test_vmovntq_m_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
377 {
378 #ifdef POLYMORPHIC
379 return vmovntq_m(a, b, p);
380 #else /* POLYMORPHIC */
381 return vmovntq_m_u32(a, b, p);
382 #endif /* POLYMORPHIC */
383 }
384