@@ -2618,9 +2618,9 @@ simd_type_to_negate_op (int t)
2618
2618
}
2619
2619
}
2620
2620
2621
- static int
2621
+ static bool
2622
2622
type_is_float (int t ){
2623
- return (t == MONO_TYPE_R4 || t == MONO_TYPE_R8 ) ? OP_XCOMPARE_FP : OP_XCOMPARE ;
2623
+ return (t == MONO_TYPE_R4 || t == MONO_TYPE_R8 );
2624
2624
}
2625
2625
2626
2626
/**
@@ -2758,16 +2758,11 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
2758
2758
ins -> opcode = GINT_TO_OPCODE (simd_type_to_comp_op (GTMREG_TO_INT (ins -> inst_c1 )));
2759
2759
break ;
2760
2760
case CMP_LT :
2761
- temp = ins -> sreg1 ;
2762
- ins -> sreg1 = ins -> sreg2 ;
2763
- ins -> sreg2 = temp ;
2764
- case CMP_GT :
2765
- ins -> opcode = GINT_TO_OPCODE (simd_type_to_gt_op (GTMREG_TO_INT (ins -> inst_c1 )));
2766
- break ;
2767
2761
case CMP_LT_UN :
2768
2762
temp = ins -> sreg1 ;
2769
2763
ins -> sreg1 = ins -> sreg2 ;
2770
2764
ins -> sreg2 = temp ;
2765
+ case CMP_GT :
2771
2766
case CMP_GT_UN :
2772
2767
ins -> opcode = GINT_TO_OPCODE (simd_type_to_gt_op (GTMREG_TO_INT (ins -> inst_c1 )));
2773
2768
break ;
@@ -2790,86 +2785,68 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
2790
2785
break ;
2791
2786
}
2792
2787
case OP_S390_XCOMPARE_XEXTRACT :{
2793
- switch ( type_is_float ( GTMREG_TO_INT ( ins -> inst_c1 ))){
2794
- case OP_XCOMPARE : {
2788
+ guint32 temp_reg = alloc_ireg ( cfg );
2789
+ if (! type_is_float ( GTMREG_TO_INT ( ins -> inst_c1 ))) {
2795
2790
switch (ins -> inst_c0 >> 4 ){
2796
- case CMP_EQ :
2797
- NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_comp_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), s390_vr16 , ins -> sreg1 , ins -> sreg2 );
2798
- break ;
2799
- case CMP_LT :
2800
- case CMP_LT_UN :
2801
- temp = ins -> sreg1 ;
2802
- ins -> sreg1 = ins -> sreg2 ;
2803
- ins -> sreg2 = temp ;
2804
- case CMP_GT :
2791
+ case CMP_EQ :
2792
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_comp_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), temp_reg , ins -> sreg1 , ins -> sreg2 );
2793
+ break ;
2794
+ case CMP_LT :
2795
+ case CMP_LT_UN :
2796
+ case CMP_GE :
2797
+ case CMP_GE_UN :
2798
+ temp = ins -> sreg1 ;
2799
+ ins -> sreg1 = ins -> sreg2 ;
2800
+ ins -> sreg2 = temp ;
2801
+ case CMP_GT :
2805
2802
case CMP_GT_UN :
2806
- NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_gt_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), s390_vr16 , ins -> sreg1 , ins -> sreg2 );
2807
- break ;
2808
- case CMP_GE :
2809
- case CMP_GE_UN :
2810
- temp = ins -> sreg1 ;
2811
- ins -> sreg1 = ins -> sreg2 ;
2812
- ins -> sreg2 = temp ;
2813
- case CMP_LE :
2814
- case CMP_LE_UN :{
2815
- NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_gt_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), s390_vr16 , ins -> sreg1 , ins -> sreg2 );
2816
- NEW_SIMD_INS (cfg , ins , temp_ins , OP_S390_VNO , s390_vr16 , s390_vr16 , s390_vr16 );
2817
- break ;
2818
- }
2819
- default :
2820
- g_assert_not_reached ();
2821
- break ;
2822
- }
2823
- break ;
2803
+ case CMP_LE :
2804
+ case CMP_LE_UN :
2805
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_gt_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), temp_reg , ins -> sreg1 , ins -> sreg2 );
2806
+ break ;
2807
+ default :
2808
+ g_assert_not_reached ();
2809
+ break ;
2810
+ }
2811
+ }
2812
+ else {
2813
+ switch (ins -> inst_c0 >> 4 ){
2814
+ case CMP_EQ :
2815
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_comp_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), temp_reg , ins -> sreg1 , ins -> sreg2 );
2816
+ break ;
2817
+ case CMP_LT_UN :
2818
+ case CMP_LT :
2819
+ temp = ins -> sreg1 ;
2820
+ ins -> sreg1 = ins -> sreg2 ;
2821
+ ins -> sreg2 = temp ;
2822
+ case CMP_GT_UN :
2823
+ case CMP_GT :
2824
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_gt_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), temp_reg , ins -> sreg1 , ins -> sreg2 );
2825
+ break ;
2826
+ case CMP_LE_UN :
2827
+ case CMP_LE :
2828
+ temp = ins -> sreg1 ;
2829
+ ins -> sreg1 = ins -> sreg2 ;
2830
+ ins -> sreg2 = temp ;
2831
+ case CMP_GE_UN :
2832
+ case CMP_GE :
2833
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_ge_fp_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), temp_reg , ins -> sreg1 , ins -> sreg2 );
2834
+ break ;
2835
+ default :
2836
+ g_assert_not_reached ();
2837
+ break ;
2838
+ }
2824
2839
}
2825
- case OP_XCOMPARE_FP :{
2826
- switch (ins -> inst_c0 >> 4 ){
2827
- case CMP_EQ :
2828
- NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_comp_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), s390_vr16 , ins -> sreg1 , ins -> sreg2 );
2829
- break ;
2830
- case CMP_LT_UN :
2831
- case CMP_LT :
2832
- temp = ins -> sreg1 ;
2833
- ins -> sreg1 = ins -> sreg2 ;
2834
- ins -> sreg2 = temp ;
2835
- case CMP_GT_UN :
2836
- case CMP_GT :
2837
- NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_gt_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), s390_vr16 , ins -> sreg1 , ins -> sreg2 );
2838
- break ;
2839
- case CMP_LE_UN :
2840
- case CMP_LE :
2841
- temp = ins -> sreg1 ;
2842
- ins -> sreg1 = ins -> sreg2 ;
2843
- ins -> sreg2 = temp ;
2844
- case CMP_GE_UN :
2845
- case CMP_GE :
2846
- NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_ge_fp_any_all_op (GTMREG_TO_INT (ins -> inst_c1 ))), s390_vr16 , ins -> sreg1 , ins -> sreg2 );
2847
- break ;
2848
- default :
2849
- g_assert_not_reached ();
2850
- break ;
2851
- }
2840
+ if (!type_is_float (GTMREG_TO_INT (ins -> inst_c1 ))){
2841
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_extract_int_op (GTMREG_TO_INT (ins -> inst_c0 & 0x0f ), GTMREG_TO_INT (ins -> inst_c0 >> 4 ))), ins -> dreg , -1 , -1 );
2842
+ NULLIFY_INS (ins );
2843
+ }
2844
+ else {
2845
+ NEW_SIMD_INS (cfg , ins , temp_ins , GINT_TO_OPCODE (simd_type_to_extract_fp_op (GTMREG_TO_INT (ins -> inst_c0 & 0x0f ), GTMREG_TO_INT (ins -> inst_c0 >> 4 ))), ins -> dreg , -1 , -1 );
2846
+ NULLIFY_INS (ins );
2852
2847
}
2853
- break ;
2854
- default :
2855
- g_assert_not_reached ();
2856
- break ;
2857
2848
}
2858
- switch (type_is_float (GTMREG_TO_INT (ins -> inst_c1 ))){
2859
- case OP_XCOMPARE :
2860
- ins -> opcode = GINT_TO_OPCODE (simd_type_to_extract_int_op (GTMREG_TO_INT (ins -> inst_c0 & 0x0f ), GTMREG_TO_INT (ins -> inst_c0 >> 4 )));
2861
- break ;
2862
- case OP_XCOMPARE_FP :
2863
- ins -> opcode = GINT_TO_OPCODE (simd_type_to_extract_fp_op (GTMREG_TO_INT (ins -> inst_c0 & 0x0f ), GTMREG_TO_INT (ins -> inst_c0 >> 4 )));
2864
2849
break ;
2865
- default :
2866
- g_assert_not_reached ();
2867
- break ;
2868
- }
2869
- /* we don't use a register rather the CC set by the vector compare instructions */
2870
- ins -> sreg1 = -1 ;
2871
- }
2872
- break ;
2873
2850
case OP_VECTOR_IABS :
2874
2851
ins -> opcode = GINT_TO_OPCODE (simd_type_to_abs_op (GTMREG_TO_INT (ins -> inst_c1 )));
2875
2852
break ;
@@ -5845,19 +5822,23 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
5845
5822
s390_vfpsosb (code , ins -> dreg , ins -> sreg1 , 0 );
5846
5823
break ;
5847
5824
case OP_INSERT_I1 :
5848
- s390_vlr (code , ins -> dreg , ins -> sreg1 );
5825
+ if (ins -> dreg != ins -> sreg1 )
5826
+ s390_vlr (code , ins -> dreg , ins -> sreg1 );
5849
5827
s390_vlvgb (code , ins -> dreg , ins -> sreg2 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5850
5828
break ;
5851
5829
case OP_INSERT_I2 :
5852
- s390_vlr (code , ins -> dreg , ins -> sreg1 );
5830
+ if (ins -> dreg != ins -> sreg1 )
5831
+ s390_vlr (code , ins -> dreg , ins -> sreg1 );
5853
5832
s390_vlvgh (code , ins -> dreg , ins -> sreg2 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5854
5833
break ;
5855
5834
case OP_INSERT_I4 :
5856
- s390_vlr (code , ins -> dreg , ins -> sreg1 );
5835
+ if (ins -> dreg != ins -> sreg1 )
5836
+ s390_vlr (code , ins -> dreg , ins -> sreg1 );
5857
5837
s390_vlvgf (code , ins -> dreg , ins -> sreg2 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5858
5838
break ;
5859
5839
case OP_INSERT_I8 :
5860
- s390_vlr (code , ins -> dreg , ins -> sreg1 );
5840
+ if (ins -> dreg != ins -> sreg1 )
5841
+ s390_vlr (code , ins -> dreg , ins -> sreg1 );
5861
5842
s390_vlvgg (code , ins -> dreg , ins -> sreg2 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5862
5843
break ;
5863
5844
case OP_INSERT_R4 :
@@ -5909,30 +5890,30 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
5909
5890
s390_ldgr (code , ins -> dreg , s390_r13 );
5910
5891
break ;
5911
5892
case OP_EXPAND_I1 :
5912
- s390_vlvgb (code , s390_vr16 , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5913
- s390_vrepb (code , ins -> dreg , s390_vr16 , 0 );
5893
+ s390_vlvgb (code , ins -> dreg , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5894
+ s390_vrepb (code , ins -> dreg , ins -> dreg , 0 );
5914
5895
break ;
5915
5896
case OP_EXPAND_I2 :
5916
- s390_vlvgh (code , s390_vr16 , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5917
- s390_vreph (code , ins -> dreg , s390_vr16 , 0 );
5897
+ s390_vlvgh (code , ins -> dreg , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5898
+ s390_vreph (code , ins -> dreg , ins -> dreg , 0 );
5918
5899
break ;
5919
5900
case OP_EXPAND_I4 :
5920
- s390_vlvgf (code , s390_vr16 , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5921
- s390_vrepf (code , ins -> dreg , s390_vr16 , 0 );
5901
+ s390_vlvgf (code , ins -> dreg , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5902
+ s390_vrepf (code , ins -> dreg , ins -> dreg , 0 );
5922
5903
break ;
5923
5904
case OP_EXPAND_I8 :
5924
- s390_vlvgg (code , s390_vr16 , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5925
- s390_vrepg (code , ins -> dreg , s390_vr16 , 0 );
5905
+ s390_vlvgg (code , ins -> dreg , ins -> sreg1 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5906
+ s390_vrepg (code , ins -> dreg , ins -> dreg , 0 );
5926
5907
break ;
5927
5908
case OP_EXPAND_R4 :
5928
5909
s390_vlgvf (code , s390_r13 , ins -> sreg1 , 0 , 0 );
5929
- s390_vlvgf (code , s390_vr16 , s390_r13 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5930
- s390_vrepf (code , ins -> dreg , s390_vr16 , 0 );
5910
+ s390_vlvgf (code , ins -> dreg , s390_r13 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5911
+ s390_vrepf (code , ins -> dreg , ins -> dreg , 0 );
5931
5912
break ;
5932
5913
case OP_EXPAND_R8 :
5933
5914
s390_lgdr (code , s390_r13 , ins -> sreg1 );
5934
- s390_vlvgg (code , s390_vr16 , s390_r13 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5935
- s390_vrepg (code , ins -> dreg , s390_vr16 , 0 );
5915
+ s390_vlvgg (code , ins -> dreg , s390_r13 , 0 , GTMREG_TO_UINT32 (ins -> inst_c0 ));
5916
+ s390_vrepg (code , ins -> dreg , ins -> dreg , 0 );
5936
5917
break ;
5937
5918
case OP_S390_VPKH :
5938
5919
s390_vpkh ( code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
0 commit comments