# OpenPOWER SV setvl/setvli See links: * * * Use of setvl results in changes to the MVL, VL and STATE SPRs. see [[sv/sprs]]♧ # Format | 0..5 |6..10|11..15|16.20|21.22.23.24..25|26.....30|31| name | |------|-----|------|-----|---------------|---------|--|---------| | 19 | RT | RA | | XO[0:4] | XO[5:9] |Rc| XL-Form | | 19 | RT | RA |imm | imm // vs ms | NNNNN |Rc| setvl | Note that imm spans 7 bits (16 to 22) Note that setmvli is a pseudo-op, based on RA/RT=0, and setvli likewise * setvli VL=8 : setvl r5, r0, VL=8 * setmvli MVL=8 : setvl r0, r0, MVL=8 # Pseudocode // instruction fields: rd = get_rt_field(); // bits 6..10 ra = get_ra_field(); // bits 11..15 vlimmed = get_immed_field(); // bits 16..22 vs = get_vs_field(); // bit 24 ms = get_ms_field(); // bit 25 Rc = get_Rc_field(); // bit 31 // set VL (or not). // 3 options: from SPR, from immed, from ra if vs { // VL to be sourced from fields/regs if ra != 0 { VL = GPR[ra] } else { VL = vlimmed } } else { // VL not to change, source from SPR VL = SPR[SV_VL] } // set MVL (or not). // 2 options: from SPR, from immed if ms { MVL = vlimmed } else { MVL = SPR[SV_MVL] } // calculate (limit) VL VL = min(VL, MVL) // store VL, MVL SPR[SV_VL] = VL SPR[SV_MVL] = MVL // write rd if rt != 0 { // rt is not zero regs[rt] = VL; } // write CR? if Rc { // update CR from VL (not rt) CR0 = .... } # Examples ## Core concept loop loop: setvl a3, a0, MVL=8 # update a3 with vl # (# of elements this iteration) # set MVL to 8 # do vector operations at up to 8 length (MVL=8) # ... sub a0, a0, a3 # Decrement count by vl bnez a0, loop # Any more? ## Loop using Rc=1 my_fn: li r3, 1000 b test loop: sub r3, r3, r4 ... test: setvl. r4, r3, 64 bne cr0, loop end: blr