Commit 8dd640e49daeba4a47c1f9e75e0f09aeb5578644
1 parent
66c7c806
Fix mtcrf/mfcr
Noticed by Alexander Graf git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6667 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
13 additions
and
9 deletions
target-ppc/translate.c
... | ... | @@ -3843,9 +3843,11 @@ GEN_HANDLER(mfcr, 0x1F, 0x13, 0x00, 0x00000801, PPC_MISC) |
3843 | 3843 | |
3844 | 3844 | if (likely(ctx->opcode & 0x00100000)) { |
3845 | 3845 | crm = CRM(ctx->opcode); |
3846 | - if (likely((crm ^ (crm - 1)) == 0)) { | |
3847 | - crn = ffs(crm); | |
3846 | + if (likely(crm && ((crm & (crm - 1)) == 0))) { | |
3847 | + crn = ffs (crm) - 1; | |
3848 | 3848 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], cpu_crf[7 - crn]); |
3849 | + tcg_gen_shli_i32(cpu_gpr[rD(ctx->opcode)], | |
3850 | + cpu_gpr[rD(ctx->opcode)], crn * 4); | |
3849 | 3851 | } |
3850 | 3852 | } else { |
3851 | 3853 | gen_helper_load_cr(cpu_gpr[rD(ctx->opcode)]); |
... | ... | @@ -3935,13 +3937,15 @@ GEN_HANDLER(mtcrf, 0x1F, 0x10, 0x04, 0x00000801, PPC_MISC) |
3935 | 3937 | uint32_t crm, crn; |
3936 | 3938 | |
3937 | 3939 | crm = CRM(ctx->opcode); |
3938 | - if (likely((ctx->opcode & 0x00100000) || (crm ^ (crm - 1)) == 0)) { | |
3939 | - TCGv_i32 temp = tcg_temp_new_i32(); | |
3940 | - crn = ffs(crm); | |
3941 | - tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]); | |
3942 | - tcg_gen_shri_i32(cpu_crf[7 - crn], temp, crn * 4); | |
3943 | - tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf); | |
3944 | - tcg_temp_free_i32(temp); | |
3940 | + if (likely((ctx->opcode & 0x00100000))) { | |
3941 | + if (crm && ((crm & (crm - 1)) == 0)) { | |
3942 | + TCGv_i32 temp = tcg_temp_new_i32(); | |
3943 | + crn = ffs (crm) - 1; | |
3944 | + tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]); | |
3945 | + tcg_gen_shri_i32(cpu_crf[7 - crn], temp, crn * 4); | |
3946 | + tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf); | |
3947 | + tcg_temp_free_i32(temp); | |
3948 | + } | |
3945 | 3949 | } else { |
3946 | 3950 | TCGv_i32 temp = tcg_const_i32(crm); |
3947 | 3951 | gen_helper_store_cr(cpu_gpr[rS(ctx->opcode)], temp); | ... | ... |