@ -1547,3 +1547,78 @@ static gen_helper_gvec_3 * const uzp2_fns[] = {
gen_helper_sme2_uzp2_q ,
} ;
TRANS_FEAT ( UZP_2 , aa64_sme2 , do_zipuzp_2 , a , uzp2_fns )
static bool trans_FCLAMP ( DisasContext * s , arg_zzz_en * a )
{
static gen_helper_gvec_3_ptr * const fn [ ] = {
gen_helper_sme2_bfclamp ,
gen_helper_sme2_fclamp_h ,
gen_helper_sme2_fclamp_s ,
gen_helper_sme2_fclamp_d ,
} ;
TCGv_ptr fpst ;
int vl ;
if ( ! dc_isar_feature ( aa64_sme2 , s ) ) {
return false ;
}
/* This insn uses MO_8 to encode BFloat16. */
if ( a - > esz = = MO_8 & & ! dc_isar_feature ( aa64_sme_b16b16 , s ) ) {
return false ;
}
if ( ! sme_sm_enabled_check ( s ) ) {
return true ;
}
fpst = fpstatus_ptr ( a - > esz = = MO_16 ? FPST_A64_F16 : FPST_A64 ) ;
vl = vec_full_reg_size ( s ) ;
tcg_gen_gvec_3_ptr ( vec_full_reg_offset ( s , a - > zd ) ,
vec_full_reg_offset ( s , a - > zn ) ,
vec_full_reg_offset ( s , a - > zm ) ,
fpst , vl , vl , a - > n , fn [ a - > esz ] ) ;
return true ;
}
static bool do_clamp ( DisasContext * s , arg_zzz_en * a ,
gen_helper_gvec_3 * const fn [ 4 ] )
{
int vl ;
if ( ! dc_isar_feature ( aa64_sme2 , s ) ) {
return false ;
}
if ( ! sme_sm_enabled_check ( s ) ) {
return true ;
}
/*
* Clamp is just a min + max , easily supported by most host
* vector operations - - we already have such an expansion in
* translate - sve . c for a single output .
* TODO : Add support in gvec for multiple simultaneous output ,
* and / or copy to temporary upon overlap .
*/
vl = vec_full_reg_size ( s ) ;
tcg_gen_gvec_3_ool ( vec_full_reg_offset ( s , a - > zd ) ,
vec_full_reg_offset ( s , a - > zn ) ,
vec_full_reg_offset ( s , a - > zm ) ,
vl , vl , a - > n , fn [ a - > esz ] ) ;
return true ;
}
static gen_helper_gvec_3 * const sclamp_fns [ ] = {
gen_helper_sme2_sclamp_b ,
gen_helper_sme2_sclamp_h ,
gen_helper_sme2_sclamp_s ,
gen_helper_sme2_sclamp_d ,
} ;
TRANS ( SCLAMP , do_clamp , a , sclamp_fns )
static gen_helper_gvec_3 * const uclamp_fns [ ] = {
gen_helper_sme2_uclamp_b ,
gen_helper_sme2_uclamp_h ,
gen_helper_sme2_uclamp_s ,
gen_helper_sme2_uclamp_d ,
} ;
TRANS ( UCLAMP , do_clamp , a , uclamp_fns )