~ubuntu-branches/ubuntu/utopic/eglibc/utopic

« back to all changes in this revision

Viewing changes to sysdeps/ia64/fpu/e_exp2.S

  • Committer: Package Import Robot
  • Author(s): Adam Conrad
  • Date: 2012-10-26 05:14:58 UTC
  • mfrom: (1.5.1) (4.4.22 experimental)
  • Revision ID: package-import@ubuntu.com-20121026051458-oryotr4i03ob5pab
Tags: 2.16-0ubuntu1
* Merge with unreleased 2.16 in Debian experimental, remaining changes:
  - Drop the Breaks line from libc6, which refers to a Debian transition
  - Remove the libc6 recommends on libc6-i686, which we don't build
  - Enable libc6{,-dev}-armel on armhf and libc6{-dev}-armhf on armel
  - Ship update-locale and validlocale in /usr/sbin in libc-bin
  - Don't build locales or locales-all in Ubuntu, we rely on langpacks
  - Heavily mangle the way we do service restarting on major upgrades
  - Use different MIN_KERNEL_SUPPORTED versions than Debian, due to
    buildd needs.  This should be universally bumped to 3.2.0 once all
    our buildds (including the PPA guests) are running precise kernels
  - Build i386 variants as -march=i686, build amd64 with -O3, and build
    ppc64 variants (both 64-bit and 32-bit) with -O3 -fno-tree-vectorize
  - Re-enable unsubmitted-ldconfig-cache-abi.diff and rebuild the cache
    on upgrades from previous versions that used a different constant
  - debian/patches/any/local-CVE-2012-3406.diff: switch to malloc when
    array grows too large to handle via alloca extension (CVE-2012-3406)
  - Build generic i386/i686 flavour with -mno-tls-direct-seg-refs
* Changes added/dropped with this merge while reducing our delta:
  - Stop building glibc docs from the eglibc source, and instead make
    the glibc-docs stub have a hard dependency on glibc-doc-reference
  - Remove outdated conflicts against ancient versions of ia32-libs
  - Drop the tzdata dependency from libc6, it's in required and minimal
  - Use gcc-4.7/g++-4.7 by default on all our supported architectures
  - Save our historical changelog as changelog.ubuntu in the source
  - Drop nscd's libaudit build-dep for now, as libaudit is in universe
  - Drop the unnecessary Breaks from libc6 to locales and locales-all
  - Ship xen's ld.so.conf.d snippet as /etc/ld.so.conf.d/libc6-xen.conf
* Disable hard failures on the test suite for the first upload to raring

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
.file "exp2.s"
2
 
 
3
 
 
4
 
// Copyright (c) 2000 - 2005, Intel Corporation
5
 
// All rights reserved.
6
 
//
7
 
// Contributed 2000 by the Intel Numerics Group, Intel Corporation
8
 
//
9
 
// Redistribution and use in source and binary forms, with or without
10
 
// modification, are permitted provided that the following conditions are
11
 
// met:
12
 
//
13
 
// * Redistributions of source code must retain the above copyright
14
 
// notice, this list of conditions and the following disclaimer.
15
 
//
16
 
// * Redistributions in binary form must reproduce the above copyright
17
 
// notice, this list of conditions and the following disclaimer in the
18
 
// documentation and/or other materials provided with the distribution.
19
 
//
20
 
// * The name of Intel Corporation may not be used to endorse or promote
21
 
// products derived from this software without specific prior written
22
 
// permission.
23
 
 
24
 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
 
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
28
 
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29
 
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30
 
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31
 
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
32
 
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
33
 
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34
 
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
 
//
36
 
// Intel Corporation is the author of this code, and requests that all
37
 
// problem reports or change requests be submitted to it directly at
38
 
// http://www.intel.com/software/products/opensource/libraries/num.htm.
39
 
//
40
 
// History
41
 
//==============================================================
42
 
// 08/25/00  Initial version
43
 
// 05/20/02  Cleaned up namespace and sf0 syntax
44
 
// 09/05/02  Improved performance
45
 
// 01/17/03  Fixed to call error support when x=1024.0
46
 
// 03/31/05  Reformatted delimiters between data tables
47
 
//
48
 
// API
49
 
//==============================================================
50
 
// double exp2(double)
51
 
//
52
 
// Overview of operation
53
 
//==============================================================
54
 
// Background
55
 
//
56
 
// Implementation
57
 
//
58
 
// Let x= (K + fh + fl + r), where
59
 
