* can not be greater than 8 vector registers (Section 5.2):
* => LMUL < 8.
* => SEW < 64.
- * 2. Destination vector register number is multiples of 2 * LMUL.
+ * 2. Double-width SEW cannot greater than ELEN.
+ * 3. Destination vector register number is multiples of 2 * LMUL.
* (Section 3.4.2)
- * 3. Destination vector register group for a masked vector
+ * 4. Destination vector register group for a masked vector
* instruction cannot overlap the source mask register (v0).
* (Section 5.3)
*/
{
return (s->lmul <= 2) &&
(s->sew < MO_64) &&
+ ((s->sew + 1) <= (s->elen >> 4)) &&
require_align(vd, s->lmul + 1) &&
require_vm(vm, vd);
}
* can not be greater than 8 vector registers (Section 5.2):
* => LMUL < 8.
* => SEW < 64.
- * 2. Source vector register number is multiples of 2 * LMUL.
+ * 2. Double-width SEW cannot greater than ELEN.
+ * 3. Source vector register number is multiples of 2 * LMUL.
* (Section 3.4.2)
- * 3. Destination vector register number is multiples of LMUL.
+ * 4. Destination vector register number is multiples of LMUL.
* (Section 3.4.2)
- * 4. Destination vector register group for a masked vector
+ * 5. Destination vector register group for a masked vector
* instruction cannot overlap the source mask register (v0).
* (Section 5.3)
*/
{
return (s->lmul <= 2) &&
(s->sew < MO_64) &&
+ ((s->sew + 1) <= (s->elen >> 4)) &&
require_align(vs2, s->lmul + 1) &&
require_align(vd, s->lmul) &&
require_vm(vm, vd);
/* Vector Widening Integer Reduction Instructions */
static bool reduction_widen_check(DisasContext *s, arg_rmrr *a)
{
- return reduction_check(s, a) && (s->sew < MO_64);
+ return reduction_check(s, a) && (s->sew < MO_64) &&
+ ((s->sew + 1) <= (s->elen >> 4));
}
GEN_OPIVV_WIDEN_TRANS(vwredsum_vs, reduction_widen_check)
int8_t lmul;
uint8_t sew;
uint16_t vlen;
+ uint16_t elen;
target_ulong vstart;
bool vl_eq_vlmax;
uint8_t ntemp;
ctx->ext_zfh = cpu->cfg.ext_zfh;
ctx->ext_zfhmin = cpu->cfg.ext_zfhmin;
ctx->vlen = cpu->cfg.vlen;
+ ctx->elen = cpu->cfg.elen;
ctx->mstatus_hs_fs = FIELD_EX32(tb_flags, TB_FLAGS, MSTATUS_HS_FS);
ctx->mstatus_hs_vs = FIELD_EX32(tb_flags, TB_FLAGS, MSTATUS_HS_VS);
ctx->hlsx = FIELD_EX32(tb_flags, TB_FLAGS, HLSX);