translate.c (e65472c7bc413d79faa61eb1d05c540b03945894) translate.c (14776ab5a12972ea439c7fb2203a4c15a09094b4)
1/*
2 * PowerPC emulation for qemu: main translation routines.
3 *
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 * Copyright (C) 2011 Freescale Semiconductor, Inc.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public

--- 149 unchanged lines hidden (view full) ---

158 uint32_t exception;
159 /* Routine used to access memory */
160 bool pr, hv, dr, le_mode;
161 bool lazy_tlb_flush;
162 bool need_access_type;
163 int mem_idx;
164 int access_type;
165 /* Translation flags */
1/*
2 * PowerPC emulation for qemu: main translation routines.
3 *
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 * Copyright (C) 2011 Freescale Semiconductor, Inc.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public

--- 149 unchanged lines hidden (view full) ---

158 uint32_t exception;
159 /* Routine used to access memory */
160 bool pr, hv, dr, le_mode;
161 bool lazy_tlb_flush;
162 bool need_access_type;
163 int mem_idx;
164 int access_type;
165 /* Translation flags */
166 TCGMemOp default_tcg_memop_mask;
166 MemOp default_tcg_memop_mask;
167#if defined(TARGET_PPC64)
168 bool sf_mode;
169 bool has_cfar;
170#endif
171 bool fpu_enabled;
172 bool altivec_enabled;
173 bool vsx_enabled;
174 bool spe_enabled;

--- 2962 unchanged lines hidden (view full) ---

3137 gen_check_tlb_flush(ctx, false);
3138 }
3139 tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
3140 gen_stop_exception(ctx);
3141}
3142
3143#define MEMOP_GET_SIZE(x) (1 << ((x) & MO_SIZE))
3144
167#if defined(TARGET_PPC64)
168 bool sf_mode;
169 bool has_cfar;
170#endif
171 bool fpu_enabled;
172 bool altivec_enabled;
173 bool vsx_enabled;
174 bool spe_enabled;

--- 2962 unchanged lines hidden (view full) ---