// K is an integer, fh= 0.b1 b2 b3 b4 b5,
60
 
// fl= 2^{-5}* 0.b6 b7 b8 b8 b10 (fh, fl >= 0),
61
 
// and |r|<2^{-11}
62
 
// Th is a table that stores 2^fh (32 entries) rounded to
63
 
// double extended precision (only mantissa is stored)
64
 
// Tl is a table that stores 2^fl (32 entries) rounded to
65
 
// double extended precision (only mantissa is stored)
66
 
//
67
 
// 2^x is approximated as
68
 
// 2^K * Th [ f ] * Tl [ f ] * (1+c1*r+c2*r^2+c3*r^3+c4*r^4)
69
 
 
70
 
// Note: We use the following trick to speed up conversion from FP to integer:
71
 
//
72
 
// Let  x = K + r, where K is an integer, and  |r| <= 0.5
73
 
// Let N be the number of significand bits for the FP format used
74
 
//   ( N=64 for double-extended, N=53 for double)
75
 
//
76
 
// Then let y = 1.5 * 2^(N-1)  +  x    for RN mode
77
 
//          K = y -  1.5 * 2^(N-1)
78
 
//          r  = x - K
79
 
//
80
 
// If we want to obtain the integer part and the first m fractional bits of x,
81
 
// we can use the same trick, but with a constant of  1.5 * 2^(N-1-m):
82
 
//
83
 
// Let x = K + f + r
84
 
// f = 0.b_1 b_2 ... b_m
85
 
// |r| <= 2^(-m-1)
86
 
//
87
 
// Then let y = 1.5 * 2^(N-1-m)  +  x    for RN mode
88
 
//          (K+f) = y -  1.5 * 2^(N-1-m)
89
 
//          r  = x - K
90
 
 
91
 
 
92
 
// Special values
93
 
//==============================================================
94
 
// exp2(0)= 1
95
 
// exp2(+inf)= inf
96
 
// exp2(-inf)= 0
97
 
//
98
 
 
99
 
// Registers used
100
 
//==============================================================
101
 
// r2-r3, r14-r40
102
 
// f6-f15, f32-f45
103
 
// p6-p8, p12
104
 
//
105
 
 
106
 
 
107
 
GR_TBL_START        = r2
108
 
GR_LOG_TBL          = r3
109
 
 
110
 
GR_OF_LIMIT         = r14
111
 
GR_UF_LIMIT         = r15
112
 
GR_EXP_CORR         = r16
113
 
GR_F_low            = r17
114
 
GR_F_high           = r18
115
 
GR_K                = r19
116
 
GR_Flow_ADDR        = r20
117
 
 
118
 
GR_BIAS             = r21
119
 
GR_Fh               = r22
120
 
GR_Fh_ADDR          = r23
121
 
GR_EXPMAX           = r24
122
 
GR_EMIN             = r25
123
 
 
124
 
GR_ROUNDVAL         = r26
125
 
GR_MASK             = r27
126
 
GR_KF0              = r28
127
 
GR_MASK_low         = r29
128
 
GR_COEFF_START      = r30
129
 
 
130
 
GR_SAVE_B0          = r33
131
 
GR_SAVE_PFS         = r34
132
 
GR_SAVE_GP          = r35
133
 
GR_SAVE_SP          = r36
134
 
 
135
 
GR_Parameter_X      = r37
136
 
GR_Parameter_Y      = r38
137
 
GR_Parameter_RESULT = r39
138
 
GR_Parameter_TAG    = r40
139
 
 
140
 
 
141
 
FR_X                = f10
142
 
FR_Y                = f1
143
 
FR_RESULT           = f8
144
 
 
145
 
 
146
 
FR_COEFF1           = f6
147
 
FR_COEFF2           = f7
148
 
FR_R                = f9
149
 
 
150
 
FR_KF0              = f12
151
 
FR_COEFF3           = f13
152
 
FR_COEFF4           = f14
153
 
FR_UF_LIMIT         = f15
154
 
 
155
 
FR_OF_LIMIT         = f32
156
 
FR_EXPMIN           = f33
157
 
FR_ROUNDVAL         = f34
158
 
FR_KF               = f35
159
 
 
160
 
FR_2_TO_K           = f36
161
 
FR_T_low            = f37
162
 
FR_T_high           = f38
163
 
FR_P34              = f39
164
 
FR_R2               = f40
165
 
 
166
 
FR_P12              = f41
167
 
