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 165EXPORT_SYMBOL(__udiv_qrnnd) 166