@ -962,3 +962,88 @@ static bool do_vdot(DisasContext *s, arg_azx_n *a, gen_helper_gvec_4_ptr *fn)
TRANS_FEAT ( FVDOT , aa64_sme , do_vdot , a , gen_helper_sme2_fvdot_idx_h )
TRANS_FEAT ( BFVDOT , aa64_sme , do_vdot , a , gen_helper_sme2_bfvdot_idx )
/*
* Expand array multi - vector single ( n1 ) , array multi - vector ( nn ) ,
* and array multi - vector indexed ( nx ) , for integer accumulate .
* multi : true for nn , false for n1 .
* data : stuff for simd_data , including any index .
*/
static bool do_azz_acc ( DisasContext * s , int nreg , int nsel ,
int rv , int off , int zn , int zm ,
int data , int shsel , bool multi ,
gen_helper_gvec_4 * fn )
{
if ( sme_smza_enabled_check ( s ) ) {
int svl = streaming_vec_reg_size ( s ) ;
int vstride = svl / nreg ;
TCGv_ptr t_za = get_zarray ( s , rv , off , nreg , nsel ) ;
TCGv_ptr t = tcg_temp_new_ptr ( ) ;
for ( int r = 0 ; r < nreg ; + + r ) {
TCGv_ptr t_zn = vec_full_reg_ptr ( s , zn ) ;
TCGv_ptr t_zm = vec_full_reg_ptr ( s , zm ) ;
for ( int i = 0 ; i < nsel ; + + i ) {
int o_za = ( r * vstride + i ) * sizeof ( ARMVectorReg ) ;
int desc = simd_desc ( svl , svl , data | ( i < < shsel ) ) ;
tcg_gen_addi_ptr ( t , t_za , o_za ) ;
fn ( t , t_zn , t_zm , t , tcg_constant_i32 ( desc ) ) ;
}
/*
* For multiple - and - single vectors , Zn may wrap .
* For multiple vectors , both Zn and Zm are aligned .
*/
zn = ( zn + 1 ) % 32 ;
zm + = multi ;
}
}
return true ;
}
static bool do_dot ( DisasContext * s , arg_azz_n * a , bool multi ,
gen_helper_gvec_4 * fn )
{
return do_azz_acc ( s , a - > n , 1 , a - > rv , a - > off , a - > zn , a - > zm ,
0 , 0 , multi , fn ) ;
}
static void gen_helper_gvec_sudot_4b ( TCGv_ptr d , TCGv_ptr n , TCGv_ptr m ,
TCGv_ptr a , TCGv_i32 desc )
{
gen_helper_gvec_usdot_4b ( d , m , n , a , desc ) ;
}
TRANS_FEAT ( USDOT_n1 , aa64_sme2 , do_dot , a , false , gen_helper_gvec_usdot_4b )
TRANS_FEAT ( SUDOT_n1 , aa64_sme2 , do_dot , a , false , gen_helper_gvec_sudot_4b )
TRANS_FEAT ( SDOT_n1_2h , aa64_sme2 , do_dot , a , false , gen_helper_gvec_sdot_2h )
TRANS_FEAT ( UDOT_n1_2h , aa64_sme2 , do_dot , a , false , gen_helper_gvec_udot_2h )
TRANS_FEAT ( SDOT_n1_4b , aa64_sme2 , do_dot , a , false , gen_helper_gvec_sdot_4b )
TRANS_FEAT ( UDOT_n1_4b , aa64_sme2 , do_dot , a , false , gen_helper_gvec_udot_4b )
TRANS_FEAT ( SDOT_n1_4h , aa64_sme2_i16i64 , do_dot , a , false , gen_helper_gvec_sdot_4h )
TRANS_FEAT ( UDOT_n1_4h , aa64_sme2_i16i64 , do_dot , a , false , gen_helper_gvec_udot_4h )
TRANS_FEAT ( USDOT_nn , aa64_sme2 , do_dot , a , true , gen_helper_gvec_usdot_4b )
TRANS_FEAT ( SDOT_nn_2h , aa64_sme2 , do_dot , a , true , gen_helper_gvec_sdot_2h )
TRANS_FEAT ( UDOT_nn_2h , aa64_sme2 , do_dot , a , true , gen_helper_gvec_udot_2h )
TRANS_FEAT ( SDOT_nn_4b , aa64_sme2 , do_dot , a , true , gen_helper_gvec_sdot_4b )
TRANS_FEAT ( UDOT_nn_4b , aa64_sme2 , do_dot , a , true , gen_helper_gvec_udot_4b )
TRANS_FEAT ( SDOT_nn_4h , aa64_sme2_i16i64 , do_dot , a , true , gen_helper_gvec_sdot_4h )
TRANS_FEAT ( UDOT_nn_4h , aa64_sme2_i16i64 , do_dot , a , true , gen_helper_gvec_udot_4h )
static bool do_dot_nx ( DisasContext * s , arg_azx_n * a , gen_helper_gvec_4 * fn )
{
return do_azz_acc ( s , a - > n , 1 , a - > rv , a - > off , a - > zn , a - > zm ,
a - > idx , 0 , false , fn ) ;
}
TRANS_FEAT ( USDOT_nx , aa64_sme2 , do_dot_nx , a , gen_helper_gvec_usdot_idx_4b )
TRANS_FEAT ( SUDOT_nx , aa64_sme2 , do_dot_nx , a , gen_helper_gvec_sudot_idx_4b )
TRANS_FEAT ( SDOT_nx_2h , aa64_sme2 , do_dot_nx , a , gen_helper_gvec_sdot_idx_2h )
TRANS_FEAT ( UDOT_nx_2h , aa64_sme2 , do_dot_nx , a , gen_helper_gvec_udot_idx_2h )
TRANS_FEAT ( SDOT_nx_4b , aa64_sme2 , do_dot_nx , a , gen_helper_gvec_sdot_idx_4b )
TRANS_FEAT ( UDOT_nx_4b , aa64_sme2 , do_dot_nx , a , gen_helper_gvec_udot_idx_4b )
TRANS_FEAT ( SDOT_nx_4h , aa64_sme2_i16i64 , do_dot_nx , a , gen_helper_gvec_sdot_idx_4h )
TRANS_FEAT ( UDOT_nx_4h , aa64_sme2_i16i64 , do_dot_nx , a , gen_helper_gvec_udot_idx_4h )