From: Richard Henderson <richard.henderson@linaro.org>
To: Philipp Tomsich <philipp.tomsich@vrull.eu>, qemu-devel@nongnu.org
Cc: Kito Cheng <kito.cheng@sifive.com>,
Alistair Francis <alistair.francis@wdc.com>
Subject: Re: [PATCH v2 2/3] target/riscv: update Zb[abcs] to 1.0.0 (public review) specification
Date: Wed, 18 Aug 2021 15:09:33 -1000 [thread overview]
Message-ID: <7750e59b-9498-19ef-bf41-804f6e0bcae2@linaro.org> (raw)
In-Reply-To: <20210818203233.791599-3-philipp.tomsich@vrull.eu>
On 8/18/21 10:32 AM, Philipp Tomsich wrote:
> The ratification package for Zb[abcs] does not contain all instructions
> that have been added to QEmu and don't define misa.B for these: the
> individual extensions are now Zba, Zbb, Zbc and Zbs.
>
> Some of the instructions that had previously been added and now need to
> be dropped are:
> - shift-one instructions
> - generalized reverse and or-combine
> - w-forms of single-bit instructions
> - w-form of rev8
Do not try to do this all in one patch. It's too large to review that way.
> The following have been adjusted:
> - rori and slli.uw only accept a 6-bit shamt field
> (if the bit that is reserved for a future 7-bit shamt for RV128 is
> set, the encoding is illegal on RV64)
The gen_shifti helper should be taking care of testing that the shamt is in range. You
really should match the base shift instructions here.
>
> -static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
> +static void gen_orc_b(TCGv ret, TCGv source1)
> {
> - REQUIRE_EXT(ctx, RVB);
> -
> - if (a->shamt >= TARGET_LONG_BITS) {
> - return false;
> - }
> -
> - return gen_grevi(ctx, a);
> + TCGv tmp = tcg_temp_new();
> + tcg_gen_andi_tl(tmp, source1, (TARGET_LONG_BITS == 64) ? 0x5555555555555555LL
> + : 0x55555555);
> + tcg_gen_shli_tl(tmp, tmp, 1);
> + tcg_gen_or_tl(source1, source1, tmp);
> + tcg_gen_andi_tl(tmp, source1, (TARGET_LONG_BITS == 64) ? 0xaaaaaaaaaaaaaaaaLL
> + : 0xaaaaaaaa);
> + tcg_gen_shri_tl(tmp, tmp, 1);
> + tcg_gen_or_tl(source1, source1, tmp);
> + tcg_gen_andi_tl(tmp, source1, (TARGET_LONG_BITS == 64) ? 0x3333333333333333LL
> + : 0x33333333);
> + tcg_gen_shli_tl(tmp, tmp, 2);
> + tcg_gen_or_tl(source1, source1, tmp);
> + tcg_gen_andi_tl(tmp, source1, (TARGET_LONG_BITS == 64) ? 0xccccccccccccccccLL
> + : 0xcccccccc);
> + tcg_gen_shri_tl(tmp, tmp, 2);
> + tcg_gen_or_tl(source1, source1, tmp);
> + tcg_gen_andi_tl(tmp, source1, (TARGET_LONG_BITS == 64) ? 0x0f0f0f0f0f0f0f0fLL
> + : 0x0f0f0f0f);
> + tcg_gen_shli_tl(tmp, tmp, 4);
> + tcg_gen_or_tl(source1, source1, tmp);
> + tcg_gen_andi_tl(tmp, source1, (TARGET_LONG_BITS == 64) ? 0xf0f0f0f0f0f0f0f0LL
> + : 0xf0f0f0f0);
> + tcg_gen_shri_tl(tmp, tmp, 4);
> + tcg_gen_or_tl(ret, source1, tmp);
> }
You can use the simpler algorithm from
https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord
/* Set msb in each byte if the byte was zero. */
tcg_gen_subi_tl(tmp, src1, dup_const(MO_8, 0x01));
tcg_gen_andc_tl(tmp, tmp, src1);
tcg_gen_andi_tl(tmp, tmp, dup_const(MO_8, 0x80));
/* Replicate the msb of each byte across the byte. */
tcg_gen_shri_tl(tmp, tmp, 7);
tcg_gen_muli_tl(dest, tmp, 0xff);
>
> +static void gen_clmulx(DisasContext *ctx, arg_r *a, bool reverse)
> +{
> + TCGv source1 = tcg_temp_new();
> + TCGv source2 = tcg_temp_new();
> + TCGv zeroreg = tcg_const_tl(0);
> + TCGv t0 = tcg_temp_new();
> + TCGv t1 = tcg_temp_new();
> + TCGv result = tcg_temp_new();
> +
> + gen_get_gpr(source1, a->rs1);
> + gen_get_gpr(source2, a->rs2);
> + tcg_gen_movi_tl(result, 0);
> +
> + for (int i = 0; i < TARGET_LONG_BITS; i++) {
> + tcg_gen_shri_tl(t0, source2, i);
> + if (reverse) {
> + tcg_gen_shri_tl(t1, source1, TARGET_LONG_BITS - i - 1);
> + } else {
> + tcg_gen_shli_tl(t1, source1, i);
> + }
> + tcg_gen_andi_tl(t0, t0, 1);
> + tcg_gen_xor_tl(t1, result, t1);
> + tcg_gen_movcond_tl(TCG_COND_NE, result, t0, zeroreg, t1, result);
> + }
> +
> + gen_set_gpr(a->rd, result);
> + tcg_temp_free(source1);
> + tcg_temp_free(source2);
> + tcg_temp_free(t0);
> + tcg_temp_free(t1);
> + tcg_temp_free(zeroreg);
> + tcg_temp_free(result);
> +}
This inline is way too large -- up to 384 instructions.
Use a couple of out-of-line helpers.
r~
next prev parent reply other threads:[~2021-08-19 1:11 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-18 20:32 [PATCH v2 0/3] target/riscv: Update QEmu for Zb[abcs] 1.0.0 Philipp Tomsich
2021-08-18 20:32 ` [PATCH v2 1/3] target/riscv: Add x-zba, x-zbb, x-zbc and x-zbs properties Philipp Tomsich
2021-08-18 22:39 ` Richard Henderson
2021-08-18 22:41 ` Philipp Tomsich
2021-08-18 20:32 ` [PATCH v2 2/3] target/riscv: update Zb[abcs] to 1.0.0 (public review) specification Philipp Tomsich
2021-08-19 1:09 ` Richard Henderson [this message]
2021-08-18 20:32 ` [PATCH v2 3/3] disas/riscv: Add Zb[abcs] instructions Philipp Tomsich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7750e59b-9498-19ef-bf41-804f6e0bcae2@linaro.org \
--to=richard.henderson@linaro.org \
--cc=alistair.francis@wdc.com \
--cc=kito.cheng@sifive.com \
--cc=philipp.tomsich@vrull.eu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).