@@ -248,6 +248,41 @@ define <4 x float> @combine_vec_fcopysign_fptrunc_sgn(<4 x float> %x, <4 x doubl
248
248
ret <4 x float > %2
249
249
}
250
250
251
+ define double @PR136368 (double %x ) {
252
+ ; SSE-LABEL: PR136368:
253
+ ; SSE: # %bb.0:
254
+ ; SSE-NEXT: movapd {{.*#+}} xmm1 = [NaN,NaN]
255
+ ; SSE-NEXT: movapd %xmm0, %xmm2
256
+ ; SSE-NEXT: andpd %xmm1, %xmm2
257
+ ; SSE-NEXT: movsd {{.*#+}} xmm3 = [1.5707963267948966E+0,0.0E+0]
258
+ ; SSE-NEXT: movapd %xmm3, %xmm4
259
+ ; SSE-NEXT: cmpltsd %xmm2, %xmm4
260
+ ; SSE-NEXT: andpd %xmm3, %xmm4
261
+ ; SSE-NEXT: andpd %xmm1, %xmm4
262
+ ; SSE-NEXT: andnpd %xmm0, %xmm1
263
+ ; SSE-NEXT: orpd %xmm4, %xmm1
264
+ ; SSE-NEXT: movapd %xmm1, %xmm0
265
+ ; SSE-NEXT: retq
266
+ ;
267
+ ; AVX-LABEL: PR136368:
268
+ ; AVX: # %bb.0:
269
+ ; AVX-NEXT: vmovddup {{.*#+}} xmm1 = [NaN,NaN]
270
+ ; AVX-NEXT: # xmm1 = mem[0,0]
271
+ ; AVX-NEXT: vandpd %xmm1, %xmm0, %xmm2
272
+ ; AVX-NEXT: vmovsd {{.*#+}} xmm3 = [1.5707963267948966E+0,0.0E+0]
273
+ ; AVX-NEXT: vcmpltsd %xmm2, %xmm3, %xmm2
274
+ ; AVX-NEXT: vandpd %xmm3, %xmm2, %xmm2
275
+ ; AVX-NEXT: vandnpd %xmm0, %xmm1, %xmm0
276
+ ; AVX-NEXT: vandpd %xmm1, %xmm2, %xmm1
277
+ ; AVX-NEXT: vorpd %xmm0, %xmm1, %xmm0
278
+ ; AVX-NEXT: retq
279
+ %fabs = tail call double @llvm.fabs.f64 (double %x )
280
+ %cmp = fcmp ogt double %fabs , 0x3FF921FB54442D18
281
+ %cond = select i1 %cmp , double 0x3FF921FB54442D18 , double 0 .000000e+00
282
+ %res = tail call double @llvm.copysign.f64 (double %cond , double %x )
283
+ ret double %res
284
+ }
285
+
251
286
declare <4 x float > @llvm.fabs.v4f32 (<4 x float > %p )
252
287
declare <4 x float > @llvm.copysign.v4f32 (<4 x float > %Mag , <4 x float > %Sgn )
253
288
declare <4 x double > @llvm.copysign.v4f64 (<4 x double > %Mag , <4 x double > %Sgn )
0 commit comments