@@ -4202,7 +4202,154 @@ define void @foo(float %0, float %1) #0 {
42024202}
42034203declare dso_local void @bar ()
42044204
4205- attributes #0 = { strictfp }
4205+ define float @fcmp_select_ogt (float %f1 , float %f2 ) #0 {
4206+ ; SSE-32-LABEL: fcmp_select_ogt:
4207+ ; SSE-32: # %bb.0:
4208+ ; SSE-32-NEXT: pushl %eax
4209+ ; SSE-32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
4210+ ; SSE-32-NEXT: maxss {{[0-9]+}}(%esp), %xmm0
4211+ ; SSE-32-NEXT: movss %xmm0, (%esp)
4212+ ; SSE-32-NEXT: flds (%esp)
4213+ ; SSE-32-NEXT: wait
4214+ ; SSE-32-NEXT: popl %eax
4215+ ; SSE-32-NEXT: retl
4216+ ;
4217+ ; SSE-64-LABEL: fcmp_select_ogt:
4218+ ; SSE-64: # %bb.0:
4219+ ; SSE-64-NEXT: maxss %xmm1, %xmm0
4220+ ; SSE-64-NEXT: retq
4221+ ;
4222+ ; AVX-32-LABEL: fcmp_select_ogt:
4223+ ; AVX-32: # %bb.0:
4224+ ; AVX-32-NEXT: pushl %eax
4225+ ; AVX-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
4226+ ; AVX-32-NEXT: vmaxss {{[0-9]+}}(%esp), %xmm0, %xmm0
4227+ ; AVX-32-NEXT: vmovss %xmm0, (%esp)
4228+ ; AVX-32-NEXT: flds (%esp)
4229+ ; AVX-32-NEXT: wait
4230+ ; AVX-32-NEXT: popl %eax
4231+ ; AVX-32-NEXT: retl
4232+ ;
4233+ ; AVX-64-LABEL: fcmp_select_ogt:
4234+ ; AVX-64: # %bb.0:
4235+ ; AVX-64-NEXT: vmaxss %xmm1, %xmm0, %xmm0
4236+ ; AVX-64-NEXT: retq
4237+ ;
4238+ ; X87-LABEL: fcmp_select_ogt:
4239+ ; X87: # %bb.0:
4240+ ; X87-NEXT: flds {{[0-9]+}}(%esp)
4241+ ; X87-NEXT: flds {{[0-9]+}}(%esp)
4242+ ; X87-NEXT: fcom %st(1)
4243+ ; X87-NEXT: wait
4244+ ; X87-NEXT: fnstsw %ax
4245+ ; X87-NEXT: # kill: def $ah killed $ah killed $ax
4246+ ; X87-NEXT: sahf
4247+ ; X87-NEXT: ja .LBB57_2
4248+ ; X87-NEXT: # %bb.1:
4249+ ; X87-NEXT: fstp %st(0)
4250+ ; X87-NEXT: fldz
4251+ ; X87-NEXT: fxch %st(1)
4252+ ; X87-NEXT: .LBB57_2:
4253+ ; X87-NEXT: fstp %st(1)
4254+ ; X87-NEXT: wait
4255+ ; X87-NEXT: retl
4256+ ;
4257+ ; X87-CMOV-LABEL: fcmp_select_ogt:
4258+ ; X87-CMOV: # %bb.0:
4259+ ; X87-CMOV-NEXT: flds {{[0-9]+}}(%esp)
4260+ ; X87-CMOV-NEXT: flds {{[0-9]+}}(%esp)
4261+ ; X87-CMOV-NEXT: fcomi %st(1), %st
4262+ ; X87-CMOV-NEXT: fxch %st(1)
4263+ ; X87-CMOV-NEXT: fcmovnbe %st(1), %st
4264+ ; X87-CMOV-NEXT: fstp %st(1)
4265+ ; X87-CMOV-NEXT: wait
4266+ ; X87-CMOV-NEXT: retl
4267+ %cond = call i1 @llvm.experimental.constrained.fcmps.f32 (
4268+ float %f1 , float %f2 , metadata !"ogt" ,
4269+ metadata !"fpexcept.strict" )
4270+ %res = select i1 %cond , float %f1 , float %f2
4271+ ret float %res
4272+ }
4273+
4274+ define double @fcmp_select_ule (double %f1 , double %f2 ) #0 {
4275+ ; SSE-32-LABEL: fcmp_select_ule:
4276+ ; SSE-32: # %bb.0:
4277+ ; SSE-32-NEXT: pushl %ebp
4278+ ; SSE-32-NEXT: movl %esp, %ebp
4279+ ; SSE-32-NEXT: andl $-8, %esp
4280+ ; SSE-32-NEXT: subl $8, %esp
4281+ ; SSE-32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
4282+ ; SSE-32-NEXT: minsd 8(%ebp), %xmm0
4283+ ; SSE-32-NEXT: movsd %xmm0, (%esp)
4284+ ; SSE-32-NEXT: fldl (%esp)
4285+ ; SSE-32-NEXT: wait
4286+ ; SSE-32-NEXT: movl %ebp, %esp
4287+ ; SSE-32-NEXT: popl %ebp
4288+ ; SSE-32-NEXT: retl
4289+ ;
4290+ ; SSE-64-LABEL: fcmp_select_ule:
4291+ ; SSE-64: # %bb.0:
4292+ ; SSE-64-NEXT: minsd %xmm0, %xmm1
4293+ ; SSE-64-NEXT: movapd %xmm1, %xmm0
4294+ ; SSE-64-NEXT: retq
4295+ ;
4296+ ; AVX-32-LABEL: fcmp_select_ule:
4297+ ; AVX-32: # %bb.0:
4298+ ; AVX-32-NEXT: pushl %ebp
4299+ ; AVX-32-NEXT: movl %esp, %ebp
4300+ ; AVX-32-NEXT: andl $-8, %esp
4301+ ; AVX-32-NEXT: subl $8, %esp
4302+ ; AVX-32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
4303+ ; AVX-32-NEXT: vminsd 8(%ebp), %xmm0, %xmm0
4304+ ; AVX-32-NEXT: vmovsd %xmm0, (%esp)
4305+ ; AVX-32-NEXT: fldl (%esp)
4306+ ; AVX-32-NEXT: wait
4307+ ; AVX-32-NEXT: movl %ebp, %esp
4308+ ; AVX-32-NEXT: popl %ebp
4309+ ; AVX-32-NEXT: retl
4310+ ;
4311+ ; AVX-64-LABEL: fcmp_select_ule:
4312+ ; AVX-64: # %bb.0:
4313+ ; AVX-64-NEXT: vminsd %xmm0, %xmm1, %xmm0
4314+ ; AVX-64-NEXT: retq
4315+ ;
4316+ ; X87-LABEL: fcmp_select_ule:
4317+ ; X87: # %bb.0:
4318+ ; X87-NEXT: fldl {{[0-9]+}}(%esp)
4319+ ; X87-NEXT: fldl {{[0-9]+}}(%esp)
4320+ ; X87-NEXT: fcom %st(1)
4321+ ; X87-NEXT: wait
4322+ ; X87-NEXT: fnstsw %ax
4323+ ; X87-NEXT: # kill: def $ah killed $ah killed $ax
4324+ ; X87-NEXT: sahf
4325+ ; X87-NEXT: jbe .LBB58_2
4326+ ; X87-NEXT: # %bb.1:
4327+ ; X87-NEXT: fstp %st(0)
4328+ ; X87-NEXT: fldz
4329+ ; X87-NEXT: fxch %st(1)
4330+ ; X87-NEXT: .LBB58_2:
4331+ ; X87-NEXT: fstp %st(1)
4332+ ; X87-NEXT: wait
4333+ ; X87-NEXT: retl
4334+ ;
4335+ ; X87-CMOV-LABEL: fcmp_select_ule:
4336+ ; X87-CMOV: # %bb.0:
4337+ ; X87-CMOV-NEXT: fldl {{[0-9]+}}(%esp)
4338+ ; X87-CMOV-NEXT: fldl {{[0-9]+}}(%esp)
4339+ ; X87-CMOV-NEXT: fcomi %st(1), %st
4340+ ; X87-CMOV-NEXT: fxch %st(1)
4341+ ; X87-CMOV-NEXT: fcmovbe %st(1), %st
4342+ ; X87-CMOV-NEXT: fstp %st(1)
4343+ ; X87-CMOV-NEXT: wait
4344+ ; X87-CMOV-NEXT: retl
4345+ %cond = call i1 @llvm.experimental.constrained.fcmps.f64 (
4346+ double %f1 , double %f2 , metadata !"ule" ,
4347+ metadata !"fpexcept.strict" )
4348+ %res = select i1 %cond , double %f1 , double %f2
4349+ ret double %res
4350+ }
4351+
4352+ attributes #0 = { nounwind strictfp }
42064353
42074354declare i1 @llvm.experimental.constrained.fcmp.f32 (float , float , metadata , metadata )
42084355declare i1 @llvm.experimental.constrained.fcmp.f64 (double , double , metadata , metadata )
0 commit comments