@@ -72,8 +72,8 @@ define <4 x float> @signbits_sext_v4i64_sitofp_v4f32(i8 signext %a0, i16 signext
72
72
ret <4 x float > %9
73
73
}
74
74
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 :
77
77
; X32: # BB#0:
78
78
; X32-NEXT: pushl %eax
79
79
; X32-NEXT: vextractps $1, %xmm0, %eax
@@ -83,7 +83,7 @@ define float @signbits_ashr_extract_sitofp(<2 x i64> %a0) nounwind {
83
83
; X32-NEXT: popl %eax
84
84
; X32-NEXT: retl
85
85
;
86
- ; X64-LABEL: signbits_ashr_extract_sitofp :
86
+ ; X64-LABEL: signbits_ashr_extract_sitofp_0 :
87
87
; X64: # BB#0:
88
88
; X64-NEXT: vpsrad $31, %xmm0, %xmm1
89
89
; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
@@ -97,6 +97,93 @@ define float @signbits_ashr_extract_sitofp(<2 x i64> %a0) nounwind {
97
97
ret float %3
98
98
}
99
99
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
+
100
187
define float @signbits_ashr_insert_ashr_extract_sitofp (i64 %a0 , i64 %a1 ) nounwind {
101
188
; X32-LABEL: signbits_ashr_insert_ashr_extract_sitofp:
102
189
; X32: # BB#0:
0 commit comments