@ -5592,6 +5592,18 @@ TRANS(SQRDMULH_v, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmulh_qc)
TRANS_FEAT ( SQRDMLAH_v , aa64_rdm , do_gvec_fn3_no8_no64 , a , gen_gvec_sqrdmlah_qc )
TRANS_FEAT ( SQRDMLSH_v , aa64_rdm , do_gvec_fn3_no8_no64 , a , gen_gvec_sqrdmlsh_qc )
static bool do_dot_vector ( DisasContext * s , arg_qrrr_e * a ,
gen_helper_gvec_4 * fn )
{
if ( fp_access_check ( s ) ) {
gen_gvec_op4_ool ( s , a - > q , a - > rd , a - > rn , a - > rm , a - > rd , 0 , fn ) ;
}
return true ;
}
TRANS_FEAT ( SDOT_v , aa64_dp , do_dot_vector , a , gen_helper_gvec_sdot_b )
TRANS_FEAT ( UDOT_v , aa64_dp , do_dot_vector , a , gen_helper_gvec_udot_b )
/*
* Advanced SIMD scalar / vector x indexed element
*/
@ -5914,6 +5926,18 @@ static gen_helper_gvec_4 * const f_vector_idx_sqrdmlsh[2] = {
TRANS_FEAT ( SQRDMLSH_vi , aa64_rdm , do_int3_qc_vector_idx , a ,
f_vector_idx_sqrdmlsh )
static bool do_dot_vector_idx ( DisasContext * s , arg_qrrx_e * a ,
gen_helper_gvec_4 * fn )
{
if ( fp_access_check ( s ) ) {
gen_gvec_op4_ool ( s , a - > q , a - > rd , a - > rn , a - > rm , a - > rd , a - > idx , fn ) ;
}
return true ;
}
TRANS_FEAT ( SDOT_vi , aa64_dp , do_dot_vector_idx , a , gen_helper_gvec_sdot_idx_b )
TRANS_FEAT ( UDOT_vi , aa64_dp , do_dot_vector_idx , a , gen_helper_gvec_udot_idx_b )
/*
* Advanced SIMD scalar pairwise
*/
@ -10890,14 +10914,6 @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
int rot ;
switch ( u * 16 + opcode ) {
case 0x02 : /* SDOT (vector) */
case 0x12 : /* UDOT (vector) */
if ( size ! = MO_32 ) {
unallocated_encoding ( s ) ;
return ;
}
feature = dc_isar_feature ( aa64_dp , s ) ;
break ;
case 0x03 : /* USDOT */
if ( size ! = MO_32 ) {
unallocated_encoding ( s ) ;
@ -10947,8 +10963,10 @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
}
break ;
default :
case 0x02 : /* SDOT (vector) */
case 0x10 : /* SQRDMLAH (vector) */
case 0x11 : /* SQRDMLSH (vector) */
case 0x12 : /* UDOT (vector) */
unallocated_encoding ( s ) ;
return ;
}
@ -10961,11 +10979,6 @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
}
switch ( opcode ) {
case 0x2 : /* SDOT / UDOT */
gen_gvec_op4_ool ( s , is_q , rd , rn , rm , rd , 0 ,
u ? gen_helper_gvec_udot_b : gen_helper_gvec_sdot_b ) ;
return ;
case 0x3 : /* USDOT */
gen_gvec_op4_ool ( s , is_q , rd , rn , rm , rd , 0 , gen_helper_gvec_usdot_b ) ;
return ;
@ -12043,13 +12056,6 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
case 0x0b : /* SQDMULL, SQDMULL2 */
is_long = true ;
break ;
case 0x0e : /* SDOT */
case 0x1e : /* UDOT */
if ( is_scalar | | size ! = MO_32 | | ! dc_isar_feature ( aa64_dp , s ) ) {
unallocated_encoding ( s ) ;
return ;
}
break ;
case 0x0f :
switch ( size ) {
case 0 : /* SUDOT */
@ -12099,12 +12105,14 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
case 0x09 : /* FMUL */
case 0x0c : /* SQDMULH */
case 0x0d : /* SQRDMULH */
case 0x0e : /* SDOT */
case 0x10 : /* MLA */
case 0x14 : /* MLS */
case 0x18 : /* FMLAL2 */
case 0x19 : /* FMULX */
case 0x1c : /* FMLSL2 */
case 0x1d : /* SQRDMLAH */
case 0x1e : /* UDOT */
case 0x1f : /* SQRDMLSH */
unallocated_encoding ( s ) ;
return ;
@ -12180,12 +12188,6 @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
}
switch ( 16 * u + opcode ) {
case 0x0e : /* SDOT */
case 0x1e : /* UDOT */
gen_gvec_op4_ool ( s , is_q , rd , rn , rm , rd , index ,
u ? gen_helper_gvec_udot_idx_b
: gen_helper_gvec_sdot_idx_b ) ;
return ;
case 0x0f :
switch ( extract32 ( insn , 22 , 2 ) ) {
case 0 : /* SUDOT */