or1k: Add prctl wrapper to unwrap variadic args
[glibc.git] / sysdeps / alpha / udiv_qrnnd.S
blobc9ea1b1cacee254fbda62f98b90ccfadbba3a7ce
1  # Alpha 21064 __udiv_qrnnd
3  # Copyright (C) 1992-2024 Free Software Foundation, Inc.
5  # This file is part of the GNU MP Library.
7  # The GNU MP Library is free software; you can redistribute it and/or modify
8  # it under the terms of the GNU Lesser General Public License as published by
9  # the Free Software Foundation; either version 2.1 of the License, or (at your
10  # option) any later version.
12  # The GNU MP Library is distributed in the hope that it will be useful, but
13  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15  # License for more details.
17  # You should have received a copy of the GNU Lesser General Public License
18  # along with the GNU MP Library.  If not, see <https://www.gnu.org/licenses/>.
20 #include <sysdep.h>
22         .set noreorder
23         .set noat
25         .text
27 LEAF(__udiv_qrnnd, 0)
28 #ifdef PROF
29         ldgp    gp, 0(pv)
30         lda     AT, _mcount
31         jsr     AT, (AT), _mcount
32         .prologue 1
33 #else
34         .prologue 0
35 #endif
37 #define cnt     $2
38 #define tmp     $3
39 #define rem_ptr $16
40 #define n1      $17
41 #define n0      $18
42 #define d       $19
43 #define qb      $20
45         ldiq    cnt,16
46         blt     d,$largedivisor
48 $loop1: cmplt   n0,0,tmp
49         addq    n1,n1,n1
50         bis     n1,tmp,n1
51         addq    n0,n0,n0
52         cmpule  d,n1,qb
53         subq    n1,d,tmp
54         cmovne  qb,tmp,n1
55         bis     n0,qb,n0
56         cmplt   n0,0,tmp
57         addq    n1,n1,n1
58         bis     n1,tmp,n1
59         addq    n0,n0,n0
60         cmpule  d,n1,qb
61         subq    n1,d,tmp
62         cmovne  qb,tmp,n1
63         bis     n0,qb,n0
64         cmplt   n0,0,tmp
65         addq    n1,n1,n1
66         bis     n1,tmp,n1
67         addq    n0,n0,n0
68         cmpule  d,n1,qb
69         subq    n1,d,tmp
70         cmovne  qb,tmp,n1
71         bis     n0,qb,n0
72         cmplt   n0,0,tmp
73         addq    n1,n1,n1
74         bis     n1,tmp,n1
75         addq    n0,n0,n0
76         cmpule  d,n1,qb
77         subq    n1,d,tmp
78         cmovne  qb,tmp,n1
79         bis     n0,qb,n0
80         subq    cnt,1,cnt
81         bgt     cnt,$loop1
82         stq     n1,0(rem_ptr)
83         bis     $31,n0,$0
84         ret     $31,($26),1
86 $largedivisor:
87         and     n0,1,$4
89         srl     n0,1,n0
90         sll     n1,63,tmp
91         or      tmp,n0,n0
92         srl     n1,1,n1
94         and     d,1,$6
95         srl     d,1,$5
96         addq    $5,$6,$5
98 $loop2: cmplt   n0,0,tmp
99         addq    n1,n1,n1
100         bis     n1,tmp,n1
101         addq    n0,n0,n0
102         cmpule  $5,n1,qb
103         subq    n1,$5,tmp
104         cmovne  qb,tmp,n1
105         bis     n0,qb,n0
106         cmplt   n0,0,tmp
107         addq    n1,n1,n1
108         bis     n1,tmp,n1
109         addq    n0,n0,n0
110         cmpule  $5,n1,qb
111         subq    n1,$5,tmp
112         cmovne  qb,tmp,n1
113         bis     n0,qb,n0
114         cmplt   n0,0,tmp
115         addq    n1,n1,n1
116         bis     n1,tmp,n1
117         addq    n0,n0,n0
118         cmpule  $5,n1,qb
119         subq    n1,$5,tmp
120         cmovne  qb,tmp,n1
121         bis     n0,qb,n0
122         cmplt   n0,0,tmp
123         addq    n1,n1,n1
124         bis     n1,tmp,n1
125         addq    n0,n0,n0
126         cmpule  $5,n1,qb
127         subq    n1,$5,tmp
128         cmovne  qb,tmp,n1
129         bis     n0,qb,n0
130         subq    cnt,1,cnt
131         bgt     cnt,$loop2
133         addq    n1,n1,n1
134         addq    $4,n1,n1
135         bne     $6,$Odd
136         stq     n1,0(rem_ptr)
137         bis     $31,n0,$0
138         ret     $31,($26),1
140 $Odd:
141         /* q' in n0. r' in n1 */
142         addq    n1,n0,n1
144         cmpult  n1,n0,tmp       # tmp := carry from addq
145         subq    n1,d,AT
146         addq    n0,tmp,n0
147         cmovne  tmp,AT,n1
149         cmpult  n1,d,tmp
150         addq    n0,1,AT
151         cmoveq  tmp,AT,n0
152         subq    n1,d,AT
153         cmoveq  tmp,AT,n1
155         stq     n1,0(rem_ptr)
156         bis     $31,n0,$0
157         ret     $31,($26),1
159         .end    __udiv_qrnnd