GNU Linux-libre 5.19-rc6-gnu
[releases.git] / arch / alpha / lib / udiv-qrnnd.S
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 <asm/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
165 EXPORT_SYMBOL(__udiv_qrnnd)