Don't cast pointers to longs in asms. Changed all remaining longs
to int32_t's and all unsigned longs to u_int32_t's. Fixed the one printf format broken by this. The old math emulator now compiles cleanly on i386's with 64-bit longs. It may even work, provided suword() doesn't actually write a long.
This commit is contained in:
parent
9448def93e
commit
c3f62164d5
@ -3,7 +3,7 @@
|
||||
*
|
||||
* (C) 1991 Linus Torvalds
|
||||
*
|
||||
* $Id$
|
||||
* $Id: math_emu.h,v 1.5 1997/02/22 09:32:27 peter Exp $
|
||||
*/
|
||||
#ifndef _LINUX_MATH_EMU_H
|
||||
#define _LINUX_MATH_EMU_H
|
||||
@ -12,14 +12,14 @@
|
||||
(((volatile void (*)(struct info *,unsigned int)) __math_abort)((x),(y)))*/
|
||||
|
||||
/*
|
||||
* Gcc forces this stupid alignment problem: I want to use only two longs
|
||||
* Gcc forces this stupid alignment problem: I want to use only two int32_t's
|
||||
* for the temporary real 64-bit mantissa, but then gcc aligns out the
|
||||
* structure to 12 bytes which breaks things in math_emulate.c. Shit. I
|
||||
* want some kind of "no-alignt" pragma or something.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
long a,b;
|
||||
int32_t a,b;
|
||||
short exponent;
|
||||
} temp_real;
|
||||
|
||||
@ -32,13 +32,13 @@ typedef struct {
|
||||
((*(long long *) (b) = *(long long *) (a)),((b)->exponent = (a)->exponent))
|
||||
|
||||
typedef struct {
|
||||
long a,b;
|
||||
int32_t a,b;
|
||||
} long_real;
|
||||
|
||||
typedef long short_real;
|
||||
typedef int32_t short_real;
|
||||
|
||||
typedef struct {
|
||||
long a,b;
|
||||
int32_t a,b;
|
||||
short sign;
|
||||
} temp_int;
|
||||
|
||||
@ -59,14 +59,14 @@ struct swd {
|
||||
int b:1;
|
||||
};
|
||||
struct i387_struct {
|
||||
long cwd;
|
||||
long swd;
|
||||
long twd;
|
||||
long fip;
|
||||
long fcs;
|
||||
long foo;
|
||||
long fos;
|
||||
long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */
|
||||
int32_t cwd;
|
||||
int32_t swd;
|
||||
int32_t twd;
|
||||
int32_t fip;
|
||||
int32_t fcs;
|
||||
int32_t foo;
|
||||
int32_t fos;
|
||||
int32_t st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */
|
||||
};
|
||||
|
||||
#define I387 (*(struct i387_struct *)&(((struct pcb *)curproc->p_addr)->pcb_savefpu))
|
||||
|
@ -6,7 +6,7 @@
|
||||
* [expediant "port" of linux 8087 emulator to 386BSD, with apologies -wfj]
|
||||
*
|
||||
* from: 386BSD 0.1
|
||||
* $Id: math_emulate.c,v 1.25 1997/07/20 08:46:19 bde Exp $
|
||||
* $Id: math_emulate.c,v 1.26 1997/07/20 11:00:32 bde Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -74,8 +74,8 @@ static unsigned short
|
||||
get_fs_word(unsigned short *adr)
|
||||
{ return(fuword(adr)); }
|
||||
|
||||
static unsigned long
|
||||
get_fs_long(unsigned long *adr)
|
||||
static u_int32_t
|
||||
get_fs_long(u_int32_t *adr)
|
||||
{ return(fuword(adr)); }
|
||||
|
||||
static void
|
||||
@ -87,7 +87,7 @@ put_fs_word(unsigned short val, short *adr)
|
||||
{ (void)susword(adr,val); }
|
||||
|
||||
static void
|
||||
put_fs_long(u_long val, unsigned long *adr)
|
||||
put_fs_long(u_long val, u_int32_t *adr)
|
||||
{ (void)suword(adr,val); }
|
||||
|
||||
static int
|
||||
@ -96,7 +96,7 @@ math_emulate(struct trapframe * info)
|
||||
unsigned short code;
|
||||
temp_real tmp;
|
||||
char * address;
|
||||
u_long oldeip;
|
||||
u_int32_t oldeip;
|
||||
|
||||
/* ever used fp? */
|
||||
if ((((struct pcb *)curproc->p_addr)->pcb_flags & FP_SOFTFP) == 0) {
|
||||
@ -114,7 +114,7 @@ math_emulate(struct trapframe * info)
|
||||
/* 0x001f means user code space */
|
||||
if ((u_short)info->tf_cs != 0x001F) {
|
||||
printf("math_emulate: %04x:%08lx\n", (u_short)info->tf_cs,
|
||||
oldeip);
|
||||
(u_long)oldeip);
|
||||
panic("?Math emulation needed in kernel?");
|
||||
}
|
||||
code = get_fs_word((unsigned short *) oldeip);
|
||||
@ -391,8 +391,8 @@ for fcom , ??? ATS */
|
||||
case 0x24:
|
||||
address = ea(info,code);
|
||||
for (code = 0 ; code < 7 ; code++) {
|
||||
((long *) & I387)[code] =
|
||||
get_fs_long((unsigned long *) address);
|
||||
((int32_t *) & I387)[code] =
|
||||
get_fs_long((u_int32_t *) address);
|
||||
address += 4;
|
||||
}
|
||||
return(0);
|
||||
@ -405,8 +405,8 @@ for fcom , ??? ATS */
|
||||
address = ea(info,code);
|
||||
/*verify_area(address,28);*/
|
||||
for (code = 0 ; code < 7 ; code++) {
|
||||
put_fs_long( ((long *) & I387)[code],
|
||||
(unsigned long *) address);
|
||||
put_fs_long( ((int32_t *) & I387)[code],
|
||||
(u_int32_t *) address);
|
||||
address += 4;
|
||||
}
|
||||
return(0);
|
||||
@ -441,8 +441,8 @@ for fcom , ??? ATS */
|
||||
case 0xa4:
|
||||
address = ea(info,code);
|
||||
for (code = 0 ; code < 27 ; code++) {
|
||||
((long *) & I387)[code] =
|
||||
get_fs_long((unsigned long *) address);
|
||||
((int32_t *) & I387)[code] =
|
||||
get_fs_long((u_int32_t *) address);
|
||||
address += 4;
|
||||
}
|
||||
return(0);
|
||||
@ -450,8 +450,8 @@ for fcom , ??? ATS */
|
||||
address = ea(info,code);
|
||||
/*verify_area(address,108);*/
|
||||
for (code = 0 ; code < 27 ; code++) {
|
||||
put_fs_long( ((long *) & I387)[code],
|
||||
(unsigned long *) address);
|
||||
put_fs_long( ((int32_t *) & I387)[code],
|
||||
(u_int32_t *) address);
|
||||
address += 4;
|
||||
}
|
||||
I387.cwd = 0x037f;
|
||||
@ -550,7 +550,7 @@ for fcom , ??? ATS */
|
||||
static void
|
||||
fpop(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
u_int32_t tmp;
|
||||
|
||||
tmp = I387.swd & 0xffffc7ffUL;
|
||||
I387.swd += 0x00000800;
|
||||
@ -561,7 +561,7 @@ fpop(void)
|
||||
static void
|
||||
fpush(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
u_int32_t tmp;
|
||||
|
||||
tmp = I387.swd & 0xffffc7ffUL;
|
||||
I387.swd += 0x00003800;
|
||||
@ -608,7 +608,7 @@ static char *
|
||||
sib(struct trapframe * info, int mod)
|
||||
{
|
||||
unsigned char ss,index,base;
|
||||
long offset = 0;
|
||||
int32_t offset = 0;
|
||||
|
||||
base = get_fs_byte((char *) info->tf_eip);
|
||||
info->tf_eip++;
|
||||
@ -626,7 +626,7 @@ sib(struct trapframe * info, int mod)
|
||||
offset += (signed char) get_fs_byte((char *) info->tf_eip);
|
||||
info->tf_eip++;
|
||||
} else if (mod == 2 || base == 5) {
|
||||
offset += (signed) get_fs_long((unsigned long *) info->tf_eip);
|
||||
offset += (signed) get_fs_long((u_int32_t *) info->tf_eip);
|
||||
info->tf_eip += 4;
|
||||
}
|
||||
I387.foo = offset;
|
||||
@ -638,7 +638,7 @@ static char *
|
||||
ea(struct trapframe * info, unsigned short code)
|
||||
{
|
||||
unsigned char mod,rm;
|
||||
long * tmp;
|
||||
int32_t * tmp;
|
||||
int offset = 0;
|
||||
|
||||
mod = (code >> 6) & 3;
|
||||
@ -646,13 +646,13 @@ ea(struct trapframe * info, unsigned short code)
|
||||
if (rm == 4 && mod != 3)
|
||||
return sib(info,mod);
|
||||
if (rm == 5 && !mod) {
|
||||
offset = get_fs_long((unsigned long *) info->tf_eip);
|
||||
offset = get_fs_long((u_int32_t *) info->tf_eip);
|
||||
info->tf_eip += 4;
|
||||
I387.foo = offset;
|
||||
I387.fos = 0x17;
|
||||
return (char *) offset;
|
||||
}
|
||||
tmp = (long *) ®(rm);
|
||||
tmp = (int32_t *) ®(rm);
|
||||
switch (mod) {
|
||||
case 0: offset = 0; break;
|
||||
case 1:
|
||||
@ -660,7 +660,7 @@ ea(struct trapframe * info, unsigned short code)
|
||||
info->tf_eip++;
|
||||
break;
|
||||
case 2:
|
||||
offset = (signed) get_fs_long((unsigned long *) info->tf_eip);
|
||||
offset = (signed) get_fs_long((u_int32_t *) info->tf_eip);
|
||||
info->tf_eip += 4;
|
||||
break;
|
||||
#ifdef notyet
|
||||
@ -691,7 +691,7 @@ get_short_real(temp_real * tmp, struct trapframe * info, unsigned short code)
|
||||
short_real sr;
|
||||
|
||||
addr = ea(info,code);
|
||||
sr = get_fs_long((unsigned long *) addr);
|
||||
sr = get_fs_long((u_int32_t *) addr);
|
||||
short_to_temp(&sr,tmp);
|
||||
}
|
||||
|
||||
@ -702,8 +702,8 @@ get_long_real(temp_real * tmp, struct trapframe * info, unsigned short code)
|
||||
long_real lr;
|
||||
|
||||
addr = ea(info,code);
|
||||
lr.a = get_fs_long((unsigned long *) addr);
|
||||
lr.b = get_fs_long(1 + (unsigned long *) addr);
|
||||
lr.a = get_fs_long((u_int32_t *) addr);
|
||||
lr.b = get_fs_long(1 + (u_int32_t *) addr);
|
||||
long_to_temp(&lr,tmp);
|
||||
}
|
||||
|
||||
@ -713,8 +713,8 @@ get_temp_real(temp_real * tmp, struct trapframe * info, unsigned short code)
|
||||
char * addr;
|
||||
|
||||
addr = ea(info,code);
|
||||
tmp->a = get_fs_long((unsigned long *) addr);
|
||||
tmp->b = get_fs_long(1 + (unsigned long *) addr);
|
||||
tmp->a = get_fs_long((u_int32_t *) addr);
|
||||
tmp->b = get_fs_long(1 + (u_int32_t *) addr);
|
||||
tmp->exponent = get_fs_word(4 + (unsigned short *) addr);
|
||||
}
|
||||
|
||||
@ -739,7 +739,7 @@ get_long_int(temp_real * tmp, struct trapframe * info, unsigned short code)
|
||||
temp_int ti;
|
||||
|
||||
addr = ea(info,code);
|
||||
ti.a = get_fs_long((unsigned long *) addr);
|
||||
ti.a = get_fs_long((u_int32_t *) addr);
|
||||
ti.b = 0;
|
||||
if (ti.sign = (ti.a < 0))
|
||||
ti.a = - ti.a;
|
||||
@ -753,8 +753,8 @@ get_longlong_int(temp_real * tmp, struct trapframe * info, unsigned short code)
|
||||
temp_int ti;
|
||||
|
||||
addr = ea(info,code);
|
||||
ti.a = get_fs_long((unsigned long *) addr);
|
||||
ti.b = get_fs_long(1 + (unsigned long *) addr);
|
||||
ti.a = get_fs_long((u_int32_t *) addr);
|
||||
ti.b = get_fs_long(1 + (u_int32_t *) addr);
|
||||
if (ti.sign = (ti.b < 0))
|
||||
__asm__("notl %0 ; notl %1\n\t"
|
||||
"addl $1,%0 ; adcl $0,%1"
|
||||
@ -774,7 +774,7 @@ __asm__("addl %0,%0 ; adcl %1,%1\n\t" \
|
||||
|
||||
#define ADD64(val,low,high) \
|
||||
__asm__("addl %4,%0 ; adcl $0,%1":"=r" (low),"=r" (high) \
|
||||
:"0" (low),"1" (high),"r" ((unsigned long) (val)))
|
||||
:"0" (low),"1" (high),"r" ((u_int32_t) (val)))
|
||||
|
||||
static void
|
||||
get_BCD(temp_real * tmp, struct trapframe * info, unsigned short code)
|
||||
@ -808,7 +808,7 @@ put_short_real(const temp_real * tmp,
|
||||
addr = ea(info,code);
|
||||
/*verify_area(addr,4);*/
|
||||
temp_to_short(tmp,&sr);
|
||||
put_fs_long(sr,(unsigned long *) addr);
|
||||
put_fs_long(sr,(u_int32_t *) addr);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -821,8 +821,8 @@ put_long_real(const temp_real * tmp,
|
||||
addr = ea(info,code);
|
||||
/*verify_area(addr,8);*/
|
||||
temp_to_long(tmp,&lr);
|
||||
put_fs_long(lr.a, (unsigned long *) addr);
|
||||
put_fs_long(lr.b, 1 + (unsigned long *) addr);
|
||||
put_fs_long(lr.a, (u_int32_t *) addr);
|
||||
put_fs_long(lr.b, 1 + (u_int32_t *) addr);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -833,8 +833,8 @@ put_temp_real(const temp_real * tmp,
|
||||
|
||||
addr = ea(info,code);
|
||||
/*verify_area(addr,10);*/
|
||||
put_fs_long(tmp->a, (unsigned long *) addr);
|
||||
put_fs_long(tmp->b, 1 + (unsigned long *) addr);
|
||||
put_fs_long(tmp->a, (u_int32_t *) addr);
|
||||
put_fs_long(tmp->b, 1 + (u_int32_t *) addr);
|
||||
put_fs_word(tmp->exponent, 4 + (short *) addr);
|
||||
}
|
||||
|
||||
@ -865,7 +865,7 @@ put_long_int(const temp_real * tmp,
|
||||
/*verify_area(addr,4);*/
|
||||
if (ti.sign)
|
||||
ti.a = -ti.a;
|
||||
put_fs_long(ti.a,(unsigned long *) addr);
|
||||
put_fs_long(ti.a,(u_int32_t *) addr);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -883,8 +883,8 @@ put_longlong_int(const temp_real * tmp,
|
||||
"addl $1,%0 ; adcl $0,%1"
|
||||
:"=r" (ti.a),"=r" (ti.b)
|
||||
:"0" (ti.a),"1" (ti.b));
|
||||
put_fs_long(ti.a,(unsigned long *) addr);
|
||||
put_fs_long(ti.b,1 + (unsigned long *) addr);
|
||||
put_fs_long(ti.a,(u_int32_t *) addr);
|
||||
put_fs_long(ti.b,1 + (u_int32_t *) addr);
|
||||
}
|
||||
|
||||
#define DIV10(low,high,rem) \
|
||||
@ -934,7 +934,7 @@ shift(int * c)
|
||||
"movl 4(%0),%%eax ; adcl %%eax,4(%0)\n\t"
|
||||
"movl 8(%0),%%eax ; adcl %%eax,8(%0)\n\t"
|
||||
"movl 12(%0),%%eax ; adcl %%eax,12(%0)"
|
||||
::"r" ((long) c):"ax");
|
||||
::"r" (c):"ax");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -958,7 +958,7 @@ mul64(const temp_real * a, const temp_real * b, int * c)
|
||||
"addl %%eax,4(%2)\n\t"
|
||||
"adcl %%edx,8(%2)\n\t"
|
||||
"adcl $0,12(%2)"
|
||||
::"S" ((long) a),"c" ((long) b),"D" ((long) c)
|
||||
::"S" (a),"c" (b),"D" (c)
|
||||
:"ax","dx");
|
||||
}
|
||||
|
||||
@ -1009,14 +1009,14 @@ shift_left(int * c)
|
||||
"movl 4(%0),%%eax ; adcl %%eax,4(%0)\n\t"
|
||||
"movl 8(%0),%%eax ; adcl %%eax,8(%0)\n\t"
|
||||
"movl 12(%0),%%eax ; adcl %%eax,12(%0)"
|
||||
::"r" ((long) c):"ax");
|
||||
::"r" (c):"ax");
|
||||
}
|
||||
|
||||
static void
|
||||
shift_right(int * c)
|
||||
{
|
||||
__asm__("shrl $1,12(%0) ; rcrl $1,8(%0) ; rcrl $1,4(%0) ; rcrl $1,(%0)"
|
||||
::"r" ((long) c));
|
||||
::"r" (c));
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1028,7 +1028,7 @@ try_sub(int * a, int * b)
|
||||
"movl 4(%1),%%eax ; sbbl %%eax,4(%2)\n\t"
|
||||
"movl 8(%1),%%eax ; sbbl %%eax,8(%2)\n\t"
|
||||
"movl 12(%1),%%eax ; sbbl %%eax,12(%2)\n\t"
|
||||
"setae %%al":"=a" (ok):"c" ((long) a),"d" ((long) b));
|
||||
"setae %%al":"=a" (ok):"c" (a),"d" (b));
|
||||
return ok;
|
||||
}
|
||||
|
||||
@ -1312,7 +1312,7 @@ long_to_temp(const long_real * a, temp_real * b)
|
||||
b->exponent = ((a->b >> 20) & 0x7ff)-1023+16383;
|
||||
if (a->b<0)
|
||||
b->exponent |= 0x8000;
|
||||
b->b = 0x80000000UL | (a->b<<11) | (((unsigned long)a->a)>>21);
|
||||
b->b = 0x80000000UL | (a->b<<11) | (((u_int32_t)a->a)>>21);
|
||||
b->a = a->a<<11;
|
||||
}
|
||||
|
||||
@ -1323,7 +1323,7 @@ temp_to_short(const temp_real * a, short_real * b)
|
||||
*b = (a->exponent)?0x80000000UL:0;
|
||||
return;
|
||||
}
|
||||
*b = ((((long) a->exponent)-16383+127) << 23) & 0x7f800000;
|
||||
*b = ((((int32_t) a->exponent)-16383+127) << 23) & 0x7f800000;
|
||||
if (a->exponent < 0)
|
||||
*b |= 0x80000000UL;
|
||||
*b |= (a->b >> 8) & 0x007fffff;
|
||||
@ -1351,7 +1351,8 @@ temp_to_long(const temp_real * a, long_real * b)
|
||||
b->b = (a->exponent)?0x80000000UL:0;
|
||||
return;
|
||||
}
|
||||
b->b = (((0x7fff & (long) a->exponent)-16383+1023) << 20) & 0x7ff00000;
|
||||
b->b = (((0x7fff & (int32_t) a->exponent)-16383+1023) << 20) &
|
||||
0x7ff00000;
|
||||
if (a->exponent < 0)
|
||||
b->b |= 0x80000000UL;
|
||||
b->b |= (a->b >> 11) & 0x000fffff;
|
||||
@ -1383,7 +1384,7 @@ static void
|
||||
frndint(const temp_real * a, temp_real * b)
|
||||
{
|
||||
int shift = 16383 + 63 - (a->exponent & 0x7fff);
|
||||
unsigned long underflow;
|
||||
u_int32_t underflow;
|
||||
|
||||
if ((shift < 0) || (shift == 16383+63)) {
|
||||
*b = *a;
|
||||
@ -1468,7 +1469,7 @@ static void
|
||||
real_to_int(const temp_real * a, temp_int * b)
|
||||
{
|
||||
int shift = 16383 + 63 - (a->exponent & 0x7fff);
|
||||
unsigned long underflow;
|
||||
u_int32_t underflow;
|
||||
|
||||
b->a = b->b = underflow = 0;
|
||||
b->sign = (a->exponent < 0);
|
||||
|
Loading…
Reference in New Issue
Block a user