uint8_t my_log2 (uint32_t op)
{
uint8_t res;
asm(
" 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"
" clr r16\n"
" rjmp end%=\n"
"foundD%=:\n"
" ldi r16,0x18\n"
" mov r17,%D[op]\n"
" rjmp examine%=\n"
"foundC%=:\n"
" ldi r16,0x10\n"
" mov r17,%C[op]\n"
" rjmp examine%=\n"
"foundB%=:\n"
" ldi r16,0x08\n"
" mov r17,%B[op]\n"
" rjmp examine%=\n"
"foundA%=:\n"
" ldi r16,0x00\n"
" mov r17,%A[op]\n"
"examine%=:\n"
" bst r17,7\n"
" brts bit7%=\n"
" bst r17,6\n"
" brts bit6%=\n"
" bst r17,5\n"
" brts bit5%=\n"
" bst r17,4\n"
" brts bit4%=\n"
" bst r17,3\n"
" brts bit3%=\n"
" bst r17,2\n"
" brts bit2%=\n"
" bst r17,1\n"
" brts bit1%=\n"
" subi r16,0xFF\n"
" rjmp end%=\n"
"bit7%=:\n"
" subi r16,0xF8\n"
" rjmp end%=\n"
"bit6%=:\n"
" subi r16,0xF9\n"
" rjmp end%=\n"
"bit5%=:\n"
" subi r16,0xFA\n"
" rjmp end%=\n"
"bit4%=:\n"
" subi r16,0xFB\n"
" rjmp end%=\n"
"bit3%=:\n"
" subi r16,0xFC\n"
" rjmp end%=\n"
"bit2%=:\n"
" subi r16,0xFD\n"
" rjmp end%=\n"
"bit1%=:\n"
" subi r16,0xFE\n"
"end%=:\n"
" mov %[res],r16\n"
: [res] "=r" (res)
: [op] "r" (op)
: "r16", "r17"
);
return res;
}
dWludDhfdCBteV9sb2cyICh1aW50MzJfdCBvcCkKewogICAgdWludDhfdCByZXM7CiAgICBhc20oCiAgICAgICAgIiAgICBjcHNlICVEW29wXSxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIHJqbXAgZm91bmREJT1cbiIKICAgICAgICAiICAgIGNwc2UgJUNbb3BdLF9femVyb19yZWdfX1xuIgogICAgICAgICIgICAgcmptcCBmb3VuZEMlPVxuIgogICAgICAgICIgICAgY3BzZSAlQltvcF0sX196ZXJvX3JlZ19fXG4iCiAgICAgICAgIiAgICByam1wIGZvdW5kQiU9XG4iCiAgICAgICAgIiAgICBjcHNlICVBW29wXSxfX3plcm9fcmVnX19cbiIKICAgICAgICAiICAgIHJqbXAgZm91bmRBJT1cbiIKICAgICAgICAiICAgIGNsciByMTZcbiIKICAgICAgICAiICAgIHJqbXAgZW5kJT1cbiIKICAgICAgICAiZm91bmREJT06XG4iCiAgICAgICAgIiAgICBsZGkgcjE2LDB4MThcbiIKICAgICAgICAiICAgIG1vdiByMTcsJURbb3BdXG4iCiAgICAgICAgIiAgICByam1wIGV4YW1pbmUlPVxuIgogICAgICAgICJmb3VuZEMlPTpcbiIKICAgICAgICAiICAgIGxkaSByMTYsMHgxMFxuIgogICAgICAgICIgICAgbW92IHIxNywlQ1tvcF1cbiIKICAgICAgICAiICAgIHJqbXAgZXhhbWluZSU9XG4iCiAgICAgICAgImZvdW5kQiU9OlxuIgogICAgICAgICIgICAgbGRpIHIxNiwweDA4XG4iCiAgICAgICAgIiAgICBtb3YgcjE3LCVCW29wXVxuIgogICAgICAgICIgICAgcmptcCBleGFtaW5lJT1cbiIKICAgICAgICAiZm91bmRBJT06XG4iCiAgICAgICAgIiAgICBsZGkgcjE2LDB4MDBcbiIKICAgICAgICAiICAgIG1vdiByMTcsJUFbb3BdXG4iCiAgICAgICAgImV4YW1pbmUlPTpcbiIKICAgICAgICAiICAgIGJzdCByMTcsN1xuIgogICAgICAgICIgICAgYnJ0cyBiaXQ3JT1cbiIKICAgICAgICAiICAgIGJzdCByMTcsNlxuIgogICAgICAgICIgICAgYnJ0cyBiaXQ2JT1cbiIKICAgICAgICAiICAgIGJzdCByMTcsNVxuIgogICAgICAgICIgICAgYnJ0cyBiaXQ1JT1cbiIKICAgICAgICAiICAgIGJzdCByMTcsNFxuIgogICAgICAgICIgICAgYnJ0cyBiaXQ0JT1cbiIKICAgICAgICAiICAgIGJzdCByMTcsM1xuIgogICAgICAgICIgICAgYnJ0cyBiaXQzJT1cbiIKICAgICAgICAiICAgIGJzdCByMTcsMlxuIgogICAgICAgICIgICAgYnJ0cyBiaXQyJT1cbiIKICAgICAgICAiICAgIGJzdCByMTcsMVxuIgogICAgICAgICIgICAgYnJ0cyBiaXQxJT1cbiIKICAgICAgICAiICAgIHN1YmkgcjE2LDB4RkZcbiIKICAgICAgICAiICAgIHJqbXAgZW5kJT1cbiIKICAgICAgICAiYml0NyU9OlxuIgogICAgICAgICIgICAgc3ViaSByMTYsMHhGOFxuIgogICAgICAgICIgICAgcmptcCBlbmQlPVxuIgogICAgICAgICJiaXQ2JT06XG4iCiAgICAgICAgIiAgICBzdWJpIHIxNiwweEY5XG4iCiAgICAgICAgIiAgICByam1wIGVuZCU9XG4iCiAgICAgICAgImJpdDUlPTpcbiIKICAgICAgICAiICAgIHN1YmkgcjE2LDB4RkFcbiIKICAgICAgICAiICAgIHJqbXAgZW5kJT1cbiIKICAgICAgICAiYml0NCU9OlxuIgogICAgICAgICIgICAgc3ViaSByMTYsMHhGQlxuIgogICAgICAgICIgICAgcmptcCBlbmQlPVxuIgogICAgICAgICJiaXQzJT06XG4iCiAgICAgICAgIiAgICBzdWJpIHIxNiwweEZDXG4iCiAgICAgICAgIiAgICByam1wIGVuZCU9XG4iCiAgICAgICAgImJpdDIlPTpcbiIKICAgICAgICAiICAgIHN1YmkgcjE2LDB4RkRcbiIKICAgICAgICAiICAgIHJqbXAgZW5kJT1cbiIKICAgICAgICAiYml0MSU9OlxuIgogICAgICAgICIgICAgc3ViaSByMTYsMHhGRVxuIgogICAgICAgICJlbmQlPTpcbiIKICAgICAgICAiICAgIG1vdiAlW3Jlc10scjE2XG4iCiAgICAgICAgOiBbcmVzXSAiPXIiIChyZXMpCiAgICAgICAgOiBbb3BdICJyIiAob3ApCiAgICAgICAgOiAicjE2IiwgInIxNyIKICAgICk7CiAgICByZXR1cm4gcmVzOwp9