div64.S 586 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * unsigned long __xdiv64_32(unsigned long long n, unsigned long d);
  4. */
  5. #include <linux/linkage.h>
  6. .text
  7. ENTRY(__xdiv64_32)
  8. #ifdef CONFIG_CPU_LITTLE_ENDIAN
  9. mov r4, r0
  10. mov r5, r1
  11. #else
  12. mov r4, r1
  13. mov r5, r0
  14. #endif
  15. cmp/hs r6, r1
  16. bf.s 1f
  17. mov #0, r2
  18. mov r1, r2
  19. mov #0, r3
  20. div0u
  21. .rept 32
  22. rotcl r2
  23. div1 r6, r3
  24. .endr
  25. rotcl r2
  26. mul.l r6, r2
  27. sts macl, r3
  28. sub r3, r1
  29. 1:
  30. div0u
  31. .rept 32
  32. rotcl r0
  33. div1 r6, r1
  34. .endr
  35. #ifdef CONFIG_CPU_LITTLE_ENDIAN
  36. mov r2, r1
  37. rts
  38. rotcl r0
  39. #else
  40. rotcl r0
  41. mov r0, r1
  42. rts
  43. mov r2, r0
  44. #endif