1 # Alpha 21064 __udiv_qrnnd
2 # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
3
4 # This file is part of GCC.
5
6 # The GNU MP Library is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or (at your
9 # option) any later version.
10
11 # In addition to the permissions in the GNU General Public License, the
12 # Free Software Foundation gives you unlimited permission to link the
13 # compiled version of this file with other programs, and to distribute
14 # those programs without any restriction coming from the use of this
15 # file. (The General Public License restrictions do apply in other
16 # respects; for example, they cover modification of the file, and
17 # distribution when not linked into another program.)
18
19 # This file is distributed in the hope that it will be useful, but
20 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
22 # License for more details.
23
24 # You should have received a copy of the GNU General Public License
25 # along with GCC; see the file COPYING. If not, write to the
26 # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27 # MA 02111-1307, USA.
28#include <linux/export.h>
29
30 .set noreorder
31 .set noat
32
33 .text
34
35 .globl __udiv_qrnnd
36 .ent __udiv_qrnnd
37__udiv_qrnnd:
38 .frame $30,0,$26,0
39 .prologue 0
40
41#define cnt $2
42#define tmp $3
43#define rem_ptr $16
44#define n1 $17
45#define n0 $18
46#define d $19
47#define qb $20
48#define AT $at
49
50 ldiq cnt,16
51 blt d,$largedivisor
52
53$loop1: cmplt n0,0,tmp
54 addq n1,n1,n1
55 bis n1,tmp,n1
56 addq n0,n0,n0
57 cmpule d,n1,qb
58 subq n1,d,tmp
59 cmovne qb,tmp,n1
60 bis n0,qb,n0
61 cmplt n0,0,tmp
62 addq n1,n1,n1
63 bis n1,tmp,n1
64 addq n0,n0,n0
65 cmpule d,n1,qb
66 subq n1,d,tmp
67 cmovne qb,tmp,n1
68 bis n0,qb,n0
69 cmplt n0,0,tmp
70 addq n1,n1,n1
71 bis n1,tmp,n1
72 addq n0,n0,n0
73 cmpule d,n1,qb
74 subq n1,d,tmp
75 cmovne qb,tmp,n1
76 bis n0,qb,n0
77 cmplt n0,0,tmp
78 addq n1,n1,n1
79 bis n1,tmp,n1
80 addq n0,n0,n0
81 cmpule d,n1,qb
82 subq n1,d,tmp
83 cmovne qb,tmp,n1
84 bis n0,qb,n0
85 subq cnt,1,cnt
86 bgt cnt,$loop1
87 stq n1,0(rem_ptr)
88 bis $31,n0,$0
89 ret $31,($26),1
90
91$largedivisor:
92 and n0,1,$4
93
94 srl n0,1,n0
95 sll n1,63,tmp
96 or tmp,n0,n0
97 srl n1,1,n1
98
99 and d,1,$6
100 srl d,1,$5
101 addq $5,$6,$5
102
103$loop2: cmplt n0,0,tmp
104 addq n1,n1,n1
105 bis n1,tmp,n1
106 addq n0,n0,n0
107 cmpule $5,n1,qb
108 subq n1,$5,tmp
109 cmovne qb,tmp,n1
110 bis n0,qb,n0
111 cmplt n0,0,tmp
112 addq n1,n1,n1
113 bis n1,tmp,n1
114 addq n0,n0,n0
115 cmpule $5,n1,qb
116 subq n1,$5,tmp
117 cmovne qb,tmp,n1
118 bis n0,qb,n0
119 cmplt n0,0,tmp
120 addq n1,n1,n1
121 bis n1,tmp,n1
122 addq n0,n0,n0
123 cmpule $5,n1,qb
124 subq n1,$5,tmp
125 cmovne qb,tmp,n1
126 bis n0,qb,n0
127 cmplt n0,0,tmp
128 addq n1,n1,n1
129 bis n1,tmp,n1
130 addq n0,n0,n0
131 cmpule $5,n1,qb
132 subq n1,$5,tmp
133 cmovne qb,tmp,n1
134 bis n0,qb,n0
135 subq cnt,1,cnt
136 bgt cnt,$loop2
137
138 addq n1,n1,n1
139 addq $4,n1,n1
140 bne $6,$Odd
141 stq n1,0(rem_ptr)
142 bis $31,n0,$0
143 ret $31,($26),1
144
145$Odd:
146 /* q' in n0. r' in n1 */
147 addq n1,n0,n1
148
149 cmpult n1,n0,tmp # tmp := carry from addq
150 subq n1,d,AT
151 addq n0,tmp,n0
152 cmovne tmp,AT,n1
153
154 cmpult n1,d,tmp
155 addq n0,1,AT
156 cmoveq tmp,AT,n0
157 subq n1,d,AT
158 cmoveq tmp,AT,n1
159
160 stq n1,0(rem_ptr)
161 bis $31,n0,$0
162 ret $31,($26),1
163
164 .end __udiv_qrnnd
165EXPORT_SYMBOL(__udiv_qrnnd)
166

source code of linux/arch/alpha/lib/udiv-qrnnd.S