mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
target-arm: A64: Implement FCVTXN
Implement the FCVTXN operation, which does a narrowing fp precision conversion using the "round to odd" (von Neumann) mode. This can conveniently be implemented as "do operation using round to zero; then set the LSB of the mantissa to 1 if the Inexact flag was set". Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <rth@twiddle.net> Message-id: 1394822294-14837-24-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
5201c13654
commit
5553955eb6
3 changed files with 43 additions and 1 deletions
|
@ -7278,6 +7278,13 @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
|
|||
tcg_temp_free_i32(tcg_hi);
|
||||
}
|
||||
break;
|
||||
case 0x56: /* FCVTXN, FCVTXN2 */
|
||||
/* 64 bit to 32 bit float conversion
|
||||
* with von Neumann rounding (round to odd)
|
||||
*/
|
||||
assert(size == 2);
|
||||
gen_helper_fcvtx_f64_to_f32(tcg_res[pass], tcg_op, cpu_env);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
@ -7391,6 +7398,12 @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
|
|||
rmode = FPROUNDING_TIEAWAY;
|
||||
break;
|
||||
case 0x56: /* FCVTXN, FCVTXN2 */
|
||||
if (size == 2) {
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
handle_2misc_narrow(s, true, opcode, u, false, size - 1, rn, rd);
|
||||
return;
|
||||
case 0x7d: /* FRSQRTE */
|
||||
unsupported_encoding(s, insn);
|
||||
return;
|
||||
|
@ -9244,6 +9257,12 @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
|
|||
case 0x3d: /* FRECPE */
|
||||
handle_2misc_reciprocal(s, opcode, false, u, is_q, size, rn, rd);
|
||||
return;
|
||||
case 0x56: /* FCVTXN, FCVTXN2 */
|
||||
if (size == 2) {
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
/* fall through */
|
||||
case 0x16: /* FCVTN, FCVTN2 */
|
||||
/* handle_2misc_narrow does a 2*size -> size operation, but these
|
||||
* instructions encode the source size rather than dest size.
|
||||
|
@ -9277,7 +9296,6 @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
|
|||
return;
|
||||
}
|
||||
break;
|
||||
case 0x56: /* FCVTXN, FCVTXN2 */
|
||||
case 0x7c: /* URSQRTE */
|
||||
case 0x7d: /* FRSQRTE */
|
||||
unsupported_encoding(s, insn);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue