@@ -105,3 +105,147 @@ if.then:
105
105
if.end:
106
106
ret i32 1 ;
107
107
}
108
+
109
+
110
+ define <1 x float > @test_vselect_f32 (<1 x float > %i105 , <1 x float > %in ) {
111
+ ; CHECK-LABEL: test_vselect_f32:
112
+ ; CHECK: // %bb.0:
113
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
114
+ ; CHECK-NEXT: fcmp s0, s0
115
+ ; CHECK-NEXT: cset w8, vs
116
+ ; CHECK-NEXT: fmov s2, w8
117
+ ; CHECK-NEXT: shl v2.2s, v2.2s, #31
118
+ ; CHECK-NEXT: cmlt v2.2s, v2.2s, #0
119
+ ; CHECK-NEXT: bit v0.8b, v1.8b, v2.8b
120
+ ; CHECK-NEXT: ret
121
+ %i179 = fcmp uno <1 x float > %i105 , zeroinitializer
122
+ %i180 = select <1 x i1 > %i179 , <1 x float > %in , <1 x float > %i105
123
+ ret <1 x float > %i180
124
+ }
125
+
126
+ define <1 x half > @test_vselect_f16 (<1 x half > %i105 , <1 x half > %in ) {
127
+ ; CHECK-LABEL: test_vselect_f16:
128
+ ; CHECK: // %bb.0:
129
+ ; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
130
+ ; CHECK-NEXT: fcvt s2, h0
131
+ ; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
132
+ ; CHECK-NEXT: fcmp s2, s2
133
+ ; CHECK-NEXT: fcsel s0, s1, s0, vs
134
+ ; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
135
+ ; CHECK-NEXT: ret
136
+ %i179 = fcmp uno <1 x half > %i105 , zeroinitializer
137
+ %i180 = select <1 x i1 > %i179 , <1 x half > %in , <1 x half > %i105
138
+ ret <1 x half > %i180
139
+ }
140
+
141
+ define <1 x half > @test_select_f16 (half %a , half %b , <1 x half > %c , <1 x half > %d ) {
142
+ ; CHECK-LABEL: test_select_f16:
143
+ ; CHECK: // %bb.0:
144
+ ; CHECK-NEXT: fcvt s1, h1
145
+ ; CHECK-NEXT: fcvt s0, h0
146
+ ; CHECK-NEXT: // kill: def $h3 killed $h3 def $s3
147
+ ; CHECK-NEXT: // kill: def $h2 killed $h2 def $s2
148
+ ; CHECK-NEXT: fcmp s0, s1
149
+ ; CHECK-NEXT: fcsel s0, s2, s3, eq
150
+ ; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
151
+ ; CHECK-NEXT: ret
152
+ %cmp31 = fcmp oeq half %a , %b
153
+ %e = select i1 %cmp31 , <1 x half > %c , <1 x half > %d
154
+ ret <1 x half > %e
155
+ }
156
+
157
+ define <1 x i16 > @test_vselect_f16_i16 (<1 x half > %i105 , <1 x half > %in , <1 x i16 > %x , <1 x i16 > %y ) {
158
+ ; CHECK-LABEL: test_vselect_f16_i16:
159
+ ; CHECK: // %bb.0:
160
+ ; CHECK-NEXT: fcvt s0, h0
161
+ ; CHECK-NEXT: fcmp s0, s0
162
+ ; CHECK-NEXT: cset w8, vs
163
+ ; CHECK-NEXT: fmov s0, w8
164
+ ; CHECK-NEXT: shl v0.4h, v0.4h, #15
165
+ ; CHECK-NEXT: cmlt v0.4h, v0.4h, #0
166
+ ; CHECK-NEXT: bsl v0.8b, v2.8b, v3.8b
167
+ ; CHECK-NEXT: ret
168
+ %i179 = fcmp uno <1 x half > %i105 , zeroinitializer
169
+ %i180 = select <1 x i1 > %i179 , <1 x i16 > %x , <1 x i16 > %y
170
+ ret <1 x i16 > %i180
171
+ }
172
+
173
+ define <1 x i16 > @test_select_f16_i16 (half %i105 , half %in , <1 x i16 > %x , <1 x i16 > %y ) {
174
+ ; CHECK-LABEL: test_select_f16_i16:
175
+ ; CHECK: // %bb.0:
176
+ ; CHECK-NEXT: fcvt s0, h0
177
+ ; CHECK-NEXT: fcmp s0, s0
178
+ ; CHECK-NEXT: csetm w8, vs
179
+ ; CHECK-NEXT: dup v0.4h, w8
180
+ ; CHECK-NEXT: bsl v0.8b, v2.8b, v3.8b
181
+ ; CHECK-NEXT: ret
182
+ %i179 = fcmp uno half %i105 , zeroinitializer
183
+ %i180 = select i1 %i179 , <1 x i16 > %x , <1 x i16 > %y
184
+ ret <1 x i16 > %i180
185
+ }
186
+
187
+ define <1 x i32 > @test_vselect_f16_i32 (<1 x half > %i105 , <1 x half > %in , <1 x i32 > %x , <1 x i32 > %y ) {
188
+ ; CHECK-LABEL: test_vselect_f16_i32:
189
+ ; CHECK: // %bb.0:
190
+ ; CHECK-NEXT: fcvt s0, h0
191
+ ; CHECK-NEXT: fcmp s0, s0
192
+ ; CHECK-NEXT: cset w8, vs
193
+ ; CHECK-NEXT: fmov s0, w8
194
+ ; CHECK-NEXT: shl v0.2s, v0.2s, #31
195
+ ; CHECK-NEXT: cmlt v0.2s, v0.2s, #0
196
+ ; CHECK-NEXT: bsl v0.8b, v2.8b, v3.8b
197
+ ; CHECK-NEXT: ret
198
+ %i179 = fcmp uno <1 x half > %i105 , zeroinitializer
199
+ %i180 = select <1 x i1 > %i179 , <1 x i32 > %x , <1 x i32 > %y
200
+ ret <1 x i32 > %i180
201
+ }
202
+
203
+ define i64 @test_sext_extr_cmp_half (<1 x half > %v1 , <1 x half > %v2 ) {
204
+ ; CHECK-LABEL: test_sext_extr_cmp_half:
205
+ ; CHECK: // %bb.0:
206
+ ; CHECK-NEXT: fcvt s1, h1
207
+ ; CHECK-NEXT: fcvt s0, h0
208
+ ; CHECK-NEXT: fcmp s0, s1
209
+ ; CHECK-NEXT: cset w8, eq
210
+ ; CHECK-NEXT: sbfx x0, x8, #0, #1
211
+ ; CHECK-NEXT: ret
212
+ %1 = fcmp oeq <1 x half > %v1 , %v2
213
+ %2 = extractelement <1 x i1 > %1 , i32 0
214
+ %vget_lane = sext i1 %2 to i64
215
+ ret i64 %vget_lane
216
+ }
217
+
218
+ define <1 x i64 > @test_select_v1i1_half (half %lhs , half %rhs , <1 x i64 > %v3 ) {
219
+ ; CHECK-LABEL: test_select_v1i1_half:
220
+ ; CHECK: // %bb.0:
221
+ ; CHECK-NEXT: fcvt s1, h1
222
+ ; CHECK-NEXT: fcvt s0, h0
223
+ ; CHECK-NEXT: fcmp s0, s1
224
+ ; CHECK-NEXT: csetm x8, eq
225
+ ; CHECK-NEXT: fmov d0, x8
226
+ ; CHECK-NEXT: bic v0.8b, v2.8b, v0.8b
227
+ ; CHECK-NEXT: ret
228
+ %tst = fcmp oeq half %lhs , %rhs
229
+ %evil = insertelement <1 x i1 > undef , i1 %tst , i32 0
230
+ %res = select <1 x i1 > %evil , <1 x i64 > zeroinitializer , <1 x i64 > %v3
231
+ ret <1 x i64 > %res
232
+ }
233
+
234
+ define i32 @test_br_extr_cmp_half (<1 x half > %v1 , <1 x half > %v2 ) {
235
+ ; CHECK-LABEL: test_br_extr_cmp_half:
236
+ ; CHECK: // %bb.0: // %common.ret
237
+ ; CHECK-NEXT: fcvt s1, h1
238
+ ; CHECK-NEXT: fcvt s0, h0
239
+ ; CHECK-NEXT: fcmp s0, s1
240
+ ; CHECK-NEXT: cset w0, eq
241
+ ; CHECK-NEXT: ret
242
+ %1 = fcmp oeq <1 x half > %v1 , %v2
243
+ %2 = extractelement <1 x i1 > %1 , i32 0
244
+ br i1 %2 , label %if.end , label %if.then
245
+
246
+ if.then:
247
+ ret i32 0 ;
248
+
249
+ if.end:
250
+ ret i32 1 ;
251
+ }
0 commit comments