OSDN Git Service

Move libgcc1 to toplevel libgcc
[pf3gnuchains/gcc-fork.git] / gcc / config / alpha / qrnnd.asm
1  # Alpha 21064 __udiv_qrnnd
2  # Copyright (C) 1992, 1994, 1995, 2000, 2009 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 #ifdef __ELF__
26 .section .note.GNU-stack,""
27 #endif
28
29         .set noreorder
30         .set noat
31
32         .text
33
34         .globl __udiv_qrnnd
35         .ent __udiv_qrnnd
36 __udiv_qrnnd:
37         .frame $30,0,$26,0
38         .prologue 0
39
40 #define cnt     $2
41 #define tmp     $3
42 #define rem_ptr $16
43 #define n1      $17
44 #define n0      $18
45 #define d       $19
46 #define qb      $20
47 #define AT      $at
48
49         ldiq    cnt,16
50         blt     d,$largedivisor
51
52 $loop1: cmplt   n0,0,tmp
53         addq    n1,n1,n1
54         bis     n1,tmp,n1
55         addq    n0,n0,n0
56         cmpule  d,n1,qb
57         subq    n1,d,tmp
58         cmovne  qb,tmp,n1
59         bis     n0,qb,n0
60         cmplt   n0,0,tmp
61         addq    n1,n1,n1
62         bis     n1,tmp,n1
63         addq    n0,n0,n0
64         cmpule  d,n1,qb
65         subq    n1,d,tmp
66         cmovne  qb,tmp,n1
67         bis     n0,qb,n0
68         cmplt   n0,0,tmp
69         addq    n1,n1,n1
70         bis     n1,tmp,n1
71         addq    n0,n0,n0
72         cmpule  d,n1,qb
73         subq    n1,d,tmp
74         cmovne  qb,tmp,n1
75         bis     n0,qb,n0
76         cmplt   n0,0,tmp
77         addq    n1,n1,n1
78         bis     n1,tmp,n1
79         addq    n0,n0,n0
80         cmpule  d,n1,qb
81         subq    n1,d,tmp
82         cmovne  qb,tmp,n1
83         bis     n0,qb,n0
84         subq    cnt,1,cnt
85         bgt     cnt,$loop1
86         stq     n1,0(rem_ptr)
87         bis     $31,n0,$0
88         ret     $31,($26),1
89
90 $largedivisor:
91         and     n0,1,$4
92
93         srl     n0,1,n0
94         sll     n1,63,tmp
95         or      tmp,n0,n0
96         srl     n1,1,n1
97
98         and     d,1,$6
99         srl     d,1,$5
100         addq    $5,$6,$5
101
102 $loop2: cmplt   n0,0,tmp
103         addq    n1,n1,n1
104         bis     n1,tmp,n1
105         addq    n0,n0,n0
106         cmpule  $5,n1,qb
107         subq    n1,$5,tmp
108         cmovne  qb,tmp,n1
109         bis     n0,qb,n0
110         cmplt   n0,0,tmp
111         addq    n1,n1,n1
112         bis     n1,tmp,n1
113         addq    n0,n0,n0
114         cmpule  $5,n1,qb
115         subq    n1,$5,tmp
116         cmovne  qb,tmp,n1
117         bis     n0,qb,n0
118         cmplt   n0,0,tmp
119         addq    n1,n1,n1
120         bis     n1,tmp,n1
121         addq    n0,n0,n0
122         cmpule  $5,n1,qb
123         subq    n1,$5,tmp
124         cmovne  qb,tmp,n1
125         bis     n0,qb,n0
126         cmplt   n0,0,tmp
127         addq    n1,n1,n1
128         bis     n1,tmp,n1
129         addq    n0,n0,n0
130         cmpule  $5,n1,qb
131         subq    n1,$5,tmp
132         cmovne  qb,tmp,n1
133         bis     n0,qb,n0
134         subq    cnt,1,cnt
135         bgt     cnt,$loop2
136
137         addq    n1,n1,n1
138         addq    $4,n1,n1
139         bne     $6,$Odd
140         stq     n1,0(rem_ptr)
141         bis     $31,n0,$0
142         ret     $31,($26),1
143
144 $Odd:
145         /* q' in n0. r' in n1 */
146         addq    n1,n0,n1
147
148         cmpult  n1,n0,tmp       # tmp := carry from addq
149         subq    n1,d,AT
150         addq    n0,tmp,n0
151         cmovne  tmp,AT,n1
152
153         cmpult  n1,d,tmp
154         addq    n0,1,AT
155         cmoveq  tmp,AT,n0
156         subq    n1,d,AT
157         cmoveq  tmp,AT,n1
158
159         stq     n1,0(rem_ptr)
160         bis     $31,n0,$0
161         ret     $31,($26),1
162
163         .end    __udiv_qrnnd