aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/fpu/s_fmax.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64/fpu/s_fmax.S')
-rw-r--r--sysdeps/x86_64/fpu/s_fmax.S19
1 files changed, 18 insertions, 1 deletions
diff --git a/sysdeps/x86_64/fpu/s_fmax.S b/sysdeps/x86_64/fpu/s_fmax.S
index 02096c0aea..0ff326fb66 100644
--- a/sysdeps/x86_64/fpu/s_fmax.S
+++ b/sysdeps/x86_64/fpu/s_fmax.S
@@ -27,8 +27,25 @@ ENTRY(__fmax)
jmp 2f
1: ucomisd %xmm1, %xmm1 // Is xmm1 a NaN?
- jp 2f // then return xmm0
+ jp 3f
+ // xmm0 is a NaN; xmm1 is not. Test if xmm0 is signaling.
+ movsd %xmm0, -8(%rsp)
+ testb $0x8, -2(%rsp)
+ jz 4f
movsd %xmm1, %xmm0 // otherwise return xmm1
+ ret
+
+3: // xmm1 is a NaN; xmm0 may or may not be.
+ ucomisd %xmm0, %xmm0
+ jp 4f
+ // xmm1 is a NaN; xmm0 is not. Test if xmm1 is signaling.
+ movsd %xmm1, -8(%rsp)
+ testb $0x8, -2(%rsp)
+ jz 4f
+ ret
+
+4: // Both arguments are NaNs, or one is a signaling NaN.
+ addsd %xmm1, %xmm0
2: ret
END(__fmax)