xref: /netbsd-src/external/gpl3/gcc/dist/libgcc/config/alpha/qrnnd.S (revision e9e6e0f6fbc36b8de7586170291cf5fc97cab8b6)
1 # Alpha 21064 __udiv_qrnnd
2 # Copyright (C) 1992-2022 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 3 of the License, or (at your
9 # option) any later version.
10
11 # This file is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
14 # License for more details.
15
16 # Under Section 7 of GPL version 3, you are granted additional
17 # permissions described in the GCC Runtime Library Exception, version
18 # 3.1, as published by the Free Software Foundation.
19
20 # You should have received a copy of the GNU General Public License and
21 # a copy of the GCC Runtime Library Exception along with this program;
22 # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 # <http://www.gnu.org/licenses/>.
24
25#if defined(__ELF__) && defined(__linux__)
26.section .note.GNU-stack,""
27.previous
28#endif
29
30        .set noreorder
31        .set noat
32
33	.text
34
35	.globl __udiv_qrnnd
36	.ent __udiv_qrnnd
37#ifdef __VMS__
38__udiv_qrnnd..en:
39	.frame $29,0,$26,0
40	.prologue
41#else
42__udiv_qrnnd:
43	.frame $30,0,$26,0
44	.prologue 0
45#endif
46
47#define cnt	$2
48#define tmp	$3
49#define rem_ptr	$16
50#define n1	$17
51#define n0	$18
52#define d	$19
53#define qb	$20
54#define AT	$at
55
56	ldiq	cnt,16
57	blt	d,$largedivisor
58
59$loop1:	cmplt	n0,0,tmp
60	addq	n1,n1,n1
61	bis	n1,tmp,n1
62	addq	n0,n0,n0
63	cmpule	d,n1,qb
64	subq	n1,d,tmp
65	cmovne	qb,tmp,n1
66	bis	n0,qb,n0
67	cmplt	n0,0,tmp
68	addq	n1,n1,n1
69	bis	n1,tmp,n1
70	addq	n0,n0,n0
71	cmpule	d,n1,qb
72	subq	n1,d,tmp
73	cmovne	qb,tmp,n1
74	bis	n0,qb,n0
75	cmplt	n0,0,tmp
76	addq	n1,n1,n1
77	bis	n1,tmp,n1
78	addq	n0,n0,n0
79	cmpule	d,n1,qb
80	subq	n1,d,tmp
81	cmovne	qb,tmp,n1
82	bis	n0,qb,n0
83	cmplt	n0,0,tmp
84	addq	n1,n1,n1
85	bis	n1,tmp,n1
86	addq	n0,n0,n0
87	cmpule	d,n1,qb
88	subq	n1,d,tmp
89	cmovne	qb,tmp,n1
90	bis	n0,qb,n0
91	subq	cnt,1,cnt
92	bgt	cnt,$loop1
93	stq	n1,0(rem_ptr)
94	bis	$31,n0,$0
95	ret	$31,($26),1
96
97$largedivisor:
98	and	n0,1,$4
99
100	srl	n0,1,n0
101	sll	n1,63,tmp
102	or	tmp,n0,n0
103	srl	n1,1,n1
104
105	and	d,1,$6
106	srl	d,1,$5
107	addq	$5,$6,$5
108
109$loop2:	cmplt	n0,0,tmp
110	addq	n1,n1,n1
111	bis	n1,tmp,n1
112	addq	n0,n0,n0
113	cmpule	$5,n1,qb
114	subq	n1,$5,tmp
115	cmovne	qb,tmp,n1
116	bis	n0,qb,n0
117	cmplt	n0,0,tmp
118	addq	n1,n1,n1
119	bis	n1,tmp,n1
120	addq	n0,n0,n0
121	cmpule	$5,n1,qb
122	subq	n1,$5,tmp
123	cmovne	qb,tmp,n1
124	bis	n0,qb,n0
125	cmplt	n0,0,tmp
126	addq	n1,n1,n1
127	bis	n1,tmp,n1
128	addq	n0,n0,n0
129	cmpule	$5,n1,qb
130	subq	n1,$5,tmp
131	cmovne	qb,tmp,n1
132	bis	n0,qb,n0
133	cmplt	n0,0,tmp
134	addq	n1,n1,n1
135	bis	n1,tmp,n1
136	addq	n0,n0,n0
137	cmpule	$5,n1,qb
138	subq	n1,$5,tmp
139	cmovne	qb,tmp,n1
140	bis	n0,qb,n0
141	subq	cnt,1,cnt
142	bgt	cnt,$loop2
143
144	addq	n1,n1,n1
145	addq	$4,n1,n1
146	bne	$6,$Odd
147	stq	n1,0(rem_ptr)
148	bis	$31,n0,$0
149	ret	$31,($26),1
150
151$Odd:
152	/* q' in n0. r' in n1 */
153	addq	n1,n0,n1
154
155	cmpult	n1,n0,tmp	# tmp := carry from addq
156	subq	n1,d,AT
157	addq	n0,tmp,n0
158	cmovne	tmp,AT,n1
159
160	cmpult	n1,d,tmp
161	addq	n0,1,AT
162	cmoveq	tmp,AT,n0
163	subq	n1,d,AT
164	cmoveq	tmp,AT,n1
165
166	stq	n1,0(rem_ptr)
167	bis	$31,n0,$0
168	ret	$31,($26),1
169
170#ifdef __VMS__
171	.link
172	.align 3
173__udiv_qrnnd:
174	.pdesc	__udiv_qrnnd..en,null
175#endif
176	.end	__udiv_qrnnd
177