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