@@ -277,6 +277,10 @@ typedef enum S390Opcode {
277
277
VRRc_VCEQ = 0xe7f8 , /* we leave the m5 cs field 0 */
278
278
VRRc_VCH = 0xe7fb , /* " */
279
279
VRRc_VCHL = 0xe7f9 , /* " */
280
+ VRRc_VERLLV = 0xe773 ,
281
+ VRRc_VESLV = 0xe770 ,
282
+ VRRc_VESRAV = 0xe77a ,
283
+ VRRc_VESRLV = 0xe778 ,
280
284
VRRc_VML = 0xe7a2 ,
281
285
VRRc_VN = 0xe768 ,
282
286
VRRc_VNC = 0xe769 ,
@@ -287,6 +291,10 @@ typedef enum S390Opcode {
287
291
VRRc_VX = 0xe76d ,
288
292
VRRf_VLVGP = 0xe762 ,
289
293
294
+ VRSa_VERLL = 0xe733 ,
295
+ VRSa_VESL = 0xe730 ,
296
+ VRSa_VESRA = 0xe73a ,
297
+ VRSa_VESRL = 0xe738 ,
290
298
VRSb_VLVG = 0xe722 ,
291
299
VRSc_VLGV = 0xe721 ,
292
300
@@ -643,6 +651,18 @@ static void tcg_out_insn_VRRf(TCGContext *s, S390Opcode op,
643
651
tcg_out16 (s, (op & 0x00ff ) | RXB (v1, 0 , 0 , 0 ));
644
652
}
645
653
654
+ static void tcg_out_insn_VRSa (TCGContext *s, S390Opcode op, TCGReg v1,
655
+ intptr_t d2, TCGReg b2, TCGReg v3, int m4)
656
+ {
657
+ tcg_debug_assert (is_vector_reg (v1));
658
+ tcg_debug_assert (d2 >= 0 && d2 <= 0xfff );
659
+ tcg_debug_assert (is_general_reg (b2));
660
+ tcg_debug_assert (is_vector_reg (v3));
661
+ tcg_out16 (s, (op & 0xff00 ) | ((v1 & 0xf ) << 4 ) | (v3 & 0xf ));
662
+ tcg_out16 (s, b2 << 12 | d2);
663
+ tcg_out16 (s, (op & 0x00ff ) | RXB (v1, 0 , v3, 0 ) | (m4 << 12 ));
664
+ }
665
+
646
666
static void tcg_out_insn_VRSb (TCGContext *s, S390Opcode op, TCGReg v1,
647
667
intptr_t d2, TCGReg b2, TCGReg r3, int m4)
648
668
{
@@ -2710,6 +2730,43 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
2710
2730
tcg_out_insn (s, VRRc, VX, a0, a1, a2, 0 );
2711
2731
break ;
2712
2732
2733
+ case INDEX_op_shli_vec:
2734
+ tcg_out_insn (s, VRSa, VESL, a0, a2, TCG_REG_NONE, a1, vece);
2735
+ break ;
2736
+ case INDEX_op_shri_vec:
2737
+ tcg_out_insn (s, VRSa, VESRL, a0, a2, TCG_REG_NONE, a1, vece);
2738
+ break ;
2739
+ case INDEX_op_sari_vec:
2740
+ tcg_out_insn (s, VRSa, VESRA, a0, a2, TCG_REG_NONE, a1, vece);
2741
+ break ;
2742
+ case INDEX_op_rotli_vec:
2743
+ tcg_out_insn (s, VRSa, VERLL, a0, a2, TCG_REG_NONE, a1, vece);
2744
+ break ;
2745
+ case INDEX_op_shls_vec:
2746
+ tcg_out_insn (s, VRSa, VESL, a0, 0 , a2, a1, vece);
2747
+ break ;
2748
+ case INDEX_op_shrs_vec:
2749
+ tcg_out_insn (s, VRSa, VESRL, a0, 0 , a2, a1, vece);
2750
+ break ;
2751
+ case INDEX_op_sars_vec:
2752
+ tcg_out_insn (s, VRSa, VESRA, a0, 0 , a2, a1, vece);
2753
+ break ;
2754
+ case INDEX_op_rotls_vec:
2755
+ tcg_out_insn (s, VRSa, VERLL, a0, 0 , a2, a1, vece);
2756
+ break ;
2757
+ case INDEX_op_shlv_vec:
2758
+ tcg_out_insn (s, VRRc, VESLV, a0, a1, a2, vece);
2759
+ break ;
2760
+ case INDEX_op_shrv_vec:
2761
+ tcg_out_insn (s, VRRc, VESRLV, a0, a1, a2, vece);
2762
+ break ;
2763
+ case INDEX_op_sarv_vec:
2764
+ tcg_out_insn (s, VRRc, VESRAV, a0, a1, a2, vece);
2765
+ break ;
2766
+ case INDEX_op_rotlv_vec:
2767
+ tcg_out_insn (s, VRRc, VERLLV, a0, a1, a2, vece);
2768
+ break ;
2769
+
2713
2770
case INDEX_op_cmp_vec:
2714
2771
switch ((TCGCond)args[3 ]) {
2715
2772
case TCG_COND_EQ:
@@ -2744,10 +2801,23 @@ int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
2744
2801
case INDEX_op_not_vec:
2745
2802
case INDEX_op_or_vec:
2746
2803
case INDEX_op_orc_vec:
2804
+ case INDEX_op_rotli_vec:
2805
+ case INDEX_op_rotls_vec:
2806
+ case INDEX_op_rotlv_vec:
2807
+ case INDEX_op_sari_vec:
2808
+ case INDEX_op_sars_vec:
2809
+ case INDEX_op_sarv_vec:
2810
+ case INDEX_op_shli_vec:
2811
+ case INDEX_op_shls_vec:
2812
+ case INDEX_op_shlv_vec:
2813
+ case INDEX_op_shri_vec:
2814
+ case INDEX_op_shrs_vec:
2815
+ case INDEX_op_shrv_vec:
2747
2816
case INDEX_op_sub_vec:
2748
2817
case INDEX_op_xor_vec:
2749
2818
return 1 ;
2750
2819
case INDEX_op_cmp_vec:
2820
+ case INDEX_op_rotrv_vec:
2751
2821
return -1 ;
2752
2822
case INDEX_op_mul_vec:
2753
2823
return vece < MO_64;
@@ -2810,7 +2880,7 @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
2810
2880
TCGArg a0, ...)
2811
2881
{
2812
2882
va_list va;
2813
- TCGv_vec v0, v1, v2;
2883
+ TCGv_vec v0, v1, v2, t0 ;
2814
2884
2815
2885
va_start (va, a0);
2816
2886
v0 = temp_tcgv_vec (arg_temp (a0));
@@ -2822,6 +2892,13 @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
2822
2892
expand_vec_cmp (type, vece, v0, v1, v2, va_arg (va, TCGArg));
2823
2893
break ;
2824
2894
2895
+ case INDEX_op_rotrv_vec:
2896
+ t0 = tcg_temp_new_vec (type);
2897
+ tcg_gen_neg_vec (vece, t0, v2);
2898
+ tcg_gen_rotlv_vec (vece, v0, v1, t0);
2899
+ tcg_temp_free_vec (t0);
2900
+ break ;
2901
+
2825
2902
default :
2826
2903
g_assert_not_reached ();
2827
2904
}
@@ -2978,6 +3055,10 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
2978
3055
case INDEX_op_abs_vec:
2979
3056
case INDEX_op_neg_vec:
2980
3057
case INDEX_op_not_vec:
3058
+ case INDEX_op_rotli_vec:
3059
+ case INDEX_op_sari_vec:
3060
+ case INDEX_op_shli_vec:
3061
+ case INDEX_op_shri_vec:
2981
3062
return C_O1_I1 (v, v);
2982
3063
case INDEX_op_add_vec:
2983
3064
case INDEX_op_sub_vec:
@@ -2988,7 +3069,17 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
2988
3069
case INDEX_op_xor_vec:
2989
3070
case INDEX_op_cmp_vec:
2990
3071
case INDEX_op_mul_vec:
3072
+ case INDEX_op_rotlv_vec:
3073
+ case INDEX_op_rotrv_vec:
3074
+ case INDEX_op_shlv_vec:
3075
+ case INDEX_op_shrv_vec:
3076
+ case INDEX_op_sarv_vec:
2991
3077
return C_O1_I2 (v, v, v);
3078
+ case INDEX_op_rotls_vec:
3079
+ case INDEX_op_shls_vec:
3080
+ case INDEX_op_shrs_vec:
3081
+ case INDEX_op_sars_vec:
3082
+ return C_O1_I2 (v, v, r);
2992
3083
2993
3084
default :
2994
3085
g_assert_not_reached ();
0 commit comments