target-arm/translate: Fix RRX operands
Instructions that both use the RRX second operand and update CS were incorrect, as the Carry flag was updated too early. An example of such an instruction would be: ands r12,r13,RRX Ands, because of the "s" flag will update the carry flag. But the RRX second operand rotates through the C flag which should happen before the update. Fixed the ordering of the two, the old carry is read by "r13,RRX" before being updated. Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Reported-by: Vinesh Peringat <vineshp@xilinx.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
1414968a6a
commit
b6348f29d0
@ -516,10 +516,10 @@ static inline void gen_arm_shift_im(TCGv var, int shiftop, int shift, int flags)
|
||||
tcg_gen_rotri_i32(var, var, shift); break;
|
||||
} else {
|
||||
TCGv tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shli_i32(tmp, cpu_CF, 31);
|
||||
if (flags)
|
||||
shifter_out_im(var, 0);
|
||||
tcg_gen_shri_i32(var, var, 1);
|
||||
tcg_gen_shli_i32(tmp, cpu_CF, 31);
|
||||
tcg_gen_or_i32(var, var, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user