Get rid of in-line assembly in idiv16().

This cannot work with MinGW -masm=intel, only -masm=att.
This commit is contained in:
unknown 2015-10-27 19:28:55 -04:00
parent 572418ec30
commit f0fcd058da
1 changed files with 1 additions and 25 deletions

View File

@ -97,31 +97,7 @@ __inline int imul14(int x, int y) // (x * y) >> 14
__inline int idiv16(int x, int y) // (x << 16) / y
{
//x = (((long long)x) << 16) / ((long long)y);
/*
eax = x;
ebx = y;
edx = x;
(x << 16) | ()
*/
#if !defined(__GNUC__) && !defined(NO_ASM)
__asm {
mov eax, x
mov ebx, y
mov edx,eax
sar edx,16
shl eax,16
idiv ebx
mov x, eax
}
#elif !defined(NO_ASM)
int reminder;
asm ("idivl %[divisor]"
: "=a" (x), "=d" (reminder)
: [divisor] "g" (y), "d" (x >> 16), "a" (x << 16));
#else
x = (((long long)x) << 16) / ((long long)y);
#endif
x = ((int64_t)x << 16) / (int64_t)y;
return x;
}