981 |
#ifndef USE_X86LDOUBLE |
#ifndef USE_X86LDOUBLE |
982 |
void helper_fldt_ST0_A0(void) |
void helper_fldt_ST0_A0(void) |
983 |
{ |
{ |
984 |
ST0 = helper_fldt((uint8_t *)A0); |
int new_fpstt; |
985 |
|
new_fpstt = (env->fpstt - 1) & 7; |
986 |
|
env->fpregs[new_fpstt] = helper_fldt((uint8_t *)A0); |
987 |
|
env->fpstt = new_fpstt; |
988 |
|
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
989 |
} |
} |
990 |
|
|
991 |
void helper_fstt_ST0_A0(void) |
void helper_fstt_ST0_A0(void) |
1000 |
|
|
1001 |
void helper_fbld_ST0_A0(void) |
void helper_fbld_ST0_A0(void) |
1002 |
{ |
{ |
1003 |
uint8_t *seg; |
CPU86_LDouble tmp; |
1004 |
CPU86_LDouble fpsrcop; |
uint64_t val; |
|
int m32i; |
|
1005 |
unsigned int v; |
unsigned int v; |
1006 |
|
int i; |
1007 |
|
|
1008 |
/* in this code, seg/m32i will be used as temporary ptr/int */ |
val = 0; |
1009 |
seg = (uint8_t *)A0 + 8; |
for(i = 8; i >= 0; i--) { |
1010 |
v = ldub(seg--); |
v = ldub((uint8_t *)A0 + i); |
1011 |
/* XXX: raise exception */ |
val = (val * 100) + ((v >> 4) * 10) + (v & 0xf); |
1012 |
if (v != 0) |
} |
1013 |
return; |
tmp = val; |
1014 |
v = ldub(seg--); |
if (ldub((uint8_t *)A0 + 9) & 0x80) |
1015 |
/* XXX: raise exception */ |
tmp = -tmp; |
1016 |
if ((v & 0xf0) != 0) |
fpush(); |
1017 |
return; |
ST0 = tmp; |
|
m32i = v; /* <-- d14 */ |
|
|
v = ldub(seg--); |
|
|
m32i = MUL10(m32i) + (v >> 4); /* <-- val * 10 + d13 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d12 */ |
|
|
v = ldub(seg--); |
|
|
m32i = MUL10(m32i) + (v >> 4); /* <-- val * 10 + d11 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d10 */ |
|
|
v = ldub(seg--); |
|
|
m32i = MUL10(m32i) + (v >> 4); /* <-- val * 10 + d9 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d8 */ |
|
|
fpsrcop = ((CPU86_LDouble)m32i) * 100000000.0; |
|
|
|
|
|
v = ldub(seg--); |
|
|
m32i = (v >> 4); /* <-- d7 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d6 */ |
|
|
v = ldub(seg--); |
|
|
m32i = MUL10(m32i) + (v >> 4); /* <-- val * 10 + d5 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d4 */ |
|
|
v = ldub(seg--); |
|
|
m32i = MUL10(m32i) + (v >> 4); /* <-- val * 10 + d3 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d2 */ |
|
|
v = ldub(seg); |
|
|
m32i = MUL10(m32i) + (v >> 4); /* <-- val * 10 + d1 */ |
|
|
m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d0 */ |
|
|
fpsrcop += ((CPU86_LDouble)m32i); |
|
|
if ( ldub(seg+9) & 0x80 ) |
|
|
fpsrcop = -fpsrcop; |
|
|
ST0 = fpsrcop; |
|
1018 |
} |
} |
1019 |
|
|
1020 |
void helper_fbst_ST0_A0(void) |
void helper_fbst_ST0_A0(void) |
1021 |
{ |
{ |
1022 |
CPU86_LDouble fptemp; |
CPU86_LDouble tmp; |
|
CPU86_LDouble fpsrcop; |
|
1023 |
int v; |
int v; |
1024 |
uint8_t *mem_ref, *mem_end; |
uint8_t *mem_ref, *mem_end; |
1025 |
|
int64_t val; |
1026 |
|
|
1027 |
fpsrcop = rint(ST0); |
tmp = rint(ST0); |
1028 |
|
val = (int64_t)tmp; |
1029 |
mem_ref = (uint8_t *)A0; |
mem_ref = (uint8_t *)A0; |
1030 |
mem_end = mem_ref + 8; |
mem_end = mem_ref + 9; |
1031 |
if ( fpsrcop < 0.0 ) { |
if (val < 0) { |
1032 |
stw(mem_end, 0x8000); |
stb(mem_end, 0x80); |
1033 |
fpsrcop = -fpsrcop; |
val = -val; |
1034 |
} else { |
} else { |
1035 |
stw(mem_end, 0x0000); |
stb(mem_end, 0x00); |
1036 |
} |
} |
1037 |
while (mem_ref < mem_end) { |
while (mem_ref < mem_end) { |
1038 |
if (fpsrcop == 0.0) |
if (val == 0) |
1039 |
break; |
break; |
1040 |
fptemp = floor(fpsrcop/10.0); |
v = val % 100; |
1041 |
v = ((int)(fpsrcop - fptemp*10.0)); |
val = val / 100; |
1042 |
if (fptemp == 0.0) { |
v = ((v / 10) << 4) | (v % 10); |
|
stb(mem_ref++, v); |
|
|
break; |
|
|
} |
|
|
fpsrcop = fptemp; |
|
|
fptemp = floor(fpsrcop/10.0); |
|
|
v |= (((int)(fpsrcop - fptemp*10.0)) << 4); |
|
1043 |
stb(mem_ref++, v); |
stb(mem_ref++, v); |
|
fpsrcop = fptemp; |
|
1044 |
} |
} |
1045 |
while (mem_ref < mem_end) { |
while (mem_ref < mem_end) { |
1046 |
stb(mem_ref++, 0); |
stb(mem_ref++, 0); |