3137 gen_check_tlb_flush(ctx, false);
3138 }
3139 tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
3140 gen_stop_exception(ctx);
3141}
3142
3143#define MEMOP_GET_SIZE(x) (1 << ((x) & MO_SIZE))
3144
3145static void gen_load_locked(DisasContext *ctx, TCGMemOp memop)
3145static void gen_load_locked(DisasContext *ctx, MemOp memop)
3146{
3147 TCGv gpr = cpu_gpr[rD(ctx->opcode)];
3148 TCGv t0 = tcg_temp_new();
3149
3150 gen_set_access_type(ctx, ACCESS_RES);
3151 gen_addr_reg_index(ctx, t0);
3152 tcg_gen_qemu_ld_tl(gpr, t0, ctx->mem_idx, memop | MO_ALIGN);
3153 tcg_gen_mov_tl(cpu_reserve, t0);

--- 8 unchanged lines hidden (view full) ---

3162 gen_load_locked(ctx, memop); \
3163}
3164
3165/* lwarx */
3166LARX(lbarx, DEF_MEMOP(MO_UB))
3167LARX(lharx, DEF_MEMOP(MO_UW))
3168LARX(lwarx, DEF_MEMOP(MO_UL))
3169
3146{
3147 TCGv gpr = cpu_gpr[rD(ctx->opcode)];
3148 TCGv t0 = tcg_temp_new();
3149
3150 gen_set_access_type(ctx, ACCESS_RES);
3151 gen_addr_reg_index(ctx, t0);
3152 tcg_gen_qemu_ld_tl(gpr, t0, ctx->mem_idx, memop | MO_ALIGN);
3153 tcg_gen_mov_tl(cpu_reserve, t0);

--- 8 unchanged lines hidden (view full) ---

3162 gen_load_locked(ctx, memop); \
3163}
3164
3165/* lwarx */
3166LARX(lbarx, DEF_MEMOP(MO_UB))
3167LARX(lharx, DEF_MEMOP(MO_UW))
3168LARX(lwarx, DEF_MEMOP(MO_UL))
3169
3170static void gen_fetch_inc_conditional(DisasContext *ctx, TCGMemOp memop,
3170static void gen_fetch_inc_conditional(DisasContext *ctx, MemOp memop,
3171 TCGv EA, TCGCond cond, int addend)
3172{
3173 TCGv t = tcg_temp_new();
3174 TCGv t2 = tcg_temp_new();
3175 TCGv u = tcg_temp_new();
3176
3177 tcg_gen_qemu_ld_tl(t, EA, ctx->mem_idx, memop);
3178 tcg_gen_addi_tl(t2, EA, MEMOP_GET_SIZE(memop));

--- 9 unchanged lines hidden (view full) ---

3188 tcg_gen_movi_tl(u, 1 << (MEMOP_GET_SIZE(memop) * 8 - 1));
3189 tcg_gen_movcond_tl(cond, cpu_gpr[rD(ctx->opcode)], t, t2, t, u);
3190
3191 tcg_temp_free(t);
3192 tcg_temp_free(t2);
3193 tcg_temp_free(u);
3194}
3195
3171 TCGv EA, TCGCond cond, int addend)
3172{
3173 TCGv t = tcg_temp_new();
3174 TCGv t2 = tcg_temp_new();
3175 TCGv u = tcg_temp_new();
3176
3177 tcg_gen_qemu_ld_tl(t, EA, ctx->mem_idx, memop);
3178 tcg_gen_addi_tl(t2, EA, MEMOP_GET_SIZE(memop));

--- 9 unchanged lines hidden (view full) ---

3188 tcg_gen_movi_tl(u, 1 << (MEMOP_GET_SIZE(memop) * 8 - 1));
3189 tcg_gen_movcond_tl(cond, cpu_gpr[rD(ctx->opcode)], t, t2, t, u);
3190
3191 tcg_temp_free(t);
3192 tcg_temp_free(t2);
3193 tcg_temp_free(u);
3194}
3195
3196static void gen_ld_atomic(DisasContext *ctx, TCGMemOp memop)
3196static void gen_ld_atomic(DisasContext *ctx, MemOp memop)
3197{
3198 uint32_t gpr_FC = FC(ctx->opcode);
3199 TCGv EA = tcg_temp_new();
3200 int rt = rD(ctx->opcode);
3201 bool need_serial;
3202 TCGv src, dst;
3203
3204 gen_addr_register(ctx, EA);

--- 96 unchanged lines hidden (view full) ---

3301
3302#ifdef TARGET_PPC64
3303static void gen_ldat(DisasContext *ctx)
3304{
3305 gen_ld_atomic(ctx, DEF_MEMOP(MO_Q));
3306}
3307#endif
3308
3197{
3198 uint32_t gpr_FC = FC(ctx->opcode);
3199 TCGv EA = tcg_temp_new();
3200 int rt = rD(ctx->opcode);
3201 bool need_serial;
3202 TCGv src, dst;
3203
3204 gen_addr_register(ctx, EA);

--- 96 unchanged lines hidden (view full) ---

3301
3302#ifdef TARGET_PPC64
3303static void gen_ldat(DisasContext *ctx)
3304{
3305 gen_ld_atomic(ctx, DEF_MEMOP(MO_Q));
3306}
3307#endif
3308
3309static void gen_st_atomic(DisasContext *ctx, TCGMemOp memop)
3309static void gen_st_atomic(DisasContext *ctx, MemOp memop)
3310{
3311 uint32_t gpr_FC = FC(ctx->opcode);
3312 TCGv EA = tcg_temp_new();
3313 TCGv src, discard;
3314
3315 gen_addr_register(ctx, EA);
3316 src = cpu_gpr[rD(ctx->opcode)];
3317 discard = tcg_temp_new();

--- 66 unchanged lines hidden (view full) ---

3384
3385#ifdef TARGET_PPC64
3386static void gen_stdat(DisasContext *ctx)
3387{
3388 gen_st_atomic(ctx, DEF_MEMOP(MO_Q));
3389}
3390#endif
3391
3310{
3311 uint32_t gpr_FC = FC(ctx->opcode);
3312 TCGv EA = tcg_temp_new();
3313 TCGv src, discard;
3314
3315 gen_addr_register(ctx, EA);
3316 src = cpu_gpr[rD(ctx->opcode)];
3317 discard = tcg_temp_new();

--- 66 unchanged lines hidden (view full) ---

3384
3385#ifdef TARGET_PPC64
3386static void gen_stdat(DisasContext *ctx)
3387{
3388 gen_st_atomic(ctx, DEF_MEMOP(MO_Q));
3389}
3390#endif
3391
3392static void gen_conditional_store(DisasContext *ctx, TCGMemOp memop)
3392static void gen_conditional_store(DisasContext *ctx, MemOp memop)
3393{
3394 TCGLabel *l1 = gen_new_label();
3395 TCGLabel *l2 = gen_new_label();
3396 TCGv t0 = tcg_temp_new();
3397 int reg = rS(ctx->opcode);
3398
3399 gen_set_access_type(ctx, ACCESS_RES);
3400 gen_addr_reg_index(ctx, t0);

--- 4576 unchanged lines hidden ---
3393{
3394 TCGLabel *l1 = gen_new_label();
3395 TCGLabel *l2 = gen_new_label();
3396 TCGv t0 = tcg_temp_new();
3397 int reg = rS(ctx->opcode);
3398
3399 gen_set_access_type(ctx, ACCESS_RES);
3400 gen_addr_reg_index(ctx, t0);

--- 4576 unchanged lines hidden ---