#include <stdint.h>
#include <stdio.h>
#if 0
uint8_t my_log2 (uint32_t v)
{
uint8_t *bytes = (void *)&v;
uint8_t i = 24;
while (1) {
uint8_t byte = bytes[i / 8];
if (byte) {
do {
i++;
byte >>= 1;
} while (byte);
return i;
}
if (i == 0) {
return 0;
}
i -= 8;
}
}
#endif
uint8_t my_log2 (uint32_t op)
{
uint8_t res;
asm(
" clr r16\n"
" cpse %D[op],__zero_reg__\n"
" rjmp foundD%=\n"
" cpse %C[op],__zero_reg__\n"
" rjmp foundC%=\n"
" cpse %B[op],__zero_reg__\n"
" rjmp foundB%=\n"
" cpse %A[op],__zero_reg__\n"
" rjmp foundA%=\n"
" rjmp end%=\n"
"foundD%=:\n"
" ori r16,$18\n"
" mov r17,%D[op]\n"
" rjmp examine%=\n"
"foundC%=:\n"
" ori r16,$10\n"
" mov r17,%C[op]\n"
" rjmp examine%=\n"
"foundB%=:\n"
" ori r16,$08\n"
" mov r17,%B[op]\n"
" rjmp examine%=\n"
"foundA%=:\n"
" mov r17,%A[op]\n"
"examine%=:\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
" lsr r17\n"
" cpse r17,__zero_reg__\n"
" inc r16\n"
"end%=:\n"
" mov %[res],r16\n"
: [res] "=r" (res)
: [op] "r" (op)
: "r16", "r17"
);
return res;
}
int main ()
{
uint32_t x = UINT32_C(0x1FFF0FFF);
printf("%d\n", my_log2(x));
}
/tmp/ccSWpg3O.s: Assembler messages:
/tmp/ccSWpg3O.s:30: Error: junk at end of line, first unrecognized character is `1'
/tmp/ccSWpg3O.s:34: Error: junk at end of line, first unrecognized character is `1'
/tmp/ccSWpg3O.s:38: Error: junk at end of line, first unrecognized character is `0
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpZiAwCnVpbnQ4X3QgbXlfbG9nMiAodWludDMyX3QgdikKewogICAgdWludDhfdCAqYnl0ZXMgPSAodm9pZCAqKSZ2OwogICAgCiAgICB1aW50OF90IGkgPSAyNDsKICAgIHdoaWxlICgxKSB7CiAgICAgICAgdWludDhfdCBieXRlID0gYnl0ZXNbaSAvIDhdOwogICAgICAgIGlmIChieXRlKSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIGJ5dGUgPj49IDE7CiAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGUpOwogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaSAtPSA4OwogICAgfQp9CiNlbmRpZgoKdWludDhfdCBteV9sb2cyICh1aW50MzJfdCBvcCkKewogICAgdWludDhfdCByZXM7CiAgICBhc20oCiAgICAgICAgIiAgICBjbHIgcjE2XG4iCiAgICAgICAgIiAgICBjcHNlICVEW29wXSxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIHJqbXAgZm91bmREJT1cbiIKICAgICAgICAiICAgIGNwc2UgJUNbb3BdLF9femVyb19yZWdfX1xuIgogICAgICAgICIgICAgcmptcCBmb3VuZEMlPVxuIgogICAgICAgICIgICAgY3BzZSAlQltvcF0sX196ZXJvX3JlZ19fXG4iCiAgICAgICAgIiAgICByam1wIGZvdW5kQiU9XG4iCiAgICAgICAgIiAgICBjcHNlICVBW29wXSxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIHJqbXAgZm91bmRBJT1cbiIKICAgICAgICAiICAgIHJqbXAgZW5kJT1cbiIKICAgICAgICAiZm91bmREJT06XG4iCiAgICAgICAgIiAgICBvcmkgcjE2LCQxOFxuIgogICAgICAgICIgICAgbW92IHIxNywlRFtvcF1cbiIKICAgICAgICAiICAgIHJqbXAgZXhhbWluZSU9XG4iCiAgICAgICAgImZvdW5kQyU9OlxuIgogICAgICAgICIgICAgb3JpIHIxNiwkMTBcbiIKICAgICAgICAiICAgIG1vdiByMTcsJUNbb3BdXG4iCiAgICAgICAgIiAgICByam1wIGV4YW1pbmUlPVxuIgogICAgICAgICJmb3VuZEIlPTpcbiIKICAgICAgICAiICAgIG9yaSByMTYsJDA4XG4iCiAgICAgICAgIiAgICBtb3YgcjE3LCVCW29wXVxuIgogICAgICAgICIgICAgcmptcCBleGFtaW5lJT1cbiIKICAgICAgICAiZm91bmRBJT06XG4iCiAgICAgICAgIiAgICBtb3YgcjE3LCVBW29wXVxuIgogICAgICAgICJleGFtaW5lJT06XG4iCiAgICAgICAgIiAgICBjcHNlIHIxNyxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIGluYyByMTZcbiIKICAgICAgICAiICAgIGxzciByMTdcbiIKICAgICAgICAiICAgIGNwc2UgcjE3LF9femVyb19yZWdfX1xuIgogICAgICAgICIgICAgaW5jIHIxNlxuIgogICAgICAgICIgICAgbHNyIHIxN1xuIgogICAgICAgICIgICAgY3BzZSByMTcsX196ZXJvX3JlZ19fXG4iCiAgICAgICAgIiAgICBpbmMgcjE2XG4iCiAgICAgICAgIiAgICBsc3IgcjE3XG4iCiAgICAgICAgIiAgICBjcHNlIHIxNyxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIGluYyByMTZcbiIKICAgICAgICAiICAgIGxzciByMTdcbiIKICAgICAgICAiICAgIGNwc2UgcjE3LF9femVyb19yZWdfX1xuIgogICAgICAgICIgICAgaW5jIHIxNlxuIgogICAgICAgICIgICAgbHNyIHIxN1xuIgogICAgICAgICIgICAgY3BzZSByMTcsX196ZXJvX3JlZ19fXG4iCiAgICAgICAgIiAgICBpbmMgcjE2XG4iCiAgICAgICAgIiAgICBsc3IgcjE3XG4iCiAgICAgICAgIiAgICBjcHNlIHIxNyxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIGluYyByMTZcbiIKICAgICAgICAiICAgIGxzciByMTdcbiIKICAgICAgICAiICAgIGNwc2UgcjE3LF9femVyb19yZWdfX1xuIgogICAgICAgICIgICAgaW5jIHIxNlxuIgogICAgICAgICJlbmQlPTpcbiIKICAgICAgICAiICAgIG1vdiAlW3Jlc10scjE2XG4iCiAgICAgICAgOiBbcmVzXSAiPXIiIChyZXMpCiAgICAgICAgOiBbb3BdICJyIiAob3ApCiAgICAgICAgOiAicjE2IiwgInIxNyIKICAgICk7CiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbiAoKQp7CiAgICB1aW50MzJfdCB4ID0gVUlOVDMyX0MoMHgxRkZGMEZGRik7CiAgICBwcmludGYoIiVkXG4iLCBteV9sb2cyKHgpKTsKfQoKCi90bXAvY2NTV3BnM08uczogQXNzZW1ibGVyIG1lc3NhZ2VzOgovdG1wL2NjU1dwZzNPLnM6MzA6IEVycm9yOiBqdW5rIGF0IGVuZCBvZiBsaW5lLCBmaXJzdCB1bnJlY29nbml6ZWQgY2hhcmFjdGVyIGlzIGAxJwovdG1wL2NjU1dwZzNPLnM6MzQ6IEVycm9yOiBqdW5rIGF0IGVuZCBvZiBsaW5lLCBmaXJzdCB1bnJlY29nbml6ZWQgY2hhcmFjdGVyIGlzIGAxJwovdG1wL2NjU1dwZzNPLnM6Mzg6IEVycm9yOiBqdW5rIGF0IGVuZCBvZiBsaW5lLCBmaXJzdCB1bnJlY29nbml6ZWQgY2hhcmFjdGVyIGlzIGAw