{
__asm__ (
"add %3,%1\n"
"\tsar %2,%1\n"
"\tsar %%cl,%1\n"
"\tsub $-128,%1\n"
"\tcmovl %5,%1\n" /* Use the sub to compare to 0 */
"\tcmpl %4,%1\n"
"\tcmovg %4,%1\n"
: "=r"(x)
: "0"(x), "Ir"(shift), "ir"(1UL<<(shift-1)), "r" (0xff), "r" (0)
: "0"(x), "Ic"(shift), "ir"(1UL<<(shift-1)), "r" (0xff), "r" (0)
);
return x;
}