mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-12 11:10:39 +00:00
To avoid potential compiler bugs when inlining inline assembly, remove the asm variants of msqrtasm and always use the C version. Compilers generate equivalent or better assembly, and the function is used exactly once, in a routine called during startup.
git-svn-id: https://svn.eduke32.com/eduke32@5909 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
95452a5a8a
commit
6c6fdec733
2 changed files with 21 additions and 70 deletions
|
@ -7013,6 +7013,27 @@ static void dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t msqrtasm(uint32_t c)
|
||||||
|
{
|
||||||
|
uint32_t a = 0x40000000l, b = 0x20000000l;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (c >= a)
|
||||||
|
{
|
||||||
|
c -= a;
|
||||||
|
a += b*4;
|
||||||
|
}
|
||||||
|
a -= b;
|
||||||
|
a >>= 1;
|
||||||
|
b >>= 2;
|
||||||
|
} while (b);
|
||||||
|
|
||||||
|
if (c >= a)
|
||||||
|
a++;
|
||||||
|
|
||||||
|
return a >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// initksqrt (internal)
|
// initksqrt (internal)
|
||||||
|
|
|
@ -61,31 +61,6 @@ extern uint16_t ATTRIBUTE((used)) sqrtable[4096], ATTRIBUTE((used)) shlookup[409
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int32_t msqrtasm(int32_t c)
|
|
||||||
{
|
|
||||||
_asm
|
|
||||||
{
|
|
||||||
push ebx
|
|
||||||
mov ecx, c
|
|
||||||
mov eax, 0x40000000
|
|
||||||
mov ebx, 0x20000000
|
|
||||||
begit:
|
|
||||||
cmp ecx, eax
|
|
||||||
jl skip
|
|
||||||
sub ecx, eax
|
|
||||||
lea eax, [eax+ebx*4]
|
|
||||||
skip :
|
|
||||||
sub eax, ebx
|
|
||||||
shr eax, 1
|
|
||||||
shr ebx, 2
|
|
||||||
jnz begit
|
|
||||||
cmp ecx, eax
|
|
||||||
sbb eax, -1
|
|
||||||
shr eax, 1
|
|
||||||
pop ebx
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int32_t getclipmask(int32_t a, int32_t b, int32_t c, int32_t d)
|
static inline int32_t getclipmask(int32_t a, int32_t b, int32_t c, int32_t d)
|
||||||
{
|
{
|
||||||
_asm
|
_asm
|
||||||
|
@ -154,28 +129,6 @@ extern uint16_t ATTRIBUTE((used)) sqrtable[4096], ATTRIBUTE((used)) shlookup[409
|
||||||
: "=a" (__r) : "a" (__a) : "ebx", "ecx", "cc"); \
|
: "=a" (__r) : "a" (__a) : "ebx", "ecx", "cc"); \
|
||||||
__r; })
|
__r; })
|
||||||
|
|
||||||
// edx is blown by this code somehow?!
|
|
||||||
#define msqrtasm(c) \
|
|
||||||
({ int32_t __r, __c=(c); \
|
|
||||||
__asm__ __volatile__ ( \
|
|
||||||
"movl $0x40000000, %%eax\n\t" \
|
|
||||||
"movl $0x20000000, %%ebx\n\t" \
|
|
||||||
"0:\n\t" \
|
|
||||||
"cmpl %%eax, %%ecx\n\t" \
|
|
||||||
"jl 1f\n\t" \
|
|
||||||
"subl %%eax, %%ecx\n\t" \
|
|
||||||
"leal (%%eax,%%ebx,4), %%eax\n\t" \
|
|
||||||
"1:\n\t" \
|
|
||||||
"subl %%ebx, %%eax\n\t" \
|
|
||||||
"shrl $1, %%eax\n\t" \
|
|
||||||
"shrl $2, %%ebx\n\t" \
|
|
||||||
"jnz 0b\n\t" \
|
|
||||||
"cmpl %%eax, %%ecx\n\t" \
|
|
||||||
"sbbl $-1, %%eax\n\t" \
|
|
||||||
"shrl $1, %%eax" \
|
|
||||||
: "=a" (__r) : "c" (__c) : "edx","ebx", "cc"); \
|
|
||||||
__r; })
|
|
||||||
|
|
||||||
#define getclipmask(a,b,c,d) \
|
#define getclipmask(a,b,c,d) \
|
||||||
({ int32_t __a=(a), __b=(b), __c=(c), __d=(d); \
|
({ int32_t __a=(a), __b=(b), __c=(c), __d=(d); \
|
||||||
__asm__ __volatile__ ("sarl $31, %%eax; addl %%ebx, %%ebx; adcl %%eax, %%eax; " \
|
__asm__ __volatile__ ("sarl $31, %%eax; addl %%ebx, %%ebx; adcl %%eax, %%eax; " \
|
||||||
|
@ -229,29 +182,6 @@ extern uint16_t ATTRIBUTE((used)) sqrtable[4096], ATTRIBUTE((used)) shlookup[409
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int32_t msqrtasm(uint32_t c)
|
|
||||||
{
|
|
||||||
uint32_t a, b;
|
|
||||||
|
|
||||||
a = 0x40000000l; // mov eax, 0x40000000
|
|
||||||
b = 0x20000000l; // mov ebx, 0x20000000
|
|
||||||
do // begit:
|
|
||||||
{
|
|
||||||
if (c >= a) // cmp ecx, eax / jl skip
|
|
||||||
{
|
|
||||||
c -= a; // sub ecx, eax
|
|
||||||
a += b*4; // lea eax, [eax+ebx*4]
|
|
||||||
} // skip:
|
|
||||||
a -= b; // sub eax, ebx
|
|
||||||
a >>= 1; // shr eax, 1
|
|
||||||
b >>= 2; // shr ebx, 2
|
|
||||||
} while (b); // jnz begit
|
|
||||||
if (c >= a) // cmp ecx, eax
|
|
||||||
a++; // sbb eax, -1
|
|
||||||
a >>= 1; // shr eax, 1
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int32_t getclipmask(int32_t a, int32_t b, int32_t c, int32_t d)
|
static inline int32_t getclipmask(int32_t a, int32_t b, int32_t c, int32_t d)
|
||||||
{
|
{
|
||||||
// Ken did this
|
// Ken did this
|
||||||
|
|
Loading…
Reference in a new issue