[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [V2 PATCH 3/8] target-ppc: Bug Fix: rlwimi
From: |
Tom Musta |
Subject: |
[Qemu-ppc] [V2 PATCH 3/8] target-ppc: Bug Fix: rlwimi |
Date: |
Tue, 12 Aug 2014 08:45:05 -0500 |
The rlwimi specification includes the ROTL32 operation, which is defined
to be a left rotation of two copies of the least significant 32 bits of
the source GPR.
The current implementation is incorrect on 64-bit implementations in that
it rotates a single copy of the least significant 32 bits, padding with
zeroes in the most significant bits.
Fix the code to properly implement this ROTL32 operation.
Also fix the special case of MB=31 and ME=0 to copy the entire contents
of the source GPR.
Examples:
R3 FFFFFFFFFFFFFFF0
rlwimi 3,3,29,14,1
R3 expected : 1FFFFFFE3FFFFFFE
R3 actual : 000000003FFFFFFE (without this patch)
R3 ED7EB4DD824F0853
rlwimi 3,3,10,31,0
R3 expected : 3C214E09024F0853
R3 actual : 00000000024F0853 (without this patch)
Signed-off-by: Tom Musta <address@hidden>
---
target-ppc/translate.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 48f13a9..f4cc495 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -1614,17 +1614,19 @@ static void gen_rlwimi(DisasContext *ctx)
me = ME(ctx->opcode);
sh = SH(ctx->opcode);
if (likely(sh == 0 && mb == 0 && me == 31)) {
+#if defined(TARGET_PPC64)
+ tcg_gen_mov_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
+#else
tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
+#endif
} else {
target_ulong mask;
TCGv t1;
TCGv t0 = tcg_temp_new();
#if defined(TARGET_PPC64)
- TCGv_i32 t2 = tcg_temp_new_i32();
- tcg_gen_trunc_i64_i32(t2, cpu_gpr[rS(ctx->opcode)]);
- tcg_gen_rotli_i32(t2, t2, sh);
- tcg_gen_extu_i32_i64(t0, t2);
- tcg_temp_free_i32(t2);
+ tcg_gen_deposit_i64(t0, cpu_gpr[rS(ctx->opcode)],
+ cpu_gpr[rS(ctx->opcode)], 32, 32);
+ tcg_gen_rotli_i64(t0, t0, sh);
#else
tcg_gen_rotli_i32(t0, cpu_gpr[rS(ctx->opcode)], sh);
#endif
--
1.7.1
- [Qemu-ppc] [V2 PATCH 0/8] target-ppc: Bug Fixes for 64 Bit FXU Instructions, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 1/8] target-ppc: Bug Fix: rlwinm, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 2/8] target-ppc: Bug Fix: rlwnm, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 3/8] target-ppc: Bug Fix: rlwimi,
Tom Musta <=
- [Qemu-ppc] [V2 PATCH 4/8] target-ppc: Bug Fix: mullw, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 5/8] target-ppc: Bug Fix: mullwo, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 6/8] target-ppc: Bug Fix: mulldo OV Detection, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 7/8] target-ppc: Bug Fix: srawi, Tom Musta, 2014/08/12
- [Qemu-ppc] [V2 PATCH 8/8] target-ppc: Bug Fix: srad, Tom Musta, 2014/08/12
- Re: [Qemu-ppc] [V2 PATCH 0/8] target-ppc: Bug Fixes for 64 Bit FXU Instructions, Alexander Graf, 2014/08/12