fork download
  1. #define DIVIDE_ITER_0_6(i) \
  2. " lsl %D[n]\n" \
  3. " rol %A[p]\n" \
  4. " cp %A[p],%A[d]\n" \
  5. " cpc %B[p],%B[d]\n" \
  6. " cpc %C[p],%C[d]\n" \
  7. " cpc %D[p],%D[d]\n" \
  8. " brcs zero_bit_" #i "_%=\n" \
  9. " sub %A[p],%A[d]\n" \
  10. " or %D[q],__tmp_reg__\n" \
  11. "zero_bit_" #i "_%=:\n" \
  12. " lsr __tmp_reg__\n"
  13.  
  14. #define DIVIDE_ITER_7_7(i) \
  15. " lsl %D[n]\n" \
  16. " rol %A[p]\n" \
  17. " cp %A[p],%A[d]\n" \
  18. " cpc %B[p],%B[d]\n" \
  19. " cpc %C[p],%C[d]\n" \
  20. " cpc %D[p],%D[d]\n" \
  21. " brcs zero_bit_" #i "_%=\n" \
  22. " sub %A[p],%A[d]\n" \
  23. " or %D[q],__tmp_reg__\n" \
  24. "zero_bit_" #i "_%=:\n" \
  25. " mov __tmp_reg__,%A[q]\n"
  26.  
  27. #define DIVIDE_ITER_8_14(i) \
  28. " lsl %C[n]\n" \
  29. " rol %A[p]\n" \
  30. " rol %B[p]\n" \
  31. " cp %A[p],%A[d]\n" \
  32. " cpc %B[p],%B[d]\n" \
  33. " cpc %C[p],%C[d]\n" \
  34. " cpc %D[p],%D[d]\n" \
  35. " brcs zero_bit_" #i "_%=\n" \
  36. " sub %A[p],%A[d]\n" \
  37. " sbc %B[p],%B[d]\n" \
  38. " or %C[q],__tmp_reg__\n" \
  39. "zero_bit_" #i "_%=:\n" \
  40. " lsr __tmp_reg__\n"
  41.  
  42. #define DIVIDE_ITER_15_15(i) \
  43. " lsl %C[n]\n" \
  44. " rol %A[p]\n" \
  45. " rol %B[p]\n" \
  46. " cp %A[p],%A[d]\n" \
  47. " cpc %B[p],%B[d]\n" \
  48. " cpc %C[p],%C[d]\n" \
  49. " cpc %D[p],%D[d]\n" \
  50. " brcs zero_bit_" #i "_%=\n" \
  51. " sub %A[p],%A[d]\n" \
  52. " sbc %B[p],%B[d]\n" \
  53. " or %C[q],__tmp_reg__\n" \
  54. "zero_bit_" #i "_%=:\n" \
  55. " mov __tmp_reg__,%A[q]\n"
  56.  
  57. #define DIVIDE_ITER_16_22(i) \
  58. " lsl %B[n]\n" \
  59. " rol %A[p]\n" \
  60. " rol %B[p]\n" \
  61. " rol %C[p]\n" \
  62. " cp %A[p],%A[d]\n" \
  63. " cpc %B[p],%B[d]\n" \
  64. " cpc %C[p],%C[d]\n" \
  65. " cpc %D[p],%D[d]\n" \
  66. " brcs zero_bit_" #i "_%=\n" \
  67. " sub %A[p],%A[d]\n" \
  68. " sbc %B[p],%B[d]\n" \
  69. " sbc %C[p],%C[d]\n" \
  70. " or %B[q],__tmp_reg__\n" \
  71. "zero_bit_" #i "_%=:\n" \
  72. " lsr __tmp_reg__\n"
  73.  
  74. #define DIVIDE_ITER_23_23(i) \
  75. " lsl %B[n]\n" \
  76. " rol %A[p]\n" \
  77. " rol %B[p]\n" \
  78. " rol %C[p]\n" \
  79. " cp %A[p],%A[d]\n" \
  80. " cpc %B[p],%B[d]\n" \
  81. " cpc %C[p],%C[d]\n" \
  82. " cpc %D[p],%D[d]\n" \
  83. " brcs zero_bit_" #i "_%=\n" \
  84. " sub %A[p],%A[d]\n" \
  85. " sbc %B[p],%B[d]\n" \
  86. " sbc %C[p],%C[d]\n" \
  87. " or %B[q],__tmp_reg__\n" \
  88. "zero_bit_" #i "_%=:\n" \
  89. " mov __tmp_reg__,%A[q]\n" \
  90. " clr %A[q]\n"
  91.  
  92. #define DIVIDE_ITER_24_29(i) \
  93. " lsl %A[n]\n" \
  94. " rol %A[p]\n" \
  95. " rol %B[p]\n" \
  96. " rol %C[p]\n" \
  97. " rol %D[p]\n" \
  98. " cp %A[p],%A[d]\n" \
  99. " cpc %B[p],%B[d]\n" \
  100. " cpc %C[p],%C[d]\n" \
  101. " cpc %D[p],%D[d]\n" \
  102. " brcs zero_bit_" #i "_%=\n" \
  103. " sub %A[p],%A[d]\n" \
  104. " sbc %B[p],%B[d]\n" \
  105. " sbc %C[p],%C[d]\n" \
  106. " sbc %D[p],%D[d]\n" \
  107. " or %A[q],__tmp_reg__\n" \
  108. "zero_bit_" #i "_%=:\n" \
  109. " lsr __tmp_reg__\n"
  110.  
  111. #define DIVIDE_ITER_30_30(i) \
  112. " lsl %A[n]\n" \
  113. " rol %A[p]\n" \
  114. " rol %B[p]\n" \
  115. " rol %C[p]\n" \
  116. " rol %D[p]\n" \
  117. " cp %A[p],%A[d]\n" \
  118. " cpc %B[p],%B[d]\n" \
  119. " cpc %C[p],%C[d]\n" \
  120. " cpc %D[p],%D[d]\n" \
  121. " brcs zero_bit_" #i "_%=\n" \
  122. " sub %A[p],%A[d]\n" \
  123. " sbc %B[p],%B[d]\n" \
  124. " sbc %C[p],%C[d]\n" \
  125. " sbc %D[p],%D[d]\n" \
  126. " or %A[q],__tmp_reg__\n" \
  127. "zero_bit_" #i "_%=:\n" \
  128.  
  129. static uint32_t div32 (uint32_t n, uint32_t d)
  130. {
  131. uint32_t p = 0;
  132. uint32_t q = 0x80;
  133.  
  134. asm(
  135. " mov __tmp_reg__,%A[q]\n"
  136. DIVIDE_ITER_0_6(0)
  137. DIVIDE_ITER_0_6(1)
  138. DIVIDE_ITER_0_6(2)
  139. DIVIDE_ITER_0_6(3)
  140. DIVIDE_ITER_0_6(4)
  141. DIVIDE_ITER_0_6(5)
  142. DIVIDE_ITER_0_6(6)
  143. DIVIDE_ITER_7_7(7)
  144. DIVIDE_ITER_8_14(8)
  145. DIVIDE_ITER_8_14(9)
  146. DIVIDE_ITER_8_14(10)
  147. DIVIDE_ITER_8_14(11)
  148. DIVIDE_ITER_8_14(12)
  149. DIVIDE_ITER_8_14(13)
  150. DIVIDE_ITER_8_14(14)
  151. DIVIDE_ITER_15_15(15)
  152. DIVIDE_ITER_16_22(16)
  153. DIVIDE_ITER_16_22(17)
  154. DIVIDE_ITER_16_22(18)
  155. DIVIDE_ITER_16_22(19)
  156. DIVIDE_ITER_16_22(20)
  157. DIVIDE_ITER_16_22(21)
  158. DIVIDE_ITER_16_22(22)
  159. DIVIDE_ITER_23_23(23)
  160. DIVIDE_ITER_24_29(24)
  161. DIVIDE_ITER_24_29(25)
  162. DIVIDE_ITER_24_29(26)
  163. DIVIDE_ITER_24_29(27)
  164. DIVIDE_ITER_24_29(28)
  165. DIVIDE_ITER_24_29(29)
  166. DIVIDE_ITER_30_30(30)
  167. " lsl %A[n]\n"
  168. " rol %A[p]\n"
  169. " rol %B[p]\n"
  170. " rol %C[p]\n"
  171. " rol %D[p]\n"
  172. " cp %A[p],%A[d]\n"
  173. " cpc %B[p],%B[d]\n"
  174. " cpc %C[p],%C[d]\n"
  175. " cpc %D[p],%D[d]\n"
  176. " brcs end_zero_bit%=\n"
  177. " inc %A[q]\n"
  178. "end_zero_bit%=:\n"
  179.  
  180. : [p] "=&r" (p),
  181. [q] "=&r" (q),
  182. [n] "=&r" (n)
  183. : "[p]" (p),
  184. "[q]" (q),
  185. "[n]" (n),
  186. [d] "r" (d)
  187. );
  188.  
  189. return q;
  190. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty