remu.S 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. ;; SPDX-License-Identifier: GPL-2.0-or-later
  2. ;; Copyright 2010 Free Software Foundation, Inc.
  3. ;; Contributed by Bernd Schmidt <bernds@codesourcery.com>.
  4. ;;
  5. #include <linux/linkage.h>
  6. ;; ABI considerations for the divide functions
  7. ;; The following registers are call-used:
  8. ;; __c6xabi_divi A0,A1,A2,A4,A6,B0,B1,B2,B4,B5
  9. ;; __c6xabi_divu A0,A1,A2,A4,A6,B0,B1,B2,B4
  10. ;; __c6xabi_remi A1,A2,A4,A5,A6,B0,B1,B2,B4
  11. ;; __c6xabi_remu A1,A4,A5,A7,B0,B1,B2,B4
  12. ;;
  13. ;; In our implementation, divu and remu are leaf functions,
  14. ;; while both divi and remi call into divu.
  15. ;; A0 is not clobbered by any of the functions.
  16. ;; divu does not clobber B2 either, which is taken advantage of
  17. ;; in remi.
  18. ;; divi uses B5 to hold the original return address during
  19. ;; the call to divu.
  20. ;; remi uses B2 and A5 to hold the input values during the
  21. ;; call to divu. It stores B3 in on the stack.
  22. .text
  23. ENTRY(__c6xabi_remu)
  24. ;; The ABI seems designed to prevent these functions calling each other,
  25. ;; so we duplicate most of the divsi3 code here.
  26. mv .s2x A4, B1
  27. lmbd .l2 1, B4, B1
  28. || [!B1] b .s2 B3 ; RETURN A
  29. || [!B1] mvk .d2 1, B4
  30. mv .l1x B1, A7
  31. || shl .s2 B4, B1, B4
  32. cmpltu .l1x A4, B4, A1
  33. [!A1] sub .l1x A4, B4, A4
  34. shru .s2 B4, 1, B4
  35. _remu_loop:
  36. cmpgt .l2 B1, 7, B0
  37. || [B1] subc .l1x A4,B4,A4
  38. || [B1] add .s2 -1, B1, B1
  39. ;; RETURN A may happen here (note: must happen before the next branch)
  40. [B1] subc .l1x A4,B4,A4
  41. || [B1] add .s2 -1, B1, B1
  42. || [B0] b .s1 _remu_loop
  43. [B1] subc .l1x A4,B4,A4
  44. || [B1] add .s2 -1, B1, B1
  45. [B1] subc .l1x A4,B4,A4
  46. || [B1] add .s2 -1, B1, B1
  47. [B1] subc .l1x A4,B4,A4
  48. || [B1] add .s2 -1, B1, B1
  49. [B1] subc .l1x A4,B4,A4
  50. || [B1] add .s2 -1, B1, B1
  51. [B1] subc .l1x A4,B4,A4
  52. || [B1] add .s2 -1, B1, B1
  53. ;; loop backwards branch happens here
  54. ret .s2 B3
  55. [B1] subc .l1x A4,B4,A4
  56. || [B1] add .s2 -1, B1, B1
  57. [B1] subc .l1x A4,B4,A4
  58. extu .s1 A4, A7, A4
  59. nop 2
  60. ENDPROC(__c6xabi_remu)