@@ -4697,3 +4697,117 @@ GEN_VEXT_VID_V(vid_v_b, uint8_t, H1, clearb)
4697
4697
GEN_VEXT_VID_V (vid_v_h , uint16_t , H2 , clearh )
4698
4698
GEN_VEXT_VID_V (vid_v_w , uint32_t , H4 , clearl )
4699
4699
GEN_VEXT_VID_V (vid_v_d , uint64_t , H8 , clearq )
4700
+
4701
+ /*
4702
+ *** Vector Permutation Instructions
4703
+ */
4704
+
4705
+ /* Vector Slide Instructions */
4706
+ #define GEN_VEXT_VSLIDEUP_VX (NAME , ETYPE , H , CLEAR_FN ) \
4707
+ void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
4708
+ CPURISCVState *env, uint32_t desc) \
4709
+ { \
4710
+ uint32_t mlen = vext_mlen(desc); \
4711
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
4712
+ uint32_t vm = vext_vm(desc); \
4713
+ uint32_t vl = env->vl; \
4714
+ target_ulong offset = s1, i; \
4715
+ \
4716
+ for (i = offset; i < vl; i++) { \
4717
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
4718
+ continue; \
4719
+ } \
4720
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(i - offset)); \
4721
+ } \
4722
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
4723
+ }
4724
+
4725
+ /* vslideup.vx vd, vs2, rs1, vm # vd[i+rs1] = vs2[i] */
4726
+ GEN_VEXT_VSLIDEUP_VX (vslideup_vx_b , uint8_t , H1 , clearb )
4727
+ GEN_VEXT_VSLIDEUP_VX (vslideup_vx_h , uint16_t , H2 , clearh )
4728
+ GEN_VEXT_VSLIDEUP_VX (vslideup_vx_w , uint32_t , H4 , clearl )
4729
+ GEN_VEXT_VSLIDEUP_VX (vslideup_vx_d , uint64_t , H8 , clearq )
4730
+
4731
+ #define GEN_VEXT_VSLIDEDOWN_VX (NAME , ETYPE , H , CLEAR_FN ) \
4732
+ void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
4733
+ CPURISCVState *env, uint32_t desc) \
4734
+ { \
4735
+ uint32_t mlen = vext_mlen(desc); \
4736
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
4737
+ uint32_t vm = vext_vm(desc); \
4738
+ uint32_t vl = env->vl; \
4739
+ target_ulong offset = s1, i; \
4740
+ \
4741
+ for (i = 0; i < vl; ++i) { \
4742
+ target_ulong j = i + offset; \
4743
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
4744
+ continue; \
4745
+ } \
4746
+ *((ETYPE *)vd + H(i)) = j >= vlmax ? 0 : *((ETYPE *)vs2 + H(j)); \
4747
+ } \
4748
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
4749
+ }
4750
+
4751
+ /* vslidedown.vx vd, vs2, rs1, vm # vd[i] = vs2[i+rs1] */
4752
+ GEN_VEXT_VSLIDEDOWN_VX (vslidedown_vx_b , uint8_t , H1 , clearb )
4753
+ GEN_VEXT_VSLIDEDOWN_VX (vslidedown_vx_h , uint16_t , H2 , clearh )
4754
+ GEN_VEXT_VSLIDEDOWN_VX (vslidedown_vx_w , uint32_t , H4 , clearl )
4755
+ GEN_VEXT_VSLIDEDOWN_VX (vslidedown_vx_d , uint64_t , H8 , clearq )
4756
+
4757
+ #define GEN_VEXT_VSLIDE1UP_VX (NAME , ETYPE , H , CLEAR_FN ) \
4758
+ void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
4759
+ CPURISCVState *env, uint32_t desc) \
4760
+ { \
4761
+ uint32_t mlen = vext_mlen(desc); \
4762
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
4763
+ uint32_t vm = vext_vm(desc); \
4764
+ uint32_t vl = env->vl; \
4765
+ uint32_t i; \
4766
+ \
4767
+ for (i = 0; i < vl; i++) { \
4768
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
4769
+ continue; \
4770
+ } \
4771
+ if (i == 0) { \
4772
+ *((ETYPE *)vd + H(i)) = s1; \
4773
+ } else { \
4774
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(i - 1)); \
4775
+ } \
4776
+ } \
4777
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
4778
+ }
4779
+
4780
+ /* vslide1up.vx vd, vs2, rs1, vm # vd[0]=x[rs1], vd[i+1] = vs2[i] */
4781
+ GEN_VEXT_VSLIDE1UP_VX (vslide1up_vx_b , uint8_t , H1 , clearb )
4782
+ GEN_VEXT_VSLIDE1UP_VX (vslide1up_vx_h , uint16_t , H2 , clearh )
4783
+ GEN_VEXT_VSLIDE1UP_VX (vslide1up_vx_w , uint32_t , H4 , clearl )
4784
+ GEN_VEXT_VSLIDE1UP_VX (vslide1up_vx_d , uint64_t , H8 , clearq )
4785
+
4786
+ #define GEN_VEXT_VSLIDE1DOWN_VX (NAME , ETYPE , H , CLEAR_FN ) \
4787
+ void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
4788
+ CPURISCVState *env, uint32_t desc) \
4789
+ { \
4790
+ uint32_t mlen = vext_mlen(desc); \
4791
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
4792
+ uint32_t vm = vext_vm(desc); \
4793
+ uint32_t vl = env->vl; \
4794
+ uint32_t i; \
4795
+ \
4796
+ for (i = 0; i < vl; i++) { \
4797
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
4798
+ continue; \
4799
+ } \
4800
+ if (i == vl - 1) { \
4801
+ *((ETYPE *)vd + H(i)) = s1; \
4802
+ } else { \
4803
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(i + 1)); \
4804
+ } \
4805
+ } \
4806
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
4807
+ }
4808
+
4809
+ /* vslide1down.vx vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=x[rs1] */
4810
+ GEN_VEXT_VSLIDE1DOWN_VX (vslide1down_vx_b , uint8_t , H1 , clearb )
4811
+ GEN_VEXT_VSLIDE1DOWN_VX (vslide1down_vx_h , uint16_t , H2 , clearh )
4812
+ GEN_VEXT_VSLIDE1DOWN_VX (vslide1down_vx_w , uint32_t , H4 , clearl )
4813
+ GEN_VEXT_VSLIDE1DOWN_VX (vslide1down_vx_d , uint64_t , H8 , clearq )
0 commit comments