target-arm: A64: Add remaining CLS/Z vector ops
Implement the CLS, CLZ operations in the 2-reg-misc category. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <rth@twiddle.net> Message-id: 1394822294-14837-6-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
f612537e07
commit
b05c306857
@ -60,6 +60,11 @@ uint32_t HELPER(cls32)(uint32_t x)
|
||||
return clrsb32(x);
|
||||
}
|
||||
|
||||
uint32_t HELPER(clz32)(uint32_t x)
|
||||
{
|
||||
return clz32(x);
|
||||
}
|
||||
|
||||
uint64_t HELPER(rbit64)(uint64_t x)
|
||||
{
|
||||
/* assign the correct byte position */
|
||||
|
@ -21,6 +21,7 @@ DEF_HELPER_FLAGS_2(sdiv64, TCG_CALL_NO_RWG_SE, s64, s64, s64)
|
||||
DEF_HELPER_FLAGS_1(clz64, TCG_CALL_NO_RWG_SE, i64, i64)
|
||||
DEF_HELPER_FLAGS_1(cls64, TCG_CALL_NO_RWG_SE, i64, i64)
|
||||
DEF_HELPER_FLAGS_1(cls32, TCG_CALL_NO_RWG_SE, i32, i32)
|
||||
DEF_HELPER_FLAGS_1(clz32, TCG_CALL_NO_RWG_SE, i32, i32)
|
||||
DEF_HELPER_FLAGS_1(rbit64, TCG_CALL_NO_RWG_SE, i64, i64)
|
||||
DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr)
|
||||
DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, ptr)
|
||||
|
@ -6584,6 +6584,13 @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
|
||||
TCGCond cond;
|
||||
|
||||
switch (opcode) {
|
||||
case 0x4: /* CLS, CLZ */
|
||||
if (u) {
|
||||
gen_helper_clz64(tcg_rd, tcg_rn);
|
||||
} else {
|
||||
gen_helper_cls64(tcg_rd, tcg_rn);
|
||||
}
|
||||
break;
|
||||
case 0x5: /* NOT */
|
||||
/* This opcode is shared with CNT and RBIT but we have earlier
|
||||
* enforced that size == 3 if and only if this is the NOT insn.
|
||||
@ -8316,8 +8323,13 @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
|
||||
}
|
||||
handle_2misc_narrow(s, opcode, u, is_q, size, rn, rd);
|
||||
return;
|
||||
case 0x2: /* SADDLP, UADDLP */
|
||||
case 0x4: /* CLS, CLZ */
|
||||
if (size == 3) {
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 0x2: /* SADDLP, UADDLP */
|
||||
case 0x6: /* SADALP, UADALP */
|
||||
if (size == 3) {
|
||||
unallocated_encoding(s);
|
||||
@ -8484,6 +8496,13 @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
|
||||
case 0x9: /* CMEQ, CMLE */
|
||||
cond = u ? TCG_COND_LE : TCG_COND_EQ;
|
||||
goto do_cmop;
|
||||
case 0x4: /* CLS */
|
||||
if (u) {
|
||||
gen_helper_clz32(tcg_res, tcg_op);
|
||||
} else {
|
||||
gen_helper_cls32(tcg_res, tcg_op);
|
||||
}
|
||||
break;
|
||||
case 0xb: /* ABS, NEG */
|
||||
if (u) {
|
||||
tcg_gen_neg_i32(tcg_res, tcg_op);
|
||||
@ -8567,6 +8586,21 @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x4: /* CLS, CLZ */
|
||||
if (u) {
|
||||
if (size == 0) {
|
||||
gen_helper_neon_clz_u8(tcg_res, tcg_op);
|
||||
} else {
|
||||
gen_helper_neon_clz_u16(tcg_res, tcg_op);
|
||||
}
|
||||
} else {
|
||||
if (size == 0) {
|
||||
gen_helper_neon_cls_s8(tcg_res, tcg_op);
|
||||
} else {
|
||||
gen_helper_neon_cls_s16(tcg_res, tcg_op);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user