target/i386: Convert do_fldt, do_fstt to X86Access
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
24f6813924
commit
d3e8b648ab
@ -27,6 +27,7 @@
|
|||||||
#include "fpu/softfloat.h"
|
#include "fpu/softfloat.h"
|
||||||
#include "fpu/softfloat-macros.h"
|
#include "fpu/softfloat-macros.h"
|
||||||
#include "helper-tcg.h"
|
#include "helper-tcg.h"
|
||||||
|
#include "access.h"
|
||||||
|
|
||||||
/* float macros */
|
/* float macros */
|
||||||
#define FT0 (env->ft0)
|
#define FT0 (env->ft0)
|
||||||
@ -84,23 +85,22 @@ static inline void fpop(CPUX86State *env)
|
|||||||
env->fpstt = (env->fpstt + 1) & 7;
|
env->fpstt = (env->fpstt + 1) & 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
static floatx80 do_fldt(CPUX86State *env, target_ulong ptr, uintptr_t retaddr)
|
static floatx80 do_fldt(X86Access *ac, target_ulong ptr)
|
||||||
{
|
{
|
||||||
CPU_LDoubleU temp;
|
CPU_LDoubleU temp;
|
||||||
|
|
||||||
temp.l.lower = cpu_ldq_data_ra(env, ptr, retaddr);
|
temp.l.lower = access_ldq(ac, ptr);
|
||||||
temp.l.upper = cpu_lduw_data_ra(env, ptr + 8, retaddr);
|
temp.l.upper = access_ldw(ac, ptr + 8);
|
||||||
return temp.d;
|
return temp.d;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_fstt(CPUX86State *env, floatx80 f, target_ulong ptr,
|
static void do_fstt(X86Access *ac, target_ulong ptr, floatx80 f)
|
||||||
uintptr_t retaddr)
|
|
||||||
{
|
{
|
||||||
CPU_LDoubleU temp;
|
CPU_LDoubleU temp;
|
||||||
|
|
||||||
temp.d = f;
|
temp.d = f;
|
||||||
cpu_stq_data_ra(env, ptr, temp.l.lower, retaddr);
|
access_stq(ac, ptr, temp.l.lower);
|
||||||
cpu_stw_data_ra(env, ptr + 8, temp.l.upper, retaddr);
|
access_stw(ac, ptr + 8, temp.l.upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* x87 FPU helpers */
|
/* x87 FPU helpers */
|
||||||
@ -382,16 +382,22 @@ int64_t helper_fisttll_ST0(CPUX86State *env)
|
|||||||
void helper_fldt_ST0(CPUX86State *env, target_ulong ptr)
|
void helper_fldt_ST0(CPUX86State *env, target_ulong ptr)
|
||||||
{
|
{
|
||||||
int new_fpstt;
|
int new_fpstt;
|
||||||
|
X86Access ac;
|
||||||
|
|
||||||
|
access_prepare(&ac, env, ptr, 10, MMU_DATA_LOAD, GETPC());
|
||||||
|
|
||||||
new_fpstt = (env->fpstt - 1) & 7;
|
new_fpstt = (env->fpstt - 1) & 7;
|
||||||
env->fpregs[new_fpstt].d = do_fldt(env, ptr, GETPC());
|
env->fpregs[new_fpstt].d = do_fldt(&ac, ptr);
|
||||||
env->fpstt = new_fpstt;
|
env->fpstt = new_fpstt;
|
||||||
env->fptags[new_fpstt] = 0; /* validate stack entry */
|
env->fptags[new_fpstt] = 0; /* validate stack entry */
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_fstt_ST0(CPUX86State *env, target_ulong ptr)
|
void helper_fstt_ST0(CPUX86State *env, target_ulong ptr)
|
||||||
{
|
{
|
||||||
do_fstt(env, ST0, ptr, GETPC());
|
X86Access ac;
|
||||||
|
|
||||||
|
access_prepare(&ac, env, ptr, 10, MMU_DATA_STORE, GETPC());
|
||||||
|
do_fstt(&ac, ptr, ST0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_fpush(CPUX86State *env)
|
void helper_fpush(CPUX86State *env)
|
||||||
@ -2460,15 +2466,18 @@ void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32)
|
|||||||
static void do_fsave(CPUX86State *env, target_ulong ptr, int data32,
|
static void do_fsave(CPUX86State *env, target_ulong ptr, int data32,
|
||||||
uintptr_t retaddr)
|
uintptr_t retaddr)
|
||||||
{
|
{
|
||||||
|
X86Access ac;
|
||||||
floatx80 tmp;
|
floatx80 tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
do_fstenv(env, ptr, data32, retaddr);
|
do_fstenv(env, ptr, data32, retaddr);
|
||||||
|
|
||||||
ptr += (target_ulong)14 << data32;
|
ptr += (target_ulong)14 << data32;
|
||||||
|
access_prepare(&ac, env, ptr, 80, MMU_DATA_STORE, retaddr);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
tmp = ST(i);
|
tmp = ST(i);
|
||||||
do_fstt(env, tmp, ptr, retaddr);
|
do_fstt(&ac, ptr, tmp);
|
||||||
ptr += 10;
|
ptr += 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2483,14 +2492,17 @@ void helper_fsave(CPUX86State *env, target_ulong ptr, int data32)
|
|||||||
static void do_frstor(CPUX86State *env, target_ulong ptr, int data32,
|
static void do_frstor(CPUX86State *env, target_ulong ptr, int data32,
|
||||||
uintptr_t retaddr)
|
uintptr_t retaddr)
|
||||||
{
|
{
|
||||||
|
X86Access ac;
|
||||||
floatx80 tmp;
|
floatx80 tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
do_fldenv(env, ptr, data32, retaddr);
|
do_fldenv(env, ptr, data32, retaddr);
|
||||||
ptr += (target_ulong)14 << data32;
|
ptr += (target_ulong)14 << data32;
|
||||||
|
|
||||||
|
access_prepare(&ac, env, ptr, 80, MMU_DATA_LOAD, retaddr);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
tmp = do_fldt(env, ptr, retaddr);
|
tmp = do_fldt(&ac, ptr);
|
||||||
ST(i) = tmp;
|
ST(i) = tmp;
|
||||||
ptr += 10;
|
ptr += 10;
|
||||||
}
|
}
|
||||||
@ -2507,6 +2519,7 @@ static void do_xsave_fpu(CPUX86State *env, target_ulong ptr, uintptr_t ra)
|
|||||||
{
|
{
|
||||||
int fpus, fptag, i;
|
int fpus, fptag, i;
|
||||||
target_ulong addr;
|
target_ulong addr;
|
||||||
|
X86Access ac;
|
||||||
|
|
||||||
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
|
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
|
||||||
fptag = 0;
|
fptag = 0;
|
||||||
@ -2525,9 +2538,11 @@ static void do_xsave_fpu(CPUX86State *env, target_ulong ptr, uintptr_t ra)
|
|||||||
cpu_stq_data_ra(env, ptr + XO(legacy.fpdp), 0, ra); /* edp+sel; rdp */
|
cpu_stq_data_ra(env, ptr + XO(legacy.fpdp), 0, ra); /* edp+sel; rdp */
|
||||||
|
|
||||||
addr = ptr + XO(legacy.fpregs);
|
addr = ptr + XO(legacy.fpregs);
|
||||||
|
access_prepare(&ac, env, addr, 8 * 16, MMU_DATA_STORE, ra);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
floatx80 tmp = ST(i);
|
floatx80 tmp = ST(i);
|
||||||
do_fstt(env, tmp, addr, ra);
|
do_fstt(&ac, addr, tmp);
|
||||||
addr += 16;
|
addr += 16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2700,6 +2715,7 @@ static void do_xrstor_fpu(CPUX86State *env, target_ulong ptr, uintptr_t ra)
|
|||||||
{
|
{
|
||||||
int i, fpuc, fpus, fptag;
|
int i, fpuc, fpus, fptag;
|
||||||
target_ulong addr;
|
target_ulong addr;
|
||||||
|
X86Access ac;
|
||||||
|
|
||||||
fpuc = cpu_lduw_data_ra(env, ptr + XO(legacy.fcw), ra);
|
fpuc = cpu_lduw_data_ra(env, ptr + XO(legacy.fcw), ra);
|
||||||
fpus = cpu_lduw_data_ra(env, ptr + XO(legacy.fsw), ra);
|
fpus = cpu_lduw_data_ra(env, ptr + XO(legacy.fsw), ra);
|
||||||
@ -2712,8 +2728,10 @@ static void do_xrstor_fpu(CPUX86State *env, target_ulong ptr, uintptr_t ra)
|
|||||||
}
|
}
|
||||||
|
|
||||||
addr = ptr + XO(legacy.fpregs);
|
addr = ptr + XO(legacy.fpregs);
|
||||||
|
access_prepare(&ac, env, addr, 8 * 16, MMU_DATA_LOAD, ra);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
floatx80 tmp = do_fldt(env, addr, ra);
|
floatx80 tmp = do_fldt(&ac, addr);
|
||||||
ST(i) = tmp;
|
ST(i) = tmp;
|
||||||
addr += 16;
|
addr += 16;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user