FR_T_low_K          = f42
168
 
FR_P14              = f43
169
 
FR_T                = f44
170
 
FR_P                = f45
171
 
 
172
 
 
173
 
// Data tables
174
 
//==============================================================
175
 
 
176
 
RODATA
177
 
 
178
 
.align 16
179
 
 
180
 
LOCAL_OBJECT_START(poly_coeffs)
181
 
 
182
 
data8 0x3fac6b08d704a0c0, 0x3f83b2ab6fba4e77 // C_3 and C_4
183
 
data8 0xb17217f7d1cf79ab, 0x00003ffe // C_1
184
 
data8 0xf5fdeffc162c7541, 0x00003ffc // C_2
185
 
LOCAL_OBJECT_END(poly_coeffs)
186
 
 
187
 
 
188
 
LOCAL_OBJECT_START(T_table)
189
 
 
190
 
// 2^{0.00000 b6 b7 b8 b9 b10}
191
 
data8 0x8000000000000000, 0x8016302f17467628
192
 
data8 0x802c6436d0e04f50, 0x80429c17d77c18ed
193
 
data8 0x8058d7d2d5e5f6b0, 0x806f17687707a7af
194
 
data8 0x80855ad965e88b83, 0x809ba2264dada76a
195
 
data8 0x80b1ed4fd999ab6c, 0x80c83c56b50cf77f
196
 
data8 0x80de8f3b8b85a0af, 0x80f4e5ff089f763e
197
 
data8 0x810b40a1d81406d4, 0x81219f24a5baa59d
198
 
data8 0x813801881d886f7b, 0x814e67cceb90502c
199
 
data8 0x8164d1f3bc030773, 0x817b3ffd3b2f2e47
200
 
data8 0x8191b1ea15813bfd, 0x81a827baf7838b78
201
 
data8 0x81bea1708dde6055, 0x81d51f0b8557ec1c
202
 
data8 0x81eba08c8ad4536f, 0x820225f44b55b33b
203
 
data8 0x8218af4373fc25eb, 0x822f3c7ab205c89a
204
 
data8 0x8245cd9ab2cec048, 0x825c62a423d13f0c
205
 
data8 0x8272fb97b2a5894c, 0x828998760d01faf3
206
 
data8 0x82a0393fe0bb0ca8, 0x82b6ddf5dbc35906
207
 
//
208
 
// 2^{0.b1 b2 b3 b4 b5}
209
 
data8 0x8000000000000000, 0x82cd8698ac2ba1d7
210
 
data8 0x85aac367cc487b14, 0x88980e8092da8527
211
 
data8 0x8b95c1e3ea8bd6e6, 0x8ea4398b45cd53c0
212
 
data8 0x91c3d373ab11c336, 0x94f4efa8fef70961
213
 
data8 0x9837f0518db8a96f, 0x9b8d39b9d54e5538
214
 
data8 0x9ef5326091a111ad, 0xa27043030c496818
215
 
data8 0xa5fed6a9b15138ea, 0xa9a15ab4ea7c0ef8
216
 
data8 0xad583eea42a14ac6, 0xb123f581d2ac258f
217
 
data8 0xb504f333f9de6484, 0xb8fbaf4762fb9ee9
218
 
data8 0xbd08a39f580c36be, 0xc12c4cca66709456
219
 
data8 0xc5672a115506dadd, 0xc9b9bd866e2f27a2
220
 
data8 0xce248c151f8480e3, 0xd2a81d91f12ae45a
221
 
data8 0xd744fccad69d6af4, 0xdbfbb797daf23755
222
 
data8 0xe0ccdeec2a94e111, 0xe5b906e77c8348a8
223
 
data8 0xeac0c6e7dd24392e, 0xefe4b99bdcdaf5cb
224
 
data8 0xf5257d152486cc2c, 0xfa83b2db722a033a
225
 
LOCAL_OBJECT_END(T_table)
226
 
 
227
 
 
228
 
 
229
 
.section .text
230
 
GLOBAL_LIBM_ENTRY(exp2)
231
 
 
232
 
 
233
 
{.mfi
234
 
       alloc r32= ar.pfs, 1, 4, 4, 0
235
 
       // will continue only for non-zero normal/denormal numbers
236
 
       fclass.nm p12, p0= f8, 0x1b
237
 
       // GR_TBL_START= pointer to C_1...C_4 followed by T_table
238
 
       addl GR_TBL_START= @ltoff(poly_coeffs), gp
239
 
}
240
 
