mpdigdiv.s 609 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * This only works on R[45]000 chips that allow 64 bit
  3. * integer arithmetic even when uding 32 bit addresses
  4. *
  5. * R1 = dividend*
  6. * R2 = dividend[low]
  7. * R3 = dividend[high]
  8. * R4 = 32 bit divisor
  9. * R5 = quotient*
  10. */
  11. TEXT mpdigdiv(SB),$0
  12. MOVW 0(R1),R2
  13. MOVW 4(R1),R3
  14. MOVW divisor+4(FP),R4
  15. MOVW quotient+8(FP),R5
  16. /* divisor == 0 */
  17. BEQ R4,_digovfl
  18. /* dividend >= 2^32 * divisor */
  19. SGTU R4,R3,R7
  20. BEQ R7,_digovfl
  21. _digdiv1:
  22. SLLV $32,R2
  23. SLLV $32,R3
  24. SRLV $32,R2
  25. ADDVU R2,R3
  26. SLLV $32,R4
  27. SRLV $32,R4
  28. DIVVU R4,R3
  29. MOVW LO,R1
  30. MOVW R1,0(R5)
  31. RET
  32. _digovfl:
  33. MOVW $-1,R1
  34. MOVW R1,0(R5)
  35. RET