div.s 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. t = 97
  2. u = 98
  3. v = 99
  4. Q = 131
  5. link = 64
  6. /*
  7. * takes R(t)||Q ÷ R(u)
  8. *
  9. * returns quo in Q
  10. * returns rem in R(t)
  11. */
  12. TEXT _divul_(SB), $-4
  13. DSTEP0L R(t), R(t)
  14. DSTEPL R(u), R(t)
  15. DSTEPL R(u), R(t)
  16. DSTEPL R(u), R(t)
  17. DSTEPL R(u), R(t)
  18. DSTEPL R(u), R(t)
  19. DSTEPL R(u), R(t)
  20. DSTEPL R(u), R(t)
  21. DSTEPL R(u), R(t)
  22. DSTEPL R(u), R(t)
  23. DSTEPL R(u), R(t)
  24. DSTEPL R(u), R(t)
  25. DSTEPL R(u), R(t)
  26. DSTEPL R(u), R(t)
  27. DSTEPL R(u), R(t)
  28. DSTEPL R(u), R(t)
  29. DSTEPL R(u), R(t)
  30. DSTEPL R(u), R(t)
  31. DSTEPL R(u), R(t)
  32. DSTEPL R(u), R(t)
  33. DSTEPL R(u), R(t)
  34. DSTEPL R(u), R(t)
  35. DSTEPL R(u), R(t)
  36. DSTEPL R(u), R(t)
  37. DSTEPL R(u), R(t)
  38. DSTEPL R(u), R(t)
  39. DSTEPL R(u), R(t)
  40. DSTEPL R(u), R(t)
  41. DSTEPL R(u), R(t)
  42. DSTEPL R(u), R(t)
  43. DSTEPL R(u), R(t)
  44. DSTEPL R(u), R(t)
  45. DSTEPLL R(u), R(t)
  46. DSTEPRL R(u), R(t)
  47. JMP (R(v))
  48. /*
  49. * takes Q||f2 ÷ f1
  50. *
  51. * returns rem in Q
  52. * returns quo in t
  53. */
  54. TEXT _divul(SB),$-4
  55. MFSR R(Q), R(t) /* pick up high num in R(t) */
  56. ORL $0, R0, R(u) /* put low num in Q */
  57. MTSR R(u), R(Q)
  58. MOVL $0, R(u)
  59. ORL R0, R(u), R(u) /* put den in R(u) */
  60. CALL R(v), _divul_(SB)
  61. MFSR R(Q), R0
  62. MTSR R(t), R(Q)
  63. JMP (R(link))
  64. /*
  65. * takes Q||f2 ÷ f1
  66. *
  67. * returns rem in Q
  68. * returns quo in t
  69. */
  70. TEXT _divl(SB),$-4
  71. MFSR R(Q), R(t) /* pick up high num R(t) */
  72. JMPT R(t), nnum
  73. ORL $0, R0, R(u) /* put low num in Q */
  74. MTSR R(u), R(Q)
  75. MOVL $0, R(u)
  76. ORL R0, R(u), R(u) /* put den in R(u) */
  77. JMPT R(u), pnumnden
  78. CALL R(v), _divul_(SB)
  79. MFSR R(Q), R0
  80. MTSR R(t), R(Q)
  81. JMP (R(link))
  82. pnumnden: /* botch returns pos rem */
  83. ISUBL $0, R(u)
  84. CALL R(v), _divul_(SB)
  85. MFSR R(Q), R(u)
  86. MTSR R(t), R(Q)
  87. ISUBL $0, R(u), R0 /* return neg quo */
  88. JMP (R(link))
  89. /*
  90. * numerator is negative.
  91. * do 64-bit negate.
  92. */
  93. nnum:
  94. CPEQL $0, R0, R(u) /* is low num 0? */
  95. JMPT R(u), nnul1
  96. ISUBL $0, R0, R(u) /* negate R(t)||R0 -> R(t)||R(u) */
  97. XNORL $0, R(t)
  98. JMP nnul2
  99. nnul1:
  100. MOVL $0, R(u) /* negate R(t)||0 -> R(t)||R(u) */
  101. ISUBL $0, R(t)
  102. nnul2:
  103. MTSR R(u), R(Q)
  104. MOVL $0, R(u)
  105. ORL R0, R(u), R(u) /* put den in R(u) */
  106. JMPT R(u), nnumnden
  107. CALL R(v), _divul_(SB)
  108. MFSR R(Q), R(u)
  109. MTSR R(t), R(Q)
  110. ISUBL $0, R(u), R0 /* return neg quo */
  111. JMP (R(link))
  112. nnumnden: /* botch returns pos rem */
  113. ISUBL $0, R(u)
  114. CALL R(v), _divul_(SB)
  115. MFSR R(Q), R0
  116. MTSR R(t), R(Q)
  117. JMP (R(link))