Update FSF address.
[official-gcc.git] / gcc / config / alpha / qrnnd.asm
blob96f31b25cfd608b525d6c87e53bdbeef9ced8169
1 # Alpha 21064 __udiv_qrnnd
2 # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
4 # This file is part of GCC.
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.
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.)
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.
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., 51 Franklin Street, Fifth Floor, Boston,
27 # MA 02110-1301, USA.
29 #ifdef __ELF__
30 .section .note.GNU-stack,""
31 #endif
33 .set noreorder
34 .set noat
36 .text
38 .globl __udiv_qrnnd
39 .ent __udiv_qrnnd
40 __udiv_qrnnd:
41 .frame $30,0,$26,0
42 .prologue 0
44 #define cnt $2
45 #define tmp $3
46 #define rem_ptr $16
47 #define n1 $17
48 #define n0 $18
49 #define d $19
50 #define qb $20
51 #define AT $at
53 ldiq cnt,16
54 blt d,$largedivisor
56 $loop1: 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 cmplt n0,0,tmp
81 addq n1,n1,n1
82 bis n1,tmp,n1
83 addq n0,n0,n0
84 cmpule d,n1,qb
85 subq n1,d,tmp
86 cmovne qb,tmp,n1
87 bis n0,qb,n0
88 subq cnt,1,cnt
89 bgt cnt,$loop1
90 stq n1,0(rem_ptr)
91 bis $31,n0,$0
92 ret $31,($26),1
94 $largedivisor:
95 and n0,1,$4
97 srl n0,1,n0
98 sll n1,63,tmp
99 or tmp,n0,n0
100 srl n1,1,n1
102 and d,1,$6
103 srl d,1,$5
104 addq $5,$6,$5
106 $loop2: 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 cmplt n0,0,tmp
131 addq n1,n1,n1
132 bis n1,tmp,n1
133 addq n0,n0,n0
134 cmpule $5,n1,qb
135 subq n1,$5,tmp
136 cmovne qb,tmp,n1
137 bis n0,qb,n0
138 subq cnt,1,cnt
139 bgt cnt,$loop2
141 addq n1,n1,n1
142 addq $4,n1,n1
143 bne $6,$Odd
144 stq n1,0(rem_ptr)
145 bis $31,n0,$0
146 ret $31,($26),1
148 $Odd:
149 /* q' in n0. r' in n1 */
150 addq n1,n0,n1
152 cmpult n1,n0,tmp # tmp := carry from addq
153 subq n1,d,AT
154 addq n0,tmp,n0
155 cmovne tmp,AT,n1
157 cmpult n1,d,tmp
158 addq n0,1,AT
159 cmoveq tmp,AT,n0
160 subq n1,d,AT
161 cmoveq tmp,AT,n1
163 stq n1,0(rem_ptr)
164 bis $31,n0,$0
165 ret $31,($26),1
167 .end __udiv_qrnnd