r3727 - in glibc-package/branches/eglibc-2.10/debian: . patches/ia64
Author: aurel32
Date: 2009-08-02 19:14:49 +0000 (Sun, 02 Aug 2009)
New Revision: 3727
Modified:
glibc-package/branches/eglibc-2.10/debian/changelog
glibc-package/branches/eglibc-2.10/debian/patches/ia64/submitted-libm.diff
Log:
* patches/ia64/submitted-libm.diff: new patch to fix errors in the
math testsuite on ia64.
Modified: glibc-package/branches/eglibc-2.10/debian/changelog
===================================================================
--- glibc-package/branches/eglibc-2.10/debian/changelog 2009-08-01 21:09:56 UTC (rev 3726)
+++ glibc-package/branches/eglibc-2.10/debian/changelog 2009-08-02 19:14:49 UTC (rev 3727)
@@ -102,8 +102,8 @@
(file .svn-revision).
* debian/rules.d/tarball.mk: add an "update-from-upstream-svn" rule to
automatically update debian/patches/svn-updates.diff.
- * patches/ia64/submitted-libm.diff: new patch to fix part of the errors
- in the math testsuite on ia64.
+ * patches/ia64/submitted-libm.diff: new patch to fix errors in the
+ math testsuite on ia64.
[ Petr Salinger ]
* Add kfreebsd/local-no-SOCK_NONBLOCK.diff to fix build on GNU/kFreeBSD.
Modified: glibc-package/branches/eglibc-2.10/debian/patches/ia64/submitted-libm.diff
===================================================================
--- glibc-package/branches/eglibc-2.10/debian/patches/ia64/submitted-libm.diff 2009-08-01 21:09:56 UTC (rev 3726)
+++ glibc-package/branches/eglibc-2.10/debian/patches/ia64/submitted-libm.diff 2009-08-02 19:14:49 UTC (rev 3727)
@@ -1,10 +1,119 @@
2009-08-01 Aurelien Jarno <aurelien@aurel32.net>
+ * sysdeps/ia64/fpu/libm_error_codes.h: Add error codes for
+ fmodl_infinity, fmod_infinity, fmodf_infinity, cosl_infinity,
+ cos_infinity, cosf_infinity, sinl_infinity, sin_infinity,
+ sinf_infinity, tanl_infinity, tan_infinity, and tanf_infinity.
* sysdeps/ia64/fpu/libm_error.c(__libm_error_support): Pole errors
- for lgamma and pow should set errno to ERANGE, not EDOM.
+ for lgamma and pow should set errno to ERANGE, not EDOM. Add code
+ to handle fmodl_infinity, fmod_infinity, fmodf_infinity,
+ cosl_infinity, cos_infinity, cosf_infinity, sinl_infinity,
+ sin_infinity,sinf_infinity, tanl_infinity, tan_infinity, and
+ tanf_infinity.
+ * sysdeps/ia64/fpu/e_fmod.S: check for fmod(inf, y).
+ * sysdeps/ia64/fpu/e_fmodf.S: check for fmodf(inf, y).
+ * sysdeps/ia64/fpu/e_fmodl.S: check for fmodl(inf, y).
+ * sysdeps/ia64/fpu/s_fcos.S: check for fcos(inf) and fsin(inf).
+ * sysdeps/ia64/fpu/s_fcosf.S: check for fcosf(inf) and fsinf(inf).
+ * sysdeps/ia64/fpu/s_fcosl.S: check for fcosl(inf) and fsinl(inf).
+ * sysdeps/ia64/fpu/s_tan.S: check for ftan(inf).
+ * sysdeps/ia64/fpu/s_tanf.S: check for ftanf(inf).
+ * sysdeps/ia64/fpu/s_tanl.S: check for ftanl(inf).
+diff --git a/sysdeps/ia64/fpu/e_fmod.S b/sysdeps/ia64/fpu/e_fmod.S
+index dbd0a29..87b6a48 100644
+--- a/sysdeps/ia64/fpu/e_fmod.S
++++ b/sysdeps/ia64/fpu/e_fmod.S
+@@ -75,8 +75,8 @@
+ //
+ // Special cases
+ //====================================================================
+-// b=+/-0: return NaN, call libm_error_support
+-// a=+/-Inf, a=NaN or b=NaN: return NaN
++// a=+/-Inf or b=+/-0: return NaN, call libm_error_support
++// a=NaN or b=NaN: return NaN
+ //
+ // Registers used
+ //====================================================================
+@@ -407,13 +407,13 @@ FMOD_X_NAN_INF:
+ nop.m 999
+ // also set Denormal flag if necessary
+ (p8) fma.s0 f9=f9,f1,f0
+- nop.i 999 ;;
++(p8) mov GR_Parameter_TAG=274 ;;
+ }
+
+ { .mfb
+ nop.m 999
+ (p8) fma.d.s0 f8=f8,f1,f0
+- nop.b 999 ;;
++(p8) br.spnt __libm_error_region;;
+ }
+
+ { .mfb
+diff --git a/sysdeps/ia64/fpu/e_fmodf.S b/sysdeps/ia64/fpu/e_fmodf.S
+index 36e5807..9f8cbbd 100644
+--- a/sysdeps/ia64/fpu/e_fmodf.S
++++ b/sysdeps/ia64/fpu/e_fmodf.S
+@@ -75,8 +75,8 @@
+
+ // Special cases
+ //====================================================================
+-// b=+/-0: return NaN, call libm_error_support
+-// a=+/-Inf, a=NaN or b=NaN: return NaN
++// a=+/-Inf or b=+/-0: return NaN, call libm_error_support
++// a=NaN or b=NaN: return NaN
+
+ // Registers used
+ //====================================================================
+@@ -413,13 +413,13 @@ FMOD_X_NAN_INF:
+ nop.m 999
+ // also set Denormal flag if necessary
+ (p8) fma.s0 f9=f9,f1,f0
+- nop.i 999 ;;
++(p8) mov GR_Parameter_TAG=275 ;;
+ }
+
+ { .mfb
+ nop.m 999
+ (p8) fma.s.s0 f8=f8,f1,f0
+- nop.b 999 ;;
++(p8) br.spnt __libm_error_region;;
+ }
+
+ { .mfb
+diff --git a/sysdeps/ia64/fpu/e_fmodl.S b/sysdeps/ia64/fpu/e_fmodl.S
+index 3e87eb0..3c38654 100644
+--- a/sysdeps/ia64/fpu/e_fmodl.S
++++ b/sysdeps/ia64/fpu/e_fmodl.S
+@@ -484,6 +484,11 @@ FMOD_A_NAN_INF:
+ (p8) cmp.ne p7, p0 = GR_SIG_B, r0
+ nop.i 0
+ }
++{ .mfi
++ nop.m 0
++ fmerge.s FR_X = f8, f8
++ nop.i 0
++}
+ ;;
+
+ { .mfi
+@@ -509,7 +514,12 @@ FMOD_A_NAN_INF:
+ { .mfb
+ nop.m 0
+ (p9) frcpa.s0 f8, p7 = f8, f9
+- br.ret.sptk b0
++ (p9) br.ret.sptk b0
++}
++{ .mmb
++ alloc GR_ARPFS = ar.pfs, 1, 4, 4, 0
++ mov GR_Parameter_TAG = 273
++ br.sptk __libm_error_region
+ }
+ ;;
+
diff --git a/sysdeps/ia64/fpu/libm_error.c b/sysdeps/ia64/fpu/libm_error.c
-index 8ef4bb5..1aa905a 100644
+index 8ef4bb5..cf004fc 100644
--- a/sysdeps/ia64/fpu/libm_error.c
+++ b/sysdeps/ia64/fpu/libm_error.c
@@ -708,15 +708,18 @@ switch(input_tag)
@@ -50,3 +159,588 @@
}
case powl_neg_to_non_integer:
/* neg**non_integral */
+@@ -1307,6 +1310,21 @@ switch(input_tag)
+ {
+ ERRNO_DOMAIN; break;
+ }
++ case fmodl_infinity:
++ /* fmodl(inf,y) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case fmod_infinity:
++ /* fmod(inf,y) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case fmodf_infinity:
++ /* fmodf(inf,y) */
++ {
++ ERRNO_DOMAIN; break;
++ }
+ case coshl_overflow:
+ /* coshl overflows */
+ {
+@@ -1373,6 +1391,51 @@ switch(input_tag)
+ {
+ ERRNO_RANGE; break;
+ }
++ case cosl_infinity:
++ /* cosl(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case cos_infinity:
++ /* cos(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case cosf_infinity:
++ /* cosf(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case sinl_infinity:
++ /* sinl(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case sin_infinity:
++ /* sin(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case sinf_infinity:
++ /* sinf(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case tanl_infinity:
++ /* tanl(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case tan_infinity:
++ /* tan(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
++ case tanf_infinity:
++ /* tanf(inf) */
++ {
++ ERRNO_DOMAIN; break;
++ }
+ default:
+ break;
+ }
+diff --git a/sysdeps/ia64/fpu/libm_error_codes.h b/sysdeps/ia64/fpu/libm_error_codes.h
+index 4f0945e..96e67c0 100644
+--- a/sysdeps/ia64/fpu/libm_error_codes.h
++++ b/sysdeps/ia64/fpu/libm_error_codes.h
+@@ -195,7 +195,11 @@ typedef enum
+ nextafterl_underflow, nextafter_underflow,
+ nextafterf_underflow, /* 267, 268, 269 */
+ nexttowardl_underflow, nexttoward_underflow,
+- nexttowardf_underflow /* 270, 271, 272 */
++ nexttowardf_underflow, /* 270, 271, 272 */
++ fmodl_infinity, fmod_infinity, fmodf_infinity, /* 273, 274, 275 */
++ cosl_infinity, cos_infinity, cosf_infinity, /* 276, 277, 278 */
++ sinl_infinity, sin_infinity, sinf_infinity, /* 279, 280, 281 */
++ tanl_infinity, tan_infinity, tanf_infinity, /* 282, 283, 284 */
+ } error_types;
+
+ #define LIBM_ERROR __libm_error_support
+diff --git a/sysdeps/ia64/fpu/s_cos.S b/sysdeps/ia64/fpu/s_cos.S
+index fc121fc..24c258c 100644
+--- a/sysdeps/ia64/fpu/s_cos.S
++++ b/sysdeps/ia64/fpu/s_cos.S
+@@ -174,7 +174,7 @@
+ //==============================================================
+ // general input registers:
+ // r14 -> r26
+-// r32 -> r35
++// r32 -> r36
+
+ // predicate registers used:
+ // p6 -> p11
+@@ -260,6 +260,10 @@ GR_SAVE_B0 = r34
+ GR_SAVE_GP = r35
+ GR_SAVE_r_sincos = r36
+
++GR_Parameter_X = r37
++GR_Parameter_Y = r38
++GR_Parameter_RESULT = r39
++GR_Parameter_TAG = r40
+
+ RODATA
+
+@@ -474,7 +478,7 @@ _SINCOS_COMMON:
+ // 0x1001a is register_bias + 27.
+ // So if f8 >= 2^27, go to large argument routines
+ { .mfi
+- alloc r32 = ar.pfs, 1, 4, 0, 0
++ alloc r32 = ar.pfs, 1, 4, 4, 0
+ fclass.m p11,p0 = f8, 0x0b // Test for x=unorm
+ mov sincos_GR_all_ones = -1 // For "inexect" constant create
+ }
+@@ -681,20 +685,39 @@ _SINCOS_COMMON2:
+ ////////// x = 0/Inf/NaN path //////////////////
+ _SINCOS_SPECIAL_ARGS:
+ .pred.rel "mutex",p8,p9
++
++{ .mfi
++ nop.m 999
++ fclass.m.unc p7,p0 = f8, 0x23 // is x +/- inf?
++ nop.i 999;;
++}
++
++{ .mfi
++ nop.m 999
++(p7) fmerge.s f9 = f8,f8
++ nop.i 999
++}
++
+ // sin(+/-0) = +/-0
+ // sin(Inf) = NaN
+ // sin(NaN) = NaN
+ { .mfi
+ nop.m 999
+ (p8) fma.d.s0 f8 = f8, f0, f0 // sin(+/-0,NaN,Inf)
+- nop.i 999
++(p8) mov GR_Parameter_TAG = 280
+ }
+ // cos(+/-0) = 1.0
+ // cos(Inf) = NaN
+ // cos(NaN) = NaN
+-{ .mfb
++{ .mfi
+ nop.m 999
+ (p9) fma.d.s0 f8 = f8, f0, f1 // cos(+/-0,NaN,Inf)
++(p9) mov GR_Parameter_TAG = 277
++}
++
++{ .mbb
++ nop.m 999
++(p7) br.cond.spnt __libm_error_region
+ br.ret.sptk b0 // Exit for x = 0/Inf/NaN path
+ };;
+
+@@ -766,3 +789,54 @@ LOCAL_LIBM_END(__libm_callout_sincos)
+ .type __libm_cos_large#,@function
+ .global __libm_cos_large#
+
++LOCAL_LIBM_ENTRY(__libm_error_region)
++.prologue
++{ .mfi
++ add GR_Parameter_Y=-32,sp // Parameter 2 value
++ nop.f 0
++.save ar.pfs,GR_SAVE_PFS
++ mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
++}
++{ .mfi
++.fframe 64
++ add sp=-64,sp // Create new stack
++ nop.f 0
++ mov GR_SAVE_GP=gp // Save gp
++};;
++{ .mmi
++ stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack
++ add GR_Parameter_X = 16,sp // Parameter 1 address
++.save b0, GR_SAVE_B0
++ mov GR_SAVE_B0=b0 // Save b0
++};;
++.body
++{ .mib
++ stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack
++ add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
++ nop.b 0
++}
++{ .mib
++ stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack
++ add GR_Parameter_Y = -16,GR_Parameter_Y
++ br.call.sptk b0=__libm_error_support# // Call error handling function
++};;
++{ .mmi
++ add GR_Parameter_RESULT = 48,sp
++ nop.m 0
++ nop.i 0
++};;
++{ .mmi
++ ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
++.restore sp
++ add sp = 64,sp // Restore stack pointer
++ mov b0 = GR_SAVE_B0 // Restore return address
++};;
++{ .mib
++ mov gp = GR_SAVE_GP // Restore gp
++ mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
++ br.ret.sptk b0 // Return
++};;
++
++LOCAL_LIBM_END(__libm_error_region)
++.type __libm_error_support#,@function
++.global __libm_error_support#
+diff --git a/sysdeps/ia64/fpu/s_cosf.S b/sysdeps/ia64/fpu/s_cosf.S
+index bcdf1b0..f0bc9a8 100644
+--- a/sysdeps/ia64/fpu/s_cosf.S
++++ b/sysdeps/ia64/fpu/s_cosf.S
+@@ -171,7 +171,7 @@
+ //==============================================================
+ // general input registers:
+ // r14 -> r19
+-// r32 -> r45
++// r32 -> r43
+
+ // predicate registers used:
+ // p6 -> p14
+@@ -260,6 +260,11 @@ GR_SAVE_PFS = r41
+ GR_SAVE_B0 = r42
+ GR_SAVE_GP = r43
+
++GR_Parameter_X = r44
++GR_Parameter_Y = r45
++GR_Parameter_RESULT = r46
++GR_Parameter_TAG = r47
++
+ RODATA
+ .align 16
+
+@@ -389,7 +394,7 @@ LOCAL_OBJECT_END(double_sin_cos_beta_k4)
+ GLOBAL_IEEE754_ENTRY(sinf)
+
+ { .mlx
+- alloc r32 = ar.pfs,1,13,0,0
++ alloc r32 = ar.pfs,1,11,4,0
+ movl sincosf_GR_sig_inv_pi_by_16 = 0xA2F9836E4E44152A //signd of 16/pi
+ }
+ { .mlx
+@@ -413,7 +418,7 @@ GLOBAL_IEEE754_END(sinf)
+ GLOBAL_IEEE754_ENTRY(cosf)
+
+ { .mlx
+- alloc r32 = ar.pfs,1,13,0,0
++ alloc r32 = ar.pfs,1,11,4,0
+ movl sincosf_GR_sig_inv_pi_by_16 = 0xA2F9836E4E44152A //signd of 16/pi
+ }
+ { .mlx
+@@ -641,20 +646,39 @@ _SINCOSF_COMMON:
+ ////////// x = 0/Inf/NaN path //////////////////
+ _SINCOSF_SPECIAL_ARGS:
+ .pred.rel "mutex",p8,p9
++
++{ .mfi
++ nop.m 999
++ fclass.m.unc p7,p0 = f8, 0x23 // is x +/- inf?
++ nop.i 999;;
++}
++
++{ .mfi
++ nop.m 999
++(p7) fmerge.s f9 = f8,f8
++ nop.i 999
++}
++
+ // sinf(+/-0) = +/-0
+ // sinf(Inf) = NaN
+ // sinf(NaN) = NaN
+ { .mfi
+ nop.m 999
+ (p8) fma.s.s0 f8 = f8, f0, f0 // sinf(+/-0,NaN,Inf)
+- nop.i 999
++(p8) mov GR_Parameter_TAG = 281
+ }
+ // cosf(+/-0) = 1.0
+ // cosf(Inf) = NaN
+ // cosf(NaN) = NaN
+-{ .mfb
++{ .mfi
+ nop.m 999
+ (p9) fma.s.s0 f8 = f8, f0, f1 // cosf(+/-0,NaN,Inf)
++(p9) mov GR_Parameter_TAG = 278
++};;
++
++{ .mbb
++ nop.m 999
++(p7) br.cond.spnt __libm_error_region
+ br.ret.sptk b0 // Exit for x = 0/Inf/NaN path
+ };;
+
+@@ -715,3 +739,54 @@ LOCAL_LIBM_END(__libm_callout_sincosf)
+ .type __libm_cos_large#, @function
+ .global __libm_cos_large#
+
++LOCAL_LIBM_ENTRY(__libm_error_region)
++.prologue
++{ .mfi
++ add GR_Parameter_Y=-32,sp // Parameter 2 value
++ nop.f 0
++.save ar.pfs,GR_SAVE_PFS
++ mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
++}
++{ .mfi
++.fframe 64
++ add sp=-64,sp // Create new stack
++ nop.f 0
++ mov GR_SAVE_GP=gp // Save gp
++};;
++{ .mmi
++ stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack
++ add GR_Parameter_X = 16,sp // Parameter 1 address
++.save b0, GR_SAVE_B0
++ mov GR_SAVE_B0=b0 // Save b0
++};;
++.body
++{ .mib
++ stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack
++ add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
++ nop.b 0
++}
++{ .mib
++ stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack
++ add GR_Parameter_Y = -16,GR_Parameter_Y
++ br.call.sptk b0=__libm_error_support# // Call error handling function
++};;
++{ .mmi
++ add GR_Parameter_RESULT = 48,sp
++ nop.m 0
++ nop.i 0
++};;
++{ .mmi
++ ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
++.restore sp
++ add sp = 64,sp // Restore stack pointer
++ mov b0 = GR_SAVE_B0 // Restore return address
++};;
++{ .mib
++ mov gp = GR_SAVE_GP // Restore gp
++ mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
++ br.ret.sptk b0 // Return
++};;
++
++LOCAL_LIBM_END(__libm_error_region)
++.type __libm_error_support#,@function
++.global __libm_error_support#
+diff --git a/sysdeps/ia64/fpu/s_cosl.S b/sysdeps/ia64/fpu/s_cosl.S
+index 8d71e50..8bb330e 100644
+--- a/sysdeps/ia64/fpu/s_cosl.S
++++ b/sysdeps/ia64/fpu/s_cosl.S
+@@ -747,12 +747,16 @@ GR_SAVE_B0 = r39
+ GR_SAVE_GP = r40
+ GR_SAVE_PFS = r41
+
++GR_Parameter_X = r59
++GR_Parameter_Y = r60
++GR_Parameter_RESULT = r61
++GR_Parameter_TAG = r62
+
+ .section .text
+
+ GLOBAL_IEEE754_ENTRY(sinl)
+ { .mlx
+- alloc r32 = ar.pfs,0,27,2,0
++ alloc r32 = ar.pfs,1,26,4,0
+ movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
+ }
+ { .mlx
+@@ -777,7 +781,7 @@ GLOBAL_IEEE754_END(sinl)
+
+ GLOBAL_IEEE754_ENTRY(cosl)
+ { .mlx
+- alloc r32 = ar.pfs,0,27,2,0
++ alloc r32 = ar.pfs,1,26,4,0
+ movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
+ }
+ { .mlx
+@@ -2278,13 +2282,31 @@ SINCOSL_DENORMAL:
+ SINCOSL_SPECIAL:
+ { .mfb
+ nop.m 999
++ fclass.m.unc p6,p0 = f8, 0x23 // is x +/- inf?
++ nop.b 999;;
++}
++
++{ .mfi
++ nop.m 999
++(p6) fmerge.s f9 = f8,f8
++(p6) cmp.eq.unc p7, p8 = 0x1, GR_Sin_or_Cos;;
++}
++
++{ .mmf
++(p7) mov GR_Parameter_TAG = 276 // (cosl)
++(p8) mov GR_Parameter_TAG = 279 // (sinl)
+ //
+ // Path for Arg = +/- QNaN, SNaN, Inf
+ // Invalid can be raised. SNaNs
+ // become QNaNs
+ //
+ fmpy.s0 FR_Result = FR_Input_X, f0
+- br.ret.sptk b0 ;;
++}
++
++{ .mbb
++ nop.m 999
++(p6) br.cond.spnt __libm_error_region
++ br.ret.sptk b0 ;;
+ }
+
+ GLOBAL_IEEE754_END(cosl)
+@@ -2363,3 +2385,55 @@ SINCOSL_ARG_TOO_LARGE:
+ LOCAL_LIBM_END(__libm_callout)
+ .type __libm_pi_by_2_reduce#,@function
+ .global __libm_pi_by_2_reduce#
++
++LOCAL_LIBM_ENTRY(__libm_error_region)
++.prologue
++{ .mfi
++ add GR_Parameter_Y=-32,sp // Parameter 2 value
++ nop.f 0
++.save ar.pfs,GR_SAVE_PFS
++ mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
++}
++{ .mfi
++.fframe 64
++ add sp=-64,sp // Create new stack
++ nop.f 0
++ mov GR_SAVE_GP=gp // Save gp
++};;
++{ .mmi
++ stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack
++ add GR_Parameter_X = 16,sp // Parameter 1 address
++.save b0, GR_SAVE_B0
++ mov GR_SAVE_B0=b0 // Save b0
++};;
++.body
++{ .mib
++ stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack
++ add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
++ nop.b 0
++}
++{ .mib
++ stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack
++ add GR_Parameter_Y = -16,GR_Parameter_Y
++ br.call.sptk b0=__libm_error_support# // Call error handling function
++};;
++{ .mmi
++ add GR_Parameter_RESULT = 48,sp
++ nop.m 0
++ nop.i 0
++};;
++{ .mmi
++ ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
++.restore sp
++ add sp = 64,sp // Restore stack pointer
++ mov b0 = GR_SAVE_B0 // Restore return address
++};;
++{ .mib
++ mov gp = GR_SAVE_GP // Restore gp
++ mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
++ br.ret.sptk b0 // Return
++};;
++
++LOCAL_LIBM_END(__libm_error_region)
++.type __libm_error_support#,@function
++.global __libm_error_support#
+diff --git a/sysdeps/ia64/fpu/s_tan.S b/sysdeps/ia64/fpu/s_tan.S
+index a2f80c8..a4b42c9 100644
+--- a/sysdeps/ia64/fpu/s_tan.S
++++ b/sysdeps/ia64/fpu/s_tan.S
+@@ -348,15 +348,10 @@ COMMON_PATH:
+ (p6) br.ret.spnt b0 ;; // Exit for x=0 (tan only)
+ }
+
+-{ .mfi
++{ .mmi
+ ldfpd tan_P14,tan_P15 = [tan_AD],16
+-(p7) frcpa.s0 f8,p9=f0,f0 // Set qnan indef if x=inf
+- mov tan_GR_10009 = 0x10009
+-}
+-{ .mib
+ ldfpd tan_Q8,tan_Q9 = [tan_ADQ],16
+- nop.i 999
+-(p7) br.ret.spnt b0 ;; // Exit for x=inf
++ mov tan_GR_10009 = 0x10009;;
+ }
+
+ { .mfi
+@@ -384,6 +379,12 @@ COMMON_PATH:
+ fma.s1 TAN_W_2TO64_RSH = tan_NORM_f8,TAN_INV_PI_BY_2_2TO64,TAN_RSHF_2TO64
+ };;
+
++{ .mfb
++(p7) mov GR_Parameter_Tag = 283 // (tan)
++(p7) frcpa.s0 f8,p9=f0,f0 // Set qnan indef if x=inf
++(p7) br.cond.spnt __libm_error_region ;; // call error support if tan(+-inf)
++}
++
+ { .mmf
+ ldfpd tan_P10,tan_P11 = [tan_AD],16
+ and tan_exp = tan_GR_17_ones, tan_signexp
+diff --git a/sysdeps/ia64/fpu/s_tanf.S b/sysdeps/ia64/fpu/s_tanf.S
+index 193d756..cd0febb 100644
+--- a/sysdeps/ia64/fpu/s_tanf.S
++++ b/sysdeps/ia64/fpu/s_tanf.S
+@@ -301,11 +301,11 @@ Common_Path:
+ { .mfi
+ cmp.ge p6, p0 = rSignMask, rExpCut // p6 = (E => 0x10009)
+ (p8) frcpa.s0 f8, p0 = f0, f0 // Set qnan indef if x=inf
+- mov GR_Parameter_Tag = 227 // (cotf)
++ mov GR_Parameter_Tag = 284 // (tanf)
+ }
+ { .mbb
+ ldfe fPiby2 = [rCoeffB], 16
+-(p8) br.ret.spnt b0 // Exit for x=inf
++(p8) br.cond.spnt __libm_error_region // call error support if tanf(+-0)
+ (p6) br.cond.spnt Huge_Argument // Branch if |x|>=2^10
+ }
+ ;;
+@@ -313,7 +313,7 @@ Common_Path:
+ { .mfi
+ nop.m 0
+ (p11) fclass.m.unc p6, p0 = f8, 0x07 // Test for x=0 (for cotf)
+- nop.i 0
++ mov GR_Parameter_Tag = 227 // (cotf)
+ }
+ { .mfb
+ nop.m 0
+diff --git a/sysdeps/ia64/fpu/s_tanl.S b/sysdeps/ia64/fpu/s_tanl.S
+index 607a271..95d5145 100644
+--- a/sysdeps/ia64/fpu/s_tanl.S
++++ b/sysdeps/ia64/fpu/s_tanl.S
+@@ -3072,21 +3072,32 @@ TANL_UNSUPPORTED:
+
+ { .mfi
+ nop.m 999
+-(p6) fclass.m p6, p7 = f8, 0x7 // Test for zero (cotl only)
++(p6) fclass.m.unc p6, p0 = f8, 0x7 // Test for zero (cotl only)
++ nop.i 999
++}
++;;
++{ .mfi
++ nop.m 999
++(p7) fclass.m.unc p7, p0 = f8, 0x23 // Test for inf (tanl only)
+ nop.i 999
+ }
+ ;;
+
+ .pred.rel "mutex", p6, p7
+-{ .mfi
++{ .mfb
+ (p6) mov GR_Parameter_Tag = 225 // (cotl)
+ (p6) frcpa.s0 f8, p0 = f1, f8 // cotl(+-0) = +-Inf
+- nop.i 999
++(p6) br.cond.spnt __libm_error_region;;
++}
++{ .mfb
++(p7) mov GR_Parameter_Tag = 282 // (tanl)
++ fmpy.s0 f8 = f8, f0
++(p7) br.cond.spnt __libm_error_region;;
+ }
+ { .mfb
+ nop.m 999
+-(p7) fmpy.s0 f8 = f8, f0
+-(p7) br.ret.sptk b0
++ nop.f 999
++ br.ret.sptk b0
+ }
+ ;;
+
Reply to: