@@ -72,8 +72,8 @@ define <4 x float> @signbits_sext_v4i64_sitofp_v4f32(i8 signext %a0, i16 signext
7272 ret <4 x float > %9
7373}
7474
75- define float @signbits_ashr_extract_sitofp (<2 x i64 > %a0 ) nounwind {
76- ; X32-LABEL: signbits_ashr_extract_sitofp :
75+ define float @signbits_ashr_extract_sitofp_0 (<2 x i64 > %a0 ) nounwind {
76+ ; X32-LABEL: signbits_ashr_extract_sitofp_0 :
7777; X32: # BB#0:
7878; X32-NEXT: pushl %eax
7979; X32-NEXT: vextractps $1, %xmm0, %eax
@@ -83,7 +83,7 @@ define float @signbits_ashr_extract_sitofp(<2 x i64> %a0) nounwind {
8383; X32-NEXT: popl %eax
8484; X32-NEXT: retl
8585;
86- ; X64-LABEL: signbits_ashr_extract_sitofp :
86+ ; X64-LABEL: signbits_ashr_extract_sitofp_0 :
8787; X64: # BB#0:
8888; X64-NEXT: vpsrad $31, %xmm0, %xmm1
8989; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
@@ -97,6 +97,93 @@ define float @signbits_ashr_extract_sitofp(<2 x i64> %a0) nounwind {
9797 ret float %3
9898}
9999
100+ define float @signbits_ashr_extract_sitofp_1 (<2 x i64 > %a0 ) nounwind {
101+ ; X32-LABEL: signbits_ashr_extract_sitofp_1:
102+ ; X32: # BB#0:
103+ ; X32-NEXT: pushl %ebp
104+ ; X32-NEXT: movl %esp, %ebp
105+ ; X32-NEXT: andl $-8, %esp
106+ ; X32-NEXT: subl $16, %esp
107+ ; X32-NEXT: vmovdqa {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
108+ ; X32-NEXT: vpsrlq $63, %xmm1, %xmm2
109+ ; X32-NEXT: vpsrlq $32, %xmm1, %xmm1
110+ ; X32-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
111+ ; X32-NEXT: vpsrlq $63, %xmm0, %xmm2
112+ ; X32-NEXT: vpsrlq $32, %xmm0, %xmm0
113+ ; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
114+ ; X32-NEXT: vpxor %xmm1, %xmm0, %xmm0
115+ ; X32-NEXT: vpsubq %xmm1, %xmm0, %xmm0
116+ ; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
117+ ; X32-NEXT: fildll {{[0-9]+}}(%esp)
118+ ; X32-NEXT: fstps {{[0-9]+}}(%esp)
119+ ; X32-NEXT: flds {{[0-9]+}}(%esp)
120+ ; X32-NEXT: movl %ebp, %esp
121+ ; X32-NEXT: popl %ebp
122+ ; X32-NEXT: retl
123+ ;
124+ ; X64-LABEL: signbits_ashr_extract_sitofp_1:
125+ ; X64: # BB#0:
126+ ; X64-NEXT: vpsrlq $63, %xmm0, %xmm1
127+ ; X64-NEXT: vpsrlq $32, %xmm0, %xmm0
128+ ; X64-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
129+ ; X64-NEXT: vmovdqa {{.*#+}} xmm1 = [2147483648,1]
130+ ; X64-NEXT: vpxor %xmm1, %xmm0, %xmm0
131+ ; X64-NEXT: vpsubq %xmm1, %xmm0, %xmm0
132+ ; X64-NEXT: vmovq %xmm0, %rax
133+ ; X64-NEXT: vcvtsi2ssq %rax, %xmm2, %xmm0
134+ ; X64-NEXT: retq
135+ %1 = ashr <2 x i64 > %a0 , <i64 32 , i64 63 >
136+ %2 = extractelement <2 x i64 > %1 , i32 0
137+ %3 = sitofp i64 %2 to float
138+ ret float %3
139+ }
140+
141+ define float @signbits_ashr_shl_extract_sitofp (<2 x i64 > %a0 ) nounwind {
142+ ; X32-LABEL: signbits_ashr_shl_extract_sitofp:
143+ ; X32: # BB#0:
144+ ; X32-NEXT: pushl %ebp
145+ ; X32-NEXT: movl %esp, %ebp
146+ ; X32-NEXT: andl $-8, %esp
147+ ; X32-NEXT: subl $16, %esp
148+ ; X32-NEXT: vmovdqa {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
149+ ; X32-NEXT: vpsrlq $60, %xmm1, %xmm2
150+ ; X32-NEXT: vpsrlq $61, %xmm1, %xmm1
151+ ; X32-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
152+ ; X32-NEXT: vpsrlq $60, %xmm0, %xmm2
153+ ; X32-NEXT: vpsrlq $61, %xmm0, %xmm0
154+ ; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
155+ ; X32-NEXT: vpxor %xmm1, %xmm0, %xmm0
156+ ; X32-NEXT: vpsubq %xmm1, %xmm0, %xmm0
157+ ; X32-NEXT: vpsllq $16, %xmm0, %xmm1
158+ ; X32-NEXT: vpsllq $20, %xmm0, %xmm0
159+ ; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
160+ ; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
161+ ; X32-NEXT: fildll {{[0-9]+}}(%esp)
162+ ; X32-NEXT: fstps {{[0-9]+}}(%esp)
163+ ; X32-NEXT: flds {{[0-9]+}}(%esp)
164+ ; X32-NEXT: movl %ebp, %esp
165+ ; X32-NEXT: popl %ebp
166+ ; X32-NEXT: retl
167+ ;
168+ ; X64-LABEL: signbits_ashr_shl_extract_sitofp:
169+ ; X64: # BB#0:
170+ ; X64-NEXT: vpsrlq $60, %xmm0, %xmm1
171+ ; X64-NEXT: vpsrlq $61, %xmm0, %xmm0
172+ ; X64-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
173+ ; X64-NEXT: vmovdqa {{.*#+}} xmm1 = [4,8]
174+ ; X64-NEXT: vpxor %xmm1, %xmm0, %xmm0
175+ ; X64-NEXT: vpsubq %xmm1, %xmm0, %xmm0
176+ ; X64-NEXT: vpsllq $20, %xmm0, %xmm0
177+ ; X64-NEXT: vmovq %xmm0, %rax
178+ ; X64-NEXT: vcvtsi2ssq %rax, %xmm2, %xmm0
179+ ; X64-NEXT: retq
180+ %1 = ashr <2 x i64 > %a0 , <i64 61 , i64 60 >
181+ %2 = shl <2 x i64 > %1 , <i64 20 , i64 16 >
182+ %3 = extractelement <2 x i64 > %2 , i32 0
183+ %4 = sitofp i64 %3 to float
184+ ret float %4
185+ }
186+
100187define float @signbits_ashr_insert_ashr_extract_sitofp (i64 %a0 , i64 %a1 ) nounwind {
101188; X32-LABEL: signbits_ashr_insert_ashr_extract_sitofp:
102189; X32: # BB#0:
0 commit comments