{.mlx
241
 
       mov GR_OF_LIMIT= 0xffff + 10              // Exponent of overflow limit
242
 
       movl GR_ROUNDVAL= 0x5a400000              // 1.5*2^(63-10) (SP)
243
 
}
244
 
;;
245
 
 
246
 
// Form special constant 1.5*2^(63-10) to give integer part and first 10
247
 
// fractional bits of x
248
 
{.mfi
249
 
       setf.s FR_ROUNDVAL= GR_ROUNDVAL           // Form special constant
250
 
       fcmp.lt.s1 p6, p8= f8, f0                 // X<0 ?
251
 
       nop.i 0
252
 
}
253
 
{.mfb
254
 
       ld8 GR_COEFF_START= [ GR_TBL_START ]      // Load pointer to coeff table
255
 
       nop.f 0
256
 
 (p12) br.cond.spnt SPECIAL_exp2                 // Branch if nan, inf, zero
257
 
}
258
 
;;
259
 
 
260
 
{.mlx
261
 
       setf.exp FR_OF_LIMIT= GR_OF_LIMIT         // Set overflow limit
262
 
       movl GR_UF_LIMIT= 0xc4866000              // (-2^10-51) = -1075
263
 
}
264
 
;;
265
 
 
266
 
{.mfi
267
 
       ldfpd FR_COEFF3, FR_COEFF4= [ GR_COEFF_START ], 16 // load C_3, C_4
268
 
       fma.s0 f8= f8, f1, f0                     // normalize x
269
 
       nop.i 0
270
 
}
271
 
;;
272
 
 
273
 
{.mmi
274
 
       setf.s FR_UF_LIMIT= GR_UF_LIMIT           // Set underflow limit
275
 
       ldfe FR_COEFF1= [ GR_COEFF_START ], 16    // load C_1
276
 
       mov GR_EXP_CORR= 0xffff-126
277
 
}
278
 
;;
279
 
 
280
 
{.mfi
281
 
       ldfe FR_COEFF2= [ GR_COEFF_START ], 16    // load C_2
282
 
       fma.s1 FR_KF0= f8, f1, FR_ROUNDVAL        // y= x + 1.5*2^(63-10)
283
 
       nop.i 0
284
 
}
285
 
;;
286
 
 
287
 
{.mfi
288
 
       mov GR_MASK= 1023
289
 
       fms.s1 FR_KF= FR_KF0, f1, FR_ROUNDVAL     // (K+f)
290
 
       mov GR_MASK_low= 31
291
 
}
292
 
;;
293
 
 
294
 
{.mfi
295
 
       getf.sig GR_KF0= FR_KF0                   // (K+f)*2^10= round_to_int(y)
296
 
       fcmp.ge.s1 p12, p7= f8, FR_OF_LIMIT       // x >= overflow threshold ?
297
 
       add GR_LOG_TBL= 256, GR_COEFF_START       // Pointer to high T_table
298
 
}
299
 
;;
300
 
 
301
 
{.mmi
302
 
       and GR_F_low= GR_KF0, GR_MASK_low         // f_low
303
 
       and GR_F_high= GR_MASK, GR_KF0            // f_high*32
304
 
       shr GR_K= GR_KF0, 10                      // K
305
 
}
306
 
;;
307
 
 
308
 
{.mmi
309
 
       shladd GR_Flow_ADDR= GR_F_low, 3, GR_COEFF_START // address of 2^{f_low}
310
 
       add GR_BIAS= GR_K, GR_EXP_CORR            // K= bias-2*63
311
 
       shr GR_Fh= GR_F_high, 5                   // f_high
312
 
}
313
 
;;
314
 
 
315
 
{.mfi
316
 
       setf.exp FR_2_TO_K= GR_BIAS               // 2^{K-126}
317
 
       fnma.s1 FR_R= FR_KF, f1, f8               // r= x - (K+f)
318
 
       shladd GR_Fh_ADDR= GR_Fh, 3, GR_LOG_TBL   // address of 2^{f_high}
319
 
}
320
 
{.mlx
321
 
       ldf8 FR_T_low= [ GR_Flow_ADDR ]           // load T_low= 2^{f_low}
322
 
       movl GR_EMIN= 0xc47f8000                  // EMIN= -1022
323
 
}
324
 
;;
325
 
 
326
 
