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

« back to all changes in this revision

Viewing changes to ports/sysdeps/ia64/fpu/s_nearbyintl.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 "nearbyintl.s"
 
2
 
 
3
 
 
4
// Copyright (c) 2000 - 2003, 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
// 10/19/00 Created
 
43
// 02/08/01 Corrected behavior for all rounding modes.
 
44
// 05/20/02 Cleaned up namespace and sf0 syntax
 
45
// 02/10/03 Reordered header: .section, .global, .proc, .align
 
46
// 07/25/03 Improved performance
 
47
//==============================================================
 
48
 
 
49
// API
 
50
//==============================================================
 
51
// long double nearbyintl(long double x)
 
52
//==============================================================
 
53
 
 
54
// general input registers:
 
55
// r14 - r21
 
56
 
 
57
rSignexp   = r14
 
58
rExp       = r15
 
59
rExpMask   = r16
 
60
rBigexp    = r17
 
61
rFpsr      = r19
 
62
rRcs0      = r20
 
63
rRcs0Mask  = r21
 
64
 
 
65
// floating-point registers:
 
66
// f8 - f10
 
67
 
 
68
fXInt      = f9
 
69
fNormX     = f10
 
70
 
 
71
// predicate registers used:
 
72
// p6 - p10
 
73
 
 
74
// Overview of operation
 
75
//==============================================================
 
76
// long double nearbyintl(long double x)
 
77
// Return an integer value (represented as a long double) that is x
 
78
// rounded to integer in current rounding mode
 
79
// Inexact is not set, otherwise result identical with rint.
 
80
//==============================================================
 
81
 
 
82
// double_extended
 
83
// if the exponent is > 1003e => 3F(true) = 63(decimal)
 
84
// we have a significand of 64 bits 1.63-bits.
 
85
// If we multiply by 2^63, we no longer have a fractional part
 
86
// So input is an integer value already.
 
87
 
 
88
// double
 
89
// if the exponent is >= 10033 => 34(true) = 52(decimal)
 
90
// 34 + 3ff = 433
 
91
// we have a significand of 53 bits 1.52-bits. (implicit 1)
 
92
// If we multiply by 2^52, we no longer have a fractional part
 
93
// So input is an integer value already.
 
94
 
 
95
// single
 
96
// if the exponent is > 10016 => 17(true) = 23(decimal)
 
97
// we have a significand of 24 bits 1.23-bits. (implicit 1)
 
98
// If we multiply by 2^23, we no longer have a fractional part
 
99
// So input is an integer value already.
 
100
 
 
101
.section .text
 
102
GLOBAL_LIBM_ENTRY(nearbyintl)
 
103
 
 
104
{ .mfi
 
105
      getf.exp         rSignexp  = f8        // Get signexp, recompute if unorm
 
106
      fclass.m         p7,p0 = f8, 0x0b      // Test x unorm
 
107
      addl             rBigexp = 0x1003e, r0 // Set exponent at which is integer
 
108
}
 
109
{ .mfi
 
110
      nop.m            0
 
111
      fcvt.fx.s1       fXInt  = f8           // Convert to int in significand
 
112
      mov              rExpMask    = 0x1FFFF // Form exponent mask
 
113
}
 
114
;;
 
115
 
 
116
{ .mfi
 
117
      mov              rFpsr = ar40          // Read fpsr -- check rc.s0
 
118
      fclass.m         p6,p0 = f8, 0x1e3     // Test x natval, nan, inf
 
119
      nop.i            0
 
120
}
 
121
{ .mfb
 
122
      nop.m            0
 
123
      fnorm.s1         fNormX  = f8          // Normalize input
 
124
(p7)  br.cond.spnt     RINT_UNORM            // Branch if x unorm
 
125
}
 
126
;;
 
127
 
 
128
 
 
129
RINT_COMMON:
 
130
// Return here from RINT_UNORM
 
131
{ .mfb
 
132
      and              rExp = rSignexp, rExpMask // Get biased exponent
 
133
(p6)  fma.s0           f8 = f8, f1, f0       // Result if x natval, nan, inf
 
134
(p6)  br.ret.spnt      b0                    // Exit if x natval, nan, inf
 
135
}
 
136
;;
 
137
 
 
138
{ .mfi
 
139
      mov              rRcs0Mask = 0x0c00     // Mask for rc.s0
 
140
      fcvt.xf          f8 = fXInt             // Result assume |x| < 2^63
 
141
      cmp.ge           p7,p8 = rExp, rBigexp  // Is |x| >= 2^63?
 
142
}
 
143
;;
 
144
 
 
145
// We must correct result if |x| >= 2^63
 
146
{ .mfi
 
147
      nop.m            0
 
148
(p7)  fma.s0           f8 = fNormX, f1, f0    // If |x| >= 2^63, result x
 
149
      nop.i            0
 
150
}
 
151
;;
 
152
 
 
153
{ .mfi
 
154
      nop.m            0
 
155
(p8)  fmerge.s         f8 = fNormX, f8        // Make sign nearbyintl(x)= sign x
 
156
      nop.i            0
 
157
}
 
158
;;
 
159
 
 
160
{ .mfi
 
161
(p8)  and              rRcs0 = rFpsr, rRcs0Mask // Get rounding mode for sf0
 
162
      nop.f            0
 
163
      nop.i            0
 
164
}
 
165
;;
 
166
 
 
167
// If |x| < 2^63 we must test for other rounding modes
 
168
{ .mbb
 
169
(p8)  cmp.ne.unc       p10,p0 = rRcs0, r0     // Test for other rounding modes
 
170
(p10) br.cond.spnt     RINT_NOT_ROUND_NEAREST // Branch if not round nearest
 
171
      br.ret.sptk      b0                     // Exit main path if round nearest
 
172
}
 
173
;;
 
174
 
 
175
 
 
176
RINT_UNORM:
 
177
// Here if x unorm
 
178
{ .mfb
 
179
      getf.exp         rSignexp  = fNormX     // Get signexp, recompute if unorm
 
180
      fcmp.eq.s0       p7,p0 = f8, f0         // Dummy op to set denormal flag
 
181
      br.cond.sptk     RINT_COMMON            // Return to main path
 
182
}
 
183
;;
 
184
 
 
185
RINT_NOT_ROUND_NEAREST:
 
186
// Here if not round to nearest, and |x| < 2^63
 
187
// Set rounding mode of s2 to that of s0, and repeat the conversion using s2
 
188
{ .mfi
 
189
      nop.m            0
 
190
      fsetc.s2         0x7f, 0x40
 
191
      nop.i            0
 
192
}
 
193
;;
 
194
 
 
195
{ .mfi
 
196
      nop.m            0
 
197
      fcvt.fx.s2       fXInt  = fNormX        // Convert to int in significand
 
198
      nop.i            0
 
199
}
 
200
;;
 
201
 
 
202
{ .mfi
 
203
      nop.m            0
 
204
      fcvt.xf          f8 = fXInt             // Expected result
 
205
      nop.i            0
 
206
}
 
207
;;
 
208
 
 
209
// Be sure sign of result = sign of input.  Fixes cases where result is 0.
 
210
{ .mfb
 
211
      nop.m            0
 
212
      fmerge.s         f8 = fNormX, f8
 
213
      br.ret.sptk      b0                     // Exit main path
 
214
}
 
215
;;
 
216
 
 
217
GLOBAL_LIBM_END(nearbyintl)