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

« back to all changes in this revision

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