#include <stdint.h>
#define DIVIDE_ITER_0_7(i) \
" lsl %D[n]\n" \
" rol __tmp_reg__\n" \
" cp __tmp_reg__,%A[d]\n" \
" cpc __zero_reg__,%B[d]\n" \
" cpc __zero_reg__,%C[d]\n" \
" cpc __zero_reg__,%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub __tmp_reg__,%A[d]\n" \
" ori %D[q],1<<(7-" #i ")\n" \
"zero_bit_" #i "__%=:\n"
#define DIVIDE_ITER_8_15(i) \
" lsl %C[n]\n" \
" rol __tmp_reg__\n" \
" rol %D[n]\n" \
" cp __tmp_reg__,%A[d]\n" \
" cpc %D[n],%B[d]\n" \
" cpc __zero_reg__,%C[d]\n" \
" cpc __zero_reg__,%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub __tmp_reg__,%A[d]\n" \
" sbc %D[n],%B[d]\n" \
" ori %C[q],1<<(15-" #i ")\n" \
"zero_bit_" #i "__%=:\n"
#define DIVIDE_ITER_16_23(i) \
" lsl %B[n]\n" \
" rol __tmp_reg__\n" \
" rol %D[n]\n" \
" rol %C[n]\n" \
" cp __tmp_reg__,%A[d]\n" \
" cpc %D[n],%B[d]\n" \
" cpc %C[n],%C[d]\n" \
" cpc __zero_reg__,%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub __tmp_reg__,%A[d]\n" \
" sbc %D[n],%B[d]\n" \
" sbc %C[n],%C[d]\n" \
" ori %B[q],1<<(23-" #i ")\n" \
"zero_bit_" #i "__%=:\n"
#define DIVIDE_ITER_24_30(i) \
" lsl %A[n]\n" \
" rol __tmp_reg__\n" \
" rol %D[n]\n" \
" rol %C[n]\n" \
" rol %B[n]\n" \
" cp __tmp_reg__,%A[d]\n" \
" cpc %D[n],%B[d]\n" \
" cpc %C[n],%C[d]\n" \
" cpc %B[n],%D[d]\n" \
" brcs zero_bit_" #i "__%=\n" \
" sub __tmp_reg__,%A[d]\n" \
" sbc %D[n],%B[d]\n" \
" sbc %C[n],%C[d]\n" \
" sbc %B[n],%D[d]\n" \
" ori %A[q],1<<(31-" #i ")\n" \
"zero_bit_" #i "__%=:\n"
static inline uint32_t divide (uint32_t n, uint32_t d)
{
uint32_t q = 0;
asm(
"clr __tmp_reg__\n"
DIVIDE_ITER_0_7(0)
DIVIDE_ITER_0_7(1)
DIVIDE_ITER_0_7(2)
DIVIDE_ITER_0_7(3)
DIVIDE_ITER_0_7(4)
DIVIDE_ITER_0_7(5)
DIVIDE_ITER_0_7(6)
DIVIDE_ITER_0_7(7)
DIVIDE_ITER_8_15(8)
DIVIDE_ITER_8_15(9)
DIVIDE_ITER_8_15(10)
DIVIDE_ITER_8_15(11)
DIVIDE_ITER_8_15(12)
DIVIDE_ITER_8_15(13)
DIVIDE_ITER_8_15(14)
DIVIDE_ITER_8_15(15)
DIVIDE_ITER_16_23(16)
DIVIDE_ITER_16_23(17)
DIVIDE_ITER_16_23(18)
DIVIDE_ITER_16_23(19)
DIVIDE_ITER_16_23(20)
DIVIDE_ITER_16_23(21)
DIVIDE_ITER_16_23(22)
DIVIDE_ITER_16_23(23)
DIVIDE_ITER_24_30(24)
DIVIDE_ITER_24_30(25)
DIVIDE_ITER_24_30(26)
DIVIDE_ITER_24_30(27)
DIVIDE_ITER_24_30(28)
DIVIDE_ITER_24_30(29)
DIVIDE_ITER_24_30(30)
" lsl %A[n]\n"
" rol __tmp_reg__\n"
" rol %D[n]\n"
" rol %C[n]\n"
" rol %B[n]\n"
" cp __tmp_reg__,%A[d]\n"
" cpc %D[n],%B[d]\n"
" cpc %C[n],%C[d]\n"
" cpc %B[n],%D[d]\n"
" sbci %A[q],-1\n"
: [q] "=&a" (q),
[n] "=&r" (n)
: "[q]" (q),
"[n]" (n),
[d] "r" (d)
);
return q;
}
// instructions:
// 4 (init q) + 1 + 8 * 9 + 8 * 11 + 8 * 13 + 7 * 15 + 10 = 384
volatile uint32_t test1;
volatile uint32_t test2;
volatile uint32_t test3;
int main ()
{
test3 = divide(test1, test2);
//test3 = test1 / test2;
}
I2luY2x1ZGUgPHN0ZGludC5oPgoKI2RlZmluZSBESVZJREVfSVRFUl8wXzcoaSkgXAoiICAgIGxzbCAlRFtuXVxuIiBcCiIgICAgcm9sIF9fdG1wX3JlZ19fXG4iIFwKIiAgICBjcCBfX3RtcF9yZWdfXywlQVtkXVxuIiBcCiIgICAgY3BjIF9femVyb19yZWdfXywlQltkXVxuIiBcCiIgICAgY3BjIF9femVyb19yZWdfXywlQ1tkXVxuIiBcCiIgICAgY3BjIF9femVyb19yZWdfXywlRFtkXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfXyU9XG4iIFwKIiAgICBzdWIgX190bXBfcmVnX18sJUFbZF1cbiIgXAoiICAgIG9yaSAlRFtxXSwxPDwoNy0iICNpICIpXG4iIFwKInplcm9fYml0XyIgI2kgIl9fJT06XG4iCgojZGVmaW5lIERJVklERV9JVEVSXzhfMTUoaSkgXAoiICAgIGxzbCAlQ1tuXVxuIiBcCiIgICAgcm9sIF9fdG1wX3JlZ19fXG4iIFwKIiAgICByb2wgJURbbl1cbiIgXAoiICAgIGNwIF9fdG1wX3JlZ19fLCVBW2RdXG4iIFwKIiAgICBjcGMgJURbbl0sJUJbZF1cbiIgXAoiICAgIGNwYyBfX3plcm9fcmVnX18sJUNbZF1cbiIgXAoiICAgIGNwYyBfX3plcm9fcmVnX18sJURbZF1cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiX18lPVxuIiBcCiIgICAgc3ViIF9fdG1wX3JlZ19fLCVBW2RdXG4iIFwKIiAgICBzYmMgJURbbl0sJUJbZF1cbiIgXAoiICAgIG9yaSAlQ1txXSwxPDwoMTUtIiAjaSAiKVxuIiBcCiJ6ZXJvX2JpdF8iICNpICJfXyU9OlxuIgoKI2RlZmluZSBESVZJREVfSVRFUl8xNl8yMyhpKSBcCiIgICAgbHNsICVCW25dXG4iIFwKIiAgICByb2wgX190bXBfcmVnX19cbiIgXAoiICAgIHJvbCAlRFtuXVxuIiBcCiIgICAgcm9sICVDW25dXG4iIFwKIiAgICBjcCBfX3RtcF9yZWdfXywlQVtkXVxuIiBcCiIgICAgY3BjICVEW25dLCVCW2RdXG4iIFwKIiAgICBjcGMgJUNbbl0sJUNbZF1cbiIgXAoiICAgIGNwYyBfX3plcm9fcmVnX18sJURbZF1cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiX18lPVxuIiBcCiIgICAgc3ViIF9fdG1wX3JlZ19fLCVBW2RdXG4iIFwKIiAgICBzYmMgJURbbl0sJUJbZF1cbiIgXAoiICAgIHNiYyAlQ1tuXSwlQ1tkXVxuIiBcCiIgICAgb3JpICVCW3FdLDE8PCgyMy0iICNpICIpXG4iIFwKInplcm9fYml0XyIgI2kgIl9fJT06XG4iCgojZGVmaW5lIERJVklERV9JVEVSXzI0XzMwKGkpIFwKIiAgICBsc2wgJUFbbl1cbiIgXAoiICAgIHJvbCBfX3RtcF9yZWdfX1xuIiBcCiIgICAgcm9sICVEW25dXG4iIFwKIiAgICByb2wgJUNbbl1cbiIgXAoiICAgIHJvbCAlQltuXVxuIiBcCiIgICAgY3AgX190bXBfcmVnX18sJUFbZF1cbiIgXAoiICAgIGNwYyAlRFtuXSwlQltkXVxuIiBcCiIgICAgY3BjICVDW25dLCVDW2RdXG4iIFwKIiAgICBjcGMgJUJbbl0sJURbZF1cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiX18lPVxuIiBcCiIgICAgc3ViIF9fdG1wX3JlZ19fLCVBW2RdXG4iIFwKIiAgICBzYmMgJURbbl0sJUJbZF1cbiIgXAoiICAgIHNiYyAlQ1tuXSwlQ1tkXVxuIiBcCiIgICAgc2JjICVCW25dLCVEW2RdXG4iIFwKIiAgICBvcmkgJUFbcV0sMTw8KDMxLSIgI2kgIilcbiIgXAoiemVyb19iaXRfIiAjaSAiX18lPTpcbiIKCnN0YXRpYyBpbmxpbmUgdWludDMyX3QgZGl2aWRlICh1aW50MzJfdCBuLCB1aW50MzJfdCBkKQp7CiAgICB1aW50MzJfdCBxID0gMDsKICAgIAogICAgYXNtKAogICAgICAgICJjbHIgX190bXBfcmVnX19cbiIKICAgICAgICBESVZJREVfSVRFUl8wXzcoMCkKICAgICAgICBESVZJREVfSVRFUl8wXzcoMSkKICAgICAgICBESVZJREVfSVRFUl8wXzcoMikKICAgICAgICBESVZJREVfSVRFUl8wXzcoMykKICAgICAgICBESVZJREVfSVRFUl8wXzcoNCkKICAgICAgICBESVZJREVfSVRFUl8wXzcoNSkKICAgICAgICBESVZJREVfSVRFUl8wXzcoNikKICAgICAgICBESVZJREVfSVRFUl8wXzcoNykKICAgICAgICBESVZJREVfSVRFUl84XzE1KDgpCiAgICAgICAgRElWSURFX0lURVJfOF8xNSg5KQogICAgICAgIERJVklERV9JVEVSXzhfMTUoMTApCiAgICAgICAgRElWSURFX0lURVJfOF8xNSgxMSkKICAgICAgICBESVZJREVfSVRFUl84XzE1KDEyKQogICAgICAgIERJVklERV9JVEVSXzhfMTUoMTMpCiAgICAgICAgRElWSURFX0lURVJfOF8xNSgxNCkKICAgICAgICBESVZJREVfSVRFUl84XzE1KDE1KQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDE2KQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDE3KQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDE4KQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDE5KQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDIwKQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDIxKQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDIyKQogICAgICAgIERJVklERV9JVEVSXzE2XzIzKDIzKQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDI0KQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDI1KQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDI2KQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDI3KQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDI4KQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDI5KQogICAgICAgIERJVklERV9JVEVSXzI0XzMwKDMwKQogICAgICAgICIgICAgbHNsICVBW25dXG4iCiAgICAgICAgIiAgICByb2wgX190bXBfcmVnX19cbiIKICAgICAgICAiICAgIHJvbCAlRFtuXVxuIgogICAgICAgICIgICAgcm9sICVDW25dXG4iCiAgICAgICAgIiAgICByb2wgJUJbbl1cbiIKICAgICAgICAiICAgIGNwIF9fdG1wX3JlZ19fLCVBW2RdXG4iCiAgICAgICAgIiAgICBjcGMgJURbbl0sJUJbZF1cbiIKICAgICAgICAiICAgIGNwYyAlQ1tuXSwlQ1tkXVxuIgogICAgICAgICIgICAgY3BjICVCW25dLCVEW2RdXG4iCiAgICAgICAgIiAgICBzYmNpICVBW3FdLC0xXG4iCiAgICAgICAgCiAgICAgICAgOiBbcV0gIj0mYSIgKHEpLAogICAgICAgICAgW25dICI9JnIiIChuKQogICAgICAgIDogIltxXSIgKHEpLAogICAgICAgICAgIltuXSIgKG4pLAogICAgICAgICAgW2RdICJyIiAoZCkKICAgICk7CiAgICAKICAgIHJldHVybiBxOwp9CgovLyBpbnN0cnVjdGlvbnM6Ci8vIDQgKGluaXQgcSkgKyAxICsgOCAqIDkgKyA4ICogMTEgKyA4ICogMTMgKyA3ICogMTUgKyAxMCA9IDM4NAoKdm9sYXRpbGUgdWludDMyX3QgdGVzdDE7CnZvbGF0aWxlIHVpbnQzMl90IHRlc3QyOwp2b2xhdGlsZSB1aW50MzJfdCB0ZXN0MzsKCmludCBtYWluICgpCnsKICAgIHRlc3QzID0gZGl2aWRlKHRlc3QxLCB0ZXN0Mik7CiAgICAvL3Rlc3QzID0gdGVzdDEgLyB0ZXN0MjsKfQo=