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., 51 Franklin Street, Fifth Floor, Boston, 27 # MA 02110-1301, USA. 28 29#ifdef __ELF__ 30.section .note.GNU-stack,"" 31#endif 32 33 .set noreorder 34 .set noat 35 36 .text 37 38 .globl __udiv_qrnnd 39 .ent __udiv_qrnnd 40__udiv_qrnnd: 41 .frame $30,0,$26,0 42 .prologue 0 43 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 52 53 ldiq cnt,16 54 blt d,$largedivisor 55 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 93 94$largedivisor: 95 and n0,1,$4 96 97 srl n0,1,n0 98 sll n1,63,tmp 99 or tmp,n0,n0 100 srl n1,1,n1 101 102 and d,1,$6 103 srl d,1,$5 104 addq $5,$6,$5 105 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 140 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 147 148$Odd: 149 /* q' in n0. r' in n1 */ 150 addq n1,n0,n1 151 152 cmpult n1,n0,tmp # tmp := carry from addq 153 subq n1,d,AT 154 addq n0,tmp,n0 155 cmovne tmp,AT,n1 156 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 162 163 stq n1,0(rem_ptr) 164 bis $31,n0,$0 165 ret $31,($26),1 166 167 .end __udiv_qrnnd 168