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 | 107 | |
| 108 | 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 | 110 | for (; reg < 32; reg++, addr += 4) { |
| 126 | 111 | if (msr_le) |
| 127 | - env->gpr[reg] = bswap32(ldfun(get_addr(addr))); | |
| 112 | + env->gpr[reg] = bswap32(ldl(get_addr(addr))); | |
| 128 | 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 | 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 | 120 | for (; reg < 32; reg++, addr += 4) { |
| 151 | 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 | 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 | 128 | void helper_lsw(target_ulong addr, uint32_t nb, uint32_t reg) |
| 159 | 129 | { |
| 160 | 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 | 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 | 133 | reg = (reg + 1) % 32; |
| 187 | 134 | } |
| 188 | 135 | if (unlikely(nb > 0)) { |
| 189 | 136 | env->gpr[reg] = 0; |
| 190 | 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 | 161 | void helper_stsw(target_ulong addr, uint32_t nb, uint32_t reg) |
| 215 | 162 | { |
| 216 | 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 | 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 | 166 | reg = (reg + 1) % 32; |
| 244 | 167 | } |
| 245 | 168 | if (unlikely(nb > 0)) { |
| 246 | 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 | 175 | { |
| 253 | 176 | target_long mask = get_addr(~(dcache_line_size - 1)); |
| 254 | 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 | 178 | addr &= mask; |
| 271 | 179 | for (i = 0 ; i < dcache_line_size ; i += 4) { |
| 272 | - stfun(addr + i , 0); | |
| 180 | + stl(addr + i , 0); | |
| 273 | 181 | } |
| 274 | 182 | if ((env->reserve & mask) == addr) |
| 275 | 183 | env->reserve = (target_ulong)-1ULL; |
| ... | ... | @@ -298,19 +206,7 @@ void helper_icbi(target_ulong addr) |
| 298 | 206 | * (not a fetch) by the MMU. To be sure it will be so, |
| 299 | 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 | 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 | 214 | target_ulong helper_lscbx (target_ulong addr, uint32_t reg, uint32_t ra, uint32_t rb) |
| 319 | 215 | { |
| 320 | 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 | 217 | d = 24; |
| 337 | 218 | for (i = 0; i < xer_bc; i++) { |
| 338 | - c = ldfun((uint32_t)addr++); | |
| 219 | + c = ldub((uint32_t)addr++); | |
| 339 | 220 | /* ra (if not 0) and rb are never modified */ |
| 340 | 221 | if (likely(reg != rb && (ra == 0 || reg != ra))) { |
| 341 | 222 | env->gpr[reg] = (env->gpr[reg] & ~(0xFF << d)) | (c << d); | ... | ... |