@@ -275,3 +275,71 @@ define <2 x double> @signbits_ashr_concat_ashr_extract_sitofp(<2 x i64> %a0, <4
275
275
%6 = sitofp <2 x i64 > %5 to <2 x double >
276
276
ret <2 x double > %6
277
277
}
278
+
279
+ define float @signbits_ashr_sextinreg_bitops_extract_sitofp (<2 x i64 > %a0 , <2 x i64 > %a1 , i32 %a2 ) nounwind {
280
+ ; X32-LABEL: signbits_ashr_sextinreg_bitops_extract_sitofp:
281
+ ; X32: # BB#0:
282
+ ; X32-NEXT: pushl %ebp
283
+ ; X32-NEXT: movl %esp, %ebp
284
+ ; X32-NEXT: andl $-8, %esp
285
+ ; X32-NEXT: subl $16, %esp
286
+ ; X32-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
287
+ ; X32-NEXT: vpsrlq $60, %xmm2, %xmm3
288
+ ; X32-NEXT: vpsrlq $61, %xmm2, %xmm2
289
+ ; X32-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
290
+ ; X32-NEXT: vpsrlq $60, %xmm0, %xmm3
291
+ ; X32-NEXT: vpsrlq $61, %xmm0, %xmm0
292
+ ; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
293
+ ; X32-NEXT: vpxor %xmm2, %xmm0, %xmm0
294
+ ; X32-NEXT: vpsubq %xmm2, %xmm0, %xmm0
295
+ ; X32-NEXT: movl 8(%ebp), %eax
296
+ ; X32-NEXT: vpinsrd $0, %eax, %xmm1, %xmm1
297
+ ; X32-NEXT: sarl $31, %eax
298
+ ; X32-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1
299
+ ; X32-NEXT: vpsllq $20, %xmm1, %xmm1
300
+ ; X32-NEXT: vpsrad $20, %xmm1, %xmm2
301
+ ; X32-NEXT: vpsrlq $20, %xmm1, %xmm1
302
+ ; X32-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
303
+ ; X32-NEXT: vpand %xmm1, %xmm0, %xmm2
304
+ ; X32-NEXT: vpor %xmm1, %xmm2, %xmm1
305
+ ; X32-NEXT: vpxor %xmm0, %xmm1, %xmm0
306
+ ; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
307
+ ; X32-NEXT: fildll {{[0-9]+}}(%esp)
308
+ ; X32-NEXT: fstps {{[0-9]+}}(%esp)
309
+ ; X32-NEXT: flds {{[0-9]+}}(%esp)
310
+ ; X32-NEXT: movl %ebp, %esp
311
+ ; X32-NEXT: popl %ebp
312
+ ; X32-NEXT: retl
313
+ ;
314
+ ; X64-LABEL: signbits_ashr_sextinreg_bitops_extract_sitofp:
315
+ ; X64: # BB#0:
316
+ ; X64-NEXT: vpsrlq $60, %xmm0, %xmm2
317
+ ; X64-NEXT: vpsrlq $61, %xmm0, %xmm0
318
+ ; X64-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
319
+ ; X64-NEXT: vmovdqa {{.*#+}} xmm2 = [4,8]
320
+ ; X64-NEXT: vpxor %xmm2, %xmm0, %xmm0
321
+ ; X64-NEXT: vpsubq %xmm2, %xmm0, %xmm0
322
+ ; X64-NEXT: movslq %edi, %rax
323
+ ; X64-NEXT: vpinsrq $0, %rax, %xmm1, %xmm1
324
+ ; X64-NEXT: vpsllq $20, %xmm1, %xmm1
325
+ ; X64-NEXT: vpsrad $20, %xmm1, %xmm2
326
+ ; X64-NEXT: vpsrlq $20, %xmm1, %xmm1
327
+ ; X64-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
328
+ ; X64-NEXT: vpand %xmm1, %xmm0, %xmm2
329
+ ; X64-NEXT: vpor %xmm1, %xmm2, %xmm1
330
+ ; X64-NEXT: vpxor %xmm0, %xmm1, %xmm0
331
+ ; X64-NEXT: vmovq %xmm0, %rax
332
+ ; X64-NEXT: vcvtsi2ssq %rax, %xmm3, %xmm0
333
+ ; X64-NEXT: retq
334
+ %1 = ashr <2 x i64 > %a0 , <i64 61 , i64 60 >
335
+ %2 = sext i32 %a2 to i64
336
+ %3 = insertelement <2 x i64 > %a1 , i64 %2 , i32 0
337
+ %4 = shl <2 x i64 > %3 , <i64 20 , i64 20 >
338
+ %5 = ashr <2 x i64 > %4 , <i64 20 , i64 20 >
339
+ %6 = and <2 x i64 > %1 , %5
340
+ %7 = or <2 x i64 > %6 , %5
341
+ %8 = xor <2 x i64 > %7 , %1
342
+ %9 = extractelement <2 x i64 > %8 , i32 0
343
+ %10 = sitofp i64 %9 to float
344
+ ret float %10
345
+ }
0 commit comments