From 66294491665029eff0cf3ebd5fb6f04582da6c1e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Sat, 16 Nov 2013 12:45:11 +0000 Subject: [PATCH] Fix spurious "inexact" exceptions from x86 pow with NaN argument (bug 16167). --- ChangeLog | 10 ++++++++++ NEWS | 2 +- sysdeps/i386/fpu/e_pow.S | 9 +++++++++ sysdeps/i386/fpu/e_powf.S | 5 ++++- sysdeps/i386/fpu/e_powl.S | 9 +++++++++ sysdeps/x86_64/fpu/e_powl.S | 3 +++ 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 574e07e6c3d..ce26384afb6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2013-11-16 Joseph Myers + + [BZ #16167] + * sysdeps/i386/fpu/e_pow.S (__ieee754_pow): Check for first + argument being NaN and avoid computations with second argument in + that case. + * sysdeps/i386/fpu/e_powf.S (__ieee754_powf): Likewise. + * sysdeps/i386/fpu/e_powl.S (__ieee754_powl): Likewise. + * sysdeps/x86_64/fpu/e_powl.S (__ieee754_powl): Likewise. + 2013-11-15 Arun Kumar Pyasi * locale/iso-639.def: Add Chitwani Tharu (the). diff --git a/NEWS b/NEWS index 37c2390b588..e3effb64ac9 100644 --- a/NEWS +++ b/NEWS @@ -18,7 +18,7 @@ Version 2.19 15887, 15890, 15892, 15893, 15895, 15897, 15905, 15909, 15917, 15919, 15921, 15923, 15939, 15948, 15963, 15966, 15985, 15988, 15997, 16032, 16034, 16036, 16037, 16041, 16071, 16072, 16074, 16078, 16103, 16112, - 16143, 16150, 16151, 16153, 16172. + 16143, 16150, 16151, 16153, 16167, 16172. * CVE-2012-4412 The strcoll implementation caches indices and rules for large collation sequences to optimize multiple passes. This cache diff --git a/sysdeps/i386/fpu/e_pow.S b/sysdeps/i386/fpu/e_pow.S index 109c3959345..835c39b7bd8 100644 --- a/sysdeps/i386/fpu/e_pow.S +++ b/sysdeps/i386/fpu/e_pow.S @@ -98,6 +98,9 @@ ENTRY(__ieee754_pow) cmpb $0x05, %ah je 15f // x is ±inf + cmpb $0x01, %ah + je 32f // x is NaN + fxch // y : x /* fistpll raises invalid exception for |y| >= 1L<<63. */ @@ -165,6 +168,12 @@ ENTRY(__ieee754_pow) 31: fstp %st(1) ret + cfi_adjust_cfa_offset (8) +32: addl $8, %esp + cfi_adjust_cfa_offset (-8) + fstp %st(1) + ret + cfi_adjust_cfa_offset (8) .align ALIGNARG(4) 2: // y is a large integer (absolute value at least 1L<<10), but diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S index 7fad90f6cb7..90d3d0ca6ab 100644 --- a/sysdeps/i386/fpu/e_powf.S +++ b/sysdeps/i386/fpu/e_powf.S @@ -95,6 +95,9 @@ ENTRY(__ieee754_powf) cmpb $0x05, %ah je 15f // x is ±inf + cmpb $0x01, %ah + je 32f // x is NaN + fxch // y : x /* fistpl raises invalid exception for |y| >= 1L<<31. */ @@ -180,7 +183,7 @@ ENTRY(__ieee754_powf) f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x)) faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x)) fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x)) - addl $4, %esp +32: addl $4, %esp cfi_adjust_cfa_offset (-4) fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x)) ret diff --git a/sysdeps/i386/fpu/e_powl.S b/sysdeps/i386/fpu/e_powl.S index 3c23117c393..91e22c8a299 100644 --- a/sysdeps/i386/fpu/e_powl.S +++ b/sysdeps/i386/fpu/e_powl.S @@ -104,6 +104,9 @@ ENTRY(__ieee754_powl) cmpb $0x05, %ah je 15f // x is ±inf + cmpb $0x01, %ah + je 32f // x is NaN + fxch // y : x /* fistpll raises invalid exception for |y| >= 1L<<63. */ @@ -187,6 +190,12 @@ ENTRY(__ieee754_powl) 31: fstp %st(1) ret + cfi_adjust_cfa_offset (8) +32: addl $8, %esp + cfi_adjust_cfa_offset (-8) + fstp %st(1) + ret + cfi_adjust_cfa_offset (8) .align ALIGNARG(4) 2: // y is a large integer (absolute value at least 8), but diff --git a/sysdeps/x86_64/fpu/e_powl.S b/sysdeps/x86_64/fpu/e_powl.S index e10172674e2..590223b60c6 100644 --- a/sysdeps/x86_64/fpu/e_powl.S +++ b/sysdeps/x86_64/fpu/e_powl.S @@ -96,6 +96,9 @@ ENTRY(__ieee754_powl) cmpb $0x05, %ah je 15f // x is ±inf + cmpb $0x01, %ah + je 31f // x is NaN + fxch // y : x /* fistpll raises invalid exception for |y| >= 1L<<63. */ -- 2.47.3