#define SQRT_ITER_0_0(i) \
" cp %D[x],%B[goo]\n" \
" brcs zero_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" \
" lsr __tmp_reg__\n" \
" lsr %B[goo]\n"
#define SQRT_ITER_1_4(i) \
" cp %D[x],%B[goo]\n" \
" brcs zero_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_5_5(i) \
" cp %D[x],%B[goo]\n" \
" brcs zero_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_6_6(i) \
" cp %C[x],%A[goo]\n" \
" cpc %D[x],%B[goo]\n" \
" brcs zero_bit_" #i "_%=\n" \
" sub %C[x],%A[goo]\n" \
" sbc %D[x],%B[goo]\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_7_8(i) \
" cp %C[x],%A[goo]\n" \
" cpc %D[x],%B[goo]\n" \
" brcs zero_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 %B[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
#define SQRT_ITER_9_12(i) \
" cp %C[x],%A[goo]\n" \
" cpc %D[x],%B[goo]\n" \
" brcs zero_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"
#define SQRT_ITER_13_13(i) \
" cp %C[x],%A[goo]\n" \
" cpc %D[x],%B[goo]\n" \
" brcs zero_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" \
" lsl %A[goo]\n" \
" rol %B[goo]\n" \
" eor %A[goo],__tmp_reg__\n" \
" lsl %A[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n" \
" lsl %A[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
#define SQRT_ITER_14_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" \
" dec %A[goo]\n" \
" lsl %A[x]\n" \
" rol %C[x]\n" \
" rol %D[x]\n"
static uint16_t call (uint32_t x)
{
uint16_t goo = UINT16_C(0x40C0);
asm(
" mov __tmp_reg__,%A[goo]\n"
SQRT_ITER_0_0(0)
SQRT_ITER_1_4(1)
SQRT_ITER_1_4(2)
SQRT_ITER_1_4(3)
SQRT_ITER_1_4(4)
SQRT_ITER_5_5(5)
SQRT_ITER_6_6(6)
SQRT_ITER_7_8(7)
SQRT_ITER_7_8(8)
SQRT_ITER_9_12(9)
SQRT_ITER_9_12(10)
SQRT_ITER_9_12(11)
SQRT_ITER_9_12(12)
SQRT_ITER_13_13(13)
SQRT_ITER_14_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;
}
I2RlZmluZSBTUVJUX0lURVJfMF8wKGkpIFwKIiAgICBjcCAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl8lPVxuIiBcCiIgICAgc3ViICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIG9yICVCW2dvb10sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iIFwKIiAgICBlb3IgJUJbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iIFwKIiAgICBsc3IgJUJbZ29vXVxuIgoKI2RlZmluZSBTUVJUX0lURVJfMV80KGkpIFwKIiAgICBjcCAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl8lPVxuIiBcCiIgICAgc3ViICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIG9yICVCW2dvb10sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iIFwKIiAgICBlb3IgJUJbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiIgICAgbHNsICVCW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIgoKI2RlZmluZSBTUVJUX0lURVJfNV81KGkpIFwKIiAgICBjcCAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl8lPVxuIiBcCiIgICAgc3ViICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIG9yICVCW2dvb10sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgbHNyIF9fdG1wX3JlZ19fXG4iIFwKIiAgICByb3IgX190bXBfcmVnX19cbiIgXAoiICAgIG1vdiAlQVtnb29dLF9fdG1wX3JlZ19fXG4iIFwKIiAgICBkZWMgJUJbZ29vXVxuIiBcCiIgICAgbHNsICVCW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIgoKI2RlZmluZSBTUVJUX0lURVJfNl82KGkpIFwKIiAgICBjcCAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBjcGMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfJT1cbiIgXAoiICAgIHN1YiAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBzYmMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgaW5jICVCW2dvb11cbiIgXAoiemVyb19iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgYXNyIF9fdG1wX3JlZ19fXG4iIFwKIiAgICBlb3IgJUFbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiIgICAgbHNsICVCW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIgoKI2RlZmluZSBTUVJUX0lURVJfN184KGkpIFwKIiAgICBjcCAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBjcGMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfJT1cbiIgXAoiICAgIHN1YiAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBzYmMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgb3IgJUFbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBsc3IgX190bXBfcmVnX19cbiIgXAoiICAgIGVvciAlQVtnb29dLF9fdG1wX3JlZ19fXG4iIFwKIiAgICBsc2wgJUJbeF1cbiIgXAoiICAgIHJvbCAlQ1t4XVxuIiBcCiIgICAgcm9sICVEW3hdXG4iCgojZGVmaW5lIFNRUlRfSVRFUl85XzEyKGkpIFwKIiAgICBjcCAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBjcGMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgYnJjcyB6ZXJvX2JpdF8iICNpICJfJT1cbiIgXAoiICAgIHN1YiAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBzYmMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgb3IgJUFbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBsc3IgX190bXBfcmVnX19cbiIgXAoiICAgIGVvciAlQVtnb29dLF9fdG1wX3JlZ19fXG4iIFwKIiAgICBsc2wgJUFbeF1cbiIgXAoiICAgIHJvbCAlQ1t4XVxuIiBcCiIgICAgcm9sICVEW3hdXG4iCgojZGVmaW5lIFNRUlRfSVRFUl8xM18xMyhpKSBcCiIgICAgY3AgJUNbeF0sJUFbZ29vXVxuIiBcCiIgICAgY3BjICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIGJyY3MgemVyb19iaXRfIiAjaSAiXyU9XG4iIFwKIiAgICBzdWIgJUNbeF0sJUFbZ29vXVxuIiBcCiIgICAgc2JjICVEW3hdLCVCW2dvb11cbiIgXAoiICAgIG9yICVBW2dvb10sX190bXBfcmVnX19cbiIgXAoiemVyb19iaXRfIiAjaSAiXyU9OlxuIiBcCiIgICAgbHNsICVBW2dvb11cbiIgXAoiICAgIHJvbCAlQltnb29dXG4iIFwKIiAgICBlb3IgJUFbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiIgICAgbHNsICVBW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIiBcCiIgICAgbHNsICVBW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIgoKI2RlZmluZSBTUVJUX0lURVJfMTRfMTQoaSkgXAoiICAgIGJyY3Mgb25lX2JpdF8iICNpICJfJT1cbiIgXAoiICAgIGNwICVDW3hdLCVBW2dvb11cbiIgXAoiICAgIGNwYyAlRFt4XSwlQltnb29dXG4iIFwKIiAgICBicmNzIHplcm9fYml0XyIgI2kgIl8lPVxuIiBcCiJvbmVfYml0XyIgI2kgIl8lPTpcbiIgXAoiICAgIHN1YiAlQ1t4XSwlQVtnb29dXG4iIFwKIiAgICBzYmMgJURbeF0sJUJbZ29vXVxuIiBcCiIgICAgb3IgJUFbZ29vXSxfX3RtcF9yZWdfX1xuIiBcCiJ6ZXJvX2JpdF8iICNpICJfJT06XG4iIFwKIiAgICBkZWMgJUFbZ29vXVxuIiBcCiIgICAgbHNsICVBW3hdXG4iIFwKIiAgICByb2wgJUNbeF1cbiIgXAoiICAgIHJvbCAlRFt4XVxuIgoKICAgIHN0YXRpYyB1aW50MTZfdCBjYWxsICh1aW50MzJfdCB4KQogICAgewogICAgICAgIHVpbnQxNl90IGdvbyA9IFVJTlQxNl9DKDB4NDBDMCk7CiAgICAgICAgCiAgICAgICAgYXNtKAogICAgICAgICAgICAiICAgbW92IF9fdG1wX3JlZ19fLCVBW2dvb11cbiIKICAgICAgICAgICAgU1FSVF9JVEVSXzBfMCgwKQogICAgICAgICAgICBTUVJUX0lURVJfMV80KDEpCiAgICAgICAgICAgIFNRUlRfSVRFUl8xXzQoMikKICAgICAgICAgICAgU1FSVF9JVEVSXzFfNCgzKQogICAgICAgICAgICBTUVJUX0lURVJfMV80KDQpCiAgICAgICAgICAgIFNRUlRfSVRFUl81XzUoNSkKICAgICAgICAgICAgU1FSVF9JVEVSXzZfNig2KQogICAgICAgICAgICBTUVJUX0lURVJfN184KDcpCiAgICAgICAgICAgIFNRUlRfSVRFUl83XzgoOCkKICAgICAgICAgICAgU1FSVF9JVEVSXzlfMTIoOSkKICAgICAgICAgICAgU1FSVF9JVEVSXzlfMTIoMTApCiAgICAgICAgICAgIFNRUlRfSVRFUl85XzEyKDExKQogICAgICAgICAgICBTUVJUX0lURVJfOV8xMigxMikKICAgICAgICAgICAgU1FSVF9JVEVSXzEzXzEzKDEzKQogICAgICAgICAgICBTUVJUX0lURVJfMTRfMTQoMTQpCiAgICAgICAgICAgICIgICAgYnJjcyBlbmRfaW5jJT1cbiIKICAgICAgICAgICAgIiAgICBsc2wgJUFbeF1cbiIKICAgICAgICAgICAgIiAgICBjcGMgJUFbZ29vXSwlQ1t4XVxuIgogICAgICAgICAgICAiICAgIGNwYyAlQltnb29dLCVEW3hdXG4iCiAgICAgICAgICAgICJlbmRfaW5jJT06XG4iCiAgICAgICAgICAgICIgICAgYWRjICVBW2dvb10sX196ZXJvX3JlZ19fXG4iCiAgICAgICAgICAgIAogICAgICAgICAgICA6IFtnb29dICI9JnIiIChnb28pLAogICAgICAgICAgICAgIFt4XSAiPSZyIiAoeCkKICAgICAgICAgICAgOiAiW3hdIiAoeCksCiAgICAgICAgICAgICAgIltnb29dIiAoZ29vKQogICAgICAgICk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGdvbzsKICAgIH0=