1 # Alpha 21064 __udiv_qrnnd 2 3 # Copyright (C) 1992-2022 Free Software Foundation, Inc. 4 5 # This file is part of the GNU MP Library. 6 7 # The GNU MP Library is free software; you can redistribute it and/or modify 8 # it under the terms of the GNU Lesser General Public License as published by 9 # the Free Software Foundation; either version 2.1 of the License, or (at your 10 # option) any later version. 11 12 # The GNU MP Library is distributed in the hope that it will be useful, but 13 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15 # License for more details. 16 17 # You should have received a copy of the GNU Lesser General Public License 18 # along with the GNU MP Library. If not, see <https://www.gnu.org/licenses/>. 19 20#include <sysdep.h> 21 22 .set noreorder 23 .set noat 24 25 .text 26 27LEAF(__udiv_qrnnd, 0) 28#ifdef PROF 29 ldgp gp, 0(pv) 30 lda AT, _mcount 31 jsr AT, (AT), _mcount 32 .prologue 1 33#else 34 .prologue 0 35#endif 36 37#define cnt $2 38#define tmp $3 39#define rem_ptr $16 40#define n1 $17 41#define n0 $18 42#define d $19 43#define qb $20 44 45 ldiq cnt,16 46 blt d,$largedivisor 47 48$loop1: cmplt n0,0,tmp 49 addq n1,n1,n1 50 bis n1,tmp,n1 51 addq n0,n0,n0 52 cmpule d,n1,qb 53 subq n1,d,tmp 54 cmovne qb,tmp,n1 55 bis n0,qb,n0 56 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 subq cnt,1,cnt 81 bgt cnt,$loop1 82 stq n1,0(rem_ptr) 83 bis $31,n0,$0 84 ret $31,($26),1 85 86$largedivisor: 87 and n0,1,$4 88 89 srl n0,1,n0 90 sll n1,63,tmp 91 or tmp,n0,n0 92 srl n1,1,n1 93 94 and d,1,$6 95 srl d,1,$5 96 addq $5,$6,$5 97 98$loop2: cmplt n0,0,tmp 99 addq n1,n1,n1 100 bis n1,tmp,n1 101 addq n0,n0,n0 102 cmpule $5,n1,qb 103 subq n1,$5,tmp 104 cmovne qb,tmp,n1 105 bis n0,qb,n0 106 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 subq cnt,1,cnt 131 bgt cnt,$loop2 132 133 addq n1,n1,n1 134 addq $4,n1,n1 135 bne $6,$Odd 136 stq n1,0(rem_ptr) 137 bis $31,n0,$0 138 ret $31,($26),1 139 140$Odd: 141 /* q' in n0. r' in n1 */ 142 addq n1,n0,n1 143 144 cmpult n1,n0,tmp # tmp := carry from addq 145 subq n1,d,AT 146 addq n0,tmp,n0 147 cmovne tmp,AT,n1 148 149 cmpult n1,d,tmp 150 addq n0,1,AT 151 cmoveq tmp,AT,n0 152 subq n1,d,AT 153 cmoveq tmp,AT,n1 154 155 stq n1,0(rem_ptr) 156 bis $31,n0,$0 157 ret $31,($26),1 158 159 .end __udiv_qrnnd 160