mirror of git://sourceware.org/git/glibc.git
This patch refactors how soft-fp comparisons handle setting exceptions for NaN operands, so that exceptions are set through the FP_CMP macros rather than directly in the C files calling them. The _FP_CMP* and FP_CMP* macros gain an extra argument to specify when exceptions should be set, 0 for no exception setting (I'm not sure this is actually needed - at least it's not needed for IEEE operations in glibc / libgcc, but might be relevant in some cases for kernel use), 1 for exceptions only for signaling NaNs and 2 for exceptions for all NaNs. This argument is handled through _FP_CMP_CHECK_NAN, newly called by the _FP_CMP* macros when a NaN is encountered. Calls to these macros are updated, which eliminates all the existing checking and exception setting in soft-fp *.c files in glibc. Tested for powerpc-nofpu. (The __unord* functions have no code changes; the __eq* / __ge* / __le* functions get slightly larger, but I don't think that's significant.) * soft-fp/op-common.h (_FP_CMP_CHECK_NAN): New macro. (_FP_CMP): Add extra argument EX. Call _FP_CMP_CHECK_NAN. (_FP_CMP_EQ): Likewise. (_FP_CMP_UNORD): Likewise. * soft-fp/double.h (FP_CMP_D): Add extra argument EX. (FP_CMP_EQ_D): Likewise. (FP_CMP_UNORD_D): Likewise. * soft-fp/extended.h (FP_CMP_E): Likewise. (FP_CMP_EQ_E): Likewise. (FP_CMP_UNORD_E): Likewise. * soft-fp/quad.h (FP_CMP_Q): Likewise. (FP_CMP_EQ_Q): Likewise. (FP_CMP_UNORD_Q): Likewise. * soft-fp/single.h (FP_CMP_S): Likewise. (FP_CMP_EQ_S): Likewise. (FP_CMP_UNORD_S): Likewise. * soft-fp/eqdf2.c (__eqdf2): Update call to FP_CMP_EQ_D. * soft-fp/eqsf2.c (__eqsf2): Update call to FP_CMP_EQ_S. * soft-fp/eqtf2.c (__eqtf2): Update call to FP_CMP_EQ_Q. * soft-fp/gedf2.c (__gedf2): Update call to FP_CMP_D. * soft-fp/gesf2.c (__gesf2): Update call to FP_CMP_S. * soft-fp/getf2.c (__getf2): Update call to FP_CMP_Q. * soft-fp/ledf2.c (__ledf2): Update call to FP_CMP_D. * soft-fp/lesf2.c (__lesf2): Update call to FP_CMP_S. * soft-fp/letf2.c (__letf2): Update call to FP_CMP_Q. * soft-fp/unorddf2.c (__unorddf2): Update call to FP_CMP_UNORD_D. * soft-fp/unordsf2.c (__unordsf2): Update call to FP_CMP_UNORD_S. * soft-fp/unordtf2.c (__unordtf2): Update call to FP_CMP_UNORD_Q. * sysdeps/alpha/soft-fp/ots_cmpe.c (internal_compare): Update call to FP_CMP_Q. * sysdeps/sparc/sparc32/soft-fp/q_cmp.c (_Q_cmp): Update call to FP_CMP_Q. * sysdeps/sparc/sparc32/soft-fp/q_cmpe.c (_Q_cmpe): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_feq.c (_Q_feq): Update call to FP_CMP_EQ_Q. * sysdeps/sparc/sparc32/soft-fp/q_fge.c (_Q_fge): Update call to FP_CMP_Q. * sysdeps/sparc/sparc32/soft-fp/q_fgt.c (_Q_fgt): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_fle.c (_Q_fle): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_flt.c (_Q_flt): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_fne.c (_Q_fne): Update call to FP_CMP_EQ_Q. * sysdeps/sparc/sparc64/soft-fp/qp_cmp.c (_Qp_cmp): Update call to FP_CMP_Q. * sysdeps/sparc/sparc64/soft-fp/qp_cmpe.c (_Qp_cmpe): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_feq.c (_Qp_feq): Update call to FP_CMP_EQ_Q. * sysdeps/sparc/sparc64/soft-fp/qp_fge.c (_Qp_fge): Update call to FP_CMP_Q. * sysdeps/sparc/sparc64/soft-fp/qp_fgt.c (_Qp_fgt): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_fle.c (_Qp_fle): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_flt.c (_Qp_flt): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_fne.c (_Qp_fne): Update call to FP_CMP_EQ_Q. |
||
|---|---|---|
| .. | ||
| Banner | ||
| Makefile | ||
| adddf3.c | ||
| addsf3.c | ||
| addtf3.c | ||
| divdf3.c | ||
| divsf3.c | ||
| divtf3.c | ||
| double.h | ||
| eqdf2.c | ||
| eqsf2.c | ||
| eqtf2.c | ||
| extenddftf2.c | ||
| extended.h | ||
| extendsfdf2.c | ||
| extendsftf2.c | ||
| extendxftf2.c | ||
| fixdfdi.c | ||
| fixdfsi.c | ||
| fixdfti.c | ||
| fixsfdi.c | ||
| fixsfsi.c | ||
| fixsfti.c | ||
| fixtfdi.c | ||
| fixtfsi.c | ||
| fixtfti.c | ||
| fixunsdfdi.c | ||
| fixunsdfsi.c | ||
| fixunsdfti.c | ||
| fixunssfdi.c | ||
| fixunssfsi.c | ||
| fixunssfti.c | ||
| fixunstfdi.c | ||
| fixunstfsi.c | ||
| fixunstfti.c | ||
| floatdidf.c | ||
| floatdisf.c | ||
| floatditf.c | ||
| floatsidf.c | ||
| floatsisf.c | ||
| floatsitf.c | ||
| floattidf.c | ||
| floattisf.c | ||
| floattitf.c | ||
| floatundidf.c | ||
| floatundisf.c | ||
| floatunditf.c | ||
| floatunsidf.c | ||
| floatunsisf.c | ||
| floatunsitf.c | ||
| floatuntidf.c | ||
| floatuntisf.c | ||
| floatuntitf.c | ||
| fmadf4.c | ||
| fmasf4.c | ||
| fmatf4.c | ||
| gedf2.c | ||
| gesf2.c | ||
| getf2.c | ||
| ledf2.c | ||
| lesf2.c | ||
| letf2.c | ||
| muldf3.c | ||
| mulsf3.c | ||
| multf3.c | ||
| negdf2.c | ||
| negsf2.c | ||
| negtf2.c | ||
| op-1.h | ||
| op-2.h | ||
| op-4.h | ||
| op-8.h | ||
| op-common.h | ||
| quad.h | ||
| single.h | ||
| soft-fp.h | ||
| sqrtdf2.c | ||
| sqrtsf2.c | ||
| sqrttf2.c | ||
| subdf3.c | ||
| subsf3.c | ||
| subtf3.c | ||
| testit.c | ||
| truncdfsf2.c | ||
| trunctfdf2.c | ||
| trunctfsf2.c | ||
| trunctfxf2.c | ||
| unorddf2.c | ||
| unordsf2.c | ||
| unordtf2.c | ||