fork download
  1. #define DIVIDE_ITER_0_0(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. " or %D[q],__tmp_reg__\n" \
  10. "zero_bit_" #i "_%=:\n" \
  11. " lsr __tmp_reg__\n"
  12.  
  13. #define DIVIDE_ITER_1_6(i) \
  14. " lsl %D[n]\n" \
  15. " rol %A[p]\n" \
  16. " cp %A[p],%A[d]\n" \
  17. " cpc %B[p],%B[d]\n" \
  18. " cpc %C[p],%C[d]\n" \
  19. " cpc %D[p],%D[d]\n" \
  20. " brcs zero_bit_" #i "_%=\n" \
  21. " sub %A[p],%A[d]\n" \
  22. " or %D[q],__tmp_reg__\n" \
  23. "zero_bit_" #i "_%=:\n" \
  24. " lsr __tmp_reg__\n"
  25.  
  26. #define DIVIDE_ITER_7_7(i) \
  27. " lsl %D[n]\n" \
  28. " rol %A[p]\n" \
  29. " cp %A[p],%A[d]\n" \
  30. " cpc %B[p],%B[d]\n" \
  31. " cpc %C[p],%C[d]\n" \
  32. " cpc %D[p],%D[d]\n" \
  33. " brcs zero_bit_" #i "_%=\n" \
  34. " sub %A[p],%A[d]\n" \
  35. " or %D[q],__tmp_reg__\n" \
  36. "zero_bit_" #i "_%=:\n" \
  37. " mov __tmp_reg__,%A[q]\n"
  38.  
  39. #define DIVIDE_ITER_8_8(i) \
  40. " lsl %C[n]\n" \
  41. " rol %A[p]\n" \
  42. " rol %B[p]\n" \
  43. " cp %A[p],%A[d]\n" \
  44. " cpc %B[p],%B[d]\n" \
  45. " cpc %C[p],%C[d]\n" \
  46. " cpc %D[p],%D[d]\n" \
  47. " brcs zero_bit_" #i "_%=\n" \
  48. " sub %A[p],%A[d]\n" \
  49. " or %C[q],__tmp_reg__\n" \
  50. "zero_bit_" #i "_%=:\n" \
  51. " lsr __tmp_reg__\n"
  52.  
  53. #define DIVIDE_ITER_9_14(i) \
  54. " lsl %C[n]\n" \
  55. " rol %A[p]\n" \
  56. " rol %B[p]\n" \
  57. " cp %A[p],%A[d]\n" \
  58. " cpc %B[p],%B[d]\n" \
  59. " cpc %C[p],%C[d]\n" \
  60. " cpc %D[p],%D[d]\n" \
  61. " brcs zero_bit_" #i "_%=\n" \
  62. " sub %A[p],%A[d]\n" \
  63. " sbc %B[p],%B[d]\n" \
  64. " or %C[q],__tmp_reg__\n" \
  65. "zero_bit_" #i "_%=:\n" \
  66. " lsr __tmp_reg__\n"
  67.  
  68. #define DIVIDE_ITER_15_15(i) \
  69. " lsl %C[n]\n" \
  70. " rol %A[p]\n" \
  71. " rol %B[p]\n" \
  72. " cp %A[p],%A[d]\n" \
  73. " cpc %B[p],%B[d]\n" \
  74. " cpc %C[p],%C[d]\n" \
  75. " cpc %D[p],%D[d]\n" \
  76. " brcs zero_bit_" #i "_%=\n" \
  77. " sub %A[p],%A[d]\n" \
  78. " sbc %B[p],%B[d]\n" \
  79. " or %C[q],__tmp_reg__\n" \
  80. "zero_bit_" #i "_%=:\n" \
  81. " mov __tmp_reg__,%A[q]\n"
  82.  
  83. #define DIVIDE_ITER_16_16(i) \
  84. " lsl %B[n]\n" \
  85. " rol %A[p]\n" \
  86. " rol %B[p]\n" \
  87. " rol %C[p]\n" \
  88. " cp %A[p],%A[d]\n" \
  89. " cpc %B[p],%B[d]\n" \
  90. " cpc %C[p],%C[d]\n" \
  91. " cpc %D[p],%D[d]\n" \
  92. " brcs zero_bit_" #i "_%=\n" \
  93. " sub %A[p],%A[d]\n" \
  94. " sbc %B[p],%B[d]\n" \
  95. " or %B[q],__tmp_reg__\n" \
  96. "zero_bit_" #i "_%=:\n" \
  97. " lsr __tmp_reg__\n"
  98.  
  99. #define DIVIDE_ITER_17_22(i) \
  100. " lsl %B[n]\n" \
  101. " rol %A[p]\n" \
  102. " rol %B[p]\n" \
  103. " rol %C[p]\n" \
  104. " cp %A[p],%A[d]\n" \
  105. " cpc %B[p],%B[d]\n" \
  106. " cpc %C[p],%C[d]\n" \
  107. " cpc %D[p],%D[d]\n" \
  108. " brcs zero_bit_" #i "_%=\n" \
  109. " sub %A[p],%A[d]\n" \
  110. " sbc %B[p],%B[d]\n" \
  111. " sbc %C[p],%C[d]\n" \
  112. " or %B[q],__tmp_reg__\n" \
  113. "zero_bit_" #i "_%=:\n" \
  114. " lsr __tmp_reg__\n"
  115.  
  116. #define DIVIDE_ITER_23_23(i) \
  117. " lsl %B[n]\n" \
  118. " rol %A[p]\n" \
  119. " rol %B[p]\n" \
  120. " rol %C[p]\n" \
  121. " cp %A[p],%A[d]\n" \
  122. " cpc %B[p],%B[d]\n" \
  123. " cpc %C[p],%C[d]\n" \
  124. " cpc %D[p],%D[d]\n" \
  125. " brcs zero_bit_" #i "_%=\n" \
  126. " sub %A[p],%A[d]\n" \
  127. " sbc %B[p],%B[d]\n" \
  128. " sbc %C[p],%C[d]\n" \
  129. " or %B[q],__tmp_reg__\n" \
  130. "zero_bit_" #i "_%=:\n" \
  131. " mov __tmp_reg__,%A[q]\n" \
  132. " clr %A[q]\n"
  133.  
  134. #define DIVIDE_ITER_24_24(i) \
  135. " lsl %A[n]\n" \
  136. " rol %A[p]\n" \
  137. " rol %B[p]\n" \
  138. " rol %C[p]\n" \
  139. " rol %D[p]\n" \
  140. " cp %A[p],%A[d]\n" \
  141. " cpc %B[p],%B[d]\n" \
  142. " cpc %C[p],%C[d]\n" \
  143. " cpc %D[p],%D[d]\n" \
  144. " brcs zero_bit_" #i "_%=\n" \
  145. " sub %A[p],%A[d]\n" \
  146. " sbc %B[p],%B[d]\n" \
  147. " sbc %C[p],%C[d]\n" \
  148. " or %A[q],__tmp_reg__\n" \
  149. "zero_bit_" #i "_%=:\n" \
  150. " lsr __tmp_reg__\n"
  151.  
  152. #define DIVIDE_ITER_25_29(i) \
  153. " lsl %A[n]\n" \
  154. " rol %A[p]\n" \
  155. " rol %B[p]\n" \
  156. " rol %C[p]\n" \
  157. " rol %D[p]\n" \
  158. " cp %A[p],%A[d]\n" \
  159. " cpc %B[p],%B[d]\n" \
  160. " cpc %C[p],%C[d]\n" \
  161. " cpc %D[p],%D[d]\n" \
  162. " brcs zero_bit_" #i "_%=\n" \
  163. " sub %A[p],%A[d]\n" \
  164. " sbc %B[p],%B[d]\n" \
  165. " sbc %C[p],%C[d]\n" \
  166. " sbc %D[p],%D[d]\n" \
  167. " or %A[q],__tmp_reg__\n" \
  168. "zero_bit_" #i "_%=:\n" \
  169. " lsr __tmp_reg__\n"
  170.  
  171. #define DIVIDE_ITER_30_30(i) \
  172. " lsl %A[n]\n" \
  173. " rol %A[p]\n" \
  174. " rol %B[p]\n" \
  175. " rol %C[p]\n" \
  176. " rol %D[p]\n" \
  177. " cp %A[p],%A[d]\n" \
  178. " cpc %B[p],%B[d]\n" \
  179. " cpc %C[p],%C[d]\n" \
  180. " cpc %D[p],%D[d]\n" \
  181. " brcs zero_bit_" #i "_%=\n" \
  182. " sub %A[p],%A[d]\n" \
  183. " sbc %B[p],%B[d]\n" \
  184. " sbc %C[p],%C[d]\n" \
  185. " sbc %D[p],%D[d]\n" \
  186. " or %A[q],__tmp_reg__\n" \
  187. "zero_bit_" #i "_%=:\n" \
  188.  
  189. static uint32_t div32 (uint32_t n, uint32_t d)
  190. {
  191. uint32_t p = 0;
  192. uint32_t q = 0x80;
  193.  
  194. asm(
  195. " mov __tmp_reg__,%A[q]\n"
  196. DIVIDE_ITER_0_0(0)
  197. DIVIDE_ITER_1_6(1)
  198. DIVIDE_ITER_1_6(2)
  199. DIVIDE_ITER_1_6(3)
  200. DIVIDE_ITER_1_6(4)
  201. DIVIDE_ITER_1_6(5)
  202. DIVIDE_ITER_1_6(6)
  203. DIVIDE_ITER_7_7(7)
  204. DIVIDE_ITER_8_8(8)
  205. DIVIDE_ITER_9_14(9)
  206. DIVIDE_ITER_9_14(10)
  207. DIVIDE_ITER_9_14(11)
  208. DIVIDE_ITER_9_14(12)
  209. DIVIDE_ITER_9_14(13)
  210. DIVIDE_ITER_9_14(14)
  211. DIVIDE_ITER_15_15(15)
  212. DIVIDE_ITER_16_16(16)
  213. DIVIDE_ITER_17_22(17)
  214. DIVIDE_ITER_17_22(18)
  215. DIVIDE_ITER_17_22(19)
  216. DIVIDE_ITER_17_22(20)
  217. DIVIDE_ITER_17_22(21)
  218. DIVIDE_ITER_17_22(22)
  219. DIVIDE_ITER_23_23(23)
  220. DIVIDE_ITER_24_24(24)
  221. DIVIDE_ITER_25_29(25)
  222. DIVIDE_ITER_25_29(26)
  223. DIVIDE_ITER_25_29(27)
  224. DIVIDE_ITER_25_29(28)
  225. DIVIDE_ITER_25_29(29)
  226. DIVIDE_ITER_30_30(30)
  227. " lsl %A[n]\n"
  228. " rol %A[p]\n"
  229. " rol %B[p]\n"
  230. " rol %C[p]\n"
  231. " rol %D[p]\n"
  232. " cp %A[p],%A[d]\n"
  233. " cpc %B[p],%B[d]\n"
  234. " cpc %C[p],%C[d]\n"
  235. " cpc %D[p],%D[d]\n"
  236. " brcs end_zero_bit%=\n"
  237. " inc %A[q]\n"
  238. "end_zero_bit%=:\n"
  239.  
  240. : [p] "=&r" (p),
  241. [q] "=&r" (q),
  242. [n] "=&r" (n)
  243. : "[p]" (p),
  244. "[q]" (q),
  245. "[n]" (n),
  246. [d] "r" (d)
  247. );
  248.  
  249. return q;
  250. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty