fork download
  1. #define SQRT_ITER_0_0(i) \
  2. " cp %D[x],%B[goo]\n" \
  3. " brcs zero_bit_" #i "_%=\n" \
  4. " sub %D[x],%B[goo]\n" \
  5. " or %B[goo],__tmp_reg__\n" \
  6. "zero_bit_" #i "_%=:\n" \
  7. " lsr __tmp_reg__\n" \
  8. " eor %B[goo],__tmp_reg__\n" \
  9. " lsr __tmp_reg__\n" \
  10. " lsr %B[goo]\n"
  11.  
  12. #define SQRT_ITER_1_4(i) \
  13. " cp %D[x],%B[goo]\n" \
  14. " brcs zero_bit_" #i "_%=\n" \
  15. " sub %D[x],%B[goo]\n" \
  16. " or %B[goo],__tmp_reg__\n" \
  17. "zero_bit_" #i "_%=:\n" \
  18. " lsr __tmp_reg__\n" \
  19. " eor %B[goo],__tmp_reg__\n" \
  20. " lsl %B[x]\n" \
  21. " rol %C[x]\n" \
  22. " rol %D[x]\n"
  23.  
  24. #define SQRT_ITER_5_5(i) \
  25. " cp %D[x],%B[goo]\n" \
  26. " brcs zero_bit_" #i "_%=\n" \
  27. " sub %D[x],%B[goo]\n" \
  28. " or %B[goo],__tmp_reg__\n" \
  29. "zero_bit_" #i "_%=:\n" \
  30. " lsr __tmp_reg__\n" \
  31. " ror __tmp_reg__\n" \
  32. " mov %A[goo],__tmp_reg__\n" \
  33. " dec %B[goo]\n" \
  34. " lsl %B[x]\n" \
  35. " rol %C[x]\n" \
  36. " rol %D[x]\n"
  37.  
  38. #define SQRT_ITER_6_6(i) \
  39. " cp %C[x],%A[goo]\n" \
  40. " cpc %D[x],%B[goo]\n" \
  41. " brcs zero_bit_" #i "_%=\n" \
  42. " sub %C[x],%A[goo]\n" \
  43. " sbc %D[x],%B[goo]\n" \
  44. " inc %B[goo]\n" \
  45. "zero_bit_" #i "_%=:\n" \
  46. " asr __tmp_reg__\n" \
  47. " eor %A[goo],__tmp_reg__\n" \
  48. " lsl %B[x]\n" \
  49. " rol %C[x]\n" \
  50. " rol %D[x]\n"
  51.  
  52. #define SQRT_ITER_7_8(i) \
  53. " cp %C[x],%A[goo]\n" \
  54. " cpc %D[x],%B[goo]\n" \
  55. " brcs zero_bit_" #i "_%=\n" \
  56. " sub %C[x],%A[goo]\n" \
  57. " sbc %D[x],%B[goo]\n" \
  58. " or %A[goo],__tmp_reg__\n" \
  59. "zero_bit_" #i "_%=:\n" \
  60. " lsr __tmp_reg__\n" \
  61. " eor %A[goo],__tmp_reg__\n" \
  62. " lsl %B[x]\n" \
  63. " rol %C[x]\n" \
  64. " rol %D[x]\n"
  65.  
  66. #define SQRT_ITER_9_12(i) \
  67. " cp %C[x],%A[goo]\n" \
  68. " cpc %D[x],%B[goo]\n" \
  69. " brcs zero_bit_" #i "_%=\n" \
  70. " sub %C[x],%A[goo]\n" \
  71. " sbc %D[x],%B[goo]\n" \
  72. " or %A[goo],__tmp_reg__\n" \
  73. "zero_bit_" #i "_%=:\n" \
  74. " lsr __tmp_reg__\n" \
  75. " eor %A[goo],__tmp_reg__\n" \
  76. " lsl %A[x]\n" \
  77. " rol %C[x]\n" \
  78. " rol %D[x]\n"
  79.  
  80. #define SQRT_ITER_13_13(i) \
  81. " cp %C[x],%A[goo]\n" \
  82. " cpc %D[x],%B[goo]\n" \
  83. " brcs zero_bit_" #i "_%=\n" \
  84. " sub %C[x],%A[goo]\n" \
  85. " sbc %D[x],%B[goo]\n" \
  86. " or %A[goo],__tmp_reg__\n" \
  87. "zero_bit_" #i "_%=:\n" \
  88. " lsl %A[goo]\n" \
  89. " rol %B[goo]\n" \
  90. " eor %A[goo],__tmp_reg__\n" \
  91. " lsl %A[x]\n" \
  92. " rol %C[x]\n" \
  93. " rol %D[x]\n" \
  94. " lsl %A[x]\n" \
  95. " rol %C[x]\n" \
  96. " rol %D[x]\n"
  97.  
  98. #define SQRT_ITER_14_14(i) \
  99. " brcs one_bit_" #i "_%=\n" \
  100. " cp %C[x],%A[goo]\n" \
  101. " cpc %D[x],%B[goo]\n" \
  102. " brcs zero_bit_" #i "_%=\n" \
  103. "one_bit_" #i "_%=:\n" \
  104. " sub %C[x],%A[goo]\n" \
  105. " sbc %D[x],%B[goo]\n" \
  106. " or %A[goo],__tmp_reg__\n" \
  107. "zero_bit_" #i "_%=:\n" \
  108. " dec %A[goo]\n" \
  109. " lsl %A[x]\n" \
  110. " rol %C[x]\n" \
  111. " rol %D[x]\n"
  112.  
  113. static uint16_t call (uint32_t x)
  114. {
  115. uint16_t goo = UINT16_C(0x40C0);
  116.  
  117. asm(
  118. " mov __tmp_reg__,%A[goo]\n"
  119. SQRT_ITER_0_0(0)
  120. SQRT_ITER_1_4(1)
  121. SQRT_ITER_1_4(2)
  122. SQRT_ITER_1_4(3)
  123. SQRT_ITER_1_4(4)
  124. SQRT_ITER_5_5(5)
  125. SQRT_ITER_6_6(6)
  126. SQRT_ITER_7_8(7)
  127. SQRT_ITER_7_8(8)
  128. SQRT_ITER_9_12(9)
  129. SQRT_ITER_9_12(10)
  130. SQRT_ITER_9_12(11)
  131. SQRT_ITER_9_12(12)
  132. SQRT_ITER_13_13(13)
  133. SQRT_ITER_14_14(14)
  134. " brcs end_inc%=\n"
  135. " lsl %A[x]\n"
  136. " cpc %A[goo],%C[x]\n"
  137. " cpc %B[goo],%D[x]\n"
  138. "end_inc%=:\n"
  139. " adc %A[goo],__zero_reg__\n"
  140.  
  141. : [goo] "=&r" (goo),
  142. [x] "=&r" (x)
  143. : "[x]" (x),
  144. "[goo]" (goo)
  145. );
  146.  
  147. return goo;
  148. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty