mirror of git://sourceware.org/git/glibc.git
math: Remove i386 ilogb/ilogbf/llogb/llogbf
The new float and double implementation does not required an
extra function call and error handling uses math_err function,
which results in better performance on i386 as well.
With gcc-14 on AMD AMD Ryzen 9 5900X, master shows:
$ ./benchtests/bench-ilogb
"ilogb": {
"subnormal": {
"duration": 3.68863e+09,
"iterations": 1.72228e+08,
"max": 89.2995,
"min": 21.016,
"mean": 21.4171
},
"normal": {
"duration": 3.68878e+09,
"iterations": 1.72948e+08,
"max": 78.6065,
"min": 21.127,
"mean": 21.3288
}
}
$ ./benchtests/bench-ilogbf
"ilogbf": {
"subnormal": {
"duration": 3.68835e+09,
"iterations": 1.66716e+08,
"max": 46.953,
"min": 21.793,
"mean": 22.1236
},
"normal": {
"duration": 3.68784e+09,
"iterations": 1.66168e+08,
"max": 46.9715,
"min": 21.904,
"mean": 22.1935
}
}
While with this patch:
$ ./benchtests/bench-ilogb
"ilogb": {
"subnormal": {
"duration": 3.68134e+09,
"iterations": 4.17516e+08,
"max": 32.5045,
"min": 8.3245,
"mean": 8.81723
},
"normal": {
"duration": 3.6677e+09,
"iterations": 6.79468e+08,
"max": 50.9305,
"min": 5.3465,
"mean": 5.3979
}
}
$ ./benchtests/bench-ilogbf
"ilogbf": {
"subnormal": {
"duration": 3.67553e+09,
"iterations": 5.11032e+08,
"max": 35.927,
"min": 7.0485,
"mean": 7.19237
},
"normal": {
"duration": 3.66877e+09,
"iterations": 6.556e+08,
"max": 26.3625,
"min": 5.5315,
"mean": 5.59605
}
}
Checked on i686-linux-gnu.
Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
This commit is contained in:
parent
39775f00b1
commit
7c00a20397
|
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* Public domain.
|
||||
*/
|
||||
|
||||
#include <machine/asm.h>
|
||||
|
||||
RCSID("$NetBSD: s_ilogb.S,v 1.5 1995/10/12 15:53:09 jtc Exp $")
|
||||
|
||||
ENTRY(__ieee754_ilogb)
|
||||
fldl 4(%esp)
|
||||
/* I added the following ugly construct because ilogb(+-Inf) is
|
||||
required to return INT_MAX in ISO C99.
|
||||
-- jakub@redhat.com. */
|
||||
fxam /* Is NaN or +-Inf? */
|
||||
fstsw %ax
|
||||
movb $0x45, %dh
|
||||
andb %ah, %dh
|
||||
cmpb $0x05, %dh
|
||||
je 1f /* Is +-Inf, jump. */
|
||||
cmpb $0x40, %dh
|
||||
je 2f /* Is +-0, jump. */
|
||||
|
||||
fxtract
|
||||
pushl %eax
|
||||
cfi_adjust_cfa_offset (4)
|
||||
fstp %st
|
||||
|
||||
fistpl (%esp)
|
||||
fwait
|
||||
popl %eax
|
||||
cfi_adjust_cfa_offset (-4)
|
||||
|
||||
ret
|
||||
|
||||
1: fstp %st
|
||||
movl $0x7fffffff, %eax
|
||||
ret
|
||||
2: fstp %st
|
||||
movl $0x80000000, %eax /* FP_ILOGB0 */
|
||||
ret
|
||||
END (__ieee754_ilogb)
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* Public domain.
|
||||
*/
|
||||
|
||||
#include <machine/asm.h>
|
||||
|
||||
RCSID("$NetBSD: s_ilogbf.S,v 1.4 1995/10/22 20:32:43 pk Exp $")
|
||||
|
||||
ENTRY(__ieee754_ilogbf)
|
||||
flds 4(%esp)
|
||||
/* I added the following ugly construct because ilogb(+-Inf) is
|
||||
required to return INT_MAX in ISO C99.
|
||||
-- jakub@redhat.com. */
|
||||
fxam /* Is NaN or +-Inf? */
|
||||
fstsw %ax
|
||||
movb $0x45, %dh
|
||||
andb %ah, %dh
|
||||
cmpb $0x05, %dh
|
||||
je 1f /* Is +-Inf, jump. */
|
||||
cmpb $0x40, %dh
|
||||
je 2f /* Is +-0, jump. */
|
||||
|
||||
fxtract
|
||||
pushl %eax
|
||||
cfi_adjust_cfa_offset (4)
|
||||
fstp %st
|
||||
|
||||
fistpl (%esp)
|
||||
fwait
|
||||
popl %eax
|
||||
cfi_adjust_cfa_offset (-4)
|
||||
|
||||
ret
|
||||
|
||||
1: fstp %st
|
||||
movl $0x7fffffff, %eax
|
||||
ret
|
||||
2: fstp %st
|
||||
movl $0x80000000, %eax /* FP_ILOGB0 */
|
||||
ret
|
||||
END (__ieee754_ilogbf)
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
#include <math-type-macros-double.h>
|
||||
#include <w_ilogb_template.c>
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
#include <math-type-macros-float.h>
|
||||
#include <w_ilogb_template.c>
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
#include <math-type-macros-double.h>
|
||||
#include <w_llogb_template.c>
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
#include <math-type-macros-float.h>
|
||||
#include <w_llogb_template.c>
|
||||
Loading…
Reference in New Issue