Commit dcc532c8098ffd347914ad036b8cf92a84171e3e
1 parent
ef0d51af
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 <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5837 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
11 additions
and
130 deletions
target-ppc/op_helper.c
| @@ -107,88 +107,35 @@ static always_inline target_ulong get_addr(target_ulong addr) | @@ -107,88 +107,35 @@ static always_inline target_ulong get_addr(target_ulong addr) | ||
| 107 | 107 | ||
| 108 | void helper_lmw (target_ulong addr, uint32_t reg) | 108 | void helper_lmw (target_ulong addr, uint32_t reg) |
| 109 | { | 109 | { |
| 110 | -#ifdef CONFIG_USER_ONLY | ||
| 111 | -#define ldfun ldl_raw | ||
| 112 | -#else | ||
| 113 | - int (*ldfun)(target_ulong); | ||
| 114 | - | ||
| 115 | - switch (env->mmu_idx) { | ||
| 116 | - default: | ||
| 117 | - case 0: ldfun = ldl_user; | ||
| 118 | - break; | ||
| 119 | - case 1: ldfun = ldl_kernel; | ||
| 120 | - break; | ||
| 121 | - case 2: ldfun = ldl_hypv; | ||
| 122 | - break; | ||
| 123 | - } | ||
| 124 | -#endif | ||
| 125 | for (; reg < 32; reg++, addr += 4) { | 110 | for (; reg < 32; reg++, addr += 4) { |
| 126 | if (msr_le) | 111 | if (msr_le) |
| 127 | - env->gpr[reg] = bswap32(ldfun(get_addr(addr))); | 112 | + env->gpr[reg] = bswap32(ldl(get_addr(addr))); |
| 128 | else | 113 | else |
| 129 | - env->gpr[reg] = ldfun(get_addr(addr)); | 114 | + env->gpr[reg] = ldl(get_addr(addr)); |
| 130 | } | 115 | } |
| 131 | } | 116 | } |
| 132 | 117 | ||
| 133 | void helper_stmw (target_ulong addr, uint32_t reg) | 118 | void helper_stmw (target_ulong addr, uint32_t reg) |
| 134 | { | 119 | { |
| 135 | -#ifdef CONFIG_USER_ONLY | ||
| 136 | -#define stfun stl_raw | ||
| 137 | -#else | ||
| 138 | - void (*stfun)(target_ulong, int); | ||
| 139 | - | ||
| 140 | - switch (env->mmu_idx) { | ||
| 141 | - default: | ||
| 142 | - case 0: stfun = stl_user; | ||
| 143 | - break; | ||
| 144 | - case 1: stfun = stl_kernel; | ||
| 145 | - break; | ||
| 146 | - case 2: stfun = stl_hypv; | ||
| 147 | - break; | ||
| 148 | - } | ||
| 149 | -#endif | ||
| 150 | for (; reg < 32; reg++, addr += 4) { | 120 | for (; reg < 32; reg++, addr += 4) { |
| 151 | if (msr_le) | 121 | if (msr_le) |
| 152 | - stfun(get_addr(addr), bswap32((uint32_t)env->gpr[reg])); | 122 | + stl(get_addr(addr), bswap32((uint32_t)env->gpr[reg])); |
| 153 | else | 123 | else |
| 154 | - stfun(get_addr(addr), (uint32_t)env->gpr[reg]); | 124 | + stl(get_addr(addr), (uint32_t)env->gpr[reg]); |
| 155 | } | 125 | } |
| 156 | } | 126 | } |
| 157 | 127 | ||
| 158 | void helper_lsw(target_ulong addr, uint32_t nb, uint32_t reg) | 128 | void helper_lsw(target_ulong addr, uint32_t nb, uint32_t reg) |
| 159 | { | 129 | { |
| 160 | int sh; | 130 | int sh; |
| 161 | -#ifdef CONFIG_USER_ONLY | ||
| 162 | -#define ldfunl ldl_raw | ||
| 163 | -#define ldfunb ldub_raw | ||
| 164 | -#else | ||
| 165 | - int (*ldfunl)(target_ulong); | ||
| 166 | - int (*ldfunb)(target_ulong); | ||
| 167 | - | ||
| 168 | - switch (env->mmu_idx) { | ||
| 169 | - default: | ||
| 170 | - case 0: | ||
| 171 | - ldfunl = ldl_user; | ||
| 172 | - ldfunb = ldub_user; | ||
| 173 | - break; | ||
| 174 | - case 1: | ||
| 175 | - ldfunl = ldl_kernel; | ||
| 176 | - ldfunb = ldub_kernel; | ||
| 177 | - break; | ||
| 178 | - case 2: | ||
| 179 | - ldfunl = ldl_hypv; | ||
| 180 | - ldfunb = ldub_hypv; | ||
| 181 | - break; | ||
| 182 | - } | ||
| 183 | -#endif | ||
| 184 | for (; nb > 3; nb -= 4, addr += 4) { | 131 | for (; nb > 3; nb -= 4, addr += 4) { |
| 185 | - env->gpr[reg] = ldfunl(get_addr(addr)); | 132 | + env->gpr[reg] = ldl(get_addr(addr)); |
| 186 | reg = (reg + 1) % 32; | 133 | reg = (reg + 1) % 32; |
| 187 | } | 134 | } |
| 188 | if (unlikely(nb > 0)) { | 135 | if (unlikely(nb > 0)) { |
| 189 | env->gpr[reg] = 0; | 136 | env->gpr[reg] = 0; |
| 190 | for (sh = 24; nb > 0; nb--, addr++, sh -= 8) { | 137 | for (sh = 24; nb > 0; nb--, addr++, sh -= 8) { |
| 191 | - env->gpr[reg] |= ldfunb(get_addr(addr)) << sh; | 138 | + env->gpr[reg] |= ldub(get_addr(addr)) << sh; |
| 192 | } | 139 | } |
| 193 | } | 140 | } |
| 194 | } | 141 | } |
| @@ -214,37 +161,13 @@ void helper_lswx(target_ulong addr, uint32_t reg, uint32_t ra, uint32_t rb) | @@ -214,37 +161,13 @@ void helper_lswx(target_ulong addr, uint32_t reg, uint32_t ra, uint32_t rb) | ||
| 214 | void helper_stsw(target_ulong addr, uint32_t nb, uint32_t reg) | 161 | void helper_stsw(target_ulong addr, uint32_t nb, uint32_t reg) |
| 215 | { | 162 | { |
| 216 | int sh; | 163 | int sh; |
| 217 | -#ifdef CONFIG_USER_ONLY | ||
| 218 | -#define stfunl stl_raw | ||
| 219 | -#define stfunb stb_raw | ||
| 220 | -#else | ||
| 221 | - void (*stfunl)(target_ulong, int); | ||
| 222 | - void (*stfunb)(target_ulong, int); | ||
| 223 | - | ||
| 224 | - switch (env->mmu_idx) { | ||
| 225 | - default: | ||
| 226 | - case 0: | ||
| 227 | - stfunl = stl_user; | ||
| 228 | - stfunb = stb_user; | ||
| 229 | - break; | ||
| 230 | - case 1: | ||
| 231 | - stfunl = stl_kernel; | ||
| 232 | - stfunb = stb_kernel; | ||
| 233 | - break; | ||
| 234 | - case 2: | ||
| 235 | - stfunl = stl_hypv; | ||
| 236 | - stfunb = stb_hypv; | ||
| 237 | - break; | ||
| 238 | - } | ||
| 239 | -#endif | ||
| 240 | - | ||
| 241 | for (; nb > 3; nb -= 4, addr += 4) { | 164 | for (; nb > 3; nb -= 4, addr += 4) { |
| 242 | - stfunl(get_addr(addr), env->gpr[reg]); | 165 | + stl(get_addr(addr), env->gpr[reg]); |
| 243 | reg = (reg + 1) % 32; | 166 | reg = (reg + 1) % 32; |
| 244 | } | 167 | } |
| 245 | if (unlikely(nb > 0)) { | 168 | if (unlikely(nb > 0)) { |
| 246 | for (sh = 24; nb > 0; nb--, addr++, sh -= 8) | 169 | for (sh = 24; nb > 0; nb--, addr++, sh -= 8) |
| 247 | - stfunb(get_addr(addr), (env->gpr[reg] >> sh) & 0xFF); | 170 | + stb(get_addr(addr), (env->gpr[reg] >> sh) & 0xFF); |
| 248 | } | 171 | } |
| 249 | } | 172 | } |
| 250 | 173 | ||
| @@ -252,24 +175,9 @@ static void do_dcbz(target_ulong addr, int dcache_line_size) | @@ -252,24 +175,9 @@ static void do_dcbz(target_ulong addr, int dcache_line_size) | ||
| 252 | { | 175 | { |
| 253 | target_long mask = get_addr(~(dcache_line_size - 1)); | 176 | target_long mask = get_addr(~(dcache_line_size - 1)); |
| 254 | int i; | 177 | int i; |
| 255 | -#ifdef CONFIG_USER_ONLY | ||
| 256 | -#define stfun stl_raw | ||
| 257 | -#else | ||
| 258 | - void (*stfun)(target_ulong, int); | ||
| 259 | - | ||
| 260 | - switch (env->mmu_idx) { | ||
| 261 | - default: | ||
| 262 | - case 0: stfun = stl_user; | ||
| 263 | - break; | ||
| 264 | - case 1: stfun = stl_kernel; | ||
| 265 | - break; | ||
| 266 | - case 2: stfun = stl_hypv; | ||
| 267 | - break; | ||
| 268 | - } | ||
| 269 | -#endif | ||
| 270 | addr &= mask; | 178 | addr &= mask; |
| 271 | for (i = 0 ; i < dcache_line_size ; i += 4) { | 179 | for (i = 0 ; i < dcache_line_size ; i += 4) { |
| 272 | - stfun(addr + i , 0); | 180 | + stl(addr + i , 0); |
| 273 | } | 181 | } |
| 274 | if ((env->reserve & mask) == addr) | 182 | if ((env->reserve & mask) == addr) |
| 275 | env->reserve = (target_ulong)-1ULL; | 183 | env->reserve = (target_ulong)-1ULL; |
| @@ -298,19 +206,7 @@ void helper_icbi(target_ulong addr) | @@ -298,19 +206,7 @@ void helper_icbi(target_ulong addr) | ||
| 298 | * (not a fetch) by the MMU. To be sure it will be so, | 206 | * (not a fetch) by the MMU. To be sure it will be so, |
| 299 | * do the load "by hand". | 207 | * do the load "by hand". |
| 300 | */ | 208 | */ |
| 301 | -#ifdef CONFIG_USER_ONLY | ||
| 302 | - tmp = ldl_raw(addr); | ||
| 303 | -#else | ||
| 304 | - switch (env->mmu_idx) { | ||
| 305 | - default: | ||
| 306 | - case 0: tmp = ldl_user(addr); | ||
| 307 | - break; | ||
| 308 | - case 1: tmp = ldl_kernel(addr); | ||
| 309 | - break; | ||
| 310 | - case 2: tmp = ldl_hypv(addr); | ||
| 311 | - break; | ||
| 312 | - } | ||
| 313 | -#endif | 209 | + tmp = ldl(addr); |
| 314 | tb_invalidate_page_range(addr, addr + env->icache_line_size); | 210 | tb_invalidate_page_range(addr, addr + env->icache_line_size); |
| 315 | } | 211 | } |
| 316 | 212 | ||
| @@ -318,24 +214,9 @@ void helper_icbi(target_ulong addr) | @@ -318,24 +214,9 @@ void helper_icbi(target_ulong addr) | ||
| 318 | target_ulong helper_lscbx (target_ulong addr, uint32_t reg, uint32_t ra, uint32_t rb) | 214 | target_ulong helper_lscbx (target_ulong addr, uint32_t reg, uint32_t ra, uint32_t rb) |
| 319 | { | 215 | { |
| 320 | int i, c, d; | 216 | int i, c, d; |
| 321 | -#ifdef CONFIG_USER_ONLY | ||
| 322 | -#define ldfun ldub_raw | ||
| 323 | -#else | ||
| 324 | - int (*ldfun)(target_ulong); | ||
| 325 | - | ||
| 326 | - switch (env->mmu_idx) { | ||
| 327 | - default: | ||
| 328 | - case 0: ldfun = ldub_user; | ||
| 329 | - break; | ||
| 330 | - case 1: ldfun = ldub_kernel; | ||
| 331 | - break; | ||
| 332 | - case 2: ldfun = ldub_hypv; | ||
| 333 | - break; | ||
| 334 | - } | ||
| 335 | -#endif | ||
| 336 | d = 24; | 217 | d = 24; |
| 337 | for (i = 0; i < xer_bc; i++) { | 218 | for (i = 0; i < xer_bc; i++) { |
| 338 | - c = ldfun((uint32_t)addr++); | 219 | + c = ldub((uint32_t)addr++); |
| 339 | /* ra (if not 0) and rb are never modified */ | 220 | /* ra (if not 0) and rb are never modified */ |
| 340 | if (likely(reg != rb && (ra == 0 || reg != ra))) { | 221 | if (likely(reg != rb && (ra == 0 || reg != ra))) { |
| 341 | env->gpr[reg] = (env->gpr[reg] & ~(0xFF << d)) | (c << d); | 222 | env->gpr[reg] = (env->gpr[reg] & ~(0xFF << d)) | (c << d); |