linux/arch/sparc/lib/divdi3.S
<<
>>
Prefs
   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)
 272