vsetvli
Vector Set Vector Type and Vector Length Immediate
This instruction is defined by:
Decode Variables
Bits<11> vtypei = $encoding[30:20];
Bits<5> xs1 = $encoding[19:15];
Bits<5> xd = $encoding[11:7];
Execution
-
Pruned, XLEN == 64
-
Original
XReg new_vtype = vtypei;
if ((new_vtype[63] == 1'b1) || (new_vtype[5] == 1) || (new_vtype[2:0] == 3'b100)) {
CSR[vtype].VILL = 1;
CSR[vtype].VMA = 0;
CSR[vtype].VTA = 0;
CSR[vtype].VSEW = 0;
CSR[vtype].VLMUL = 0;
CSR[vl].VALUE = 0;
} else {
CSR[vtype].VILL = 0;
CSR[vtype].VMA = new_vtype[7];
CSR[vtype].VTA = new_vtype[6];
CSR[vtype].VSEW = new_vtype[5:3];
CSR[vtype].VLMUL = new_vtype[2:0];
VectorState state = vector_state();
XReg vlen = VLEN;
XReg vlmax = (vlen << state.log2_lmul) >> state.log2_sew;
XReg avl = X[xs1];
XReg ceil_avl_over_two = (avl + 1) / 2;
if (xs1 == 0) {
CSR[vl].VALUE = vlmax;
} else {
if (avl <= vlmax) {
CSR[vl].VALUE = avl;
} else if (avl < 2 * vlmax) {
if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "ceil(AVL/2)") {
CSR[vl].VALUE = ceil_avl_over_two;
} else if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "VLMAX") {
CSR[vl].VALUE = vlmax;
} else {
unpredictable("Implementations may choose a custom value for vl in the case AVL < (2*VLMAX), so long as ceil(AVL/2) <= vl <= VLMAX");
}
} else {
CSR[vl].VALUE = vlmax;
}
}
}
X[xd] = CSR[vl].VALUE;
CSR[vstart].VALUE = 0;
XReg new_vtype = vtypei;
if ((new_vtype[xlen() - 1] == 1'b1) || new_vtype & 8'd0) != 0) || (new_vtype[5] == 1) || (new_vtype[2:0] == 3'b100 {
CSR[vtype].VILL = 1;
CSR[vtype].VMA = 0;
CSR[vtype].VTA = 0;
CSR[vtype].VSEW = 0;
CSR[vtype].VLMUL = 0;
CSR[vl].VALUE = 0;
} else {
CSR[vtype].VILL = 0;
CSR[vtype].VMA = new_vtype[7];
CSR[vtype].VTA = new_vtype[6];
CSR[vtype].VSEW = new_vtype[5:3];
CSR[vtype].VLMUL = new_vtype[2:0];
VectorState state = vector_state();
XReg vlen = VLEN;
XReg vlmax = (vlen << state.log2_lmul) >> state.log2_sew;
XReg avl = X[xs1];
XReg ceil_avl_over_two = (avl + 1) / 2;
if (xs1 == 0) {
CSR[vl].VALUE = vlmax;
} else {
if (avl <= vlmax) {
CSR[vl].VALUE = avl;
} else if (avl < 2 * vlmax) {
if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "ceil(AVL/2)") {
CSR[vl].VALUE = ceil_avl_over_two;
} else if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "VLMAX") {
CSR[vl].VALUE = vlmax;
} else {
unpredictable("Implementations may choose a custom value for vl in the case AVL < (2*VLMAX), so long as ceil(AVL/2) <= vl <= VLMAX");
}
} else {
CSR[vl].VALUE = vlmax;
}
}
}
X[xd] = CSR[vl].VALUE;
CSR[vstart].VALUE = 0;