Using asm block in old form required more instructions and additional storage:
uint32_t bit_set; asm ( "bt %2, %%eax \n" "setc %%al \n" "movzx %%al, %%eax \n" : "=a" (bit_set) : "a" (number), "r" (bit) : "cc" ); if (bit_set) goto has_bit;Above code is compiled to:
80483f6: 0f a3 d8 bt %ebx,%eax 80483f9: 0f 92 c0 setb %al 80483fc: 0f b6 c0 movzbl %al,%eax 80483ff: 85 c0 test %eax,%eax 8048401: 74 16 je 8048419With asm goto the same task could be writting shorter and easier:
asm goto ( "bt %1, %0 \n" "jc %l[has_bit] \n" : /* no output */ : "r" (number), "r" (bit) : "cc" : has_bit // name of label );Complete demo is available. See also GCC documentation about Extended Asm.
Brak komentarzy:
Prześlij komentarz