[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC 02/15] target/riscv: rvb: count leading/trailing zeros
From: |
Richard Henderson |
Subject: |
Re: [RFC 02/15] target/riscv: rvb: count leading/trailing zeros |
Date: |
Thu, 19 Nov 2020 11:24:38 -0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 |
On 11/18/20 12:29 AM, frank.chang@sifive.com wrote:
> +static bool gen_cxzw(DisasContext *ctx, arg_r2 *a,
> + void(*func)(TCGv_i32, TCGv_i32, uint32_t))
...
> +static bool gen_cxz(DisasContext *ctx, arg_r2 *a,
> + void(*func)(TCGv, TCGv, target_ulong))
I think both of these are unnecessary and you should use the gen_unary that you
introduce in the next patch. ctz/clz cannot produce a negative number and do
not need extension.
You should simply add wrappers like you do for gen_pcntw to truncate and
operate:
static void gen_ctz(TCGv ret, TCGv arg1)
{
tcg_gen_ctz_tl(ret, arg1, TARGET_LONG_BITS);
}
static void gen_clz(TCGv ret, TCGv arg1)
{
tcg_gen_clz_tl(ret, arg1, TARGET_LONG_BITS);
}
static void gen_ctzw(TCGv ret, TCGv arg1)
{
tcg_gen_ori_i64(ret, arg1, MAKE_64BIT_MASK(32, 32));
tcg_gen_ctz_i64(ret, ret, 32);
}
static void gen_clzw(TCGv ret, TCGv arg1)
{
tcg_gen_ext32u_i64(ret, arg1);
tcg_gen_ctz_i64(ret, ret, 64);
tcg_gen_subi_i64(ret, ret, 32);
}
r~
- [RFC 00/15] support subsets of bitmanip extension, frank . chang, 2020/11/18
- [RFC 01/15] target/riscv: reformat @sh format encoding for B-extension, frank . chang, 2020/11/18
- [RFC 02/15] target/riscv: rvb: count leading/trailing zeros, frank . chang, 2020/11/18
- [RFC 03/15] target/riscv: rvb: count bits set, frank . chang, 2020/11/18
- [RFC 04/15] target/riscv: rvb: logic-with-negate, frank . chang, 2020/11/18
- [RFC 05/15] target/riscv: rvb: pack two words into one register, frank . chang, 2020/11/18
- [RFC 06/15] target/riscv: rvb: min/max instructions, frank . chang, 2020/11/18
- [RFC 07/15] target/riscv: rvb: sign-extend instructions, frank . chang, 2020/11/18