dvu.s 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. .global dvu4
  2. .global dvi4
  3. .global mathdvi4
  4. EIDIVZ=6
  5. dvi4:
  6. ! %o0' = %o0 / %o1
  7. ! %o1' = %o0 % %o1
  8. tst %o1
  9. be 0f
  10. clr %o5
  11. tst %o0
  12. bge 1f
  13. nop
  14. neg %o0
  15. xor %o5, 1, %o5
  16. 1:
  17. tst %o1
  18. bge 3f
  19. nop
  20. neg %o1
  21. xor %o5, 2, %o5
  22. 3: /* div common */
  23. clr %o2
  24. mov %o1, %o3
  25. clr %o4
  26. 4:
  27. cmp %o1, %o0
  28. bgeu 5f
  29. nop
  30. inc %o4
  31. sll %o1, 1, %o1
  32. b 4b
  33. nop
  34. 5:
  35. sll %o2, 1, %o2
  36. subcc %o0, %o1, %o0
  37. bgeu 3f
  38. nop
  39. add %o0, %o1, %o0
  40. b 4f
  41. nop
  42. 3:
  43. inc %o2
  44. 4:
  45. srl %o1, 1, %o1
  46. tst %o4
  47. bz 5f
  48. nop
  49. dec %o4
  50. b 5b
  51. nop
  52. 5:
  53. andcc %o5, 1, %g0
  54. bz 6f
  55. nop
  56. neg %o0
  57. neg %o2
  58. 6:
  59. andcc %o5, 2, %g0
  60. bz 8f
  61. nop
  62. neg %o2
  63. 8:
  64. mov %o0, %o1
  65. mov %o2, %o0
  66. retl
  67. nop
  68. dvu4:
  69. ! %o0' = %o0 / %o1
  70. ! %o1' = %o0 % %o1
  71. tst %o1
  72. be 0f
  73. nop
  74. clr %o5
  75. tst %o0
  76. bge 3f /* jump if msb clear */
  77. nop
  78. clr %o2
  79. mov %o1, %o3
  80. clr %o4
  81. 1: tst %o1
  82. bl 5f /* jump if msb set */
  83. nop
  84. sll %o1, 1, %o1
  85. inc %o4
  86. b 1b
  87. nop
  88. mathdvi4:
  89. ! %o0' = %o0 / %o1
  90. ! %o1' = %o0 % %o1
  91. tst %o1
  92. be 0f
  93. clr %o5
  94. tst %o0
  95. bge 1f
  96. nop
  97. neg %o0
  98. xor %o5, 1, %o5
  99. 1:
  100. tst %o1
  101. bge 3f
  102. nop
  103. neg %o1
  104. xor %o5, 3, %o5
  105. 3: /* div common */
  106. clr %o2
  107. mov %o1, %o3
  108. clr %o4
  109. 4:
  110. cmp %o1, %o0
  111. bgeu 5f
  112. nop
  113. inc %o4
  114. sll %o1, 1, %o1
  115. b 4b
  116. nop
  117. 5: /* div common for dvu4 && ( %o0 & 0x80000000) */
  118. sll %o2, 1, %o2
  119. subcc %o0, %o1, %o0
  120. bgeu 3f
  121. nop
  122. add %o0, %o1, %o0
  123. b 4f
  124. nop
  125. 3:
  126. inc %o2
  127. 4:
  128. srl %o1, 1, %o1
  129. tst %o4
  130. bz 5f
  131. nop
  132. dec %o4
  133. b 5b
  134. nop
  135. 5:
  136. andcc %o5, 1, %g0
  137. bz 6f
  138. nop
  139. tst %o0
  140. bz 7f
  141. nop
  142. inc %o2
  143. sub %o3, %o0, %o0
  144. 7:
  145. neg %o2
  146. 6:
  147. andcc %o5, 2, %g0
  148. bz 8f
  149. nop
  150. neg %o0
  151. 8:
  152. mov %o0, %o1
  153. mov %o2, %o0
  154. retl
  155. nop
  156. 0: /* divide by zero */
  157. set EIDIVZ, %o0
  158. call trp
  159. nop
  160. retl
  161. nop