target/riscv: rvv: Source vector registers cannot overlap mask register
Add the relevant ISA paragraphs explaining why source (and destination)
registers cannot overlap the mask register.
Signed-off-by: Anton Blanchard <antonb@tenstorrent.com>
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Max Chou <max.chou@sifive.com>
Signed-off-by: Max Chou <max.chou@sifive.com>
Message-ID: <20250408103938.3623486-2-max.chou@sifive.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Cc: qemu-stable@nongnu.org
(cherry picked from commit 3e8d1e4a62)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
70dbbc2811
commit
336fed6bb8
1 changed files with 26 additions and 3 deletions
|
|
@ -100,10 +100,33 @@ static bool require_scale_rvfmin(DisasContext *s)
|
|||
}
|
||||
}
|
||||
|
||||
/* Destination vector register group cannot overlap source mask register. */
|
||||
static bool require_vm(int vm, int vd)
|
||||
/*
|
||||
* Source and destination vector register groups cannot overlap source mask
|
||||
* register:
|
||||
*
|
||||
* A vector register cannot be used to provide source operands with more than
|
||||
* one EEW for a single instruction. A mask register source is considered to
|
||||
* have EEW=1 for this constraint. An encoding that would result in the same
|
||||
* vector register being read with two or more different EEWs, including when
|
||||
* the vector register appears at different positions within two or more vector
|
||||
* register groups, is reserved.
|
||||
* (Section 5.2)
|
||||
*
|
||||
* A destination vector register group can overlap a source vector
|
||||
* register group only if one of the following holds:
|
||||
* 1. The destination EEW equals the source EEW.
|
||||
* 2. The destination EEW is smaller than the source EEW and the overlap
|
||||
* is in the lowest-numbered part of the source register group.
|
||||
* 3. The destination EEW is greater than the source EEW, the source EMUL
|
||||
* is at least 1, and the overlap is in the highest-numbered part of
|
||||
* the destination register group.
|
||||
* For the purpose of determining register group overlap constraints, mask
|
||||
* elements have EEW=1.
|
||||
* (Section 5.2)
|
||||
*/
|
||||
static bool require_vm(int vm, int v)
|
||||
{
|
||||
return (vm != 0 || vd != 0);
|
||||
return (vm != 0 || v != 0);
|
||||
}
|
||||
|
||||
static bool require_nf(int vd, int nf, int lmul)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue