blob: 4d0568a675becc0fe798f7800ee660b3c85c48f5 [file] [log] [blame]
David Greenc7e55d42019-07-24 11:51:36 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
David Greeneecba952020-04-22 16:33:11 +01002; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
David Greenc7e55d42019-07-24 11:51:36 +00003
4
5define arm_aapcs_vfpcc <4 x i32> @build_var0_v4i1(i32 %s, i32 %t, <4 x i32> %a, <4 x i32> %b) {
6; CHECK-LABEL: build_var0_v4i1:
7; CHECK: @ %bb.0: @ %entry
8; CHECK-NEXT: cmp r0, r1
David Green57cc65ff2019-09-03 10:53:07 +00009; CHECK-NEXT: mov.w r1, #0
David Green2f3574c2019-09-03 11:30:54 +000010; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +000011; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +000012; CHECK-NEXT: rsbs r0, r0, #0
David Green57cc65ff2019-09-03 10:53:07 +000013; CHECK-NEXT: bfi r1, r0, #0, #4
14; CHECK-NEXT: vmsr p0, r1
David Greenc7e55d42019-07-24 11:51:36 +000015; CHECK-NEXT: vpsel q0, q0, q1
16; CHECK-NEXT: bx lr
17entry:
18 %c = icmp ult i32 %s, %t
19 %vc = insertelement <4 x i1> zeroinitializer, i1 %c, i64 0
20 %r = select <4 x i1> %vc, <4 x i32> %a, <4 x i32> %b
21 ret <4 x i32> %r
22}
23
24define arm_aapcs_vfpcc <4 x i32> @build_var3_v4i1(i32 %s, i32 %t, <4 x i32> %a, <4 x i32> %b) {
25; CHECK-LABEL: build_var3_v4i1:
26; CHECK: @ %bb.0: @ %entry
27; CHECK-NEXT: cmp r0, r1
David Green57cc65ff2019-09-03 10:53:07 +000028; CHECK-NEXT: mov.w r1, #0
David Green2f3574c2019-09-03 11:30:54 +000029; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +000030; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +000031; CHECK-NEXT: rsbs r0, r0, #0
David Green57cc65ff2019-09-03 10:53:07 +000032; CHECK-NEXT: bfi r1, r0, #12, #4
33; CHECK-NEXT: vmsr p0, r1
David Greenc7e55d42019-07-24 11:51:36 +000034; CHECK-NEXT: vpsel q0, q0, q1
35; CHECK-NEXT: bx lr
36entry:
37 %c = icmp ult i32 %s, %t
38 %vc = insertelement <4 x i1> zeroinitializer, i1 %c, i64 3
39 %r = select <4 x i1> %vc, <4 x i32> %a, <4 x i32> %b
40 ret <4 x i32> %r
41}
42
43define arm_aapcs_vfpcc <4 x i32> @build_varN_v4i1(i32 %s, i32 %t, <4 x i32> %a, <4 x i32> %b) {
44; CHECK-LABEL: build_varN_v4i1:
45; CHECK: @ %bb.0: @ %entry
46; CHECK-NEXT: cmp r0, r1
David Green2f3574c2019-09-03 11:30:54 +000047; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +000048; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +000049; CHECK-NEXT: rsbs r0, r0, #0
David Green0cfb78e52019-09-19 12:17:41 +000050; CHECK-NEXT: vmsr p0, r0
David Greenc7e55d42019-07-24 11:51:36 +000051; CHECK-NEXT: vpsel q0, q0, q1
52; CHECK-NEXT: bx lr
53entry:
54 %c = icmp ult i32 %s, %t
55 %vc1 = insertelement <4 x i1> undef, i1 %c, i64 0
56 %vc4 = shufflevector <4 x i1> %vc1, <4 x i1> undef, <4 x i32> zeroinitializer
57 %r = select <4 x i1> %vc4, <4 x i32> %a, <4 x i32> %b
58 ret <4 x i32> %r
59}
60
61
62define arm_aapcs_vfpcc <8 x i16> @build_var0_v8i1(i32 %s, i32 %t, <8 x i16> %a, <8 x i16> %b) {
63; CHECK-LABEL: build_var0_v8i1:
64; CHECK: @ %bb.0: @ %entry
65; CHECK-NEXT: cmp r0, r1
David Green57cc65ff2019-09-03 10:53:07 +000066; CHECK-NEXT: mov.w r1, #0
David Green2f3574c2019-09-03 11:30:54 +000067; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +000068; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +000069; CHECK-NEXT: rsbs r0, r0, #0
David Green57cc65ff2019-09-03 10:53:07 +000070; CHECK-NEXT: bfi r1, r0, #0, #2
71; CHECK-NEXT: vmsr p0, r1
David Greenc7e55d42019-07-24 11:51:36 +000072; CHECK-NEXT: vpsel q0, q0, q1
73; CHECK-NEXT: bx lr
74entry:
75 %c = icmp ult i32 %s, %t
76 %vc = insertelement <8 x i1> zeroinitializer, i1 %c, i64 0
77 %r = select <8 x i1> %vc, <8 x i16> %a, <8 x i16> %b
78 ret <8 x i16> %r
79}
80
81define arm_aapcs_vfpcc <8 x i16> @build_var3_v8i1(i32 %s, i32 %t, <8 x i16> %a, <8 x i16> %b) {
82; CHECK-LABEL: build_var3_v8i1:
83; CHECK: @ %bb.0: @ %entry
84; CHECK-NEXT: cmp r0, r1
David Green57cc65ff2019-09-03 10:53:07 +000085; CHECK-NEXT: mov.w r1, #0
David Green2f3574c2019-09-03 11:30:54 +000086; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +000087; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +000088; CHECK-NEXT: rsbs r0, r0, #0
David Green57cc65ff2019-09-03 10:53:07 +000089; CHECK-NEXT: bfi r1, r0, #6, #2
90; CHECK-NEXT: vmsr p0, r1
David Greenc7e55d42019-07-24 11:51:36 +000091; CHECK-NEXT: vpsel q0, q0, q1
92; CHECK-NEXT: bx lr
93entry:
94 %c = icmp ult i32 %s, %t
95 %vc = insertelement <8 x i1> zeroinitializer, i1 %c, i64 3
96 %r = select <8 x i1> %vc, <8 x i16> %a, <8 x i16> %b
97 ret <8 x i16> %r
98}
99
100define arm_aapcs_vfpcc <8 x i16> @build_varN_v8i1(i32 %s, i32 %t, <8 x i16> %a, <8 x i16> %b) {
101; CHECK-LABEL: build_varN_v8i1:
102; CHECK: @ %bb.0: @ %entry
103; CHECK-NEXT: cmp r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000104; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000105; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +0000106; CHECK-NEXT: rsbs r0, r0, #0
David Green0cfb78e52019-09-19 12:17:41 +0000107; CHECK-NEXT: vmsr p0, r0
David Greenc7e55d42019-07-24 11:51:36 +0000108; CHECK-NEXT: vpsel q0, q0, q1
109; CHECK-NEXT: bx lr
110entry:
111 %c = icmp ult i32 %s, %t
112 %vc1 = insertelement <8 x i1> undef, i1 %c, i64 0
113 %vc4 = shufflevector <8 x i1> %vc1, <8 x i1> undef, <8 x i32> zeroinitializer
114 %r = select <8 x i1> %vc4, <8 x i16> %a, <8 x i16> %b
115 ret <8 x i16> %r
116}
117
118
119define arm_aapcs_vfpcc <16 x i8> @build_var0_v16i1(i32 %s, i32 %t, <16 x i8> %a, <16 x i8> %b) {
120; CHECK-LABEL: build_var0_v16i1:
121; CHECK: @ %bb.0: @ %entry
122; CHECK-NEXT: cmp r0, r1
David Green57cc65ff2019-09-03 10:53:07 +0000123; CHECK-NEXT: mov.w r1, #0
David Green2f3574c2019-09-03 11:30:54 +0000124; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000125; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +0000126; CHECK-NEXT: rsbs r0, r0, #0
David Green57cc65ff2019-09-03 10:53:07 +0000127; CHECK-NEXT: bfi r1, r0, #0, #1
128; CHECK-NEXT: vmsr p0, r1
David Greenc7e55d42019-07-24 11:51:36 +0000129; CHECK-NEXT: vpsel q0, q0, q1
130; CHECK-NEXT: bx lr
131entry:
132 %c = icmp ult i32 %s, %t
133 %vc = insertelement <16 x i1> zeroinitializer, i1 %c, i64 0
134 %r = select <16 x i1> %vc, <16 x i8> %a, <16 x i8> %b
135 ret <16 x i8> %r
136}
137
138define arm_aapcs_vfpcc <16 x i8> @build_var3_v16i1(i32 %s, i32 %t, <16 x i8> %a, <16 x i8> %b) {
139; CHECK-LABEL: build_var3_v16i1:
140; CHECK: @ %bb.0: @ %entry
141; CHECK-NEXT: cmp r0, r1
David Green57cc65ff2019-09-03 10:53:07 +0000142; CHECK-NEXT: mov.w r1, #0
David Green2f3574c2019-09-03 11:30:54 +0000143; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000144; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +0000145; CHECK-NEXT: rsbs r0, r0, #0
David Green57cc65ff2019-09-03 10:53:07 +0000146; CHECK-NEXT: bfi r1, r0, #3, #1
147; CHECK-NEXT: vmsr p0, r1
David Greenc7e55d42019-07-24 11:51:36 +0000148; CHECK-NEXT: vpsel q0, q0, q1
149; CHECK-NEXT: bx lr
150entry:
151 %c = icmp ult i32 %s, %t
152 %vc = insertelement <16 x i1> zeroinitializer, i1 %c, i64 3
153 %r = select <16 x i1> %vc, <16 x i8> %a, <16 x i8> %b
154 ret <16 x i8> %r
155}
156
157define arm_aapcs_vfpcc <16 x i8> @build_varN_v16i1(i32 %s, i32 %t, <16 x i8> %a, <16 x i8> %b) {
158; CHECK-LABEL: build_varN_v16i1:
159; CHECK: @ %bb.0: @ %entry
160; CHECK-NEXT: cmp r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000161; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000162; CHECK-NEXT: and r0, r0, #1
David Greenc7e55d42019-07-24 11:51:36 +0000163; CHECK-NEXT: rsbs r0, r0, #0
David Green0cfb78e52019-09-19 12:17:41 +0000164; CHECK-NEXT: vmsr p0, r0
David Greenc7e55d42019-07-24 11:51:36 +0000165; CHECK-NEXT: vpsel q0, q0, q1
166; CHECK-NEXT: bx lr
167entry:
168 %c = icmp ult i32 %s, %t
169 %vc1 = insertelement <16 x i1> undef, i1 %c, i64 0
170 %vc4 = shufflevector <16 x i1> %vc1, <16 x i1> undef, <16 x i32> zeroinitializer
171 %r = select <16 x i1> %vc4, <16 x i8> %a, <16 x i8> %b
172 ret <16 x i8> %r
173}
174
175
176define arm_aapcs_vfpcc <2 x i64> @build_var0_v2i1(i32 %s, i32 %t, <2 x i64> %a, <2 x i64> %b) {
177; CHECK-LABEL: build_var0_v2i1:
178; CHECK: @ %bb.0: @ %entry
David Greenc7e55d42019-07-24 11:51:36 +0000179; CHECK-NEXT: cmp r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000180; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000181; CHECK-NEXT: and r0, r0, #1
182; CHECK-NEXT: rsbs r0, r0, #0
David Greenc7e55d42019-07-24 11:51:36 +0000183; CHECK-NEXT: vmov s8, r0
184; CHECK-NEXT: vldr s10, .LCPI9_0
185; CHECK-NEXT: vmov.f32 s9, s8
186; CHECK-NEXT: vmov.f32 s11, s10
187; CHECK-NEXT: vbic q1, q1, q2
188; CHECK-NEXT: vand q0, q0, q2
189; CHECK-NEXT: vorr q0, q0, q1
190; CHECK-NEXT: bx lr
191; CHECK-NEXT: .p2align 2
192; CHECK-NEXT: @ %bb.1:
193; CHECK-NEXT: .LCPI9_0:
Jinsong Ji01edae12020-02-06 16:12:10 +0000194; CHECK-NEXT: .long 0x00000000 @ float 0
David Greenc7e55d42019-07-24 11:51:36 +0000195entry:
196 %c = icmp ult i32 %s, %t
197 %vc = insertelement <2 x i1> zeroinitializer, i1 %c, i64 0
198 %r = select <2 x i1> %vc, <2 x i64> %a, <2 x i64> %b
199 ret <2 x i64> %r
200}
201
202define arm_aapcs_vfpcc <2 x i64> @build_var1_v2i1(i32 %s, i32 %t, <2 x i64> %a, <2 x i64> %b) {
203; CHECK-LABEL: build_var1_v2i1:
204; CHECK: @ %bb.0: @ %entry
David Greenc7e55d42019-07-24 11:51:36 +0000205; CHECK-NEXT: cmp r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000206; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000207; CHECK-NEXT: and r0, r0, #1
208; CHECK-NEXT: rsbs r0, r0, #0
David Greenc7e55d42019-07-24 11:51:36 +0000209; CHECK-NEXT: vmov s10, r0
210; CHECK-NEXT: vldr s8, .LCPI10_0
211; CHECK-NEXT: vmov.f32 s9, s8
212; CHECK-NEXT: vmov.f32 s11, s10
213; CHECK-NEXT: vbic q1, q1, q2
214; CHECK-NEXT: vand q0, q0, q2
215; CHECK-NEXT: vorr q0, q0, q1
216; CHECK-NEXT: bx lr
217; CHECK-NEXT: .p2align 2
218; CHECK-NEXT: @ %bb.1:
219; CHECK-NEXT: .LCPI10_0:
Jinsong Ji01edae12020-02-06 16:12:10 +0000220; CHECK-NEXT: .long 0x00000000 @ float 0
David Greenc7e55d42019-07-24 11:51:36 +0000221entry:
222 %c = icmp ult i32 %s, %t
223 %vc = insertelement <2 x i1> zeroinitializer, i1 %c, i64 1
224 %r = select <2 x i1> %vc, <2 x i64> %a, <2 x i64> %b
225 ret <2 x i64> %r
226}
227
228define arm_aapcs_vfpcc <2 x i64> @build_varN_v2i1(i32 %s, i32 %t, <2 x i64> %a, <2 x i64> %b) {
229; CHECK-LABEL: build_varN_v2i1:
230; CHECK: @ %bb.0: @ %entry
David Greenc7e55d42019-07-24 11:51:36 +0000231; CHECK-NEXT: cmp r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000232; CHECK-NEXT: cset r0, lo
David Green57cc65ff2019-09-03 10:53:07 +0000233; CHECK-NEXT: and r0, r0, #1
234; CHECK-NEXT: rsbs r0, r0, #0
David Greenc7e55d42019-07-24 11:51:36 +0000235; CHECK-NEXT: vdup.32 q2, r0
236; CHECK-NEXT: vbic q1, q1, q2
237; CHECK-NEXT: vand q0, q0, q2
238; CHECK-NEXT: vorr q0, q0, q1
239; CHECK-NEXT: bx lr
240entry:
241 %c = icmp ult i32 %s, %t
242 %vc1 = insertelement <2 x i1> undef, i1 %c, i64 0
243 %vc4 = shufflevector <2 x i1> %vc1, <2 x i1> undef, <2 x i32> zeroinitializer
244 %r = select <2 x i1> %vc4, <2 x i64> %a, <2 x i64> %b
245 ret <2 x i64> %r
246}