[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 38/64] ppc: Handle unconditional (always/never) traps a
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 38/64] ppc: Handle unconditional (always/never) traps at translation time |
Date: |
Wed, 7 Sep 2016 20:29:17 +1000 |
From: Benjamin Herrenschmidt <address@hidden>
We don't need to call a helper for trap always and trap never
which are used by Linux under some circumstances.
Signed-off-by: Benjamin Herrenschmidt <address@hidden>
--
v2. Don't generate the helper call when trapping always
Signed-off-by: David Gibson <address@hidden>
---
target-ppc/translate.c | 49 +++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 43 insertions(+), 6 deletions(-)
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 6bb0ba9..7aa8d77 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -3575,10 +3575,30 @@ static void gen_sc(DisasContext *ctx)
/*** Trap ***/
+/* Check for unconditional traps (always or never) */
+static bool check_unconditional_trap(DisasContext *ctx)
+{
+ /* Trap never */
+ if (TO(ctx->opcode) == 0) {
+ return true;
+ }
+ /* Trap always */
+ if (TO(ctx->opcode) == 31) {
+ gen_exception_err(ctx, POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP);
+ return true;
+ }
+ return false;
+}
+
/* tw */
static void gen_tw(DisasContext *ctx)
{
- TCGv_i32 t0 = tcg_const_i32(TO(ctx->opcode));
+ TCGv_i32 t0;
+
+ if (check_unconditional_trap(ctx)) {
+ return;
+ }
+ t0 = tcg_const_i32(TO(ctx->opcode));
gen_helper_tw(cpu_env, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],
t0);
tcg_temp_free_i32(t0);
@@ -3587,8 +3607,14 @@ static void gen_tw(DisasContext *ctx)
/* twi */
static void gen_twi(DisasContext *ctx)
{
- TCGv t0 = tcg_const_tl(SIMM(ctx->opcode));
- TCGv_i32 t1 = tcg_const_i32(TO(ctx->opcode));
+ TCGv t0;
+ TCGv_i32 t1;
+
+ if (check_unconditional_trap(ctx)) {
+ return;
+ }
+ t0 = tcg_const_tl(SIMM(ctx->opcode));
+ t1 = tcg_const_i32(TO(ctx->opcode));
gen_helper_tw(cpu_env, cpu_gpr[rA(ctx->opcode)], t0, t1);
tcg_temp_free(t0);
tcg_temp_free_i32(t1);
@@ -3598,7 +3624,12 @@ static void gen_twi(DisasContext *ctx)
/* td */
static void gen_td(DisasContext *ctx)
{
- TCGv_i32 t0 = tcg_const_i32(TO(ctx->opcode));
+ TCGv_i32 t0;
+
+ if (check_unconditional_trap(ctx)) {
+ return;
+ }
+ t0 = tcg_const_i32(TO(ctx->opcode));
gen_helper_td(cpu_env, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],
t0);
tcg_temp_free_i32(t0);
@@ -3607,8 +3638,14 @@ static void gen_td(DisasContext *ctx)
/* tdi */
static void gen_tdi(DisasContext *ctx)
{
- TCGv t0 = tcg_const_tl(SIMM(ctx->opcode));
- TCGv_i32 t1 = tcg_const_i32(TO(ctx->opcode));
+ TCGv t0;
+ TCGv_i32 t1;
+
+ if (check_unconditional_trap(ctx)) {
+ return;
+ }
+ t0 = tcg_const_tl(SIMM(ctx->opcode));
+ t1 = tcg_const_i32(TO(ctx->opcode));
gen_helper_td(cpu_env, cpu_gpr[rA(ctx->opcode)], t0, t1);
tcg_temp_free(t0);
tcg_temp_free_i32(t1);
--
2.7.4
- Re: [Qemu-ppc] [Qemu-devel] [PULL 54/64] hw/ppc: add a ppc_create_page_sizes_prop() helper routine, (continued)
[Qemu-ppc] [PULL 47/64] target-ppc: add vabsdu[b, h, w] instructions, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 40/64] ppc: Fix CFAR updates, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 52/64] ppc: Rename #include'd .c files to .inc.c, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 20/64] ppc: Move VMX ops out of translate.c, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 18/64] ppc: Move embedded spe ops out of translate.c, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 48/64] target-ppc: add vcmpnez[b, h, w][.] instructions, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 19/64] ppc: Move DFP ops out of translate.c, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 38/64] ppc: Handle unconditional (always/never) traps at translation time,
David Gibson <=
[Qemu-ppc] [PULL 60/64] ppc: Improve the exception helpers flags, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 21/64] ppc: Move VSX ops out of translate.c, David Gibson, 2016/09/07
[Qemu-ppc] [PULL 17/64] ppc: Move classic fp ops out of translate.c, David Gibson, 2016/09/07
Re: [Qemu-ppc] [Qemu-devel] [PULL 00/64] ppc-for-2.8 queue 20160907, no-reply, 2016/09/07
Re: [Qemu-ppc] [PULL 00/64] ppc-for-2.8 queue 20160907, Peter Maydell, 2016/09/08