__moddi3.S revision 108533
1/* $FreeBSD: head/lib/libc/ia64/gen/__moddi3.S 108533 2003-01-01 18:49:04Z schweikh $ */
2.file "__moddi3.s"
3
4//
5// Copyright (c) 2000, Intel Corporation
6// All rights reserved.
7//
8// Contributed 2/15/2000 by Marius Cornea, John Harrison, Cristina Iordache,
9// Ted Kubaska, Bob Norin, and Shane Story of the Computational Software Lab,
10// Intel Corporation.
11//
12// WARRANTY DISCLAIMER
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
23// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Intel Corporation is the author of this code, and requests that all
27// problem reports or change requests be submitted to it directly at
28// http://developer.intel.com/opensource.
29//
30
31.section .text
32
33// 64-bit signed integer remainder
34
35.proc __moddi3#
36.align 32
37.global __moddi3#
38.align 32
39
40__moddi3:
41
42{ .mii
43  alloc r31=ar.pfs,3,0,0,0
44  nop.i 0
45  nop.i 0
46} { .mmb
47
48  // 64-BIT SIGNED INTEGER REMAINDER BEGINS HERE
49
50  // general register used:
51  //    r32 - 64-bit signed integer dividend
52  //    r33 - 64-bit signed integer divisor
53  //    r8 - 64-bit signed integer result
54  //    r2 - scratch register
55  // floating-point registers used: f6, f7, f8, f9, f10, f11, f12
56  // predicate registers used: p6
57
58  setf.sig f12=r32  // holds an in integer form
59  setf.sig f7=r33
60  nop.b 0
61} { .mlx
62  nop.m 0
63  //movl r2=0x8000000000000000;;
64  movl r2=0xffffffffffffffff;;
65} { .mfi
66  // get the 2's complement of b
67  sub r33=r0,r33
68  fcvt.xf f6=f12
69  nop.i 0
70} { .mfi
71  nop.m 0
72  fcvt.xf f7=f7
73  nop.i 0;;
74} { .mfi
75  nop.m 0
76  // Step (1)
77  // y0 = 1 / b in f8
78  frcpa.s1 f8,p6=f6,f7
79  nop.i 0;;
80} { .mfi
81  nop.m 0
82  // Step (2)
83  // q0 = a * y0 in f10
84  (p6) fma.s1 f10=f6,f8,f0
85  nop.i 0
86} { .mfi
87  nop.m 0
88  // Step (3)
89  // e0 = 1 - b * y0 in f9
90  (p6) fnma.s1 f9=f7,f8,f1
91  nop.i 0;;
92} { .mfi
93  nop.m 0
94  // Step (4)
95  // q1 = q0 + e0 * q0 in f10
96  (p6) fma.s1 f10=f9,f10,f10
97  nop.i 0
98} { .mfi
99  nop.m 0
100  // Step (5)
101  // e1 = e0 * e0 in f11
102  (p6) fma.s1 f11=f9,f9,f0
103  nop.i 0;;
104} { .mfi
105  nop.m 0
106  // Step (6)
107  // y1 = y0 + e0 * y0 in f8
108  (p6) fma.s1 f8=f9,f8,f8
109  nop.i 0;;
110} { .mfi
111  nop.m 0
112  // Step (7)
113  // q2 = q1 + e1 * q1 in f9
114  (p6) fma.s1 f9=f11,f10,f10
115  nop.i 0;;
116} { .mfi
117  nop.m 0
118  // Step (8)
119  // y2 = y1 + e1 * y1 in f8
120  (p6) fma.s1 f8=f11,f8,f8
121  nop.i 0;;
122} { .mfi
123  nop.m 0
124  // Step (9)
125  // r2 = a - b * q2 in f10
126  (p6) fnma.s1 f10=f7,f9,f6
127  nop.i 0;;
128} { .mfi
129  setf.sig f7=r33
130  // Step (10)
131  // q3 = q2 + r2 * y2 in f8
132  (p6) fma.s1 f8=f10,f8,f9
133  nop.i 0;;
134} { .mfi
135  nop.m 0
136  // (11) q = trunc(q3)
137  fcvt.fx.trunc.s1 f8=f8
138  nop.i 0;;
139} { .mfi
140  nop.m 0
141  // (12) r = a + (-b) * q
142  xma.l f8=f8,f7,f12
143  nop.i 0;;
144}  { .mib
145  getf.sig r8=f8
146  nop.i 0
147  nop.b 0
148}
149
150  // 64-BIT SIGNED INTEGER REMAINDER ENDS HERE
151
152{ .mib
153  nop.m 0
154  nop.i 0
155  br.ret.sptk b0;;
156}
157
158.endp __moddi3
159