mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-22 02:12:33 +01:00
447 lines
8.6 KiB
C
447 lines
8.6 KiB
C
/*
|
|
* Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved.
|
|
*
|
|
* $Id: g386ifix.h 1.6 1995/02/22 21:37:10 sam Exp $
|
|
* $Locker: $
|
|
*
|
|
* Inline fixed point maths for GNU-C (386)
|
|
*/
|
|
|
|
|
|
/*
|
|
* Old version using inline functions
|
|
*/
|
|
#if 0
|
|
__inline static const long IFixedMul(long a, long b)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %2\n"
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b)
|
|
: "eax", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedDiv(long a, long b)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"movl %%eax,%%edx\n"
|
|
"shll $16,%%eax\n"
|
|
"sarl $16,%%edx\n"
|
|
"idivl %2\n"
|
|
: "=a" (__r) /* outputs */
|
|
: "0" (a), "rm" (b) /* inputs */
|
|
: "eax", "edx", "cc" /* uses */
|
|
);
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedDivR(long a, long b)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"cdq\n"
|
|
"xchg %%edx,%%eax\n"
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
"sarl $16,%%edx\n"
|
|
"idivl %2\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b)
|
|
: "eax", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedDivF(long a, long b)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"xorl %%eax,%%eax\n"
|
|
"sarl $1,%%edx\n"
|
|
"rcrl $1,%%eax\n"
|
|
"divl %2\n"
|
|
: "=a" (__r)
|
|
: "d" (a), "rm" (b)
|
|
: "eax", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedRcp(long a)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"movl $1,%%edx\n"
|
|
"xorl %%eax,%%eax\n"
|
|
"idivl %1\n"
|
|
: "=a" (__r)
|
|
: "rm" (a)
|
|
: "eax", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedMulDiv(long a, long b, long c)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %2\n"
|
|
"idivl %3\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b), "rm" (c)
|
|
: "eax", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedMac2(
|
|
long a, long b,
|
|
long c, long d)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %2\n"
|
|
"movl %%eax,%%ebx\n"
|
|
"movl %%edx,%%ecx\n"
|
|
|
|
"movl %3,%%eax\n"
|
|
"imull %4\n"
|
|
"addl %%ebx,%%eax\n"
|
|
"adcl %%ecx,%%edx\n"
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b), "rm" (c), "rm" (d)
|
|
: "eax", "ebx", "ecx", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedMac3(
|
|
long a, long b,
|
|
long c, long d,
|
|
long e, long f)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %2\n"
|
|
"movl %%eax,%%ebx\n"
|
|
"movl %%edx,%%ecx\n"
|
|
|
|
"movl %3,%%eax\n"
|
|
"imull %4\n"
|
|
"addl %%eax,%%ebx\n"
|
|
"adcl %%edx,%%ecx\n"
|
|
|
|
"movl %5,%%eax\n"
|
|
"imull %6\n"
|
|
"addl %%ebx,%%eax\n"
|
|
"adcl %%ecx,%%edx\n"
|
|
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b), "rm" (c), "rm" (d), "rm" (e), "rm" (f)
|
|
: "eax", "ebx", "ecx", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedMac4(
|
|
long a, long b,
|
|
long c, long d,
|
|
long e, long f,
|
|
long g, long h)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %2\n"
|
|
"movl %%eax,%%ebx\n"
|
|
"movl %%edx,%%ecx\n"
|
|
|
|
"movl %3,%%eax\n"
|
|
"imull %4\n"
|
|
"addl %%eax,%%ebx\n"
|
|
"adcl %%edx,%%ecx\n"
|
|
|
|
"movl %5,%%eax\n"
|
|
"imull %6\n"
|
|
"addl %%eax,%%ebx\n"
|
|
"adcl %%edx,%%ecx\n"
|
|
|
|
"movl %7,%%eax\n"
|
|
"imull %8\n"
|
|
"addl %%ebx,%%eax\n"
|
|
"adcl %%ecx,%%edx\n"
|
|
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b), "rm" (c), "rm" (d), "rm" (e), "rm" (f), "rm" (g), "rm" (h)
|
|
: "eax", "ebx", "ecx", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedSqr(long a)
|
|
{
|
|
__asm (
|
|
"imull %%eax\n"
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (a)
|
|
: "0" (a)
|
|
: "eax", "edx", "cc");
|
|
|
|
return a;
|
|
}
|
|
|
|
__inline static const long IFixedSqr2(long a, long b)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %%eax\n"
|
|
"movl %%eax,%%ebx\n"
|
|
"movl %%edx,%%ecx\n"
|
|
|
|
"movl %2,%%eax\n"
|
|
"imull %%eax\n"
|
|
"addl %%ebx,%%eax\n"
|
|
"adcl %%ecx,%%edx\n"
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b)
|
|
: "eax", "ebx", "ecx", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedSqr3(
|
|
long a, long b,long c)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %%eax\n"
|
|
"movl %%eax,%%ebx\n"
|
|
"movl %%edx,%%ecx\n"
|
|
|
|
"movl %2,%%eax\n"
|
|
"imull %%eax\n"
|
|
"addl %%eax,%%ebx\n"
|
|
"adcl %%edx,%%ecx\n"
|
|
|
|
"movl %3,%%eax\n"
|
|
"imull %%eax\n"
|
|
"addl %%ebx,%%eax\n"
|
|
"adcl %%ecx,%%edx\n"
|
|
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b), "rm" (c)
|
|
: "eax", "ebx", "ecx", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
__inline static const long IFixedSqr4(
|
|
long a, long b,
|
|
long c, long d)
|
|
{
|
|
register long __r;
|
|
|
|
__asm (
|
|
"imull %%eax\n"
|
|
"movl %%eax,%%ebx\n"
|
|
"movl %%edx,%%ecx\n"
|
|
|
|
"movl %2,%%eax\n"
|
|
"imull %%eax\n"
|
|
"addl %%eax,%%ebx\n"
|
|
"adcl %%edx,%%ecx\n"
|
|
|
|
"movl %3,%%eax\n"
|
|
"imull %%eax\n"
|
|
"addl %%eax,%%ebx\n"
|
|
"adcl %%edx,%%ecx\n"
|
|
|
|
"movl %4,%%eax\n"
|
|
"imull %%eax\n"
|
|
"addl %%ebx,%%eax\n"
|
|
"adcl %%ecx,%%edx\n"
|
|
|
|
"shrdl $16,%%edx,%%eax\n"
|
|
: "=a" (__r)
|
|
: "0" (a), "rm" (b), "rm" (c), "rm" (d)
|
|
: "eax", "ebx", "ecx", "edx", "cc");
|
|
|
|
return __r;
|
|
}
|
|
|
|
#define BrFixedMul(a,b) IFixedMul(a,b)
|
|
#define BrFixedMac2(a,b,c,d) IFixedMac2(a,b,c,d)
|
|
#define BrFixedMac3(a,b,c,d,e,f) IFixedMac3(a,b,c,d,e,f)
|
|
#define BrFixedMac4(a,b,c,d,e,f,g,h) IFixedMac4(a,b,c,d,e,f,g,h)
|
|
|
|
#define BrFixedDiv(a,b) IFixedDiv(a,b)
|
|
#define BrFixedDivR(a,b) IFixedDivR(a,b)
|
|
#define BrFixedDivF(a,b) IFixedDivF(a,b)
|
|
#define BrFixedMulDiv(a,b,c) IFixedMulDiv(a,b,c)
|
|
#define BrFixedRcp(a) IFixedRcp(a)
|
|
|
|
#define BrFixedSqr(a) IFixedSqr(a)
|
|
#define BrFixedSqr2(a,b) IFixedSqr2(a,b)
|
|
#define BrFixedSqr3(a,b,c) IFixedSqr3(a,b,c)
|
|
#define BrFixedSqr4(a,b,c,d) IFixedSqr4(a,b,c,d)
|
|
#endif
|
|
|
|
/*
|
|
* New version using direct expansion
|
|
*/
|
|
#if 0
|
|
#define BrFixedMul(__a,__b) \
|
|
({ \
|
|
long __r; \
|
|
\
|
|
__asm ( \
|
|
" imull %2\n" \
|
|
" shrdl $16,%%edx,%%eax\n" \
|
|
: "=a" (__r) \
|
|
: "0" ((long)(__a)), "rm" ((long)(__b)) \
|
|
: "edx", "cc"); \
|
|
\
|
|
__r; \
|
|
})
|
|
|
|
#define BrFixedDiv(__a,__b) \
|
|
({ \
|
|
register long __r; \
|
|
\
|
|
__asm ( \
|
|
" movl %%eax,%%edx\n" \
|
|
" shll $16,%%eax\n" \
|
|
" sarl $16,%%edx\n" \
|
|
" idivl %2\n" \
|
|
: "=a" (__r) \
|
|
: "a" ((long)(__a)), "rm" ((long)(__b)) \
|
|
: "edx", "cc" \
|
|
); \
|
|
\
|
|
__r; \
|
|
})
|
|
|
|
|
|
#define BrFixedMulDiv(__a,__b,__c) \
|
|
({ \
|
|
register long __r; \
|
|
\
|
|
__asm ( \
|
|
"imull %2\n" \
|
|
"idivl %3\n" \
|
|
: "=a" (__r) \
|
|
: "0" ((long)(__a)), "rm" ((long)(__b)), \
|
|
"rm" ((long)(__c)) \
|
|
: "edx", "cc"); \
|
|
\
|
|
__r; \
|
|
})
|
|
|
|
#define BrFixedMac2(__a,__b,__c,__d) \
|
|
({ \
|
|
register long __r; \
|
|
\
|
|
__asm ( \
|
|
"imull %2\n" \
|
|
"movl %%eax,%%ebx\n" \
|
|
"movl %%edx,%%ecx\n" \
|
|
\
|
|
"movl %3,%%eax\n" \
|
|
"imull %4\n" \
|
|
"addl %%ebx,%%eax\n" \
|
|
"adcl %%ecx,%%edx\n" \
|
|
"shrdl $16,%%edx,%%eax\n" \
|
|
: "=a" (__r) \
|
|
: "0" ((long)(__a)), "rm" ((long)(__b)), \
|
|
"rm" ((long)(__c)), "rm" ((long)(__d)) \
|
|
: "ebx", "ecx", "edx", "cc"); \
|
|
\
|
|
__r; \
|
|
})
|
|
|
|
#define BrFixedMac3(__a,__b,__c,__d,__e,__f) \
|
|
({ \
|
|
register long __r; \
|
|
\
|
|
__asm ( \
|
|
"imull %2\n" \
|
|
"movl %%eax,%%ebx\n" \
|
|
"movl %%edx,%%ecx\n" \
|
|
\
|
|
"movl %3,%%eax\n" \
|
|
"imull %4\n" \
|
|
"addl %%eax,%%ebx\n" \
|
|
"adcl %%edx,%%ecx\n" \
|
|
\
|
|
"movl %5,%%eax\n" \
|
|
"imull %6\n" \
|
|
"addl %%ebx,%%eax\n" \
|
|
"adcl %%ecx,%%edx\n" \
|
|
\
|
|
"shrdl $16,%%edx,%%eax\n" \
|
|
: "=a" (__r) \
|
|
: "0" ((long)(__a)), "rm" ((long)(__b)), \
|
|
"rm" ((long)(__c)), "rm" ((long)(__d)), \
|
|
"rm" ((long)(__e)), "rm" ((long)(__f)) \
|
|
: "ebx", "ecx", "edx", "cc"); \
|
|
\
|
|
__r; \
|
|
})
|
|
|
|
#define BrFixedMac4(__a,__b,__c,__d,__e,__f,__g,__h)\
|
|
({ \
|
|
register long __r; \
|
|
\
|
|
__asm ( \
|
|
"imull %2\n" \
|
|
"movl %%eax,%%ebx\n" \
|
|
"movl %%edx,%%ecx\n" \
|
|
\
|
|
"movl %3,%%eax\n" \
|
|
"imull %4\n" \
|
|
"addl %%eax,%%ebx\n" \
|
|
"adcl %%edx,%%ecx\n" \
|
|
\
|
|
"movl %5,%%eax\n" \
|
|
"imull %6\n" \
|
|
"addl %%eax,%%ebx\n" \
|
|
"adcl %%edx,%%ecx\n" \
|
|
\
|
|
"movl %7,%%eax\n" \
|
|
"imull %8\n" \
|
|
"addl %%ebx,%%eax\n" \
|
|
"adcl %%ecx,%%edx\n" \
|
|
\
|
|
"shrdl $16,%%edx,%%eax\n" \
|
|
: "=a" (__r) \
|
|
: "0" ((long)(__a)), "rm" ((long)(__b)), \
|
|
"rm" ((long)(__c)), "rm" ((long)(__d)), \
|
|
"rm" ((long)(__e)), "rm" ((long)(__f)), \
|
|
"rm" ((long)(__g)), "rm" ((long)(__h)) \
|
|
: "ebx", "ecx", "edx", "cc"); \
|
|
\
|
|
__r; \
|
|
})
|
|
#endif
|
|
|