{.mfi
327
 
       ldf8 FR_T_high= [ GR_Fh_ADDR ]            // load T_high= 2^{f_high}
328
 
 (p7)  fcmp.lt.s1 p12, p7= f8, FR_UF_LIMIT       // x<underflow threshold ?
329
 
       nop.i 0
330
 
}
331
 
;;
332
 
 
333
 
{.mfi
334
 
       setf.s FR_EXPMIN= GR_EMIN                 // FR_EXPMIN= EMIN
335
 
       fma.s1 FR_P34= FR_COEFF4, FR_R, FR_COEFF3 // P34= C_3+C_4*r
336
 
       nop.i 0
337
 
}
338
 
{.mfb
339
 
       nop.m 0
340
 
       fma.s1 FR_R2= FR_R, FR_R, f0              // r*r
341
 
 (p12) br.cond.spnt OUT_RANGE_exp2
342
 
}
343
 
;;
344
 
 
345
 
{.mfi
346
 
       nop.m 0
347
 
       fma.s1 FR_P12= FR_COEFF2, FR_R, FR_COEFF1 // P12= C_1+C_2*r
348
 
       nop.i 0
349
 
}
350
 
;;
351
 
 
352
 
{.mfi
353
 
       nop.m 0
354
 
       fma.s1 FR_T_low_K= FR_T_low, FR_2_TO_K, f0 // T= 2^{K-126}*T_low
355
 
       nop.i 0
356
 
}
357
 
;;
358
 
 
359
 
{.mfi
360
 
       nop.m 0
361
 
       fma.s1 FR_P14= FR_R2, FR_P34, FR_P12       // P14= P12+r2*P34
362
 
       nop.i 0
363
 
}
364
 
;;
365
 
 
366
 
{.mfi
367
 
       nop.m 0
368
 
       fma.s1 FR_T= FR_T_low_K, FR_T_high, f0     // T= T*T_high
369
 
       nop.i 0
370
 
}
371
 
;;
372
 
 
373
 
{.mfi
374
 
       nop.m 0
375
 
       fcmp.lt.s0 p6, p8= f8, FR_EXPMIN           // underflow (x<EMIN) ?
376
 
       nop.i 0
377
 
}
378
 
;;
379
 
 
380
 
{.mfi
381
 
       nop.m 0
382
 
       fma.s1 FR_P= FR_P14, FR_R, f0              // P= P14*r
383
 
       nop.i 0
384
 
}
385
 
;;
386
 
 
387
 
{.mfb
388
 
       nop.m 0
389
 
       fma.d.s0 f8= FR_P, FR_T, FR_T              // result= T+T*P
390
 
 (p8)  br.ret.sptk b0                             // return
391
 
}
392
 
;;
393
 
 
394
 
{.mfb
395
 
 (p6)  mov GR_Parameter_TAG= 162
396
 
       nop.f 0
397
 
 (p6)  br.cond.sptk __libm_error_region
398
 
}
399
 
;;
400
 
 
401
 
 
402
 
SPECIAL_exp2:
403
 
{.mfi
404
 
       nop.m 0
405
 
       fclass.m p6, p0= f8, 0x22                  // x= -Infinity ?
406
 
       nop.i 0
407
 
}
408
 
;;
409
 
 
410
 
{.mfi
411
 
       nop.m 0
412
 
       fclass.m p7, p0= f8, 0x21                  // x= +Infinity ?
413
 
       nop.i 0
414
 
}
415
 
;;
416
 
 
417
 
{.mfi
418
 
       nop.m 0
419
 
       fclass.m p8, p0= f8, 0x7                   // x= +/-Zero ?
420
 
       nop.i 0
421
 
}
422
 
{.mfb
423
 
       nop.m 0
424
 
 (p6)  mov f8= f0                                 // exp2(-Infinity)= 0
425
 
 (p6)  br.ret.spnt b0
426
 
}
427
 
;;
428
 
 
429
 
{.mfb
430
 
       nop.m 0
431
 
       nop.f 0
432
 
 (p7)  br.ret.spnt b0                             // exp2(+Infinity)= +Infinity
433
 
}
434
 
;;
435
 
 
436
 
{.mfb
437
 
       nop.m 0
438
 
 (p8)  mov f8= f1                                 // exp2(+/-0)= 1
439
 
 (p8)  br.ret.spnt b0
440
 
}
441
 
;;
442
 
 
443
 
{.mfb
444
 
       nop.m 0
445
 
       fma.d.s0 f8= f8, f1, f0                    // Remaining cases: NaNs
446
 
       br.ret.sptk b0
447
 
}
448
 
