root/arch/sparc/lib/divdi3.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
   3 
   4 This 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
  47 1:      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
  52 2:      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
  58 4:      sub     %i0,%o4,%i0
  59 5:      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
  66 3:      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
  83 1:      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
  88 2:      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
  94 4:      sub     %g3,%o4,%g3
  95 5:      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
 102 3:      xnor    %o2,0,%o2
 103         mov %g3,%i0
 104         mov %i3,%o1
 105         mov     32,%g1
 106         subcc   %i0,%o4,%g0
 107 1:      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
 112 2:      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
 118 4:      sub     %i0,%o4,%i0
 119 5:      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
 126 3:      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
 182 1:      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
 187 2:      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
 193 4:      sub     %o2,%i2,%o2
 194 5:      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
 201 3:      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
 271 EXPORT_SYMBOL(__divdi3)

/* [<][>][^][v][top][bottom][index][help] */