divdi3.S (5084B)
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. 3 4This file is part of GNU CC. 5 6 */ 7 8#include <asm/export.h> 9 .text 10 .align 4 11 .globl __divdi3 12__divdi3: 13 save %sp,-104,%sp 14 cmp %i0,0 15 bge .LL40 16 mov 0,%l4 17 mov -1,%l4 18 sub %g0,%i1,%o0 19 mov %o0,%o5 20 subcc %g0,%o0,%g0 21 sub %g0,%i0,%o0 22 subx %o0,0,%o4 23 mov %o4,%i0 24 mov %o5,%i1 25.LL40: 26 cmp %i2,0 27 bge .LL84 28 mov %i3,%o4 29 xnor %g0,%l4,%l4 30 sub %g0,%i3,%o0 31 mov %o0,%o3 32 subcc %g0,%o0,%g0 33 sub %g0,%i2,%o0 34 subx %o0,0,%o2 35 mov %o2,%i2 36 mov %o3,%i3 37 mov %i3,%o4 38.LL84: 39 cmp %i2,0 40 bne .LL45 41 mov %i1,%i3 42 cmp %o4,%i0 43 bleu .LL46 44 mov %i3,%o1 45 mov 32,%g1 46 subcc %i0,%o4,%g0 471: bcs 5f 48 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 49 sub %i0,%o4,%i0 ! this kills msb of n 50 addx %i0,%i0,%i0 ! so this cannot give carry 51 subcc %g1,1,%g1 522: bne 1b 53 subcc %i0,%o4,%g0 54 bcs 3f 55 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 56 b 3f 57 sub %i0,%o4,%i0 ! this kills msb of n 584: sub %i0,%o4,%i0 595: addxcc %i0,%i0,%i0 60 bcc 2b 61 subcc %g1,1,%g1 62! Got carry from n. Subtract next step to cancel this carry. 63 bne 4b 64 addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 65 sub %i0,%o4,%i0 663: xnor %o1,0,%o1 67 b .LL50 68 mov 0,%o2 69.LL46: 70 cmp %o4,0 71 bne .LL85 72 mov %i0,%o2 73 mov 1,%o0 74 mov 0,%o1 75 wr %g0, 0, %y 76 udiv %o0, %o1, %o0 77 mov %o0,%o4 78 mov %i0,%o2 79.LL85: 80 mov 0,%g3 81 mov 32,%g1 82 subcc %g3,%o4,%g0 831: bcs 5f 84 addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb 85 sub %g3,%o4,%g3 ! this kills msb of n 86 addx %g3,%g3,%g3 ! so this cannot give carry 87 subcc %g1,1,%g1 882: bne 1b 89 subcc %g3,%o4,%g0 90 bcs 3f 91 addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb 92 b 3f 93 sub %g3,%o4,%g3 ! this kills msb of n 944: sub %g3,%o4,%g3 955: addxcc %g3,%g3,%g3 96 bcc 2b 97 subcc %g1,1,%g1 98! Got carry from n. Subtract next step to cancel this carry. 99 bne 4b 100 addcc %o2,%o2,%o2 ! shift n1n0 and a 0-bit in lsb 101 sub %g3,%o4,%g3 1023: xnor %o2,0,%o2 103 mov %g3,%i0 104 mov %i3,%o1 105 mov 32,%g1 106 subcc %i0,%o4,%g0 1071: bcs 5f 108 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 109 sub %i0,%o4,%i0 ! this kills msb of n 110 addx %i0,%i0,%i0 ! so this cannot give carry 111 subcc %g1,1,%g1 1122: bne 1b 113 subcc %i0,%o4,%g0 114 bcs 3f 115 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 116 b 3f 117 sub %i0,%o4,%i0 ! this kills msb of n 1184: sub %i0,%o4,%i0 1195: addxcc %i0,%i0,%i0 120 bcc 2b 121 subcc %g1,1,%g1 122! Got carry from n. Subtract next step to cancel this carry. 123 bne 4b 124 addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 125 sub %i0,%o4,%i0 1263: xnor %o1,0,%o1 127 b .LL86 128 mov %o1,%l1 129.LL45: 130 cmp %i2,%i0 131 bleu .LL51 132 sethi %hi(65535),%o0 133 b .LL78 134 mov 0,%o1 135.LL51: 136 or %o0,%lo(65535),%o0 137 cmp %i2,%o0 138 bgu .LL58 139 mov %i2,%o1 140 cmp %i2,256 141 addx %g0,-1,%o0 142 b .LL64 143 and %o0,8,%o2 144.LL58: 145 sethi %hi(16777215),%o0 146 or %o0,%lo(16777215),%o0 147 cmp %i2,%o0 148 bgu .LL64 149 mov 24,%o2 150 mov 16,%o2 151.LL64: 152 srl %o1,%o2,%o0 153 sethi %hi(__clz_tab),%o1 154 or %o1,%lo(__clz_tab),%o1 155 ldub [%o0+%o1],%o0 156 add %o0,%o2,%o0 157 mov 32,%o1 158 subcc %o1,%o0,%o3 159 bne,a .LL72 160 sub %o1,%o3,%o1 161 cmp %i0,%i2 162 bgu .LL74 163 cmp %i3,%o4 164 blu .LL78 165 mov 0,%o1 166.LL74: 167 b .LL78 168 mov 1,%o1 169.LL72: 170 sll %i2,%o3,%o2 171 srl %o4,%o1,%o0 172 or %o2,%o0,%i2 173 sll %o4,%o3,%o4 174 srl %i0,%o1,%o2 175 sll %i0,%o3,%o0 176 srl %i3,%o1,%o1 177 or %o0,%o1,%i0 178 sll %i3,%o3,%i3 179 mov %i0,%o1 180 mov 32,%g1 181 subcc %o2,%i2,%g0 1821: bcs 5f 183 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 184 sub %o2,%i2,%o2 ! this kills msb of n 185 addx %o2,%o2,%o2 ! so this cannot give carry 186 subcc %g1,1,%g1 1872: bne 1b 188 subcc %o2,%i2,%g0 189 bcs 3f 190 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 191 b 3f 192 sub %o2,%i2,%o2 ! this kills msb of n 1934: sub %o2,%i2,%o2 1945: addxcc %o2,%o2,%o2 195 bcc 2b 196 subcc %g1,1,%g1 197! Got carry from n. Subtract next step to cancel this carry. 198 bne 4b 199 addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 200 sub %o2,%i2,%o2 2013: xnor %o1,0,%o1 202 mov %o2,%i0 203 wr %g0,%o1,%y ! SPARC has 0-3 delay insn after a wr 204 sra %o4,31,%g2 ! Do not move this insn 205 and %o1,%g2,%g2 ! Do not move this insn 206 andcc %g0,0,%g1 ! Do not move this insn 207 mulscc %g1,%o4,%g1 208 mulscc %g1,%o4,%g1 209 mulscc %g1,%o4,%g1 210 mulscc %g1,%o4,%g1 211 mulscc %g1,%o4,%g1 212 mulscc %g1,%o4,%g1 213 mulscc %g1,%o4,%g1 214 mulscc %g1,%o4,%g1 215 mulscc %g1,%o4,%g1 216 mulscc %g1,%o4,%g1 217 mulscc %g1,%o4,%g1 218 mulscc %g1,%o4,%g1 219 mulscc %g1,%o4,%g1 220 mulscc %g1,%o4,%g1 221 mulscc %g1,%o4,%g1 222 mulscc %g1,%o4,%g1 223 mulscc %g1,%o4,%g1 224 mulscc %g1,%o4,%g1 225 mulscc %g1,%o4,%g1 226 mulscc %g1,%o4,%g1 227 mulscc %g1,%o4,%g1 228 mulscc %g1,%o4,%g1 229 mulscc %g1,%o4,%g1 230 mulscc %g1,%o4,%g1 231 mulscc %g1,%o4,%g1 232 mulscc %g1,%o4,%g1 233 mulscc %g1,%o4,%g1 234 mulscc %g1,%o4,%g1 235 mulscc %g1,%o4,%g1 236 mulscc %g1,%o4,%g1 237 mulscc %g1,%o4,%g1 238 mulscc %g1,%o4,%g1 239 mulscc %g1,0,%g1 240 add %g1,%g2,%o0 241 rd %y,%o2 242 cmp %o0,%i0 243 bgu,a .LL78 244 add %o1,-1,%o1 245 bne,a .LL50 246 mov 0,%o2 247 cmp %o2,%i3 248 bleu .LL50 249 mov 0,%o2 250 add %o1,-1,%o1 251.LL78: 252 mov 0,%o2 253.LL50: 254 mov %o1,%l1 255.LL86: 256 mov %o2,%l0 257 mov %l0,%i0 258 mov %l1,%i1 259 cmp %l4,0 260 be .LL81 261 sub %g0,%i1,%o0 262 mov %o0,%l3 263 subcc %g0,%o0,%g0 264 sub %g0,%i0,%o0 265 subx %o0,0,%l2 266 mov %l2,%i0 267 mov %l3,%i1 268.LL81: 269 ret 270 restore 271EXPORT_SYMBOL(__divdi3)