aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2024-04-08 00:35:06 -1000
committerRichard Henderson <richard.henderson@linaro.org>2024-05-26 12:51:50 -0700
commit94f60f8f1c07de1449f798141cf13ba93f07d875 (patch)
treeabc6b34d17216c6e203cac2ca7215bdb3b5cdcca
parent505e2ef744b3ebd0a28a94ed9b00f99595b0cf6a (diff)
downloadqemu-94f60f8f1c07de1449f798141cf13ba93f07d875.zip
qemu-94f60f8f1c07de1449f798141cf13ba93f07d875.tar.gz
qemu-94f60f8f1c07de1449f798141cf13ba93f07d875.tar.bz2
target/i386: Convert do_fsave, do_frstor to X86Access
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r--target/i386/tcg/fpu_helper.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c
index 01e9a1f..df12eac 100644
--- a/target/i386/tcg/fpu_helper.c
+++ b/target/i386/tcg/fpu_helper.c
@@ -2469,21 +2469,16 @@ void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32)
do_fldenv(&ac, ptr, data32);
}
-static void do_fsave(CPUX86State *env, target_ulong ptr, int data32,
- uintptr_t retaddr)
+static void do_fsave(X86Access *ac, target_ulong ptr, int data32)
{
- X86Access ac;
- floatx80 tmp;
- int i, envsize = 14 << data32;
-
- access_prepare(&ac, env, ptr, envsize + 80, MMU_DATA_STORE, retaddr);
+ CPUX86State *env = ac->env;
- do_fstenv(&ac, ptr, data32);
- ptr += envsize;
+ do_fstenv(ac, ptr, data32);
+ ptr += 14 << data32;
- for (i = 0; i < 8; i++) {
- tmp = ST(i);
- do_fstt(&ac, ptr, tmp);
+ for (int i = 0; i < 8; i++) {
+ floatx80 tmp = ST(i);
+ do_fstt(ac, ptr, tmp);
ptr += 10;
}
@@ -2492,23 +2487,22 @@ static void do_fsave(CPUX86State *env, target_ulong ptr, int data32,
void helper_fsave(CPUX86State *env, target_ulong ptr, int data32)
{
- do_fsave(env, ptr, data32, GETPC());
+ int size = (14 << data32) + 80;
+ X86Access ac;
+
+ access_prepare(&ac, env, ptr, size, MMU_DATA_STORE, GETPC());
+ do_fsave(&ac, ptr, data32);
}
-static void do_frstor(CPUX86State *env, target_ulong ptr, int data32,
- uintptr_t retaddr)
+static void do_frstor(X86Access *ac, target_ulong ptr, int data32)
{
- X86Access ac;
- floatx80 tmp;
- int i, envsize = 14 << data32;
-
- access_prepare(&ac, env, ptr, envsize + 80, MMU_DATA_LOAD, retaddr);
+ CPUX86State *env = ac->env;
- do_fldenv(&ac, ptr, data32);
- ptr += envsize;
+ do_fldenv(ac, ptr, data32);
+ ptr += 14 << data32;
- for (i = 0; i < 8; i++) {
- tmp = do_fldt(&ac, ptr);
+ for (int i = 0; i < 8; i++) {
+ floatx80 tmp = do_fldt(ac, ptr);
ST(i) = tmp;
ptr += 10;
}
@@ -2516,7 +2510,11 @@ static void do_frstor(CPUX86State *env, target_ulong ptr, int data32,
void helper_frstor(CPUX86State *env, target_ulong ptr, int data32)
{
- do_frstor(env, ptr, data32, GETPC());
+ int size = (14 << data32) + 80;
+ X86Access ac;
+
+ access_prepare(&ac, env, ptr, size, MMU_DATA_LOAD, GETPC());
+ do_frstor(&ac, ptr, data32);
}
#define XO(X) offsetof(X86XSaveArea, X)
@@ -2972,12 +2970,20 @@ void helper_xrstor(CPUX86State *env, target_ulong ptr, uint64_t rfbm)
#if defined(CONFIG_USER_ONLY)
void cpu_x86_fsave(CPUX86State *env, target_ulong ptr, int data32)
{
- do_fsave(env, ptr, data32, 0);
+ int size = (14 << data32) + 80;
+ X86Access ac;
+
+ access_prepare(&ac, env, ptr, size, MMU_DATA_STORE, 0);
+ do_fsave(&ac, ptr, data32);
}
void cpu_x86_frstor(CPUX86State *env, target_ulong ptr, int data32)
{
- do_frstor(env, ptr, data32, 0);
+ int size = (14 << data32) + 80;
+ X86Access ac;
+
+ access_prepare(&ac, env, ptr, size, MMU_DATA_LOAD, 0);
+ do_frstor(&ac, ptr, data32);
}
void cpu_x86_fxsave(CPUX86State *env, target_ulong ptr)