Fixed code seems to be:
Code:
__asm __volatile (
"push %%ebx\n"
"xorl %%ebx, %%ebx\n"
"movl %1, %%esi\n"
(cut many lines)
"xorl (%%edi,%%ebx,4), %%eax\n"
"2:\n"
"pop %%ebx\n"
:
: "a" (val), "g" (buf), "g" (bufsize)
: "cx", "dx", "si", "di"
);
return val;