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