#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 uint32_t call (uint32_t n, uint32_t d)
{
AMBRO_ASSERT(d != 0)
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"
" brcs end_zero_bit_%=\n"
" inc %A[q]\n"
"end_zero_bit_%=:\n"
: [q] "=&a" (q),
[n] "=&r" (n)
: "[q]" (q),
"[n]" (n),
[d] "r" (d)
);
return q;
}
CiNkZWZpbmUgRElWSURFX0lURVJfMF83KGkpIFwKIiAgICBsc2wgJURbbl1cbiIgXAoiICAgIHJvbCBfX3RtcF9yZWdfX1xuIiBcCiIgICAgY3AgX190bXBfcmVnX18sJUFbZF1cbiIgXAoiICAgIGNwYyBfX3plcm9fcmVnX18sJUJbZF1cbiIgXAoiICAgIGNwYyBfX3plcm9fcmVnX18sJUNbZF1cbiIgXAoiICAgIGNwYyBfX3plcm9fcmVnX18sJURbZF1cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiX18lPVxuIiBcCiIgICAgc3ViIF9fdG1wX3JlZ19fLCVBW2RdXG4iIFwKIiAgICBvcmkgJURbcV0sMTw8KDctIiAjaSAiKVxuIiBcCiJ6ZXJvX2JpdF8iICNpICJfXyU9OlxuIgoKI2RlZmluZSBESVZJREVfSVRFUl84XzE1KGkpIFwKIiAgICBsc2wgJUNbbl1cbiIgXAoiICAgIHJvbCBfX3RtcF9yZWdfX1xuIiBcCiIgICAgcm9sICVEW25dXG4iIFwKIiAgICBjcCBfX3RtcF9yZWdfXywlQVtkXVxuIiBcCiIgICAgY3BjICVEW25dLCVCW2RdXG4iIFwKIiAgICBjcGMgX196ZXJvX3JlZ19fLCVDW2RdXG4iIFwKIiAgICBjcGMgX196ZXJvX3JlZ19fLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiBfX3RtcF9yZWdfXywlQVtkXVxuIiBcCiIgICAgc2JjICVEW25dLCVCW2RdXG4iIFwKIiAgICBvcmkgJUNbcV0sMTw8KDE1LSIgI2kgIilcbiIgXAoiemVyb19iaXRfIiAjaSAiX18lPTpcbiIKCiNkZWZpbmUgRElWSURFX0lURVJfMTZfMjMoaSkgXAoiICAgIGxzbCAlQltuXVxuIiBcCiIgICAgcm9sIF9fdG1wX3JlZ19fXG4iIFwKIiAgICByb2wgJURbbl1cbiIgXAoiICAgIHJvbCAlQ1tuXVxuIiBcCiIgICAgY3AgX190bXBfcmVnX18sJUFbZF1cbiIgXAoiICAgIGNwYyAlRFtuXSwlQltkXVxuIiBcCiIgICAgY3BjICVDW25dLCVDW2RdXG4iIFwKIiAgICBjcGMgX196ZXJvX3JlZ19fLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiBfX3RtcF9yZWdfXywlQVtkXVxuIiBcCiIgICAgc2JjICVEW25dLCVCW2RdXG4iIFwKIiAgICBzYmMgJUNbbl0sJUNbZF1cbiIgXAoiICAgIG9yaSAlQltxXSwxPDwoMjMtIiAjaSAiKVxuIiBcCiJ6ZXJvX2JpdF8iICNpICJfXyU9OlxuIgoKI2RlZmluZSBESVZJREVfSVRFUl8yNF8zMChpKSBcCiIgICAgbHNsICVBW25dXG4iIFwKIiAgICByb2wgX190bXBfcmVnX19cbiIgXAoiICAgIHJvbCAlRFtuXVxuIiBcCiIgICAgcm9sICVDW25dXG4iIFwKIiAgICByb2wgJUJbbl1cbiIgXAoiICAgIGNwIF9fdG1wX3JlZ19fLCVBW2RdXG4iIFwKIiAgICBjcGMgJURbbl0sJUJbZF1cbiIgXAoiICAgIGNwYyAlQ1tuXSwlQ1tkXVxuIiBcCiIgICAgY3BjICVCW25dLCVEW2RdXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl9fJT1cbiIgXAoiICAgIHN1YiBfX3RtcF9yZWdfXywlQVtkXVxuIiBcCiIgICAgc2JjICVEW25dLCVCW2RdXG4iIFwKIiAgICBzYmMgJUNbbl0sJUNbZF1cbiIgXAoiICAgIHNiYyAlQltuXSwlRFtkXVxuIiBcCiIgICAgb3JpICVBW3FdLDE8PCgzMS0iICNpICIpXG4iIFwKInplcm9fYml0XyIgI2kgIl9fJT06XG4iCgpzdGF0aWMgdWludDMyX3QgY2FsbCAodWludDMyX3QgbiwgdWludDMyX3QgZCkKewogICAgQU1CUk9fQVNTRVJUKGQgIT0gMCkKICAgIAogICAgdWludDMyX3QgcSA9IDA7CiAgICAKICAgIGFzbSgKICAgICAgICAiY2xyIF9fdG1wX3JlZ19fXG4iCiAgICAgICAgRElWSURFX0lURVJfMF83KDApCiAgICAgICAgRElWSURFX0lURVJfMF83KDEpCiAgICAgICAgRElWSURFX0lURVJfMF83KDIpCiAgICAgICAgRElWSURFX0lURVJfMF83KDMpCiAgICAgICAgRElWSURFX0lURVJfMF83KDQpCiAgICAgICAgRElWSURFX0lURVJfMF83KDUpCiAgICAgICAgRElWSURFX0lURVJfMF83KDYpCiAgICAgICAgRElWSURFX0lURVJfMF83KDcpCiAgICAgICAgRElWSURFX0lURVJfOF8xNSg4KQogICAgICAgIERJVklERV9JVEVSXzhfMTUoOSkKICAgICAgICBESVZJREVfSVRFUl84XzE1KDEwKQogICAgICAgIERJVklERV9JVEVSXzhfMTUoMTEpCiAgICAgICAgRElWSURFX0lURVJfOF8xNSgxMikKICAgICAgICBESVZJREVfSVRFUl84XzE1KDEzKQogICAgICAgIERJVklERV9JVEVSXzhfMTUoMTQpCiAgICAgICAgRElWSURFX0lURVJfOF8xNSgxNSkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygxNikKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygxNykKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygxOCkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygxOSkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygyMCkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygyMSkKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygyMikKICAgICAgICBESVZJREVfSVRFUl8xNl8yMygyMykKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgyNCkKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgyNSkKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgyNikKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgyNykKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgyOCkKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgyOSkKICAgICAgICBESVZJREVfSVRFUl8yNF8zMCgzMCkKICAgICAgICAiICAgIGxzbCAlQVtuXVxuIgogICAgICAgICIgICAgcm9sIF9fdG1wX3JlZ19fXG4iCiAgICAgICAgIiAgICByb2wgJURbbl1cbiIKICAgICAgICAiICAgIHJvbCAlQ1tuXVxuIgogICAgICAgICIgICAgcm9sICVCW25dXG4iCiAgICAgICAgIiAgICBjcCBfX3RtcF9yZWdfXywlQVtkXVxuIgogICAgICAgICIgICAgY3BjICVEW25dLCVCW2RdXG4iCiAgICAgICAgIiAgICBjcGMgJUNbbl0sJUNbZF1cbiIKICAgICAgICAiICAgIGNwYyAlQltuXSwlRFtkXVxuIgogICAgICAgICIgICAgYnJjcyBlbmRfemVyb19iaXRfJT1cbiIKICAgICAgICAiICAgIGluYyAlQVtxXVxuIgogICAgICAgICJlbmRfemVyb19iaXRfJT06XG4iCiAgICAgICAgCiAgICAgICAgOiBbcV0gIj0mYSIgKHEpLAogICAgICAgICAgW25dICI9JnIiIChuKQogICAgICAgIDogIltxXSIgKHEpLAogICAgICAgICAgIltuXSIgKG4pLAogICAgICAgICAgW2RdICJyIiAoZCkKICAgICk7CiAgICAKICAgIHJldHVybiBxOwp9