fork download
  1. #include <stdint.h>
  2.  
  3. #define DIVIDE_ITER_0_7(i) \
  4. " lsl %D[n]\n" \
  5. " rol __tmp_reg__\n" \
  6. " cp __tmp_reg__,%A[d]\n" \
  7. " cpc __zero_reg__,%B[d]\n" \
  8. " cpc __zero_reg__,%C[d]\n" \
  9. " cpc __zero_reg__,%D[d]\n" \
  10. " brcs zero_bit_" #i "__%=\n" \
  11. " sub __tmp_reg__,%A[d]\n" \
  12. " ori %D[q],1<<(7-" #i ")\n" \
  13. "zero_bit_" #i "__%=:\n"
  14.  
  15. #define DIVIDE_ITER_8_15(i) \
  16. " lsl %C[n]\n" \
  17. " rol __tmp_reg__\n" \
  18. " rol %D[n]\n" \
  19. " cp __tmp_reg__,%A[d]\n" \
  20. " cpc %D[n],%B[d]\n" \
  21. " cpc __zero_reg__,%C[d]\n" \
  22. " cpc __zero_reg__,%D[d]\n" \
  23. " brcs zero_bit_" #i "__%=\n" \
  24. " sub __tmp_reg__,%A[d]\n" \
  25. " sbc %D[n],%B[d]\n" \
  26. " ori %C[q],1<<(15-" #i ")\n" \
  27. "zero_bit_" #i "__%=:\n"
  28.  
  29. #define DIVIDE_ITER_16_23(i) \
  30. " lsl %B[n]\n" \
  31. " rol __tmp_reg__\n" \
  32. " rol %D[n]\n" \
  33. " rol %C[n]\n" \
  34. " cp __tmp_reg__,%A[d]\n" \
  35. " cpc %D[n],%B[d]\n" \
  36. " cpc %C[n],%C[d]\n" \
  37. " cpc __zero_reg__,%D[d]\n" \
  38. " brcs zero_bit_" #i "__%=\n" \
  39. " sub __tmp_reg__,%A[d]\n" \
  40. " sbc %D[n],%B[d]\n" \
  41. " sbc %C[n],%C[d]\n" \
  42. " ori %B[q],1<<(23-" #i ")\n" \
  43. "zero_bit_" #i "__%=:\n"
  44.  
  45. #define DIVIDE_ITER_24_30(i) \
  46. " lsl %A[n]\n" \
  47. " rol __tmp_reg__\n" \
  48. " rol %D[n]\n" \
  49. " rol %C[n]\n" \
  50. " rol %B[n]\n" \
  51. " cp __tmp_reg__,%A[d]\n" \
  52. " cpc %D[n],%B[d]\n" \
  53. " cpc %C[n],%C[d]\n" \
  54. " cpc %B[n],%D[d]\n" \
  55. " brcs zero_bit_" #i "__%=\n" \
  56. " sub __tmp_reg__,%A[d]\n" \
  57. " sbc %D[n],%B[d]\n" \
  58. " sbc %C[n],%C[d]\n" \
  59. " sbc %B[n],%D[d]\n" \
  60. " ori %A[q],1<<(31-" #i ")\n" \
  61. "zero_bit_" #i "__%=:\n"
  62.  
  63. static inline uint32_t divide (uint32_t n, uint32_t d)
  64. {
  65. uint32_t q = 0;
  66.  
  67. asm(
  68. "clr __tmp_reg__\n"
  69. DIVIDE_ITER_0_7(0)
  70. DIVIDE_ITER_0_7(1)
  71. DIVIDE_ITER_0_7(2)
  72. DIVIDE_ITER_0_7(3)
  73. DIVIDE_ITER_0_7(4)
  74. DIVIDE_ITER_0_7(5)
  75. DIVIDE_ITER_0_7(6)
  76. DIVIDE_ITER_0_7(7)
  77. DIVIDE_ITER_8_15(8)
  78. DIVIDE_ITER_8_15(9)
  79. DIVIDE_ITER_8_15(10)
  80. DIVIDE_ITER_8_15(11)
  81. DIVIDE_ITER_8_15(12)
  82. DIVIDE_ITER_8_15(13)
  83. DIVIDE_ITER_8_15(14)
  84. DIVIDE_ITER_8_15(15)
  85. DIVIDE_ITER_16_23(16)
  86. DIVIDE_ITER_16_23(17)
  87. DIVIDE_ITER_16_23(18)
  88. DIVIDE_ITER_16_23(19)
  89. DIVIDE_ITER_16_23(20)
  90. DIVIDE_ITER_16_23(21)
  91. DIVIDE_ITER_16_23(22)
  92. DIVIDE_ITER_16_23(23)
  93. DIVIDE_ITER_24_30(24)
  94. DIVIDE_ITER_24_30(25)
  95. DIVIDE_ITER_24_30(26)
  96. DIVIDE_ITER_24_30(27)
  97. DIVIDE_ITER_24_30(28)
  98. DIVIDE_ITER_24_30(29)
  99. DIVIDE_ITER_24_30(30)
  100. " lsl %A[n]\n"
  101. " rol __tmp_reg__\n"
  102. " rol %D[n]\n"
  103. " rol %C[n]\n"
  104. " rol %B[n]\n"
  105. " cp __tmp_reg__,%A[d]\n"
  106. " cpc %D[n],%B[d]\n"
  107. " cpc %C[n],%C[d]\n"
  108. " cpc %B[n],%D[d]\n"
  109. " sbci %A[q],-1\n"
  110.  
  111. : [q] "=&a" (q),
  112. [n] "=&r" (n)
  113. : "[q]" (q),
  114. "[n]" (n),
  115. [d] "r" (d)
  116. );
  117.  
  118. return q;
  119. }
  120.  
  121. // instructions:
  122. // 4 (init q) + 1 + 8 * 9 + 8 * 11 + 8 * 13 + 7 * 15 + 10 = 384
  123.  
  124. volatile uint32_t test1;
  125. volatile uint32_t test2;
  126. volatile uint32_t test3;
  127.  
  128. int main ()
  129. {
  130. test3 = divide(test1, test2);
  131. //test3 = test1 / test2;
  132. }
  133.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty