#include <stdint.h>
#define DIVIDE_ITER_0_6(i) \
" lsl %D[n]\n" \
" rol %A[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" or %D[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" lsr __tmp_reg__\n"
#define DIVIDE_ITER_7_7(i) \
" lsl %D[n]\n" \
" rol %A[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" or %D[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" mov __tmp_reg__,%A[q]\n"
#define DIVIDE_ITER_8_14(i) \
" lsl %C[n]\n" \
" rol %A[p]\n" \
" rol %B[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" sbc %B[p],%B[d]\n" \
" or %C[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" lsr __tmp_reg__\n"
#define DIVIDE_ITER_15_15(i) \
" lsl %C[n]\n" \
" rol %A[p]\n" \
" rol %B[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" sbc %B[p],%B[d]\n" \
" or %C[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" mov __tmp_reg__,%A[q]\n"
#define DIVIDE_ITER_16_22(i) \
" lsl %B[n]\n" \
" rol %A[p]\n" \
" rol %B[p]\n" \
" rol %C[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" sbc %B[p],%B[d]\n" \
" sbc %C[p],%C[d]\n" \
" or %B[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" lsr __tmp_reg__\n"
#define DIVIDE_ITER_23_23(i) \
" lsl %B[n]\n" \
" rol %A[p]\n" \
" rol %B[p]\n" \
" rol %C[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" sbc %B[p],%B[d]\n" \
" sbc %C[p],%C[d]\n" \
" or %B[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" mov __tmp_reg__,%A[q]\n" \
" clr %A[q]\n"
#define DIVIDE_ITER_24_29(i) \
" lsl %A[n]\n" \
" rol %A[p]\n" \
" rol %B[p]\n" \
" rol %C[p]\n" \
" rol %D[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" sbc %B[p],%B[d]\n" \
" sbc %C[p],%C[d]\n" \
" sbc %D[p],%D[d]\n" \
" or %A[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
" lsr __tmp_reg__\n"
#define DIVIDE_ITER_30_30(i) \
" lsl %A[n]\n" \
" rol %A[p]\n" \
" rol %B[p]\n" \
" rol %C[p]\n" \
" rol %D[p]\n" \
" cp %A[p],%A[d]\n" \
" cpc %B[p],%B[d]\n" \
" cpc %C[p],%C[d]\n" \
" cpc %D[p],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub %A[p],%A[d]\n" \
" sbc %B[p],%B[d]\n" \
" sbc %C[p],%C[d]\n" \
" sbc %D[p],%D[d]\n" \
" or %A[q],__tmp_reg__\n" \
"zero_bit_" #i "__%=:\n" \
uint32_t div_mine (uint32_t n, uint32_t d)
{
uint32_t p = 0;
uint32_t q = 0x80;
__asm__(
" mov __tmp_reg__,%A[q]\n"
DIVIDE_ITER_0_6(0)
DIVIDE_ITER_0_6(1)
DIVIDE_ITER_0_6(2)
DIVIDE_ITER_0_6(3)
DIVIDE_ITER_0_6(4)
DIVIDE_ITER_0_6(5)
DIVIDE_ITER_0_6(6)
DIVIDE_ITER_7_7(7)
DIVIDE_ITER_8_14(8)
DIVIDE_ITER_8_14(9)
DIVIDE_ITER_8_14(10)
DIVIDE_ITER_8_14(11)
DIVIDE_ITER_8_14(12)
DIVIDE_ITER_8_14(13)
DIVIDE_ITER_8_14(14)
DIVIDE_ITER_15_15(15)
DIVIDE_ITER_16_22(16)
DIVIDE_ITER_16_22(17)
DIVIDE_ITER_16_22(18)
DIVIDE_ITER_16_22(19)
DIVIDE_ITER_16_22(20)
DIVIDE_ITER_16_22(21)
DIVIDE_ITER_16_22(22)
DIVIDE_ITER_23_23(23)
DIVIDE_ITER_24_29(24)
DIVIDE_ITER_24_29(25)
DIVIDE_ITER_24_29(26)
DIVIDE_ITER_24_29(27)
DIVIDE_ITER_24_29(28)
DIVIDE_ITER_24_29(29)
DIVIDE_ITER_30_30(30)
" lsl %A[n]\n"
" rol %A[p]\n"
" rol %B[p]\n"
" rol %C[p]\n"
" rol %D[p]\n"
" cp %A[p],%A[d]\n"
" cpc %B[p],%B[d]\n"
" cpc %C[p],%C[d]\n"
" cpc %D[p],%D[d]\n"
" brcs end_zero_bit_%=\n"
" inc %A[q]\n"
"end_zero_bit_%=:\n"
: [p] "=&r" (p),
[q] "=&r" (q),
[n] "=&r" (n)
: "[p]" (p),
"[q]" (q),
"[n]" (n),
[d] "r" (d)
);
return q;
}
I2luY2x1ZGUgPHN0ZGludC5oPgoKI2RlZmluZSBESVZJREVfSVRFUl8wXzYoaSkgXAoiICAgIGxzbCAlRFtuXVxuIiBcCiIgICAgcm9sICVBW3BdXG4iIFwKIiAgICBjcCAlQVtwXSwlQVtkXVxuIiBcCiIgICAgY3BjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBjcGMgJUNbcF0sJUNbZF1cbiIgXAoiICAgIGNwYyAlRFtwXSwlRFtkXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfXyU9XG4iIFwKIiAgICBzdWIgJUFbcF0sJUFbZF1cbiIgXAoiICAgIG9yICVEW3FdLF9fdG1wX3JlZ19fXG4iIFwKInplcm9fYml0XyIgI2kgIl9fJT06XG4iIFwKIiAgICBsc3IgX190bXBfcmVnX19cbiIKCiNkZWZpbmUgRElWSURFX0lURVJfN183KGkpIFwKIiAgICBsc2wgJURbbl1cbiIgXAoiICAgIHJvbCAlQVtwXVxuIiBcCiIgICAgY3AgJUFbcF0sJUFbZF1cbiIgXAoiICAgIGNwYyAlQltwXSwlQltkXVxuIiBcCiIgICAgY3BjICVDW3BdLCVDW2RdXG4iIFwKIiAgICBjcGMgJURbcF0sJURbZF1cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiX18lPVxuIiBcCiIgICAgc3ViICVBW3BdLCVBW2RdXG4iIFwKIiAgICBvciAlRFtxXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfXyU9OlxuIiBcCiIgICAgbW92IF9fdG1wX3JlZ19fLCVBW3FdXG4iCgojZGVmaW5lIERJVklERV9JVEVSXzhfMTQoaSkgXAoiICAgIGxzbCAlQ1tuXVxuIiBcCiIgICAgcm9sICVBW3BdXG4iIFwKIiAgICByb2wgJUJbcF1cbiIgXAoiICAgIGNwICVBW3BdLCVBW2RdXG4iIFwKIiAgICBjcGMgJUJbcF0sJUJbZF1cbiIgXAoiICAgIGNwYyAlQ1twXSwlQ1tkXVxuIiBcCiIgICAgY3BjICVEW3BdLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiAlQVtwXSwlQVtkXVxuIiBcCiIgICAgc2JjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBvciAlQ1txXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfXyU9OlxuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iCgojZGVmaW5lIERJVklERV9JVEVSXzE1XzE1KGkpIFwKIiAgICBsc2wgJUNbbl1cbiIgXAoiICAgIHJvbCAlQVtwXVxuIiBcCiIgICAgcm9sICVCW3BdXG4iIFwKIiAgICBjcCAlQVtwXSwlQVtkXVxuIiBcCiIgICAgY3BjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBjcGMgJUNbcF0sJUNbZF1cbiIgXAoiICAgIGNwYyAlRFtwXSwlRFtkXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfXyU9XG4iIFwKIiAgICBzdWIgJUFbcF0sJUFbZF1cbiIgXAoiICAgIHNiYyAlQltwXSwlQltkXVxuIiBcCiIgICAgb3IgJUNbcV0sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiX18lPTpcbiIgXAoiICAgIG1vdiBfX3RtcF9yZWdfXywlQVtxXVxuIgoKI2RlZmluZSBESVZJREVfSVRFUl8xNl8yMihpKSBcCiIgICAgbHNsICVCW25dXG4iIFwKIiAgICByb2wgJUFbcF1cbiIgXAoiICAgIHJvbCAlQltwXVxuIiBcCiIgICAgcm9sICVDW3BdXG4iIFwKIiAgICBjcCAlQVtwXSwlQVtkXVxuIiBcCiIgICAgY3BjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBjcGMgJUNbcF0sJUNbZF1cbiIgXAoiICAgIGNwYyAlRFtwXSwlRFtkXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfXyU9XG4iIFwKIiAgICBzdWIgJUFbcF0sJUFbZF1cbiIgXAoiICAgIHNiYyAlQltwXSwlQltkXVxuIiBcCiIgICAgc2JjICVDW3BdLCVDW2RdXG4iIFwKIiAgICBvciAlQltxXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfXyU9OlxuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iCgojZGVmaW5lIERJVklERV9JVEVSXzIzXzIzKGkpIFwKIiAgICBsc2wgJUJbbl1cbiIgXAoiICAgIHJvbCAlQVtwXVxuIiBcCiIgICAgcm9sICVCW3BdXG4iIFwKIiAgICByb2wgJUNbcF1cbiIgXAoiICAgIGNwICVBW3BdLCVBW2RdXG4iIFwKIiAgICBjcGMgJUJbcF0sJUJbZF1cbiIgXAoiICAgIGNwYyAlQ1twXSwlQ1tkXVxuIiBcCiIgICAgY3BjICVEW3BdLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiAlQVtwXSwlQVtkXVxuIiBcCiIgICAgc2JjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBzYmMgJUNbcF0sJUNbZF1cbiIgXAoiICAgIG9yICVCW3FdLF9fdG1wX3JlZ19fXG4iIFwKInplcm9fYml0XyIgI2kgIl9fJT06XG4iIFwKIiAgICBtb3YgX190bXBfcmVnX18sJUFbcV1cbiIgXAoiICAgIGNsciAlQVtxXVxuIgoKI2RlZmluZSBESVZJREVfSVRFUl8yNF8yOShpKSBcCiIgICAgbHNsICVBW25dXG4iIFwKIiAgICByb2wgJUFbcF1cbiIgXAoiICAgIHJvbCAlQltwXVxuIiBcCiIgICAgcm9sICVDW3BdXG4iIFwKIiAgICByb2wgJURbcF1cbiIgXAoiICAgIGNwICVBW3BdLCVBW2RdXG4iIFwKIiAgICBjcGMgJUJbcF0sJUJbZF1cbiIgXAoiICAgIGNwYyAlQ1twXSwlQ1tkXVxuIiBcCiIgICAgY3BjICVEW3BdLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiAlQVtwXSwlQVtkXVxuIiBcCiIgICAgc2JjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBzYmMgJUNbcF0sJUNbZF1cbiIgXAoiICAgIHNiYyAlRFtwXSwlRFtkXVxuIiBcCiIgICAgb3IgJUFbcV0sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiX18lPTpcbiIgXAoiICAgIGxzciBfX3RtcF9yZWdfX1xuIgoKI2RlZmluZSBESVZJREVfSVRFUl8zMF8zMChpKSBcCiIgICAgbHNsICVBW25dXG4iIFwKIiAgICByb2wgJUFbcF1cbiIgXAoiICAgIHJvbCAlQltwXVxuIiBcCiIgICAgcm9sICVDW3BdXG4iIFwKIiAgICByb2wgJURbcF1cbiIgXAoiICAgIGNwICVBW3BdLCVBW2RdXG4iIFwKIiAgICBjcGMgJUJbcF0sJUJbZF1cbiIgXAoiICAgIGNwYyAlQ1twXSwlQ1tkXVxuIiBcCiIgICAgY3BjICVEW3BdLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiAlQVtwXSwlQVtkXVxuIiBcCiIgICAgc2JjICVCW3BdLCVCW2RdXG4iIFwKIiAgICBzYmMgJUNbcF0sJUNbZF1cbiIgXAoiICAgIHNiYyAlRFtwXSwlRFtkXVxuIiBcCiIgICAgb3IgJUFbcV0sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiX18lPTpcbiIgXAoKdWludDMyX3QgZGl2X21pbmUgKHVpbnQzMl90IG4sIHVpbnQzMl90IGQpCnsKICAgIHVpbnQzMl90IHAgPSAwOwogICAgdWludDMyX3QgcSA9IDB4ODA7CiAgICAKICAgIF9fYXNtX18oCiAgICAgICAgIiAgICBtb3YgX190bXBfcmVnX18sJUFbcV1cbiIKICAgICAgICBESVZJREVfSVRFUl8wXzYoMCkKICAgICAgICBESVZJREVfSVRFUl8wXzYoMSkKICAgICAgICBESVZJREVfSVRFUl8wXzYoMikKICAgICAgICBESVZJREVfSVRFUl8wXzYoMykKICAgICAgICBESVZJREVfSVRFUl8wXzYoNCkKICAgICAgICBESVZJREVfSVRFUl8wXzYoNSkKICAgICAgICBESVZJREVfSVRFUl8wXzYoNikKICAgICAgICBESVZJREVfSVRFUl83XzcoNykKICAgICAgICBESVZJREVfSVRFUl84XzE0KDgpCiAgICAgICAgRElWSURFX0lURVJfOF8xNCg5KQogICAgICAgIERJVklERV9JVEVSXzhfMTQoMTApCiAgICAgICAgRElWSURFX0lURVJfOF8xNCgxMSkKICAgICAgICBESVZJREVfSVRFUl84XzE0KDEyKQogICAgICAgIERJVklERV9JVEVSXzhfMTQoMTMpCiAgICAgICAgRElWSURFX0lURVJfOF8xNCgxNCkKICAgICAgICBESVZJREVfSVRFUl8xNV8xNSgxNSkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigxNikKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigxNykKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigxOCkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigxOSkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigyMCkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigyMSkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMigyMikKICAgICAgICBESVZJREVfSVRFUl8yM18yMygyMykKICAgICAgICBESVZJREVfSVRFUl8yNF8yOSgyNCkKICAgICAgICBESVZJREVfSVRFUl8yNF8yOSgyNSkKICAgICAgICBESVZJREVfSVRFUl8yNF8yOSgyNikKICAgICAgICBESVZJREVfSVRFUl8yNF8yOSgyNykKICAgICAgICBESVZJREVfSVRFUl8yNF8yOSgyOCkKICAgICAgICBESVZJREVfSVRFUl8yNF8yOSgyOSkKICAgICAgICBESVZJREVfSVRFUl8zMF8zMCgzMCkKICAgICAgICAiICAgIGxzbCAlQVtuXVxuIgogICAgICAgICIgICAgcm9sICVBW3BdXG4iCiAgICAgICAgIiAgICByb2wgJUJbcF1cbiIKICAgICAgICAiICAgIHJvbCAlQ1twXVxuIgogICAgICAgICIgICAgcm9sICVEW3BdXG4iCiAgICAgICAgIiAgICBjcCAlQVtwXSwlQVtkXVxuIgogICAgICAgICIgICAgY3BjICVCW3BdLCVCW2RdXG4iCiAgICAgICAgIiAgICBjcGMgJUNbcF0sJUNbZF1cbiIKICAgICAgICAiICAgIGNwYyAlRFtwXSwlRFtkXVxuIgogICAgICAgICIgICAgYnJjcyBlbmRfemVyb19iaXRfJT1cbiIKICAgICAgICAiICAgIGluYyAlQVtxXVxuIgogICAgICAgICJlbmRfemVyb19iaXRfJT06XG4iCiAgICAgICAgCiAgICAgICAgOiBbcF0gIj0mciIgKHApLAogICAgICAgICAgW3FdICI9JnIiIChxKSwKICAgICAgICAgIFtuXSAiPSZyIiAobikKICAgICAgICA6ICJbcF0iIChwKSwKICAgICAgICAgICJbcV0iIChxKSwKICAgICAgICAgICJbbl0iIChuKSwKICAgICAgICAgIFtkXSAiciIgKGQpCiAgICApOwogICAgCiAgICByZXR1cm4gcTsKfQo=