;;
449
 
 
450
 
 
451
 
OUT_RANGE_exp2:
452
 
 
453
 
// overflow: p8= 1
454
 
 
455
 
{.mii
456
 
 (p8)  mov GR_EXPMAX= 0x1fffe
457
 
       nop.i 0
458
 
       nop.i 0
459
 
}
460
 
;;
461
 
 
462
 
{.mmb
463
 
 (p8)  mov GR_Parameter_TAG= 161
464
 
 (p8)  setf.exp FR_R= GR_EXPMAX
465
 
       nop.b 999
466
 
}
467
 
;;
468
 
 
469
 
{.mfi
470
 
       nop.m 999
471
 
 (p8)  fma.d.s0 f8= FR_R, FR_R, f0                // Create overflow
472
 
       nop.i 999
473
 
}
474
 
// underflow: p6= 1
475
 
{.mii
476
 
 (p6)  mov GR_Parameter_TAG= 162
477
 
 (p6)  mov GR_EXPMAX= 1
478
 
       nop.i 0
479
 
}
480
 
;;
481
 
 
482
 
{.mmb
483
 
       nop.m 0
484
 
 (p6)  setf.exp FR_R= GR_EXPMAX
485
 
       nop.b 999
486
 
}
487
 
;;
488
 
 
489
 
{.mfb
490
 
       nop.m 999
491
 
 (p6)  fma.d.s0 f8= FR_R, FR_R, f0                // Create underflow
492
 
       nop.b 0
493
 
}
494
 
;;
495
 
 
496
 
GLOBAL_LIBM_END(exp2)
497
 
 
498
 
 
499
 
LOCAL_LIBM_ENTRY(__libm_error_region)
500
 
 
501
 
.prologue
502
 
{.mfi
503
 
       add GR_Parameter_Y= -32, sp                // Parameter 2 value
504
 
       nop.f 0
505
 
.save ar.pfs, GR_SAVE_PFS
506
 
       mov GR_SAVE_PFS= ar.pfs                    // Save ar.pfs
507
 
}
508
 
 
509
 
{.mfi
510
 
.fframe 64
511
 
       add sp= -64, sp                            // Create new stack
512
 
       nop.f 0
513
 
       mov GR_SAVE_GP= gp                         // Save gp
514
 
}
515
 
;;
516
 
 
517
 
{.mmi
518
 
       stfd [ GR_Parameter_Y ]= FR_Y, 16          // STORE Parameter 2 on stack
519
 
       add GR_Parameter_X= 16, sp                 // Parameter 1 address
520
 
.save b0, GR_SAVE_B0
521
 
       mov GR_SAVE_B0= b0                         // Save b0
522
 
}
523
 
;;
524
 
 
525
 
.body
526
 
{.mib
527
 
       stfd [ GR_Parameter_X ]= FR_X              // STORE Parameter 1 on stack
528
 
       add GR_Parameter_RESULT= 0, GR_Parameter_Y // Parameter 3 address
529
 
       nop.b 0
530
 
}
531
 
{.mib
532
 
       stfd [ GR_Parameter_Y ]= FR_RESULT         // STORE Parameter 3 on stack
533
 
       add GR_Parameter_Y= -16, GR_Parameter_Y
534
 
       br.call.sptk b0= __libm_error_support#    // Call error handling function
535
 
}
536
 
;;
537
 
 
538
 
{.mmi
539
 
       add GR_Parameter_RESULT= 48, sp
540
 
       nop.m 0
541
 
       nop.i 0
542
 
}
543
 
;;
544
 
 
545
 
{.mmi
546
 
       ldfd f8= [ GR_Parameter_RESULT ]          // Get return result off stack
547
 
.restore sp
548
 
       add sp= 64, sp                            // Restore stack pointer
549
 
       mov b0= GR_SAVE_B0                        // Restore return address
550
 
}
551
 
;;
552
 
 
553
 
{.mib
554
 
       mov gp= GR_SAVE_GP                        // Restore gp
555
 
       mov ar.pfs= GR_SAVE_PFS                   // Restore ar.pfs
556
 
       br.ret.sptk b0                            // Return
557
 
}
558
 
;;
559
 
 
560
 
 
561
 
LOCAL_LIBM_END(__libm_error_region)
562
 
 
563
 
.type __libm_error_support#, @function
564
 
.global __libm_error_support#