#define SQRT_ITER_0_0(i) \
" cp %D[x],%B[goo]\n" \
" brcs zero_bit_" #i "_%=\n" \
"one_bit_" #i "_%=:\n" \
" sub %D[x],%B[goo]\n" \
" or %B[goo],__tmp_reg__\n" \
"zero_bit_" #i "_%=:\n" \
" lsr __tmp_reg__\n" \
" eor %B[goo],__tmp_reg__\n" \
" lsl %B[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
#define SQRT_ITER_1_5(i) \
" brcs one_bit_" #i "_%=\n" \
" cp %D[x],%B[goo]\n" \
" brcs zero_bit_" #i "_%=\n" \
"one_bit_" #i "_%=:\n" \
" sub %D[x],%B[goo]\n" \
" or %B[goo],__tmp_reg__\n" \
"zero_bit_" #i "_%=:\n" \
" lsr __tmp_reg__\n" \
" eor %B[goo],__tmp_reg__\n" \
" lsl %B[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
#define SQRT_ITER_6_6(i) \
" brcs one_bit_" #i "_%=\n" \
" cp %D[x],%B[goo]\n" \
" brcs zero_bit_" #i "_%=\n" \
"one_bit_" #i "_%=:\n" \
" sub %D[x],%B[goo]\n" \
" or %B[goo],__tmp_reg__\n" \
"zero_bit_" #i "_%=:\n" \
" lsr __tmp_reg__\n" \
" ror __tmp_reg__\n" \
" mov %A[goo],__tmp_reg__\n" \
" dec %B[goo]\n" \
" lsl %B[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
#define SQRT_ITER_7_7(i) \
" brcs one_bit_" #i "_%=\n" \
" cp %C[x],%A[goo]\n" \
" cpc %D[x],%B[goo]\n" \
" brcs zero_bit_" #i "_%=\n" \
"one_bit_" #i "_%=:\n" \
" sub %C[x],%A[goo]\n" \
" sbc %D[x],%B[goo]\n" \
" or %A[goo],__tmp_reg__\n" \
" inc %B[goo]\n" \
"zero_bit_" #i "_%=:\n" \
" asr __tmp_reg__\n" \
" eor %A[goo],__tmp_reg__\n" \
" lsl %B[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
#define SQRT_ITER_8_14(i) \
" brcs one_bit_" #i "_%=\n" \
" cp %C[x],%A[goo]\n" \
" cpc %D[x],%B[goo]\n" \
" brcs zero_bit_" #i "_%=\n" \
"one_bit_" #i "_%=:\n" \
" sub %C[x],%A[goo]\n" \
" sbc %D[x],%B[goo]\n" \
" or %A[goo],__tmp_reg__\n" \
"zero_bit_" #i "_%=:\n" \
" lsr __tmp_reg__\n" \
" eor %A[goo],__tmp_reg__\n" \
" lsl %A[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
static uint16_t sqrt32 (uint32_t x)
{
uint16_t goo = UINT16_C(0x40C0);
asm(
" mov __tmp_reg__,%A[goo]\n"
SQRT_ITER_0_0(0)
SQRT_ITER_1_5(1)
SQRT_ITER_1_5(2)
SQRT_ITER_1_5(3)
SQRT_ITER_1_5(4)
SQRT_ITER_1_5(5)
SQRT_ITER_6_6(6)
SQRT_ITER_7_7(7)
SQRT_ITER_8_14(8)
SQRT_ITER_8_14(9)
SQRT_ITER_8_14(10)
SQRT_ITER_8_14(11)
SQRT_ITER_8_14(12)
SQRT_ITER_8_14(13)
SQRT_ITER_8_14(14)
" brcs end_inc%=\n"
" lsl %A[x]\n"
" cpc %A[goo],%C[x]\n"
" cpc %B[goo],%D[x]\n"
"end_inc%=:\n"
" adc %A[goo],__zero_reg__\n"
: [goo] "=&r" (goo),
[x] "=&r" (x)
: "[x]" (x),
"[goo]" (goo)
);
return goo;
}
I2RlZmluZSBTUVJUX0lURVJfMF8wKGkpIFwKIiAgICBjcCAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl8lPVxuIiBcCiJvbmVfYml0XyIgI2kgIl8lPTpcbiIgXAoiICAgIHN1YiAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBvciAlQltnb29dLF9fdG1wX3JlZ19fXG4iIFwKInplcm9fYml0XyIgI2kgIl8lPTpcbiIgXAoiICAgIGxzciBfX3RtcF9yZWdfX1xuIiBcCiIgICAgZW9yICVCW2dvb10sX190bXBfcmVnX19cbiIgXAoiICAgIGxzbCAlQlt4XVxuIiBcCiIgICAgcm9sICVDW3hdXG4iIFwKIiAgICByb2wgJURbeF1cbiIKCiNkZWZpbmUgU1FSVF9JVEVSXzFfNShpKSBcCiIgICAgYnJjcyBvbmVfYml0XyIgI2kgIl8lPVxuIiBcCiIgICAgY3AgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfJT1cbiIgXAoib25lX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBzdWIgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgb3IgJUJbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBsc3IgX190bXBfcmVnX19cbiIgXAoiICAgIGVvciAlQltnb29dLF9fdG1wX3JlZ19fXG4iIFwKIiAgICBsc2wgJUJbeF1cbiIgXAoiICAgIHJvbCAlQ1t4XVxuIiBcCiIgICAgcm9sICVEW3hdXG4iCgojZGVmaW5lIFNRUlRfSVRFUl82XzYoaSkgXAoiICAgIGJyY3Mgb25lX2JpdF8iICNpICJfJT1cbiIgXAoiICAgIGNwICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiXyU9XG4iIFwKIm9uZV9iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgc3ViICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIG9yICVCW2dvb10sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iIFwKIiAgICByb3IgX190bXBfcmVnX19cbiIgXAoiICAgIG1vdiAlQVtnb29dLF9fdG1wX3JlZ19fXG4iIFwKIiAgICBkZWMgJUJbZ29vXVxuIiBcCiIgICAgbHNsICVCW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIgoKI2RlZmluZSBTUVJUX0lURVJfN183KGkpIFwKIiAgICBicmNzIG9uZV9iaXRfIiAjaSAiXyU9XG4iIFwKIiAgICBjcCAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBjcGMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfJT1cbiIgXAoib25lX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBzdWIgJUNbeF0sJUFbZ29vXVxuIiBcCiIgICAgc2JjICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIG9yICVBW2dvb10sX190bXBfcmVnX19cbiIgXAoiICAgIGluYyAlQltnb29dXG4iIFwKInplcm9fYml0XyIgI2kgIl8lPTpcbiIgXAoiICAgIGFzciBfX3RtcF9yZWdfX1xuIiBcCiIgICAgZW9yICVBW2dvb10sX190bXBfcmVnX19cbiIgXAoiICAgIGxzbCAlQlt4XVxuIiBcCiIgICAgcm9sICVDW3hdXG4iIFwKIiAgICByb2wgJURbeF1cbiIKCiNkZWZpbmUgU1FSVF9JVEVSXzhfMTQoaSkgXAoiICAgIGJyY3Mgb25lX2JpdF8iICNpICJfJT1cbiIgXAoiICAgIGNwICVDW3hdLCVBW2dvb11cbiIgXAoiICAgIGNwYyAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl8lPVxuIiBcCiJvbmVfYml0XyIgI2kgIl8lPTpcbiIgXAoiICAgIHN1YiAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBzYmMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgb3IgJUFbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBsc3IgX190bXBfcmVnX19cbiIgXAoiICAgIGVvciAlQVtnb29dLF9fdG1wX3JlZ19fXG4iIFwKIiAgICBsc2wgJUFbeF1cbiIgXAoiICAgIHJvbCAlQ1t4XVxuIiBcCiIgICAgcm9sICVEW3hdXG4iCiAgICAKc3RhdGljIHVpbnQxNl90IHNxcnQzMiAodWludDMyX3QgeCkKewogICAgdWludDE2X3QgZ29vID0gVUlOVDE2X0MoMHg0MEMwKTsKICAgIAogICAgYXNtKAogICAgICAgICIgICBtb3YgX190bXBfcmVnX18sJUFbZ29vXVxuIgogICAgICAgIAogICAgICAgIFNRUlRfSVRFUl8wXzAoMCkKICAgICAgICBTUVJUX0lURVJfMV81KDEpCiAgICAgICAgU1FSVF9JVEVSXzFfNSgyKQogICAgICAgIFNRUlRfSVRFUl8xXzUoMykKICAgICAgICBTUVJUX0lURVJfMV81KDQpCiAgICAgICAgU1FSVF9JVEVSXzFfNSg1KQogICAgICAgIFNRUlRfSVRFUl82XzYoNikKICAgICAgICBTUVJUX0lURVJfN183KDcpCiAgICAgICAgU1FSVF9JVEVSXzhfMTQoOCkKICAgICAgICBTUVJUX0lURVJfOF8xNCg5KQogICAgICAgIFNRUlRfSVRFUl84XzE0KDEwKQogICAgICAgIFNRUlRfSVRFUl84XzE0KDExKQogICAgICAgIFNRUlRfSVRFUl84XzE0KDEyKQogICAgICAgIFNRUlRfSVRFUl84XzE0KDEzKQogICAgICAgIFNRUlRfSVRFUl84XzE0KDE0KQogICAgICAgIAogICAgICAgICIgICAgYnJjcyBlbmRfaW5jJT1cbiIKICAgICAgICAiICAgIGxzbCAlQVt4XVxuIgogICAgICAgICIgICAgY3BjICVBW2dvb10sJUNbeF1cbiIKICAgICAgICAiICAgIGNwYyAlQltnb29dLCVEW3hdXG4iCiAgICAgICAgImVuZF9pbmMlPTpcbiIKICAgICAgICAiICAgIGFkYyAlQVtnb29dLF9femVyb19yZWdfX1xuIgogICAgICAgIAogICAgICAgIDogW2dvb10gIj0mciIgKGdvbyksCiAgICAgICAgICBbeF0gIj0mciIgKHgpCiAgICAgICAgOiAiW3hdIiAoeCksCiAgICAgICAgICAiW2dvb10iIChnb28pCiAgICApOwogICAgCiAgICByZXR1cm4gZ29vOwp9