/[pkg-glibc]/glibc-package/branches/eglibc-2.10/debian/patches/ia64/submitted-libm.diff
ViewVC logotype

Contents of /glibc-package/branches/eglibc-2.10/debian/patches/ia64/submitted-libm.diff

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3727 - (show annotations) (download)
Sun Aug 2 19:14:49 2009 UTC (3 years, 10 months ago) by aurel32
File size: 21338 byte(s)
  * patches/ia64/submitted-libm.diff: new patch to fix errors in the 
    math testsuite on ia64.

1 2009-08-01 Aurelien Jarno <aurelien@aurel32.net>
2
3 * sysdeps/ia64/fpu/libm_error_codes.h: Add error codes for
4 fmodl_infinity, fmod_infinity, fmodf_infinity, cosl_infinity,
5 cos_infinity, cosf_infinity, sinl_infinity, sin_infinity,
6 sinf_infinity, tanl_infinity, tan_infinity, and tanf_infinity.
7 * sysdeps/ia64/fpu/libm_error.c(__libm_error_support): Pole errors
8 for lgamma and pow should set errno to ERANGE, not EDOM. Add code
9 to handle fmodl_infinity, fmod_infinity, fmodf_infinity,
10 cosl_infinity, cos_infinity, cosf_infinity, sinl_infinity,
11 sin_infinity,sinf_infinity, tanl_infinity, tan_infinity, and
12 tanf_infinity.
13 * sysdeps/ia64/fpu/e_fmod.S: check for fmod(inf, y).
14 * sysdeps/ia64/fpu/e_fmodf.S: check for fmodf(inf, y).
15 * sysdeps/ia64/fpu/e_fmodl.S: check for fmodl(inf, y).
16 * sysdeps/ia64/fpu/s_fcos.S: check for fcos(inf) and fsin(inf).
17 * sysdeps/ia64/fpu/s_fcosf.S: check for fcosf(inf) and fsinf(inf).
18 * sysdeps/ia64/fpu/s_fcosl.S: check for fcosl(inf) and fsinl(inf).
19 * sysdeps/ia64/fpu/s_tan.S: check for ftan(inf).
20 * sysdeps/ia64/fpu/s_tanf.S: check for ftanf(inf).
21 * sysdeps/ia64/fpu/s_tanl.S: check for ftanl(inf).
22
23 diff --git a/sysdeps/ia64/fpu/e_fmod.S b/sysdeps/ia64/fpu/e_fmod.S
24 index dbd0a29..87b6a48 100644
25 --- a/sysdeps/ia64/fpu/e_fmod.S
26 +++ b/sysdeps/ia64/fpu/e_fmod.S
27 @@ -75,8 +75,8 @@
28 //
29 // Special cases
30 //====================================================================
31 -// b=+/-0: return NaN, call libm_error_support
32 -// a=+/-Inf, a=NaN or b=NaN: return NaN
33 +// a=+/-Inf or b=+/-0: return NaN, call libm_error_support
34 +// a=NaN or b=NaN: return NaN
35 //
36 // Registers used
37 //====================================================================
38 @@ -407,13 +407,13 @@ FMOD_X_NAN_INF:
39 nop.m 999
40 // also set Denormal flag if necessary
41 (p8) fma.s0 f9=f9,f1,f0
42 - nop.i 999 ;;
43 +(p8) mov GR_Parameter_TAG=274 ;;
44 }
45
46 { .mfb
47 nop.m 999
48 (p8) fma.d.s0 f8=f8,f1,f0
49 - nop.b 999 ;;
50 +(p8) br.spnt __libm_error_region;;
51 }
52
53 { .mfb
54 diff --git a/sysdeps/ia64/fpu/e_fmodf.S b/sysdeps/ia64/fpu/e_fmodf.S
55 index 36e5807..9f8cbbd 100644
56 --- a/sysdeps/ia64/fpu/e_fmodf.S
57 +++ b/sysdeps/ia64/fpu/e_fmodf.S
58 @@ -75,8 +75,8 @@
59
60 // Special cases
61 //====================================================================
62 -// b=+/-0: return NaN, call libm_error_support
63 -// a=+/-Inf, a=NaN or b=NaN: return NaN
64 +// a=+/-Inf or b=+/-0: return NaN, call libm_error_support
65 +// a=NaN or b=NaN: return NaN
66
67 // Registers used
68 //====================================================================
69 @@ -413,13 +413,13 @@ FMOD_X_NAN_INF:
70 nop.m 999
71 // also set Denormal flag if necessary
72 (p8) fma.s0 f9=f9,f1,f0
73 - nop.i 999 ;;
74 +(p8) mov GR_Parameter_TAG=275 ;;
75 }
76
77 { .mfb
78 nop.m 999
79 (p8) fma.s.s0 f8=f8,f1,f0
80 - nop.b 999 ;;
81 +(p8) br.spnt __libm_error_region;;
82 }
83
84 { .mfb
85 diff --git a/sysdeps/ia64/fpu/e_fmodl.S b/sysdeps/ia64/fpu/e_fmodl.S
86 index 3e87eb0..3c38654 100644
87 --- a/sysdeps/ia64/fpu/e_fmodl.S
88 +++ b/sysdeps/ia64/fpu/e_fmodl.S
89 @@ -484,6 +484,11 @@ FMOD_A_NAN_INF:
90 (p8) cmp.ne p7, p0 = GR_SIG_B, r0
91 nop.i 0
92 }
93 +{ .mfi
94 + nop.m 0
95 + fmerge.s FR_X = f8, f8
96 + nop.i 0
97 +}
98 ;;
99
100 { .mfi
101 @@ -509,7 +514,12 @@ FMOD_A_NAN_INF:
102 { .mfb
103 nop.m 0
104 (p9) frcpa.s0 f8, p7 = f8, f9
105 - br.ret.sptk b0
106 + (p9) br.ret.sptk b0
107 +}
108 +{ .mmb
109 + alloc GR_ARPFS = ar.pfs, 1, 4, 4, 0
110 + mov GR_Parameter_TAG = 273
111 + br.sptk __libm_error_region
112 }
113 ;;
114
115 diff --git a/sysdeps/ia64/fpu/libm_error.c b/sysdeps/ia64/fpu/libm_error.c
116 index 8ef4bb5..cf004fc 100644
117 --- a/sysdeps/ia64/fpu/libm_error.c
118 +++ b/sysdeps/ia64/fpu/libm_error.c
119 @@ -708,15 +708,18 @@ switch(input_tag)
120 case gammal_negative:
121 case gamma_negative:
122 case gammaf_negative:
123 - case lgammal_negative:
124 - case lgamma_negative:
125 - case lgammaf_negative:
126 case tgammal_negative:
127 case tgamma_negative:
128 case tgammaf_negative:
129 {
130 ERRNO_DOMAIN; break;
131 }
132 + case lgammal_negative:
133 + case lgamma_negative:
134 + case lgammaf_negative:
135 + {
136 + ERRNO_RANGE; break;
137 + }
138 case ldexpl_overflow:
139 case ldexpl_underflow:
140 case ldexp_overflow:
141 @@ -1081,17 +1084,17 @@ switch(input_tag)
142 case powl_zero_to_negative:
143 /* 0**neg */
144 {
145 - ERRNO_DOMAIN; break;
146 + ERRNO_RANGE; break;
147 }
148 case pow_zero_to_negative:
149 /* 0**neg */
150 {
151 - ERRNO_DOMAIN; break;
152 + ERRNO_RANGE; break;
153 }
154 case powf_zero_to_negative:
155 /* 0**neg */
156 {
157 - ERRNO_DOMAIN; break;
158 + ERRNO_RANGE; break;
159 }
160 case powl_neg_to_non_integer:
161 /* neg**non_integral */
162 @@ -1307,6 +1310,21 @@ switch(input_tag)
163 {
164 ERRNO_DOMAIN; break;
165 }
166 + case fmodl_infinity:
167 + /* fmodl(inf,y) */
168 + {
169 + ERRNO_DOMAIN; break;
170 + }
171 + case fmod_infinity:
172 + /* fmod(inf,y) */
173 + {
174 + ERRNO_DOMAIN; break;
175 + }
176 + case fmodf_infinity:
177 + /* fmodf(inf,y) */
178 + {
179 + ERRNO_DOMAIN; break;
180 + }
181 case coshl_overflow:
182 /* coshl overflows */
183 {
184 @@ -1373,6 +1391,51 @@ switch(input_tag)
185 {
186 ERRNO_RANGE; break;
187 }
188 + case cosl_infinity:
189 + /* cosl(inf) */
190 + {
191 + ERRNO_DOMAIN; break;
192 + }
193 + case cos_infinity:
194 + /* cos(inf) */
195 + {
196 + ERRNO_DOMAIN; break;
197 + }
198 + case cosf_infinity:
199 + /* cosf(inf) */
200 + {
201 + ERRNO_DOMAIN; break;
202 + }
203 + case sinl_infinity:
204 + /* sinl(inf) */
205 + {
206 + ERRNO_DOMAIN; break;
207 + }
208 + case sin_infinity:
209 + /* sin(inf) */
210 + {
211 + ERRNO_DOMAIN; break;
212 + }
213 + case sinf_infinity:
214 + /* sinf(inf) */
215 + {
216 + ERRNO_DOMAIN; break;
217 + }
218 + case tanl_infinity:
219 + /* tanl(inf) */
220 + {
221 + ERRNO_DOMAIN; break;
222 + }
223 + case tan_infinity:
224 + /* tan(inf) */
225 + {
226 + ERRNO_DOMAIN; break;
227 + }
228 + case tanf_infinity:
229 + /* tanf(inf) */
230 + {
231 + ERRNO_DOMAIN; break;
232 + }
233 default:
234 break;
235 }
236 diff --git a/sysdeps/ia64/fpu/libm_error_codes.h b/sysdeps/ia64/fpu/libm_error_codes.h
237 index 4f0945e..96e67c0 100644
238 --- a/sysdeps/ia64/fpu/libm_error_codes.h
239 +++ b/sysdeps/ia64/fpu/libm_error_codes.h
240 @@ -195,7 +195,11 @@ typedef enum
241 nextafterl_underflow, nextafter_underflow,
242 nextafterf_underflow, /* 267, 268, 269 */
243 nexttowardl_underflow, nexttoward_underflow,
244 - nexttowardf_underflow /* 270, 271, 272 */
245 + nexttowardf_underflow, /* 270, 271, 272 */
246 + fmodl_infinity, fmod_infinity, fmodf_infinity, /* 273, 274, 275 */
247 + cosl_infinity, cos_infinity, cosf_infinity, /* 276, 277, 278 */
248 + sinl_infinity, sin_infinity, sinf_infinity, /* 279, 280, 281 */
249 + tanl_infinity, tan_infinity, tanf_infinity, /* 282, 283, 284 */
250 } error_types;
251
252 #define LIBM_ERROR __libm_error_support
253 diff --git a/sysdeps/ia64/fpu/s_cos.S b/sysdeps/ia64/fpu/s_cos.S
254 index fc121fc..24c258c 100644
255 --- a/sysdeps/ia64/fpu/s_cos.S
256 +++ b/sysdeps/ia64/fpu/s_cos.S
257 @@ -174,7 +174,7 @@
258 //==============================================================
259 // general input registers:
260 // r14 -> r26
261 -// r32 -> r35
262 +// r32 -> r36
263
264 // predicate registers used:
265 // p6 -> p11
266 @@ -260,6 +260,10 @@ GR_SAVE_B0 = r34
267 GR_SAVE_GP = r35
268 GR_SAVE_r_sincos = r36
269
270 +GR_Parameter_X = r37
271 +GR_Parameter_Y = r38
272 +GR_Parameter_RESULT = r39
273 +GR_Parameter_TAG = r40
274
275 RODATA
276
277 @@ -474,7 +478,7 @@ _SINCOS_COMMON:
278 // 0x1001a is register_bias + 27.
279 // So if f8 >= 2^27, go to large argument routines
280 { .mfi
281 - alloc r32 = ar.pfs, 1, 4, 0, 0
282 + alloc r32 = ar.pfs, 1, 4, 4, 0
283 fclass.m p11,p0 = f8, 0x0b // Test for x=unorm
284 mov sincos_GR_all_ones = -1 // For "inexect" constant create
285 }
286 @@ -681,20 +685,39 @@ _SINCOS_COMMON2:
287 ////////// x = 0/Inf/NaN path //////////////////
288 _SINCOS_SPECIAL_ARGS:
289 .pred.rel "mutex",p8,p9
290 +
291 +{ .mfi
292 + nop.m 999
293 + fclass.m.unc p7,p0 = f8, 0x23 // is x +/- inf?
294 + nop.i 999;;
295 +}
296 +
297 +{ .mfi
298 + nop.m 999
299 +(p7) fmerge.s f9 = f8,f8
300 + nop.i 999
301 +}
302 +
303 // sin(+/-0) = +/-0
304 // sin(Inf) = NaN
305 // sin(NaN) = NaN
306 { .mfi
307 nop.m 999
308 (p8) fma.d.s0 f8 = f8, f0, f0 // sin(+/-0,NaN,Inf)
309 - nop.i 999
310 +(p8) mov GR_Parameter_TAG = 280
311 }
312 // cos(+/-0) = 1.0
313 // cos(Inf) = NaN
314 // cos(NaN) = NaN
315 -{ .mfb
316 +{ .mfi
317 nop.m 999
318 (p9) fma.d.s0 f8 = f8, f0, f1 // cos(+/-0,NaN,Inf)
319 +(p9) mov GR_Parameter_TAG = 277
320 +}
321 +
322 +{ .mbb
323 + nop.m 999
324 +(p7) br.cond.spnt __libm_error_region
325 br.ret.sptk b0 // Exit for x = 0/Inf/NaN path
326 };;
327
328 @@ -766,3 +789,54 @@ LOCAL_LIBM_END(__libm_callout_sincos)
329 .type __libm_cos_large#,@function
330 .global __libm_cos_large#
331
332 +LOCAL_LIBM_ENTRY(__libm_error_region)
333 +.prologue
334 +{ .mfi
335 + add GR_Parameter_Y=-32,sp // Parameter 2 value
336 + nop.f 0
337 +.save ar.pfs,GR_SAVE_PFS
338 + mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
339 +}
340 +{ .mfi
341 +.fframe 64
342 + add sp=-64,sp // Create new stack
343 + nop.f 0
344 + mov GR_SAVE_GP=gp // Save gp
345 +};;
346 +{ .mmi
347 + stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack
348 + add GR_Parameter_X = 16,sp // Parameter 1 address
349 +.save b0, GR_SAVE_B0
350 + mov GR_SAVE_B0=b0 // Save b0
351 +};;
352 +.body
353 +{ .mib
354 + stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack
355 + add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
356 + nop.b 0
357 +}
358 +{ .mib
359 + stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack
360 + add GR_Parameter_Y = -16,GR_Parameter_Y
361 + br.call.sptk b0=__libm_error_support# // Call error handling function
362 +};;
363 +{ .mmi
364 + add GR_Parameter_RESULT = 48,sp
365 + nop.m 0
366 + nop.i 0
367 +};;
368 +{ .mmi
369 + ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
370 +.restore sp
371 + add sp = 64,sp // Restore stack pointer
372 + mov b0 = GR_SAVE_B0 // Restore return address
373 +};;
374 +{ .mib
375 + mov gp = GR_SAVE_GP // Restore gp
376 + mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
377 + br.ret.sptk b0 // Return
378 +};;
379 +
380 +LOCAL_LIBM_END(__libm_error_region)
381 +.type __libm_error_support#,@function
382 +.global __libm_error_support#
383 diff --git a/sysdeps/ia64/fpu/s_cosf.S b/sysdeps/ia64/fpu/s_cosf.S
384 index bcdf1b0..f0bc9a8 100644
385 --- a/sysdeps/ia64/fpu/s_cosf.S
386 +++ b/sysdeps/ia64/fpu/s_cosf.S
387 @@ -171,7 +171,7 @@
388 //==============================================================
389 // general input registers:
390 // r14 -> r19
391 -// r32 -> r45
392 +// r32 -> r43
393
394 // predicate registers used:
395 // p6 -> p14
396 @@ -260,6 +260,11 @@ GR_SAVE_PFS = r41
397 GR_SAVE_B0 = r42
398 GR_SAVE_GP = r43
399
400 +GR_Parameter_X = r44
401 +GR_Parameter_Y = r45
402 +GR_Parameter_RESULT = r46
403 +GR_Parameter_TAG = r47
404 +
405 RODATA
406 .align 16
407
408 @@ -389,7 +394,7 @@ LOCAL_OBJECT_END(double_sin_cos_beta_k4)
409 GLOBAL_IEEE754_ENTRY(sinf)
410
411 { .mlx
412 - alloc r32 = ar.pfs,1,13,0,0
413 + alloc r32 = ar.pfs,1,11,4,0
414 movl sincosf_GR_sig_inv_pi_by_16 = 0xA2F9836E4E44152A //signd of 16/pi
415 }
416 { .mlx
417 @@ -413,7 +418,7 @@ GLOBAL_IEEE754_END(sinf)
418 GLOBAL_IEEE754_ENTRY(cosf)
419
420 { .mlx
421 - alloc r32 = ar.pfs,1,13,0,0
422 + alloc r32 = ar.pfs,1,11,4,0
423 movl sincosf_GR_sig_inv_pi_by_16 = 0xA2F9836E4E44152A //signd of 16/pi
424 }
425 { .mlx
426 @@ -641,20 +646,39 @@ _SINCOSF_COMMON:
427 ////////// x = 0/Inf/NaN path //////////////////
428 _SINCOSF_SPECIAL_ARGS:
429 .pred.rel "mutex",p8,p9
430 +
431 +{ .mfi
432 + nop.m 999
433 + fclass.m.unc p7,p0 = f8, 0x23 // is x +/- inf?
434 + nop.i 999;;
435 +}
436 +
437 +{ .mfi
438 + nop.m 999
439 +(p7) fmerge.s f9 = f8,f8
440 + nop.i 999
441 +}
442 +
443 // sinf(+/-0) = +/-0
444 // sinf(Inf) = NaN
445 // sinf(NaN) = NaN
446 { .mfi
447 nop.m 999
448 (p8) fma.s.s0 f8 = f8, f0, f0 // sinf(+/-0,NaN,Inf)
449 - nop.i 999
450 +(p8) mov GR_Parameter_TAG = 281
451 }
452 // cosf(+/-0) = 1.0
453 // cosf(Inf) = NaN
454 // cosf(NaN) = NaN
455 -{ .mfb
456 +{ .mfi
457 nop.m 999
458 (p9) fma.s.s0 f8 = f8, f0, f1 // cosf(+/-0,NaN,Inf)
459 +(p9) mov GR_Parameter_TAG = 278
460 +};;
461 +
462 +{ .mbb
463 + nop.m 999
464 +(p7) br.cond.spnt __libm_error_region
465 br.ret.sptk b0 // Exit for x = 0/Inf/NaN path
466 };;
467
468 @@ -715,3 +739,54 @@ LOCAL_LIBM_END(__libm_callout_sincosf)
469 .type __libm_cos_large#, @function
470 .global __libm_cos_large#
471
472 +LOCAL_LIBM_ENTRY(__libm_error_region)
473 +.prologue
474 +{ .mfi
475 + add GR_Parameter_Y=-32,sp // Parameter 2 value
476 + nop.f 0
477 +.save ar.pfs,GR_SAVE_PFS
478 + mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
479 +}
480 +{ .mfi
481 +.fframe 64
482 + add sp=-64,sp // Create new stack
483 + nop.f 0
484 + mov GR_SAVE_GP=gp // Save gp
485 +};;
486 +{ .mmi
487 + stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack
488 + add GR_Parameter_X = 16,sp // Parameter 1 address
489 +.save b0, GR_SAVE_B0
490 + mov GR_SAVE_B0=b0 // Save b0
491 +};;
492 +.body
493 +{ .mib
494 + stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack
495 + add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
496 + nop.b 0
497 +}
498 +{ .mib
499 + stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack
500 + add GR_Parameter_Y = -16,GR_Parameter_Y
501 + br.call.sptk b0=__libm_error_support# // Call error handling function
502 +};;
503 +{ .mmi
504 + add GR_Parameter_RESULT = 48,sp
505 + nop.m 0
506 + nop.i 0
507 +};;
508 +{ .mmi
509 + ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
510 +.restore sp
511 + add sp = 64,sp // Restore stack pointer
512 + mov b0 = GR_SAVE_B0 // Restore return address
513 +};;
514 +{ .mib
515 + mov gp = GR_SAVE_GP // Restore gp
516 + mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
517 + br.ret.sptk b0 // Return
518 +};;
519 +
520 +LOCAL_LIBM_END(__libm_error_region)
521 +.type __libm_error_support#,@function
522 +.global __libm_error_support#
523 diff --git a/sysdeps/ia64/fpu/s_cosl.S b/sysdeps/ia64/fpu/s_cosl.S
524 index 8d71e50..8bb330e 100644
525 --- a/sysdeps/ia64/fpu/s_cosl.S
526 +++ b/sysdeps/ia64/fpu/s_cosl.S
527 @@ -747,12 +747,16 @@ GR_SAVE_B0 = r39
528 GR_SAVE_GP = r40
529 GR_SAVE_PFS = r41
530
531 +GR_Parameter_X = r59
532 +GR_Parameter_Y = r60
533 +GR_Parameter_RESULT = r61
534 +GR_Parameter_TAG = r62
535
536 .section .text
537
538 GLOBAL_IEEE754_ENTRY(sinl)
539 { .mlx
540 - alloc r32 = ar.pfs,0,27,2,0
541 + alloc r32 = ar.pfs,1,26,4,0
542 movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
543 }
544 { .mlx
545 @@ -777,7 +781,7 @@ GLOBAL_IEEE754_END(sinl)
546
547 GLOBAL_IEEE754_ENTRY(cosl)
548 { .mlx
549 - alloc r32 = ar.pfs,0,27,2,0
550 + alloc r32 = ar.pfs,1,26,4,0
551 movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
552 }
553 { .mlx
554 @@ -2278,13 +2282,31 @@ SINCOSL_DENORMAL:
555 SINCOSL_SPECIAL:
556 { .mfb
557 nop.m 999
558 + fclass.m.unc p6,p0 = f8, 0x23 // is x +/- inf?
559 + nop.b 999;;
560 +}
561 +
562 +{ .mfi
563 + nop.m 999
564 +(p6) fmerge.s f9 = f8,f8
565 +(p6) cmp.eq.unc p7, p8 = 0x1, GR_Sin_or_Cos;;
566 +}
567 +
568 +{ .mmf
569 +(p7) mov GR_Parameter_TAG = 276 // (cosl)
570 +(p8) mov GR_Parameter_TAG = 279 // (sinl)
571 //
572 // Path for Arg = +/- QNaN, SNaN, Inf
573 // Invalid can be raised. SNaNs
574 // become QNaNs
575 //
576 fmpy.s0 FR_Result = FR_Input_X, f0
577 - br.ret.sptk b0 ;;
578 +}
579 +
580 +{ .mbb
581 + nop.m 999
582 +(p6) br.cond.spnt __libm_error_region
583 + br.ret.sptk b0 ;;
584 }
585
586 GLOBAL_IEEE754_END(cosl)
587 @@ -2363,3 +2385,55 @@ SINCOSL_ARG_TOO_LARGE:
588 LOCAL_LIBM_END(__libm_callout)
589 .type __libm_pi_by_2_reduce#,@function
590 .global __libm_pi_by_2_reduce#
591 +
592 +LOCAL_LIBM_ENTRY(__libm_error_region)
593 +.prologue
594 +{ .mfi
595 + add GR_Parameter_Y=-32,sp // Parameter 2 value
596 + nop.f 0
597 +.save ar.pfs,GR_SAVE_PFS
598 + mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
599 +}
600 +{ .mfi
601 +.fframe 64
602 + add sp=-64,sp // Create new stack
603 + nop.f 0
604 + mov GR_SAVE_GP=gp // Save gp
605 +};;
606 +{ .mmi
607 + stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack
608 + add GR_Parameter_X = 16,sp // Parameter 1 address
609 +.save b0, GR_SAVE_B0
610 + mov GR_SAVE_B0=b0 // Save b0
611 +};;
612 +.body
613 +{ .mib
614 + stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack
615 + add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
616 + nop.b 0
617 +}
618 +{ .mib
619 + stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack
620 + add GR_Parameter_Y = -16,GR_Parameter_Y
621 + br.call.sptk b0=__libm_error_support# // Call error handling function
622 +};;
623 +{ .mmi
624 + add GR_Parameter_RESULT = 48,sp
625 + nop.m 0
626 + nop.i 0
627 +};;
628 +{ .mmi
629 + ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
630 +.restore sp
631 + add sp = 64,sp // Restore stack pointer
632 + mov b0 = GR_SAVE_B0 // Restore return address
633 +};;
634 +{ .mib
635 + mov gp = GR_SAVE_GP // Restore gp
636 + mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
637 + br.ret.sptk b0 // Return
638 +};;
639 +
640 +LOCAL_LIBM_END(__libm_error_region)
641 +.type __libm_error_support#,@function
642 +.global __libm_error_support#
643 diff --git a/sysdeps/ia64/fpu/s_tan.S b/sysdeps/ia64/fpu/s_tan.S
644 index a2f80c8..a4b42c9 100644
645 --- a/sysdeps/ia64/fpu/s_tan.S
646 +++ b/sysdeps/ia64/fpu/s_tan.S
647 @@ -348,15 +348,10 @@ COMMON_PATH:
648 (p6) br.ret.spnt b0 ;; // Exit for x=0 (tan only)
649 }
650
651 -{ .mfi
652 +{ .mmi
653 ldfpd tan_P14,tan_P15 = [tan_AD],16
654 -(p7) frcpa.s0 f8,p9=f0,f0 // Set qnan indef if x=inf
655 - mov tan_GR_10009 = 0x10009
656 -}
657 -{ .mib
658 ldfpd tan_Q8,tan_Q9 = [tan_ADQ],16
659 - nop.i 999
660 -(p7) br.ret.spnt b0 ;; // Exit for x=inf
661 + mov tan_GR_10009 = 0x10009;;
662 }
663
664 { .mfi
665 @@ -384,6 +379,12 @@ COMMON_PATH:
666 fma.s1 TAN_W_2TO64_RSH = tan_NORM_f8,TAN_INV_PI_BY_2_2TO64,TAN_RSHF_2TO64
667 };;
668
669 +{ .mfb
670 +(p7) mov GR_Parameter_Tag = 283 // (tan)
671 +(p7) frcpa.s0 f8,p9=f0,f0 // Set qnan indef if x=inf
672 +(p7) br.cond.spnt __libm_error_region ;; // call error support if tan(+-inf)
673 +}
674 +
675 { .mmf
676 ldfpd tan_P10,tan_P11 = [tan_AD],16
677 and tan_exp = tan_GR_17_ones, tan_signexp
678 diff --git a/sysdeps/ia64/fpu/s_tanf.S b/sysdeps/ia64/fpu/s_tanf.S
679 index 193d756..cd0febb 100644
680 --- a/sysdeps/ia64/fpu/s_tanf.S
681 +++ b/sysdeps/ia64/fpu/s_tanf.S
682 @@ -301,11 +301,11 @@ Common_Path:
683 { .mfi
684 cmp.ge p6, p0 = rSignMask, rExpCut // p6 = (E => 0x10009)
685 (p8) frcpa.s0 f8, p0 = f0, f0 // Set qnan indef if x=inf
686 - mov GR_Parameter_Tag = 227 // (cotf)
687 + mov GR_Parameter_Tag = 284 // (tanf)
688 }
689 { .mbb
690 ldfe fPiby2 = [rCoeffB], 16
691 -(p8) br.ret.spnt b0 // Exit for x=inf
692 +(p8) br.cond.spnt __libm_error_region // call error support if tanf(+-0)
693 (p6) br.cond.spnt Huge_Argument // Branch if |x|>=2^10
694 }
695 ;;
696 @@ -313,7 +313,7 @@ Common_Path:
697 { .mfi
698 nop.m 0
699 (p11) fclass.m.unc p6, p0 = f8, 0x07 // Test for x=0 (for cotf)
700 - nop.i 0
701 + mov GR_Parameter_Tag = 227 // (cotf)
702 }
703 { .mfb
704 nop.m 0
705 diff --git a/sysdeps/ia64/fpu/s_tanl.S b/sysdeps/ia64/fpu/s_tanl.S
706 index 607a271..95d5145 100644
707 --- a/sysdeps/ia64/fpu/s_tanl.S
708 +++ b/sysdeps/ia64/fpu/s_tanl.S
709 @@ -3072,21 +3072,32 @@ TANL_UNSUPPORTED:
710
711 { .mfi
712 nop.m 999
713 -(p6) fclass.m p6, p7 = f8, 0x7 // Test for zero (cotl only)
714 +(p6) fclass.m.unc p6, p0 = f8, 0x7 // Test for zero (cotl only)
715 + nop.i 999
716 +}
717 +;;
718 +{ .mfi
719 + nop.m 999
720 +(p7) fclass.m.unc p7, p0 = f8, 0x23 // Test for inf (tanl only)
721 nop.i 999
722 }
723 ;;
724
725 .pred.rel "mutex", p6, p7
726 -{ .mfi
727 +{ .mfb
728 (p6) mov GR_Parameter_Tag = 225 // (cotl)
729 (p6) frcpa.s0 f8, p0 = f1, f8 // cotl(+-0) = +-Inf
730 - nop.i 999
731 +(p6) br.cond.spnt __libm_error_region;;
732 +}
733 +{ .mfb
734 +(p7) mov GR_Parameter_Tag = 282 // (tanl)
735 + fmpy.s0 f8 = f8, f0
736 +(p7) br.cond.spnt __libm_error_region;;
737 }
738 { .mfb
739 nop.m 999
740 -(p7) fmpy.s0 f8 = f8, f0
741 -(p7) br.ret.sptk b0
742 + nop.f 999
743 + br.ret.sptk b0
744 }
745 ;;
746

  ViewVC Help
Powered by ViewVC 1.1.5