linux/arch/sh/lib64/udivsi3.S
<<
>>
Prefs
   1        .global __udivsi3
   2        .section        .text..SHmedia32,"ax"
   3        .align  2
   4
   5/*
   6   inputs: r4,r5
   7   clobbered: r18,r19,r20,r21,r22,r25,tr0
   8   result in r0.
   9 */
  10__udivsi3:
  11        addz.l r5,r63,r22
  12        nsb r22,r0
  13        shlld r22,r0,r25
  14        shlri r25,48,r25
  15        movi 0xffffffffffffbb0c,r20 /* shift count eqiv 76 */
  16        sub r20,r25,r21
  17        mmulfx.w r21,r21,r19
  18        mshflo.w r21,r63,r21
  19        ptabs r18,tr0
  20        mmulfx.w r25,r19,r19
  21        sub r20,r0,r0
  22        /* bubble */
  23        msub.w r21,r19,r19
  24
  25        /*
  26         * It would be nice for scheduling to do this add to r21 before
  27         * the msub.w, but we need a different value for r19 to keep
  28         * errors under control.
  29         */
  30        addi r19,-2,r21
  31        mulu.l r4,r21,r18
  32        mmulfx.w r19,r19,r19
  33        shlli r21,15,r21
  34        shlrd r18,r0,r18
  35        mulu.l r18,r22,r20
  36        mmacnfx.wl r25,r19,r21
  37        /* bubble */
  38        sub r4,r20,r25
  39
  40        mulu.l r25,r21,r19
  41        addi r0,14,r0
  42        /* bubble */
  43        shlrd r19,r0,r19
  44        mulu.l r19,r22,r20
  45        add r18,r19,r18
  46        /* bubble */
  47        sub.l r25,r20,r25
  48
  49        mulu.l r25,r21,r19
  50        addz.l r25,r63,r25
  51        sub r25,r22,r25
  52        shlrd r19,r0,r19
  53        mulu.l r19,r22,r20
  54        addi r25,1,r25
  55        add r18,r19,r18
  56
  57        cmpgt r25,r20,r25
  58        add.l r18,r25,r0
  59        blink tr0,r63
  60