Commit fa407c030c2bb592b4f9a7152517815a047007e6
1 parent
cf360a32
target-ppc: convert external load/store instructions to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5831 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
13 additions
and
144 deletions
target-ppc/op.c
| ... | ... | @@ -257,22 +257,6 @@ void OPPROTO op_srli_T1 (void) |
| 257 | 257 | RETURN(); |
| 258 | 258 | } |
| 259 | 259 | |
| 260 | -/* Load and store */ | |
| 261 | -#define MEMSUFFIX _raw | |
| 262 | -#include "op_helper.h" | |
| 263 | -#include "op_mem.h" | |
| 264 | -#if !defined(CONFIG_USER_ONLY) | |
| 265 | -#define MEMSUFFIX _user | |
| 266 | -#include "op_helper.h" | |
| 267 | -#include "op_mem.h" | |
| 268 | -#define MEMSUFFIX _kernel | |
| 269 | -#include "op_helper.h" | |
| 270 | -#include "op_mem.h" | |
| 271 | -#define MEMSUFFIX _hypv | |
| 272 | -#include "op_helper.h" | |
| 273 | -#include "op_mem.h" | |
| 274 | -#endif | |
| 275 | - | |
| 276 | 260 | /* Return from interrupt */ |
| 277 | 261 | #if !defined(CONFIG_USER_ONLY) |
| 278 | 262 | void OPPROTO op_rfi (void) | ... | ... |
target-ppc/op_mem.h deleted
100644 → 0
| 1 | -/* | |
| 2 | - * PowerPC emulation micro-operations for qemu. | |
| 3 | - * | |
| 4 | - * Copyright (c) 2003-2007 Jocelyn Mayer | |
| 5 | - * | |
| 6 | - * This library is free software; you can redistribute it and/or | |
| 7 | - * modify it under the terms of the GNU Lesser General Public | |
| 8 | - * License as published by the Free Software Foundation; either | |
| 9 | - * version 2 of the License, or (at your option) any later version. | |
| 10 | - * | |
| 11 | - * This library is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 | - * Lesser General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public | |
| 17 | - * License along with this library; if not, write to the Free Software | |
| 18 | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 | - */ | |
| 20 | - | |
| 21 | -#include "op_mem_access.h" | |
| 22 | - | |
| 23 | -/* External access */ | |
| 24 | -void OPPROTO glue(op_eciwx, MEMSUFFIX) (void) | |
| 25 | -{ | |
| 26 | - T1 = glue(ldu32, MEMSUFFIX)((uint32_t)T0); | |
| 27 | - RETURN(); | |
| 28 | -} | |
| 29 | - | |
| 30 | -#if defined(TARGET_PPC64) | |
| 31 | -void OPPROTO glue(op_eciwx_64, MEMSUFFIX) (void) | |
| 32 | -{ | |
| 33 | - T1 = glue(ldu32, MEMSUFFIX)((uint64_t)T0); | |
| 34 | - RETURN(); | |
| 35 | -} | |
| 36 | -#endif | |
| 37 | - | |
| 38 | -void OPPROTO glue(op_ecowx, MEMSUFFIX) (void) | |
| 39 | -{ | |
| 40 | - glue(st32, MEMSUFFIX)((uint32_t)T0, T1); | |
| 41 | - RETURN(); | |
| 42 | -} | |
| 43 | - | |
| 44 | -#if defined(TARGET_PPC64) | |
| 45 | -void OPPROTO glue(op_ecowx_64, MEMSUFFIX) (void) | |
| 46 | -{ | |
| 47 | - glue(st32, MEMSUFFIX)((uint64_t)T0, T1); | |
| 48 | - RETURN(); | |
| 49 | -} | |
| 50 | -#endif | |
| 51 | - | |
| 52 | -void OPPROTO glue(op_eciwx_le, MEMSUFFIX) (void) | |
| 53 | -{ | |
| 54 | - T1 = glue(ldu32r, MEMSUFFIX)((uint32_t)T0); | |
| 55 | - RETURN(); | |
| 56 | -} | |
| 57 | - | |
| 58 | -#if defined(TARGET_PPC64) | |
| 59 | -void OPPROTO glue(op_eciwx_le_64, MEMSUFFIX) (void) | |
| 60 | -{ | |
| 61 | - T1 = glue(ldu32r, MEMSUFFIX)((uint64_t)T0); | |
| 62 | - RETURN(); | |
| 63 | -} | |
| 64 | -#endif | |
| 65 | - | |
| 66 | -void OPPROTO glue(op_ecowx_le, MEMSUFFIX) (void) | |
| 67 | -{ | |
| 68 | - glue(st32r, MEMSUFFIX)((uint32_t)T0, T1); | |
| 69 | - RETURN(); | |
| 70 | -} | |
| 71 | - | |
| 72 | -#if defined(TARGET_PPC64) | |
| 73 | -void OPPROTO glue(op_ecowx_le_64, MEMSUFFIX) (void) | |
| 74 | -{ | |
| 75 | - glue(st32r, MEMSUFFIX)((uint64_t)T0, T1); | |
| 76 | - RETURN(); | |
| 77 | -} | |
| 78 | -#endif | |
| 79 | - | |
| 80 | -#undef MEMSUFFIX |
target-ppc/translate.c
| ... | ... | @@ -2490,37 +2490,6 @@ static always_inline void gen_check_align (DisasContext *ctx, TCGv EA, int mask) |
| 2490 | 2490 | tcg_temp_free(t0); |
| 2491 | 2491 | } |
| 2492 | 2492 | |
| 2493 | -#if defined(TARGET_PPC64) | |
| 2494 | -#define _GEN_MEM_FUNCS(name, mode) \ | |
| 2495 | - &gen_op_##name##_##mode, \ | |
| 2496 | - &gen_op_##name##_le_##mode, \ | |
| 2497 | - &gen_op_##name##_64_##mode, \ | |
| 2498 | - &gen_op_##name##_le_64_##mode | |
| 2499 | -#else | |
| 2500 | -#define _GEN_MEM_FUNCS(name, mode) \ | |
| 2501 | - &gen_op_##name##_##mode, \ | |
| 2502 | - &gen_op_##name##_le_##mode | |
| 2503 | -#endif | |
| 2504 | -#if defined(CONFIG_USER_ONLY) | |
| 2505 | -#if defined(TARGET_PPC64) | |
| 2506 | -#define NB_MEM_FUNCS 4 | |
| 2507 | -#else | |
| 2508 | -#define NB_MEM_FUNCS 2 | |
| 2509 | -#endif | |
| 2510 | -#define GEN_MEM_FUNCS(name) \ | |
| 2511 | - _GEN_MEM_FUNCS(name, raw) | |
| 2512 | -#else | |
| 2513 | -#if defined(TARGET_PPC64) | |
| 2514 | -#define NB_MEM_FUNCS 12 | |
| 2515 | -#else | |
| 2516 | -#define NB_MEM_FUNCS 6 | |
| 2517 | -#endif | |
| 2518 | -#define GEN_MEM_FUNCS(name) \ | |
| 2519 | - _GEN_MEM_FUNCS(name, user), \ | |
| 2520 | - _GEN_MEM_FUNCS(name, kernel), \ | |
| 2521 | - _GEN_MEM_FUNCS(name, hypv) | |
| 2522 | -#endif | |
| 2523 | - | |
| 2524 | 2493 | /*** Integer load ***/ |
| 2525 | 2494 | #if defined(TARGET_PPC64) |
| 2526 | 2495 | #define GEN_QEMU_LD_PPC64(width) \ |
| ... | ... | @@ -4427,32 +4396,28 @@ GEN_HANDLER(slbie, 0x1F, 0x12, 0x0D, 0x03FF0001, PPC_SLBI) |
| 4427 | 4396 | |
| 4428 | 4397 | /*** External control ***/ |
| 4429 | 4398 | /* Optional: */ |
| 4430 | -#define op_eciwx() (*gen_op_eciwx[ctx->mem_idx])() | |
| 4431 | -#define op_ecowx() (*gen_op_ecowx[ctx->mem_idx])() | |
| 4432 | -static GenOpFunc *gen_op_eciwx[NB_MEM_FUNCS] = { | |
| 4433 | - GEN_MEM_FUNCS(eciwx), | |
| 4434 | -}; | |
| 4435 | -static GenOpFunc *gen_op_ecowx[NB_MEM_FUNCS] = { | |
| 4436 | - GEN_MEM_FUNCS(ecowx), | |
| 4437 | -}; | |
| 4438 | - | |
| 4439 | 4399 | /* eciwx */ |
| 4440 | 4400 | GEN_HANDLER(eciwx, 0x1F, 0x16, 0x0D, 0x00000001, PPC_EXTERN) |
| 4441 | 4401 | { |
| 4442 | - /* Should check EAR[E] & alignment ! */ | |
| 4402 | + /* Should check EAR[E] ! */ | |
| 4403 | + TCGv t0 = tcg_temp_new(); | |
| 4443 | 4404 | gen_set_access_type(ACCESS_RES); |
| 4444 | - gen_addr_reg_index(cpu_T[0], ctx); | |
| 4445 | - op_eciwx(); | |
| 4446 | - tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); | |
| 4405 | + gen_addr_reg_index(t0, ctx); | |
| 4406 | + gen_check_align(ctx, t0, 0x03); | |
| 4407 | + gen_qemu_ld32u(cpu_gpr[rD(ctx->opcode)], t0, ctx->mem_idx); | |
| 4408 | + tcg_temp_free(t0); | |
| 4447 | 4409 | } |
| 4448 | 4410 | |
| 4449 | 4411 | /* ecowx */ |
| 4450 | 4412 | GEN_HANDLER(ecowx, 0x1F, 0x16, 0x09, 0x00000001, PPC_EXTERN) |
| 4451 | 4413 | { |
| 4452 | - /* Should check EAR[E] & alignment ! */ | |
| 4453 | - gen_addr_reg_index(cpu_T[0], ctx); | |
| 4454 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]); | |
| 4455 | - op_ecowx(); | |
| 4414 | + /* Should check EAR[E] ! */ | |
| 4415 | + TCGv t0 = tcg_temp_new(); | |
| 4416 | + gen_set_access_type(ACCESS_RES); | |
| 4417 | + gen_addr_reg_index(t0, ctx); | |
| 4418 | + gen_check_align(ctx, t0, 0x03); | |
| 4419 | + gen_qemu_st32(cpu_gpr[rD(ctx->opcode)], t0, ctx->mem_idx); | |
| 4420 | + tcg_temp_free(t0); | |
| 4456 | 4421 | } |
| 4457 | 4422 | |
| 4458 | 4423 | /* PowerPC 601 specific instructions */ | ... | ... |