From: LIU Zhiwei <zhiwei_liu@c-sky.com>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: palmer@dabbelt.com, Alistair.Francis@wdc.com,
qemu-devel@nongnu.org, Chih-Min Chao <chihmin.chao@sifive.com>
Subject: Re: [Qemu-devel] [PATCH] RISCV: support riscv vector extension 0.7.1
Date: Wed, 25 Dec 2019 17:36:06 +0800 [thread overview]
Message-ID: <ea5d5926-48ba-e204-cad8-7e5260b2e2ee@c-sky.com> (raw)
In-Reply-To: <fe1a210e-e4cf-f62a-a39f-2818358d53c9@linaro.org>
[-- Attachment #1: Type: text/plain, Size: 5164 bytes --]
On 2019/12/20 4:38, Richard Henderson wrote:
> On 12/18/19 11:11 PM, LIU Zhiwei wrote:
>> I'm sorry that it's really hard to absorb your opinion. I don't know why clang
>> will fail
>>
>> when index beyond the end of vreg[n] into vreg[n+1].
> I thought sure one of the address sanitizer checks would detect array bounds
> overrun. But it becomes irrelevant
>
>> As Chih-Min Chao said in another part of PATCH V2 thread, VLEN will be a
>> property which can be
>>
>> specified from command line. So the sub-struct maybe defined as
>>
>> struct {
>> union{
>> uint64_t *u64 ;
>> int64_t *s64;
>> uint32_t *u32;
>> int32_t *s32;
>> uint16_t *u16;
>> int16_t *s16;
>> uint8_t *u8;
>> int8_t *s8;
>> } mem;
>> target_ulong vxrm;
>> target_ulong vxsat;
>> target_ulong vl;
>> target_ulong vstart;
>> target_ulong vtype;
>> } vext;
>>
>> Will that be OK?
> Pointers have consequences. It can be done, but I don't think it is ideal.
>
>> The (ill, lmul, sew ) of vtype will be placed within tb_flags, also the bit of
>> (VSTART == 0 && VL == VLMAX).
>>
>> So it will take 8 bits of tb flags for vector extension at least.
> Good.
>> However, I have one problem to support both command line VLEN and vreg_ofs.
>>
>> As in SVE, vreg ofs is the offset from cpu_env. If the structure of vector
>> extension (to support command line VLEN) is
>>
>> struct {
>> union{
>> uint64_t *u64 ;
>> int64_t *s64;
>> uint32_t *u32;
>> int32_t *s32;
>> uint16_t *u16;
>> int16_t *s16;
>> uint8_t *u8;
>> int8_t *s8;
>> } mem;
>> target_ulong vxrm;
>> target_ulong vxsat;
>> target_ulong vl;
>> target_ulong vstart;
>> target_ulong vtype;
>> } vext
>>
>> I can't find the way to get the direct offset of vreg from cpu_env.
>>
>> Maybe I should specify a max VLEN like the way of SVE?
> I think a maximum vlen is best. A command-line option to adjust vlen is all
> well and good, but there's no reason to have to support vlen=(1<<29).
>
> Oh, and you probably need a minimum vlen of 16 bytes as well, otherwise you
> will run afoul of the assert in tcg-op-gvec.c that requires gvec operations to
> be aligned mod 16.
>
> I think that all you need is
>
> uint64_t vreg[32 * MAX_VLEN / 8] QEMU_ALIGNED(16);
>
> which gives us
>
> uint32_t vreg_ofs(DisasContext *ctx, int reg)
> {
> return offsetof(CPURISCVState, vreg) + reg * ctx->vlen;
> }
struct {
uint64_t vreg[32 * RV_VLEN_MAX / 64] QEMU_ALIGNED(16);
target_ulong vxrm;
target_ulong vxsat;
target_ulong vl;
target_ulong vstart;
target_ulong vtype;
} vext;
Is it OK?
> I don't see the point of a union for vreg. I don't think you'll find that you
> actually use it at all.
I think I can move most of execution check to translate time like SVE
now. However, there are still some differences from SVE.
1)cpu_env must be used as a parameter for helper function.
The helpers need use env->vext.vl and env->vext.vstart. Thus it
will be difficult to use out of line tcg_gen_gvec_ool.
void tcg_gen_gvec_2_ool(uint32_t dofs, uint32_t aofs,
uint32_t oprsz, uint32_t maxsz, int32_t data,
gen_helper_gvec_2 *fn)
{
......
fn(a0, a1, desc);
......
}
Maybe I have to write something similar to tcg_gen_gvec_ool in
trans_rvv.inc.c. But it will be redundant.
2)simd_desc is not proper.
I also need to transfer some members of DisasContext to helpers.
(Data, Vlmax, Mlen) is my current choice. Vlmax is the num of
elements of this operation, so it will defined as ctx->lmul * ctx->vlen
/ ctx->sew;
Data is reserved to expand. Mlen is mask length for one elment, so it
will defined as ctx->sew/ctx->lmul. As with Mlen, a active element will
be selected by
static inline int vext_elem_mask(void *v0, int mlen, int index)
{
int idx = (index * mlen) / 8;
int pos = (index * mlen) % 8;
return (v0[idx] >> pos) & 0x1;
}
So I may have to implement vext_desc instead of use the simd_desc,
which will be another redundant. Maybe a better way to mask elements?
> You do need to document the element ordering that you're going to use for vreg.
> I.e. the mapping between the architectural vector register state and the
> emulation state. You have two choices:
>
> (1) all bytes in host endianness (e.g. target/ppc)
> (2) bytes within each uint64_t in host endianness,
> but each uint64_t is little-endian (e.g. target/arm).
>
> Both require some fixup when running on a big-endian host.
Yes, I will take (2).
Best Regards,
Zhiwei
>
> r~
[-- Attachment #2: Type: text/html, Size: 7573 bytes --]
next prev parent reply other threads:[~2019-12-25 9:36 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1566959818-38369-1-git-send-email-zhiwei_liu@c-sky.com>
2019-08-28 9:08 ` [Qemu-devel] [PATCH] RISCV: support riscv vector extension 0.7.1 Alex Bennée
2019-08-28 16:39 ` Richard Henderson
2019-08-29 13:35 ` liuzhiwei
2019-08-28 18:54 ` Richard Henderson
2019-08-28 20:43 ` Richard Henderson
2019-08-29 12:45 ` liuzhiwei
2019-08-29 15:09 ` Richard Henderson
2019-09-02 7:45 ` liuzhiwei
2019-09-03 14:38 ` Richard Henderson
2019-09-02 9:43 ` liuzhiwei
2019-09-03 14:21 ` Richard Henderson
2019-12-19 9:11 ` LIU Zhiwei
2019-12-19 20:38 ` Richard Henderson
2019-12-25 9:36 ` LIU Zhiwei [this message]
2019-12-28 1:14 ` Richard Henderson
2019-12-30 8:11 ` LIU Zhiwei
2020-01-05 20:19 ` Richard Henderson
2019-08-28 21:34 ` Alistair Francis
2019-08-29 12:00 ` liuzhiwei
2019-08-29 15:14 ` Richard Henderson
2019-09-02 6:54 ` liuzhiwei
2019-08-29 21:50 ` Alistair Francis
2019-08-30 9:06 ` Alex Bennée
2019-08-30 18:39 ` Alistair Francis
2019-09-02 6:36 ` liuzhiwei
[not found] ` <CAL1e-=iHangj7w+HgJ+FM=iqRLmaY-_CYeUv0gx+c8bpScb9RQ@mail.gmail.com>
[not found] ` <46ade3da-d642-bd19-7975-7dc228d401e4@c-sky.com>
2019-08-29 18:32 ` Aleksandar Markovic
[not found] ` <CAEiOBXXofjrY2=sjuMDb9dTV2fk9yUVKnr+qmf+7mg9vki6OCw@mail.gmail.com>
2019-09-02 8:17 ` [Qemu-devel] [Qemu-riscv] " liuzhiwei
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=ea5d5926-48ba-e204-cad8-7e5260b2e2ee@c-sky.com \
--to=zhiwei_liu@c-sky.com \
--cc=Alistair.Francis@wdc.com \
--cc=chihmin.chao@sifive.com \
--cc=palmer@dabbelt.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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).