@ -322,79 +322,6 @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
return true ;
}
static bool trans_VMINMAXNM ( DisasContext * s , arg_VMINMAXNM * a )
{
uint32_t rd , rn , rm ;
bool dp = a - > dp ;
bool vmin = a - > op ;
TCGv_ptr fpst ;
if ( ! dc_isar_feature ( aa32_vminmaxnm , s ) ) {
return false ;
}
if ( dp & & ! dc_isar_feature ( aa32_fpdp_v2 , s ) ) {
return false ;
}
/* UNDEF accesses to D16-D31 if they don't exist */
if ( dp & & ! dc_isar_feature ( aa32_simd_r32 , s ) & &
( ( a - > vm | a - > vn | a - > vd ) & 0x10 ) ) {
return false ;
}
rd = a - > vd ;
rn = a - > vn ;
rm = a - > vm ;
if ( ! vfp_access_check ( s ) ) {
return true ;
}
fpst = get_fpstatus_ptr ( 0 ) ;
if ( dp ) {
TCGv_i64 frn , frm , dest ;
frn = tcg_temp_new_i64 ( ) ;
frm = tcg_temp_new_i64 ( ) ;
dest = tcg_temp_new_i64 ( ) ;
neon_load_reg64 ( frn , rn ) ;
neon_load_reg64 ( frm , rm ) ;
if ( vmin ) {
gen_helper_vfp_minnumd ( dest , frn , frm , fpst ) ;
} else {
gen_helper_vfp_maxnumd ( dest , frn , frm , fpst ) ;
}
neon_store_reg64 ( dest , rd ) ;
tcg_temp_free_i64 ( frn ) ;
tcg_temp_free_i64 ( frm ) ;
tcg_temp_free_i64 ( dest ) ;
} else {
TCGv_i32 frn , frm , dest ;
frn = tcg_temp_new_i32 ( ) ;
frm = tcg_temp_new_i32 ( ) ;
dest = tcg_temp_new_i32 ( ) ;
neon_load_reg32 ( frn , rn ) ;
neon_load_reg32 ( frm , rm ) ;
if ( vmin ) {
gen_helper_vfp_minnums ( dest , frn , frm , fpst ) ;
} else {
gen_helper_vfp_maxnums ( dest , frn , frm , fpst ) ;
}
neon_store_reg32 ( dest , rd ) ;
tcg_temp_free_i32 ( frn ) ;
tcg_temp_free_i32 ( frm ) ;
tcg_temp_free_i32 ( dest ) ;
}
tcg_temp_free_ptr ( fpst ) ;
return true ;
}
/*
* Table for converting the most common AArch32 encoding of
* rounding mode to arm_fprounding order ( which matches the
@ -1784,6 +1711,42 @@ static bool trans_VDIV_dp(DisasContext *s, arg_VDIV_dp *a)
return do_vfp_3op_dp ( s , gen_helper_vfp_divd , a - > vd , a - > vn , a - > vm , false ) ;
}
static bool trans_VMINNM_sp ( DisasContext * s , arg_VMINNM_sp * a )
{
if ( ! dc_isar_feature ( aa32_vminmaxnm , s ) ) {
return false ;
}
return do_vfp_3op_sp ( s , gen_helper_vfp_minnums ,
a - > vd , a - > vn , a - > vm , false ) ;
}
static bool trans_VMAXNM_sp ( DisasContext * s , arg_VMAXNM_sp * a )
{
if ( ! dc_isar_feature ( aa32_vminmaxnm , s ) ) {
return false ;
}
return do_vfp_3op_sp ( s , gen_helper_vfp_maxnums ,
a - > vd , a - > vn , a - > vm , false ) ;
}
static bool trans_VMINNM_dp ( DisasContext * s , arg_VMINNM_dp * a )
{
if ( ! dc_isar_feature ( aa32_vminmaxnm , s ) ) {
return false ;
}
return do_vfp_3op_dp ( s , gen_helper_vfp_minnumd ,
a - > vd , a - > vn , a - > vm , false ) ;
}
static bool trans_VMAXNM_dp ( DisasContext * s , arg_VMAXNM_dp * a )
{
if ( ! dc_isar_feature ( aa32_vminmaxnm , s ) ) {
return false ;
}
return do_vfp_3op_dp ( s , gen_helper_vfp_maxnumd ,
a - > vd , a - > vn , a - > vm , false ) ;
}
static bool do_vfm_sp ( DisasContext * s , arg_VFMA_sp * a , bool neg_n , bool neg_d )
{
/*