1*f8739b71SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. 31da177e4SLinus Torvalds 41da177e4SLinus TorvaldsThis file is part of GNU CC. 51da177e4SLinus Torvalds 6*f8739b71SThomas Gleixner */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds .text 91da177e4SLinus Torvalds .align 4 101da177e4SLinus Torvalds .globl __udivdi3 111da177e4SLinus Torvalds__udivdi3: 121da177e4SLinus Torvalds save %sp,-104,%sp 131da177e4SLinus Torvalds mov %i3,%o3 141da177e4SLinus Torvalds cmp %i2,0 151da177e4SLinus Torvalds bne .LL40 161da177e4SLinus Torvalds mov %i1,%i3 171da177e4SLinus Torvalds cmp %o3,%i0 181da177e4SLinus Torvalds bleu .LL41 191da177e4SLinus Torvalds mov %i3,%o1 201da177e4SLinus Torvalds ! Inlined udiv_qrnnd 211da177e4SLinus Torvalds mov 32,%g1 221da177e4SLinus Torvalds subcc %i0,%o3,%g0 231da177e4SLinus Torvalds1: bcs 5f 241da177e4SLinus Torvalds addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 251da177e4SLinus Torvalds sub %i0,%o3,%i0 ! this kills msb of n 261da177e4SLinus Torvalds addx %i0,%i0,%i0 ! so this cannot give carry 271da177e4SLinus Torvalds subcc %g1,1,%g1 281da177e4SLinus Torvalds2: bne 1b 291da177e4SLinus Torvalds subcc %i0,%o3,%g0 301da177e4SLinus Torvalds bcs 3f 311da177e4SLinus Torvalds addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 321da177e4SLinus Torvalds b 3f 331da177e4SLinus Torvalds sub %i0,%o3,%i0 ! this kills msb of n 341da177e4SLinus Torvalds4: sub %i0,%o3,%i0 351da177e4SLinus Torvalds5: addxcc %i0,%i0,%i0 361da177e4SLinus Torvalds bcc 2b 371da177e4SLinus Torvalds subcc %g1,1,%g1 381da177e4SLinus Torvalds! Got carry from n. Subtract next step to cancel this carry. 391da177e4SLinus Torvalds bne 4b 401da177e4SLinus Torvalds addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 411da177e4SLinus Torvalds sub %i0,%o3,%i0 421da177e4SLinus Torvalds3: xnor %o1,0,%o1 431da177e4SLinus Torvalds ! End of inline udiv_qrnnd 441da177e4SLinus Torvalds b .LL45 451da177e4SLinus Torvalds mov 0,%o2 461da177e4SLinus Torvalds.LL41: 471da177e4SLinus Torvalds cmp %o3,0 481da177e4SLinus Torvalds bne .LL77 491da177e4SLinus Torvalds mov %i0,%o2 501da177e4SLinus Torvalds mov 1,%o0 511da177e4SLinus Torvalds mov 0,%o1 521b35a57bSDavid S. Miller wr %g0, 0, %y 531b35a57bSDavid S. Miller udiv %o0, %o1, %o0 541da177e4SLinus Torvalds mov %o0,%o3 551da177e4SLinus Torvalds mov %i0,%o2 561da177e4SLinus Torvalds.LL77: 571da177e4SLinus Torvalds mov 0,%o4 581da177e4SLinus Torvalds ! Inlined udiv_qrnnd 591da177e4SLinus Torvalds mov 32,%g1 601da177e4SLinus Torvalds subcc %o4,%o3,%g0 611da177e4SLinus Torvalds1: bcs 5f 621da177e4SLinus Torvalds addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb 631da177e4SLinus Torvalds sub %o4,%o3,%o4 ! this kills msb of n 641da177e4SLinus Torvalds addx %o4,%o4,%o4 ! so this cannot give carry 651da177e4SLinus Torvalds subcc %g1,1,%g1 661da177e4SLinus Torvalds2: bne 1b 671da177e4SLinus Torvalds subcc %o4,%o3,%g0 681da177e4SLinus Torvalds bcs 3f 691da177e4SLinus Torvalds addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb 701da177e4SLinus Torvalds b 3f 711da177e4SLinus Torvalds sub %o4,%o3,%o4 ! this kills msb of n 721da177e4SLinus Torvalds4: sub %o4,%o3,%o4 731da177e4SLinus Torvalds5: addxcc %o4,%o4,%o4 741da177e4SLinus Torvalds bcc 2b 751da177e4SLinus Torvalds subcc %g1,1,%g1 761da177e4SLinus Torvalds! Got carry from n. Subtract next step to cancel this carry. 771da177e4SLinus Torvalds bne 4b 781da177e4SLinus Torvalds addcc %o2,%o2,%o2 ! shift n1n0 and a 0-bit in lsb 791da177e4SLinus Torvalds sub %o4,%o3,%o4 801da177e4SLinus Torvalds3: xnor %o2,0,%o2 811da177e4SLinus Torvalds ! End of inline udiv_qrnnd 821da177e4SLinus Torvalds mov %o4,%i0 831da177e4SLinus Torvalds mov %i3,%o1 841da177e4SLinus Torvalds ! Inlined udiv_qrnnd 851da177e4SLinus Torvalds mov 32,%g1 861da177e4SLinus Torvalds subcc %i0,%o3,%g0 871da177e4SLinus Torvalds1: bcs 5f 881da177e4SLinus Torvalds addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 891da177e4SLinus Torvalds sub %i0,%o3,%i0 ! this kills msb of n 901da177e4SLinus Torvalds addx %i0,%i0,%i0 ! so this cannot give carry 911da177e4SLinus Torvalds subcc %g1,1,%g1 921da177e4SLinus Torvalds2: bne 1b 931da177e4SLinus Torvalds subcc %i0,%o3,%g0 941da177e4SLinus Torvalds bcs 3f 951da177e4SLinus Torvalds addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 961da177e4SLinus Torvalds b 3f 971da177e4SLinus Torvalds sub %i0,%o3,%i0 ! this kills msb of n 981da177e4SLinus Torvalds4: sub %i0,%o3,%i0 991da177e4SLinus Torvalds5: addxcc %i0,%i0,%i0 1001da177e4SLinus Torvalds bcc 2b 1011da177e4SLinus Torvalds subcc %g1,1,%g1 1021da177e4SLinus Torvalds! Got carry from n. Subtract next step to cancel this carry. 1031da177e4SLinus Torvalds bne 4b 1041da177e4SLinus Torvalds addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 1051da177e4SLinus Torvalds sub %i0,%o3,%i0 1061da177e4SLinus Torvalds3: xnor %o1,0,%o1 1071da177e4SLinus Torvalds ! End of inline udiv_qrnnd 1081da177e4SLinus Torvalds b .LL78 1091da177e4SLinus Torvalds mov %o1,%l1 1101da177e4SLinus Torvalds.LL40: 1111da177e4SLinus Torvalds cmp %i2,%i0 1121da177e4SLinus Torvalds bleu .LL46 1131da177e4SLinus Torvalds sethi %hi(65535),%o0 1141da177e4SLinus Torvalds b .LL73 1151da177e4SLinus Torvalds mov 0,%o1 1161da177e4SLinus Torvalds.LL46: 1171da177e4SLinus Torvalds or %o0,%lo(65535),%o0 1181da177e4SLinus Torvalds cmp %i2,%o0 1191da177e4SLinus Torvalds bgu .LL53 1201da177e4SLinus Torvalds mov %i2,%o1 1211da177e4SLinus Torvalds cmp %i2,256 1221da177e4SLinus Torvalds addx %g0,-1,%o0 1231da177e4SLinus Torvalds b .LL59 1241da177e4SLinus Torvalds and %o0,8,%o2 1251da177e4SLinus Torvalds.LL53: 1261da177e4SLinus Torvalds sethi %hi(16777215),%o0 1271da177e4SLinus Torvalds or %o0,%lo(16777215),%o0 1281da177e4SLinus Torvalds cmp %o1,%o0 1291da177e4SLinus Torvalds bgu .LL59 1301da177e4SLinus Torvalds mov 24,%o2 1311da177e4SLinus Torvalds mov 16,%o2 1321da177e4SLinus Torvalds.LL59: 1331da177e4SLinus Torvalds srl %o1,%o2,%o1 1341da177e4SLinus Torvalds sethi %hi(__clz_tab),%o0 1351da177e4SLinus Torvalds or %o0,%lo(__clz_tab),%o0 1361da177e4SLinus Torvalds ldub [%o1+%o0],%o0 1371da177e4SLinus Torvalds add %o0,%o2,%o0 1381da177e4SLinus Torvalds mov 32,%o1 1391da177e4SLinus Torvalds subcc %o1,%o0,%o2 1401da177e4SLinus Torvalds bne,a .LL67 1411da177e4SLinus Torvalds mov 32,%o0 1421da177e4SLinus Torvalds cmp %i0,%i2 1431da177e4SLinus Torvalds bgu .LL69 1441da177e4SLinus Torvalds cmp %i3,%o3 1451da177e4SLinus Torvalds blu .LL73 1461da177e4SLinus Torvalds mov 0,%o1 1471da177e4SLinus Torvalds.LL69: 1481da177e4SLinus Torvalds b .LL73 1491da177e4SLinus Torvalds mov 1,%o1 1501da177e4SLinus Torvalds.LL67: 1511da177e4SLinus Torvalds sub %o0,%o2,%o0 1521da177e4SLinus Torvalds sll %i2,%o2,%i2 1531da177e4SLinus Torvalds srl %o3,%o0,%o1 1541da177e4SLinus Torvalds or %i2,%o1,%i2 1551da177e4SLinus Torvalds sll %o3,%o2,%o3 1561da177e4SLinus Torvalds srl %i0,%o0,%o1 1571da177e4SLinus Torvalds sll %i0,%o2,%i0 1581da177e4SLinus Torvalds srl %i3,%o0,%o0 1591da177e4SLinus Torvalds or %i0,%o0,%i0 1601da177e4SLinus Torvalds sll %i3,%o2,%i3 1611da177e4SLinus Torvalds mov %i0,%o5 1621da177e4SLinus Torvalds mov %o1,%o4 1631da177e4SLinus Torvalds ! Inlined udiv_qrnnd 1641da177e4SLinus Torvalds mov 32,%g1 1651da177e4SLinus Torvalds subcc %o4,%i2,%g0 1661da177e4SLinus Torvalds1: bcs 5f 1671da177e4SLinus Torvalds addxcc %o5,%o5,%o5 ! shift n1n0 and a q-bit in lsb 1681da177e4SLinus Torvalds sub %o4,%i2,%o4 ! this kills msb of n 1691da177e4SLinus Torvalds addx %o4,%o4,%o4 ! so this cannot give carry 1701da177e4SLinus Torvalds subcc %g1,1,%g1 1711da177e4SLinus Torvalds2: bne 1b 1721da177e4SLinus Torvalds subcc %o4,%i2,%g0 1731da177e4SLinus Torvalds bcs 3f 1741da177e4SLinus Torvalds addxcc %o5,%o5,%o5 ! shift n1n0 and a q-bit in lsb 1751da177e4SLinus Torvalds b 3f 1761da177e4SLinus Torvalds sub %o4,%i2,%o4 ! this kills msb of n 1771da177e4SLinus Torvalds4: sub %o4,%i2,%o4 1781da177e4SLinus Torvalds5: addxcc %o4,%o4,%o4 1791da177e4SLinus Torvalds bcc 2b 1801da177e4SLinus Torvalds subcc %g1,1,%g1 1811da177e4SLinus Torvalds! Got carry from n. Subtract next step to cancel this carry. 1821da177e4SLinus Torvalds bne 4b 1831da177e4SLinus Torvalds addcc %o5,%o5,%o5 ! shift n1n0 and a 0-bit in lsb 1841da177e4SLinus Torvalds sub %o4,%i2,%o4 1851da177e4SLinus Torvalds3: xnor %o5,0,%o5 1861da177e4SLinus Torvalds ! End of inline udiv_qrnnd 1871da177e4SLinus Torvalds mov %o4,%i0 1881da177e4SLinus Torvalds mov %o5,%o1 1891da177e4SLinus Torvalds ! Inlined umul_ppmm 1901da177e4SLinus Torvalds wr %g0,%o1,%y ! SPARC has 0-3 delay insn after a wr 1911da177e4SLinus Torvalds sra %o3,31,%g2 ! Do not move this insn 1921da177e4SLinus Torvalds and %o1,%g2,%g2 ! Do not move this insn 1931da177e4SLinus Torvalds andcc %g0,0,%g1 ! Do not move this insn 1941da177e4SLinus Torvalds mulscc %g1,%o3,%g1 1951da177e4SLinus Torvalds mulscc %g1,%o3,%g1 1961da177e4SLinus Torvalds mulscc %g1,%o3,%g1 1971da177e4SLinus Torvalds mulscc %g1,%o3,%g1 1981da177e4SLinus Torvalds mulscc %g1,%o3,%g1 1991da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2001da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2011da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2021da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2031da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2041da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2051da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2061da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2071da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2081da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2091da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2101da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2111da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2121da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2131da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2141da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2151da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2161da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2171da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2181da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2191da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2201da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2211da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2221da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2231da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2241da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2251da177e4SLinus Torvalds mulscc %g1,%o3,%g1 2261da177e4SLinus Torvalds mulscc %g1,0,%g1 2271da177e4SLinus Torvalds add %g1,%g2,%o0 2281da177e4SLinus Torvalds rd %y,%o2 2291da177e4SLinus Torvalds cmp %o0,%i0 2301da177e4SLinus Torvalds bgu,a .LL73 2311da177e4SLinus Torvalds add %o1,-1,%o1 2321da177e4SLinus Torvalds bne,a .LL45 2331da177e4SLinus Torvalds mov 0,%o2 2341da177e4SLinus Torvalds cmp %o2,%i3 2351da177e4SLinus Torvalds bleu .LL45 2361da177e4SLinus Torvalds mov 0,%o2 2371da177e4SLinus Torvalds add %o1,-1,%o1 2381da177e4SLinus Torvalds.LL73: 2391da177e4SLinus Torvalds mov 0,%o2 2401da177e4SLinus Torvalds.LL45: 2411da177e4SLinus Torvalds mov %o1,%l1 2421da177e4SLinus Torvalds.LL78: 2431da177e4SLinus Torvalds mov %o2,%l0 2441da177e4SLinus Torvalds mov %l0,%i0 2451da177e4SLinus Torvalds mov %l1,%i1 2461da177e4SLinus Torvalds ret 2471da177e4SLinus Torvalds restore 248