muldivrt.s 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. * calls _divul with
  3. * absolute value arguments
  4. */
  5. TEXT _divsl(SB), $0
  6. MOVL R0, TOS
  7. MOVL b+4(FP), R0
  8. BPL y1
  9. NEGL R0
  10. MOVL R0, TOS
  11. MOVL a+0(FP), R0
  12. BPL y3
  13. NEGL R0
  14. MOVL R0, TOS
  15. /* neg/neg */
  16. JSR _divul(SB)
  17. MOVL TOS, R0
  18. MOVL R0, a+0(FP)
  19. MOVL TOS, R0
  20. NEGL R0
  21. MOVL R0, b+4(FP)
  22. MOVL TOS, R0
  23. RTS
  24. y1: MOVL R0, TOS
  25. MOVL a+0(FP), R0
  26. BPL y2
  27. NEGL R0
  28. MOVL R0, TOS
  29. /* neg/pos */
  30. JSR _divul(SB)
  31. MOVL TOS, R0
  32. NEGL R0
  33. MOVL R0, a+0(FP)
  34. MOVL TOS, R0
  35. NEGL R0
  36. MOVL R0, b+4(FP)
  37. MOVL TOS, R0
  38. RTS
  39. y2: MOVL R0, TOS
  40. /* pos/pos */
  41. JSR _divul(SB)
  42. MOVL TOS, R0
  43. MOVL R0, a+0(FP)
  44. MOVL TOS, R0
  45. MOVL R0, b+4(FP)
  46. MOVL TOS, R0
  47. RTS
  48. y3: MOVL R0, TOS
  49. /* pos/neg */
  50. JSR _divul(SB)
  51. MOVL TOS, R0
  52. NEGL R0
  53. MOVL R0, a+0(FP)
  54. MOVL TOS, R0
  55. MOVL R0, b+4(FP)
  56. MOVL TOS, R0
  57. RTS
  58. /*
  59. * for(i=1;; i++) {
  60. * if(den & (1<<31))
  61. * break;
  62. * den <<= 1;
  63. * }
  64. *
  65. * for(; i; i--) {
  66. * quo <<= 1;
  67. * if(num >= den) {
  68. * num -= den;
  69. * quo |= 1;
  70. * }
  71. * den >>= 1;
  72. * }
  73. */
  74. TEXT _divul(SB), $0
  75. MOVL R0, TOS /* i */
  76. MOVL R1, TOS /* num */
  77. MOVL R2, TOS /* den */
  78. MOVL R3, TOS /* quo */
  79. MOVL $0, R0
  80. MOVL $0, R3
  81. MOVL a+0(FP), R1
  82. MOVL b+4(FP), R2
  83. BEQ xout
  84. BMI x1
  85. ADDL $1, R0
  86. LSLL $1, R2
  87. BPL -2(PC)
  88. x1: LSLL $1, R3
  89. CMPL R1, R2
  90. BCS 3(PC)
  91. SUBL R2, R1
  92. ORL $1, R3
  93. LSRL $1, R2
  94. DBMI R0, x1
  95. MOVL R3, a+0(FP)
  96. MOVL R1, b+4(FP)
  97. xout:
  98. MOVL TOS, R3
  99. MOVL TOS, R2
  100. MOVL TOS, R1
  101. MOVL TOS, R0
  102. RTS
  103. /*
  104. * x = 0;
  105. * for(i=0; i<32; i++) {
  106. * if(a & 1)
  107. * x += b;
  108. * a >>= 1;
  109. * b <<= 1;
  110. * }
  111. * a = x;
  112. */
  113. TEXT _mull(SB), $0
  114. MOVL R0, TOS /* i */
  115. MOVL R1, TOS /* a */
  116. MOVL R2, TOS /* b */
  117. MOVL R3, TOS /* x */
  118. MOVL a+0(FP), R1
  119. MOVL b+4(FP), R2
  120. MOVL $32, R0
  121. CLRL R3
  122. z1: ROTRL $1, R1
  123. BCC 2(PC)
  124. ADDL R2, R3
  125. LSLL $1, R2
  126. DBEQ R0, z1
  127. MOVL R3, b+4(FP)
  128. MOVL TOS, R3
  129. MOVL TOS, R2
  130. MOVL TOS, R1
  131. MOVL TOS, R0
  132. RTS
  133. TEXT _ccr(SB), $0
  134. PEA (A0)
  135. SUBL A0, A0
  136. BCC 2(PC)
  137. LEA 1(A0), A0
  138. BVC 2(PC)
  139. LEA 2(A0), A0
  140. BNE 2(PC)
  141. LEA 4(A0), A0
  142. BPL 2(PC)
  143. LEA 8(A0), A0
  144. MOVW A0, a+0(FP)
  145. MOVL TOS, A0
  146. RTS