div-thumb.s 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. Q = 0
  2. N = 1
  3. D = 2
  4. CC = 3
  5. TMP = 11
  6. TEXT save<>(SB), 1, $0
  7. MOVW R(Q), 0(FP)
  8. MOVW R(N), 4(FP)
  9. MOVW R(D), 8(FP)
  10. MOVW R(CC), 12(FP)
  11. MOVW R(TMP), R(Q) /* numerator */
  12. MOVW 20(FP), R(D) /* denominator */
  13. CMP $0, R(D)
  14. BNE s1
  15. SWI 0
  16. /* MOVW -1(R(D)), R(TMP) /* divide by zero fault */
  17. s1: RET
  18. TEXT rest<>(SB), 1, $0
  19. MOVW 0(FP), R(Q)
  20. MOVW 4(FP), R(N)
  21. MOVW 8(FP), R(D)
  22. MOVW 12(FP), R(CC)
  23. /*
  24. * return to caller
  25. * of rest<>
  26. */
  27. MOVW 0(R13), R14
  28. ADD $20, R13
  29. B (R14)
  30. TEXT div<>(SB), 1, $0
  31. MOVW $32, R(CC)
  32. /*
  33. * skip zeros 8-at-a-time
  34. */
  35. e1:
  36. AND.S $(0xff<<24),R(Q), R(N)
  37. BNE e2
  38. SLL $8, R(Q)
  39. SUB.S $8, R(CC)
  40. BNE e1
  41. RET
  42. e2:
  43. MOVW $0, R(N)
  44. loop:
  45. /*
  46. * shift R(N||Q) left one
  47. */
  48. SLL $1, R(N)
  49. CMP $0, R(Q)
  50. ORR.LT $1, R(N)
  51. SLL $1, R(Q)
  52. /*
  53. * compare numerator to denominator
  54. * if less, subtract and set quotent bit
  55. */
  56. CMP R(D), R(N)
  57. ORR.HS $1, R(Q)
  58. SUB.HS R(D), R(N)
  59. SUB.S $1, R(CC)
  60. BNE loop
  61. RET
  62. TEXT _div(SB), 1, $16
  63. BL save<>(SB)
  64. CMP $0, R(Q)
  65. BGE d1
  66. RSB $0, R(Q), R(Q)
  67. CMP $0, R(D)
  68. BGE d2
  69. RSB $0, R(D), R(D)
  70. d0:
  71. BL div<>(SB) /* none/both neg */
  72. MOVW R(Q), R(TMP)
  73. B out
  74. d1:
  75. CMP $0, R(D)
  76. BGE d0
  77. RSB $0, R(D), R(D)
  78. d2:
  79. BL div<>(SB) /* one neg */
  80. RSB $0, R(Q), R(TMP)
  81. B out
  82. TEXT _mod(SB), 1, $16
  83. BL save<>(SB)
  84. CMP $0, R(D)
  85. RSB.LT $0, R(D), R(D)
  86. CMP $0, R(Q)
  87. BGE m1
  88. RSB $0, R(Q), R(Q)
  89. BL div<>(SB) /* neg numerator */
  90. RSB $0, R(N), R(TMP)
  91. B out
  92. m1:
  93. BL div<>(SB) /* pos numerator */
  94. MOVW R(N), R(TMP)
  95. B out
  96. TEXT _divu(SB), 1, $16
  97. BL save<>(SB)
  98. BL div<>(SB)
  99. MOVW R(Q), R(TMP)
  100. B out
  101. TEXT _modu(SB), 1, $16
  102. BL save<>(SB)
  103. BL div<>(SB)
  104. MOVW R(N), R(TMP)
  105. B out
  106. out:
  107. BL rest<>(SB)
  108. B out