How does one do integer (signed or unsigned) division on ARM?

后端 未结 5 1858
长发绾君心
长发绾君心 2020-12-06 00:33

I\'m working on Cortex-A8 and Cortex-A9 in particular. I know that some architectures don\'t come with integer division, but what is the best way to do it other than convert

5条回答
  •  生来不讨喜
    2020-12-06 01:34

    I wrote my own routine to perform an unsigned division as I could not find an unsigned version on the web. I needed to divide a 64 bit value with a 32 bit value to get a 32 bit result.

    The inner loop is not as efficient as the signed solution provided above, but this does support unsigned arithmetic. This routine performs a 32 bit division if the high part of the numerator (hi) is smaller than the denominator (den), otherwise a full 64 bit division is performed (hi:lo/den). The result is in lo.

      cmp     hi, den                   // if hi < den do 32 bits, else 64 bits
      bpl     do64bits
      REPT    32
        adds    lo, lo, lo              // shift numerator through carry
        adcs    hi, hi, hi
        subscc  work, hi, den           // if carry not set, compare        
        subcs   hi, hi, den             // if carry set, subtract
        addcs   lo, lo, #1              // if carry set, and 1 to quotient
      ENDR
    
      mov     r0, lo                    // move result into R0
      mov     pc, lr                    // return
    
    do64bits:
      mov     top, #0
      REPT    64
        adds    lo, lo, lo              // shift numerator through carry
        adcs    hi, hi, hi
        adcs    top, top, top
        subscc  work, top, den          // if carry not set, compare        
        subcs   top, top, den           // if carry set, subtract
        addcs   lo, lo, #1              // if carry set, and 1 to quotient
      ENDR
      mov     r0, lo                    // move result into R0
      mov     pc, lr                    // return
    

    Extra checking for boundary conditions and power of 2 can be added. Full details can be found at http://www.idwiz.co.za/Tips%20and%20Tricks/Divide.htm

提交回复
热议问题