[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [5837] target-ppc: use ldl/ldub/stl/stub for load/store in
From: |
Aurelien Jarno |
Subject: |
[Qemu-devel] [5837] target-ppc: use ldl/ldub/stl/stub for load/store in op_helper.c |
Date: |
Sun, 30 Nov 2008 17:54:21 +0000 |
Revision: 5837
http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5837
Author: aurel32
Date: 2008-11-30 17:54:21 +0000 (Sun, 30 Nov 2008)
Log Message:
-----------
target-ppc: use ldl/ldub/stl/stub for load/store in op_helper.c
Should not give any performance penality given cpu_mmu_index() is
an inline function returning a value from env.
Signed-off-by: Aurelien Jarno <address@hidden>
Modified Paths:
--------------
trunk/target-ppc/op_helper.c
Modified: trunk/target-ppc/op_helper.c
===================================================================
--- trunk/target-ppc/op_helper.c 2008-11-30 17:26:29 UTC (rev 5836)
+++ trunk/target-ppc/op_helper.c 2008-11-30 17:54:21 UTC (rev 5837)
@@ -107,88 +107,35 @@
void helper_lmw (target_ulong addr, uint32_t reg)
{
-#ifdef CONFIG_USER_ONLY
-#define ldfun ldl_raw
-#else
- int (*ldfun)(target_ulong);
-
- switch (env->mmu_idx) {
- default:
- case 0: ldfun = ldl_user;
- break;
- case 1: ldfun = ldl_kernel;
- break;
- case 2: ldfun = ldl_hypv;
- break;
- }
-#endif
for (; reg < 32; reg++, addr += 4) {
if (msr_le)
- env->gpr[reg] = bswap32(ldfun(get_addr(addr)));
+ env->gpr[reg] = bswap32(ldl(get_addr(addr)));
else
- env->gpr[reg] = ldfun(get_addr(addr));
+ env->gpr[reg] = ldl(get_addr(addr));
}
}
void helper_stmw (target_ulong addr, uint32_t reg)
{
-#ifdef CONFIG_USER_ONLY
-#define stfun stl_raw
-#else
- void (*stfun)(target_ulong, int);
-
- switch (env->mmu_idx) {
- default:
- case 0: stfun = stl_user;
- break;
- case 1: stfun = stl_kernel;
- break;
- case 2: stfun = stl_hypv;
- break;
- }
-#endif
for (; reg < 32; reg++, addr += 4) {
if (msr_le)
- stfun(get_addr(addr), bswap32((uint32_t)env->gpr[reg]));
+ stl(get_addr(addr), bswap32((uint32_t)env->gpr[reg]));
else
- stfun(get_addr(addr), (uint32_t)env->gpr[reg]);
+ stl(get_addr(addr), (uint32_t)env->gpr[reg]);
}
}
void helper_lsw(target_ulong addr, uint32_t nb, uint32_t reg)
{
int sh;
-#ifdef CONFIG_USER_ONLY
-#define ldfunl ldl_raw
-#define ldfunb ldub_raw
-#else
- int (*ldfunl)(target_ulong);
- int (*ldfunb)(target_ulong);
-
- switch (env->mmu_idx) {
- default:
- case 0:
- ldfunl = ldl_user;
- ldfunb = ldub_user;
- break;
- case 1:
- ldfunl = ldl_kernel;
- ldfunb = ldub_kernel;
- break;
- case 2:
- ldfunl = ldl_hypv;
- ldfunb = ldub_hypv;
- break;
- }
-#endif
for (; nb > 3; nb -= 4, addr += 4) {
- env->gpr[reg] = ldfunl(get_addr(addr));
+ env->gpr[reg] = ldl(get_addr(addr));
reg = (reg + 1) % 32;
}
if (unlikely(nb > 0)) {
env->gpr[reg] = 0;
for (sh = 24; nb > 0; nb--, addr++, sh -= 8) {
- env->gpr[reg] |= ldfunb(get_addr(addr)) << sh;
+ env->gpr[reg] |= ldub(get_addr(addr)) << sh;
}
}
}
@@ -214,37 +161,13 @@
void helper_stsw(target_ulong addr, uint32_t nb, uint32_t reg)
{
int sh;
-#ifdef CONFIG_USER_ONLY
-#define stfunl stl_raw
-#define stfunb stb_raw
-#else
- void (*stfunl)(target_ulong, int);
- void (*stfunb)(target_ulong, int);
-
- switch (env->mmu_idx) {
- default:
- case 0:
- stfunl = stl_user;
- stfunb = stb_user;
- break;
- case 1:
- stfunl = stl_kernel;
- stfunb = stb_kernel;
- break;
- case 2:
- stfunl = stl_hypv;
- stfunb = stb_hypv;
- break;
- }
-#endif
-
for (; nb > 3; nb -= 4, addr += 4) {
- stfunl(get_addr(addr), env->gpr[reg]);
+ stl(get_addr(addr), env->gpr[reg]);
reg = (reg + 1) % 32;
}
if (unlikely(nb > 0)) {
for (sh = 24; nb > 0; nb--, addr++, sh -= 8)
- stfunb(get_addr(addr), (env->gpr[reg] >> sh) & 0xFF);
+ stb(get_addr(addr), (env->gpr[reg] >> sh) & 0xFF);
}
}
@@ -252,24 +175,9 @@
{
target_long mask = get_addr(~(dcache_line_size - 1));
int i;
-#ifdef CONFIG_USER_ONLY
-#define stfun stl_raw
-#else
- void (*stfun)(target_ulong, int);
-
- switch (env->mmu_idx) {
- default:
- case 0: stfun = stl_user;
- break;
- case 1: stfun = stl_kernel;
- break;
- case 2: stfun = stl_hypv;
- break;
- }
-#endif
addr &= mask;
for (i = 0 ; i < dcache_line_size ; i += 4) {
- stfun(addr + i , 0);
+ stl(addr + i , 0);
}
if ((env->reserve & mask) == addr)
env->reserve = (target_ulong)-1ULL;
@@ -298,19 +206,7 @@
* (not a fetch) by the MMU. To be sure it will be so,
* do the load "by hand".
*/
-#ifdef CONFIG_USER_ONLY
- tmp = ldl_raw(addr);
-#else
- switch (env->mmu_idx) {
- default:
- case 0: tmp = ldl_user(addr);
- break;
- case 1: tmp = ldl_kernel(addr);
- break;
- case 2: tmp = ldl_hypv(addr);
- break;
- }
-#endif
+ tmp = ldl(addr);
tb_invalidate_page_range(addr, addr + env->icache_line_size);
}
@@ -318,24 +214,9 @@
target_ulong helper_lscbx (target_ulong addr, uint32_t reg, uint32_t ra,
uint32_t rb)
{
int i, c, d;
-#ifdef CONFIG_USER_ONLY
-#define ldfun ldub_raw
-#else
- int (*ldfun)(target_ulong);
-
- switch (env->mmu_idx) {
- default:
- case 0: ldfun = ldub_user;
- break;
- case 1: ldfun = ldub_kernel;
- break;
- case 2: ldfun = ldub_hypv;
- break;
- }
-#endif
d = 24;
for (i = 0; i < xer_bc; i++) {
- c = ldfun((uint32_t)addr++);
+ c = ldub((uint32_t)addr++);
/* ra (if not 0) and rb are never modified */
if (likely(reg != rb && (ra == 0 || reg != ra))) {
env->gpr[reg] = (env->gpr[reg] & ~(0xFF << d)) | (c << d);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [5837] target-ppc: use ldl/ldub/stl/stub for load/store in op_helper.c,
Aurelien Jarno <=