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

« back to all changes in this revision

Viewing changes to sysdeps/ia64/fpu/s_floorf.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 "floorf.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
 
// 06/13/00 Improved speed
44
 
// 06/27/00 Eliminated incorrect invalid flag setting
45
 
// 02/07/01 Corrected sign of zero result in round to -inf mode
46
 
// 05/20/02 Cleaned up namespace and sf0 syntax
47
 
// 01/28/03 Improved performance
48
 
//==============================================================
49
 
 
50
 
// API
51
 
//==============================================================
52
 
// float floorf(float x)
53
 
//==============================================================
54
 
 
55
 
// general input registers:
56
 
// r14 - r18
57
 
 
58
 
rSignexp   = r14
59
 
rExp       = r15
60
 
rExpMask   = r16
61
 
rBigexp    = r17
62
 
rM1        = r18
63
 
 
64
 
// floating-point registers:
65
 
// f8 - f13
66
 
 
67
 
fXInt      = f9
68
 
fNormX     = f10
69
 
fTmp       = f11
70
 
fAdj       = f12
71
 
fPreResult = f13
72
 
 
73
 
// predicate registers used:
74
 
// p6 - p9
75
 
 
76
 
// Overview of operation
77
 
//==============================================================
78
 
// float floorf(float x)
79
 
// Return an integer value (represented as a float) that is the largest
80
 
// value not greater than x
81
 
// This is x rounded toward -infinity to an integral value.
82
 
// Inexact is set if x != floorf(x)
83
 
//==============================================================
84
 
 
85
 
// double_extended
86
 
// if the exponent is > 1003e => 3F(true) = 63(decimal)
87
 
// we have a significand of 64 bits 1.63-bits.
88
 
// If we multiply by 2^63, we no longer have a fractional part
89
 
// So input is an integer value already.
90
 
 
91
 
// double
92
 
// if the exponent is >= 10033 => 34(true) = 52(decimal)
93
 
// 34 + 3ff = 433
94
 
// we have a significand of 53 bits 1.52-bits. (implicit 1)
95
 
// If we multiply by 2^52, we no longer have a fractional part
96
 
// So input is an integer value already.
97
 
 
98
 
// single
99
 
// if the exponent is > 10016 => 17(true) = 23(decimal)
100
 
// we have a significand of 24 bits 1.23-bits. (implicit 1)
101
 
// If we multiply by 2^23, we no longer have a fractional part
102
 
// So input is an integer value already.
103
 
 
104
 
 
105
 
.section .text
106
 
GLOBAL_IEEE754_ENTRY(floorf)
107
 
 
108
 
{ .mfi
109
 
      getf.exp         rSignexp  = f8        // Get signexp, recompute if unorm
110
 
      fclass.m         p7,p0 = f8, 0x0b      // Test x unorm
111
 
      addl             rBigexp = 0x10016, r0 // Set exponent at which is integer
112
 
}
113
 
{ .mfi
114
 
      mov              rM1 = -1              // Set all ones
115
 
      fcvt.fx.trunc.s1 fXInt  = f8           // Convert to int in significand
116
 
      mov              rExpMask    = 0x1FFFF // Form exponent mask
117
 
}
118
 
;;
119
 
 
120
 
{ .mfi
121
 
      nop.m            0
122
 
      fcmp.lt.s1       p8,p9 = f8, f0        // Test x < 0
123
 
      nop.i            0
124
 
}
125
 
{ .mfb
126
 
      setf.sig         fTmp = rM1            // Make const for setting inexact
127
 
      fnorm.s1         fNormX  = f8          // Normalize input
128
 
(p7)  br.cond.spnt     FLOOR_UNORM           // Branch if x unorm
129
 
}
130
 
;;
131
 
 
132
 
FLOOR_COMMON:
133
 
// Return here from FLOOR_UNORM
134
 
{ .mfi
135
 
      nop.m            0
136
 
      fclass.m         p6,p0 = f8, 0x1e7     // Test x natval, nan, inf, 0
137
 
      nop.i            0
138
 
}
139
 
;;
140
 
 
141
 
.pred.rel "mutex",p8,p9
142
 
{ .mfi
143
 
      nop.m            0
144
 
(p8)  fnma.s1          fAdj = f1, f1, f0     // If x < 0, adjustment is -1
145
 
      nop.i            0
146
 
}
147
 
{ .mfi
148
 
      nop.m            0
149
 
(p9)  fma.s1           fAdj = f0, f0, f0     // If x > 0, adjustment is 0
150
 
      nop.i            0
151
 
}
152
 
;;
153
 
 
154
 
{ .mfi
155
 
      nop.m            0
156
 
      fcvt.xf          fPreResult = fXInt    // trunc(x)
157
 
      nop.i            0
158
 
}
159
 
{ .mfb
160
 
      nop.m            0
161
 
(p6)  fma.s.s0         f8 = f8, f1, f0       // Result if x natval, nan, inf, 0
162
 
(p6)  br.ret.spnt      b0                    // Exit if x natval, nan, inf, 0
163
 
}
164
 
;;
165
 
 
166
 
{ .mmi
167
 
      and              rExp = rSignexp, rExpMask // Get biased exponent
168
 
;;
169
 
      cmp.ge           p7,p6 = rExp, rBigexp  // Is |x| >= 2^23?
170
 
      nop.i            0
171
 
}
172
 
;;
173
 
 
174
 
{ .mfi
175
 
      nop.m            0
176
 
(p6)  fma.s.s0         f8 = fPreResult, f1, fAdj // Result if !int, |x| < 2^23
177
 
      nop.i            0
178
 
}
179
 
{ .mfi
180
 
      nop.m            0
181
 
(p7)  fma.s.s0         f8 = fNormX, f1, f0    // Result, if |x| >= 2^23
182
 
      nop.i            0
183
 
}
184
 
;;
185
 
 
186
 
{ .mfi
187
 
      nop.m            0
188
 
(p6)  fcmp.eq.unc.s1   p8, p9 = fPreResult, fNormX // Is trunc(x) = x ?
189
 
      nop.i            0
190
 
}
191
 
;;
192
 
 
193
 
{ .mfi
194
 
      nop.m            0
195
 
(p9)  fmpy.s0          fTmp = fTmp, fTmp      // Dummy to set inexact
196
 
      nop.i            0
197
 
}
198
 
{ .mfb
199
 
      nop.m            0
200
 
(p8)  fma.s.s0         f8 = fNormX, f1, f0    // If x int, result normalized x
201
 
      br.ret.sptk      b0                     // Exit main path, 0 < |x| < 2^23
202
 
}
203
 
;;
204
 
 
205
 
 
206
 
FLOOR_UNORM:
207
 
// Here if x unorm
208
 
{ .mfb
209
 
      getf.exp         rSignexp  = fNormX     // Get signexp, recompute if unorm
210
 
      fcmp.eq.s0       p7,p0 = f8, f0         // Dummy op to set denormal flag
211
 
      br.cond.sptk     FLOOR_COMMON           // Return to main path
212
 
}
213
 
;;
214
 
 
215
 
GLOBAL_IEEE754_END(floorf)