Lines Matching refs:a

1324 static bool do_gvec_op2_ool(DisasContext *s, arg_qrr_e *a, int data,  in do_gvec_op2_ool()  argument
1327 if (!a->q && a->esz == MO_64) { in do_gvec_op2_ool()
1331 gen_gvec_op2_ool(s, a->q, a->rd, a->rn, data, fn); in do_gvec_op2_ool()
1336 static bool do_gvec_op3_ool(DisasContext *s, arg_qrrr_e *a, int data, in do_gvec_op3_ool() argument
1339 if (!a->q && a->esz == MO_64) { in do_gvec_op3_ool()
1343 gen_gvec_op3_ool(s, a->q, a->rd, a->rn, a->rm, data, fn); in do_gvec_op3_ool()
1348 static bool do_gvec_fn3(DisasContext *s, arg_qrrr_e *a, GVecGen3Fn *fn) in do_gvec_fn3() argument
1350 if (!a->q && a->esz == MO_64) { in do_gvec_fn3()
1354 gen_gvec_fn3(s, a->q, a->rd, a->rn, a->rm, fn, a->esz); in do_gvec_fn3()
1359 static bool do_gvec_fn3_no64(DisasContext *s, arg_qrrr_e *a, GVecGen3Fn *fn) in do_gvec_fn3_no64() argument
1361 if (a->esz == MO_64) { in do_gvec_fn3_no64()
1365 gen_gvec_fn3(s, a->q, a->rd, a->rn, a->rm, fn, a->esz); in do_gvec_fn3_no64()
1370 static bool do_gvec_fn3_no8_no64(DisasContext *s, arg_qrrr_e *a, GVecGen3Fn *fn) in do_gvec_fn3_no8_no64() argument
1372 if (a->esz == MO_8) { in do_gvec_fn3_no8_no64()
1375 return do_gvec_fn3_no64(s, a, fn); in do_gvec_fn3_no8_no64()
1378 static bool do_gvec_fn4(DisasContext *s, arg_qrrrr_e *a, GVecGen4Fn *fn) in do_gvec_fn4() argument
1380 if (!a->q && a->esz == MO_64) { in do_gvec_fn4()
1384 gen_gvec_fn4(s, a->q, a->rd, a->rn, a->rm, a->ra, fn, a->esz); in do_gvec_fn4()
1450 static bool trans_B(DisasContext *s, arg_i *a) in trans_B() argument
1453 gen_goto_tb(s, 0, a->imm); in trans_B()
1457 static bool trans_BL(DisasContext *s, arg_i *a) in trans_BL() argument
1461 gen_goto_tb(s, 0, a->imm); in trans_BL()
1466 static bool trans_CBZ(DisasContext *s, arg_cbz *a) in trans_CBZ() argument
1471 tcg_cmp = read_cpu_reg(s, a->rt, a->sf); in trans_CBZ()
1475 tcg_gen_brcondi_i64(a->nz ? TCG_COND_NE : TCG_COND_EQ, in trans_CBZ()
1479 gen_goto_tb(s, 1, a->imm); in trans_CBZ()
1483 static bool trans_TBZ(DisasContext *s, arg_tbz *a) in trans_TBZ() argument
1489 tcg_gen_andi_i64(tcg_cmp, cpu_reg(s, a->rt), 1ULL << a->bitpos); in trans_TBZ()
1494 tcg_gen_brcondi_i64(a->nz ? TCG_COND_NE : TCG_COND_EQ, in trans_TBZ()
1498 gen_goto_tb(s, 1, a->imm); in trans_TBZ()
1502 static bool trans_B_cond(DisasContext *s, arg_B_cond *a) in trans_B_cond() argument
1505 if (a->c && !dc_isar_feature(aa64_hbc, s)) { in trans_B_cond()
1509 if (a->cond < 0x0e) { in trans_B_cond()
1512 arm_gen_test_cc(a->cond, match.label); in trans_B_cond()
1515 gen_goto_tb(s, 1, a->imm); in trans_B_cond()
1518 gen_goto_tb(s, 0, a->imm); in trans_B_cond()
1546 static bool trans_BR(DisasContext *s, arg_r *a) in trans_BR() argument
1548 set_btype_for_br(s, a->rn); in trans_BR()
1549 gen_a64_set_pc(s, cpu_reg(s, a->rn)); in trans_BR()
1554 static bool trans_BLR(DisasContext *s, arg_r *a) in trans_BLR() argument
1556 TCGv_i64 dst = cpu_reg(s, a->rn); in trans_BLR()
1570 static bool trans_RET(DisasContext *s, arg_r *a) in trans_RET() argument
1572 gen_a64_set_pc(s, cpu_reg(s, a->rn)); in trans_RET()
1599 static bool trans_BRAZ(DisasContext *s, arg_braz *a) in trans_BRAZ() argument
1607 dst = auth_branch_target(s, cpu_reg(s, a->rn), tcg_constant_i64(0), !a->m); in trans_BRAZ()
1608 set_btype_for_br(s, a->rn); in trans_BRAZ()
1614 static bool trans_BLRAZ(DisasContext *s, arg_braz *a) in trans_BLRAZ() argument
1622 dst = auth_branch_target(s, cpu_reg(s, a->rn), tcg_constant_i64(0), !a->m); in trans_BLRAZ()
1636 static bool trans_RETA(DisasContext *s, arg_reta *a) in trans_RETA() argument
1640 dst = auth_branch_target(s, cpu_reg(s, 30), cpu_X[31], !a->m); in trans_RETA()
1646 static bool trans_BRA(DisasContext *s, arg_bra *a) in trans_BRA() argument
1653 dst = auth_branch_target(s, cpu_reg(s,a->rn), cpu_reg_sp(s, a->rm), !a->m); in trans_BRA()
1655 set_btype_for_br(s, a->rn); in trans_BRA()
1660 static bool trans_BLRA(DisasContext *s, arg_bra *a) in trans_BLRA() argument
1667 dst = auth_branch_target(s, cpu_reg(s, a->rn), cpu_reg_sp(s, a->rm), !a->m); in trans_BLRA()
1681 static bool trans_ERET(DisasContext *s, arg_ERET *a) in trans_ERET() argument
1704 static bool trans_ERETA(DisasContext *s, arg_reta *a) in trans_ERETA() argument
1716 gen_exception_insn_el(s, 0, EXCP_UDEF, syn_erettrap(a->m ? 3 : 2), 2); in trans_ERETA()
1723 dst = auth_branch_target(s, dst, cpu_X[31], !a->m); in trans_ERETA()
1733 static bool trans_NOP(DisasContext *s, arg_NOP *a) in trans_NOP() argument
1738 static bool trans_YIELD(DisasContext *s, arg_YIELD *a) in trans_YIELD() argument
1752 static bool trans_WFI(DisasContext *s, arg_WFI *a) in trans_WFI() argument
1758 static bool trans_WFE(DisasContext *s, arg_WFI *a) in trans_WFE() argument
1772 static bool trans_WFIT(DisasContext *s, arg_WFIT *a) in trans_WFIT() argument
1790 gen_helper_wfit(tcg_env, cpu_reg(s, a->rd)); in trans_WFIT()
1796 static bool trans_WFET(DisasContext *s, arg_WFET *a) in trans_WFET() argument
1813 static bool trans_XPACLRI(DisasContext *s, arg_XPACLRI *a) in trans_XPACLRI() argument
1821 static bool trans_PACIA1716(DisasContext *s, arg_PACIA1716 *a) in trans_PACIA1716() argument
1829 static bool trans_PACIB1716(DisasContext *s, arg_PACIB1716 *a) in trans_PACIB1716() argument
1837 static bool trans_AUTIA1716(DisasContext *s, arg_AUTIA1716 *a) in trans_AUTIA1716() argument
1845 static bool trans_AUTIB1716(DisasContext *s, arg_AUTIB1716 *a) in trans_AUTIB1716() argument
1853 static bool trans_ESB(DisasContext *s, arg_ESB *a) in trans_ESB() argument
1873 static bool trans_PACIAZ(DisasContext *s, arg_PACIAZ *a) in trans_PACIAZ() argument
1881 static bool trans_PACIASP(DisasContext *s, arg_PACIASP *a) in trans_PACIASP() argument
1889 static bool trans_PACIBZ(DisasContext *s, arg_PACIBZ *a) in trans_PACIBZ() argument
1897 static bool trans_PACIBSP(DisasContext *s, arg_PACIBSP *a) in trans_PACIBSP() argument
1905 static bool trans_AUTIAZ(DisasContext *s, arg_AUTIAZ *a) in trans_AUTIAZ() argument
1913 static bool trans_AUTIASP(DisasContext *s, arg_AUTIASP *a) in trans_AUTIASP() argument
1921 static bool trans_AUTIBZ(DisasContext *s, arg_AUTIBZ *a) in trans_AUTIBZ() argument
1929 static bool trans_AUTIBSP(DisasContext *s, arg_AUTIBSP *a) in trans_AUTIBSP() argument
1937 static bool trans_CLREX(DisasContext *s, arg_CLREX *a) in trans_CLREX() argument
1943 static bool trans_DSB_DMB(DisasContext *s, arg_DSB_DMB *a) in trans_DSB_DMB() argument
1948 switch (a->types) { in trans_DSB_DMB()
1963 static bool trans_ISB(DisasContext *s, arg_ISB *a) in trans_ISB() argument
1975 static bool trans_SB(DisasContext *s, arg_SB *a) in trans_SB() argument
1989 static bool trans_CFINV(DisasContext *s, arg_CFINV *a) in trans_CFINV() argument
1998 static bool trans_XAFLAG(DisasContext *s, arg_XAFLAG *a) in trans_XAFLAG() argument
2034 static bool trans_AXFLAG(DisasContext *s, arg_AXFLAG *a) in trans_AXFLAG() argument
2052 static bool trans_MSR_i_UAO(DisasContext *s, arg_i *a) in trans_MSR_i_UAO() argument
2057 if (a->imm & 1) { in trans_MSR_i_UAO()
2067 static bool trans_MSR_i_PAN(DisasContext *s, arg_i *a) in trans_MSR_i_PAN() argument
2072 if (a->imm & 1) { in trans_MSR_i_PAN()
2082 static bool trans_MSR_i_SPSEL(DisasContext *s, arg_i *a) in trans_MSR_i_SPSEL() argument
2087 gen_helper_msr_i_spsel(tcg_env, tcg_constant_i32(a->imm & PSTATE_SP)); in trans_MSR_i_SPSEL()
2092 static bool trans_MSR_i_SBSS(DisasContext *s, arg_i *a) in trans_MSR_i_SBSS() argument
2097 if (a->imm & 1) { in trans_MSR_i_SBSS()
2107 static bool trans_MSR_i_DIT(DisasContext *s, arg_i *a) in trans_MSR_i_DIT() argument
2112 if (a->imm & 1) { in trans_MSR_i_DIT()
2122 static bool trans_MSR_i_TCO(DisasContext *s, arg_i *a) in trans_MSR_i_TCO() argument
2126 if (a->imm & 1) { in trans_MSR_i_TCO()
2144 static bool trans_MSR_i_DAIFSET(DisasContext *s, arg_i *a) in trans_MSR_i_DAIFSET() argument
2146 gen_helper_msr_i_daifset(tcg_env, tcg_constant_i32(a->imm)); in trans_MSR_i_DAIFSET()
2151 static bool trans_MSR_i_DAIFCLEAR(DisasContext *s, arg_i *a) in trans_MSR_i_DAIFCLEAR() argument
2153 gen_helper_msr_i_daifclear(tcg_env, tcg_constant_i32(a->imm)); in trans_MSR_i_DAIFCLEAR()
2159 static bool trans_MSR_i_ALLINT(DisasContext *s, arg_i *a) in trans_MSR_i_ALLINT() argument
2165 if (a->imm == 0) { in trans_MSR_i_ALLINT()
2178 static bool trans_MSR_i_SVCR(DisasContext *s, arg_MSR_i_SVCR *a) in trans_MSR_i_SVCR() argument
2180 if (!dc_isar_feature(aa64_sme, s) || a->mask == 0) { in trans_MSR_i_SVCR()
2185 int new = a->imm * 3; in trans_MSR_i_SVCR()
2187 if ((old ^ new) & a->mask) { in trans_MSR_i_SVCR()
2190 tcg_constant_i32(a->mask)); in trans_MSR_i_SVCR()
2589 static bool trans_SYS(DisasContext *s, arg_SYS *a) in trans_SYS() argument
2591 handle_sys(s, a->l, a->op0, a->op1, a->op2, a->crn, a->crm, a->rt); in trans_SYS()
2595 static bool trans_SVC(DisasContext *s, arg_i *a) in trans_SVC() argument
2603 uint32_t syndrome = syn_aa64_svc(a->imm); in trans_SVC()
2613 static bool trans_HVC(DisasContext *s, arg_i *a) in trans_HVC() argument
2629 gen_exception_insn_el(s, 4, EXCP_HVC, syn_aa64_hvc(a->imm), target_el); in trans_HVC()
2633 static bool trans_SMC(DisasContext *s, arg_i *a) in trans_SMC() argument
2640 gen_helper_pre_smc(tcg_env, tcg_constant_i32(syn_aa64_smc(a->imm))); in trans_SMC()
2643 gen_exception_insn_el(s, 4, EXCP_SMC, syn_aa64_smc(a->imm), 3); in trans_SMC()
2647 static bool trans_BRK(DisasContext *s, arg_i *a) in trans_BRK() argument
2649 gen_exception_bkpt_insn(s, syn_aa64_bkpt(a->imm)); in trans_BRK()
2653 static bool trans_HLT(DisasContext *s, arg_i *a) in trans_HLT() argument
2662 if (semihosting_enabled(s->current_el == 0) && a->imm == 0xf000) { in trans_HLT()
2799 TCGv_i64 a, b; in gen_store_exclusive() local
2814 a = tcg_temp_new_i64(); in gen_store_exclusive()
2817 tcg_gen_extr_i128_i64(a, b, t16); in gen_store_exclusive()
2819 tcg_gen_extr_i128_i64(b, a, t16); in gen_store_exclusive()
2822 tcg_gen_xor_i64(a, a, cpu_exclusive_val); in gen_store_exclusive()
2824 tcg_gen_or_i64(tmp, a, b); in gen_store_exclusive()
2942 static bool trans_STXR(DisasContext *s, arg_stxr *a) in trans_STXR() argument
2944 if (a->rn == 31) { in trans_STXR()
2947 if (a->lasr) { in trans_STXR()
2950 gen_store_exclusive(s, a->rs, a->rt, a->rt2, a->rn, a->sz, false); in trans_STXR()
2954 static bool trans_LDXR(DisasContext *s, arg_stxr *a) in trans_LDXR() argument
2956 if (a->rn == 31) { in trans_LDXR()
2959 gen_load_exclusive(s, a->rt, a->rt2, a->rn, a->sz, false); in trans_LDXR()
2960 if (a->lasr) { in trans_LDXR()
2966 static bool trans_STLR(DisasContext *s, arg_stlr *a) in trans_STLR() argument
2970 bool iss_sf = ldst_iss_sf(a->sz, false, false); in trans_STLR()
2976 if (!a->lasr && !dc_isar_feature(aa64_lor, s)) { in trans_STLR()
2980 if (a->rn == 31) { in trans_STLR()
2984 memop = check_ordered_align(s, a->rn, 0, true, a->sz); in trans_STLR()
2985 clean_addr = gen_mte_check1(s, cpu_reg_sp(s, a->rn), in trans_STLR()
2986 true, a->rn != 31, memop); in trans_STLR()
2987 do_gpr_st(s, cpu_reg(s, a->rt), clean_addr, memop, true, a->rt, in trans_STLR()
2988 iss_sf, a->lasr); in trans_STLR()
2992 static bool trans_LDAR(DisasContext *s, arg_stlr *a) in trans_LDAR() argument
2996 bool iss_sf = ldst_iss_sf(a->sz, false, false); in trans_LDAR()
2999 if (!a->lasr && !dc_isar_feature(aa64_lor, s)) { in trans_LDAR()
3003 if (a->rn == 31) { in trans_LDAR()
3006 memop = check_ordered_align(s, a->rn, 0, false, a->sz); in trans_LDAR()
3007 clean_addr = gen_mte_check1(s, cpu_reg_sp(s, a->rn), in trans_LDAR()
3008 false, a->rn != 31, memop); in trans_LDAR()
3009 do_gpr_ld(s, cpu_reg(s, a->rt), clean_addr, memop, false, true, in trans_LDAR()
3010 a->rt, iss_sf, a->lasr); in trans_LDAR()
3015 static bool trans_STXP(DisasContext *s, arg_stxr *a) in trans_STXP() argument
3017 if (a->rn == 31) { in trans_STXP()
3020 if (a->lasr) { in trans_STXP()
3023 gen_store_exclusive(s, a->rs, a->rt, a->rt2, a->rn, a->sz, true); in trans_STXP()
3027 static bool trans_LDXP(DisasContext *s, arg_stxr *a) in trans_LDXP() argument
3029 if (a->rn == 31) { in trans_LDXP()
3032 gen_load_exclusive(s, a->rt, a->rt2, a->rn, a->sz, true); in trans_LDXP()
3033 if (a->lasr) { in trans_LDXP()
3039 static bool trans_CASP(DisasContext *s, arg_CASP *a) in trans_CASP() argument
3044 if (((a->rt | a->rs) & 1) != 0) { in trans_CASP()
3048 gen_compare_and_swap_pair(s, a->rs, a->rt, a->rn, a->sz); in trans_CASP()
3052 static bool trans_CAS(DisasContext *s, arg_CAS *a) in trans_CAS() argument
3057 gen_compare_and_swap(s, a->rs, a->rt, a->rn, a->sz); in trans_CAS()
3061 static bool trans_LD_lit(DisasContext *s, arg_ldlit *a) in trans_LD_lit() argument
3063 bool iss_sf = ldst_iss_sf(a->sz, a->sign, false); in trans_LD_lit()
3064 TCGv_i64 tcg_rt = cpu_reg(s, a->rt); in trans_LD_lit()
3066 MemOp memop = finalize_memop(s, a->sz + a->sign * MO_SIGN); in trans_LD_lit()
3068 gen_pc_plus_diff(s, clean_addr, a->imm); in trans_LD_lit()
3070 false, true, a->rt, iss_sf, false); in trans_LD_lit()
3074 static bool trans_LD_lit_v(DisasContext *s, arg_ldlit *a) in trans_LD_lit_v() argument
3083 memop = finalize_memop_asimd(s, a->sz); in trans_LD_lit_v()
3085 gen_pc_plus_diff(s, clean_addr, a->imm); in trans_LD_lit_v()
3086 do_fp_ld(s, a->rt, clean_addr, memop); in trans_LD_lit_v()
3090 static void op_addr_ldstpair_pre(DisasContext *s, arg_ldstpair *a, in op_addr_ldstpair_pre() argument
3094 if (a->rn == 31) { in op_addr_ldstpair_pre()
3098 *dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in op_addr_ldstpair_pre()
3099 if (!a->p) { in op_addr_ldstpair_pre()
3104 (a->w || a->rn != 31), 2 << a->sz, mop); in op_addr_ldstpair_pre()
3107 static void op_addr_ldstpair_post(DisasContext *s, arg_ldstpair *a, in op_addr_ldstpair_post() argument
3110 if (a->w) { in op_addr_ldstpair_post()
3111 if (a->p) { in op_addr_ldstpair_post()
3114 tcg_gen_mov_i64(cpu_reg_sp(s, a->rn), dirty_addr); in op_addr_ldstpair_post()
3118 static bool trans_STP(DisasContext *s, arg_ldstpair *a) in trans_STP() argument
3120 uint64_t offset = a->imm << a->sz; in trans_STP()
3122 MemOp mop = finalize_memop(s, a->sz); in trans_STP()
3124 op_addr_ldstpair_pre(s, a, &clean_addr, &dirty_addr, offset, true, mop); in trans_STP()
3125 tcg_rt = cpu_reg(s, a->rt); in trans_STP()
3126 tcg_rt2 = cpu_reg(s, a->rt2); in trans_STP()
3137 mop = a->sz + 1; in trans_STP()
3139 mop |= (a->sz == 2 ? MO_ALIGN_4 : MO_ALIGN_8); in trans_STP()
3142 if (a->sz == 2) { in trans_STP()
3161 op_addr_ldstpair_post(s, a, dirty_addr, offset); in trans_STP()
3165 static bool trans_LDP(DisasContext *s, arg_ldstpair *a) in trans_LDP() argument
3167 uint64_t offset = a->imm << a->sz; in trans_LDP()
3169 MemOp mop = finalize_memop(s, a->sz); in trans_LDP()
3171 op_addr_ldstpair_pre(s, a, &clean_addr, &dirty_addr, offset, false, mop); in trans_LDP()
3172 tcg_rt = cpu_reg(s, a->rt); in trans_LDP()
3173 tcg_rt2 = cpu_reg(s, a->rt2); in trans_LDP()
3188 mop = a->sz + 1; in trans_LDP()
3190 mop |= (a->sz == 2 ? MO_ALIGN_4 : MO_ALIGN_8); in trans_LDP()
3193 if (a->sz == 2) { in trans_LDP()
3198 if (a->sign) { in trans_LDP()
3215 op_addr_ldstpair_post(s, a, dirty_addr, offset); in trans_LDP()
3219 static bool trans_STP_v(DisasContext *s, arg_ldstpair *a) in trans_STP_v() argument
3221 uint64_t offset = a->imm << a->sz; in trans_STP_v()
3230 mop = finalize_memop_asimd(s, a->sz); in trans_STP_v()
3231 op_addr_ldstpair_pre(s, a, &clean_addr, &dirty_addr, offset, true, mop); in trans_STP_v()
3232 do_fp_st(s, a->rt, clean_addr, mop); in trans_STP_v()
3233 tcg_gen_addi_i64(clean_addr, clean_addr, 1 << a->sz); in trans_STP_v()
3234 do_fp_st(s, a->rt2, clean_addr, mop); in trans_STP_v()
3235 op_addr_ldstpair_post(s, a, dirty_addr, offset); in trans_STP_v()
3239 static bool trans_LDP_v(DisasContext *s, arg_ldstpair *a) in trans_LDP_v() argument
3241 uint64_t offset = a->imm << a->sz; in trans_LDP_v()
3250 mop = finalize_memop_asimd(s, a->sz); in trans_LDP_v()
3251 op_addr_ldstpair_pre(s, a, &clean_addr, &dirty_addr, offset, false, mop); in trans_LDP_v()
3252 do_fp_ld(s, a->rt, clean_addr, mop); in trans_LDP_v()
3253 tcg_gen_addi_i64(clean_addr, clean_addr, 1 << a->sz); in trans_LDP_v()
3254 do_fp_ld(s, a->rt2, clean_addr, mop); in trans_LDP_v()
3255 op_addr_ldstpair_post(s, a, dirty_addr, offset); in trans_LDP_v()
3259 static bool trans_STGP(DisasContext *s, arg_ldstpair *a) in trans_STGP() argument
3262 uint64_t offset = a->imm << LOG2_TAG_GRANULE; in trans_STGP()
3267 tcg_debug_assert(a->sz == MO_64); in trans_STGP()
3273 if (a->rn == 31) { in trans_STGP()
3277 dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in trans_STGP()
3278 if (!a->p) { in trans_STGP()
3283 tcg_rt = cpu_reg(s, a->rt); in trans_STGP()
3284 tcg_rt2 = cpu_reg(s, a->rt2); in trans_STGP()
3311 op_addr_ldstpair_post(s, a, dirty_addr, offset); in trans_STGP()
3315 static void op_addr_ldst_imm_pre(DisasContext *s, arg_ldst_imm *a, in op_addr_ldst_imm_pre() argument
3321 if (a->rn == 31) { in op_addr_ldst_imm_pre()
3325 *dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in op_addr_ldst_imm_pre()
3326 if (!a->p) { in op_addr_ldst_imm_pre()
3329 memidx = get_a64_user_mem_index(s, a->unpriv); in op_addr_ldst_imm_pre()
3331 a->w || a->rn != 31, in op_addr_ldst_imm_pre()
3332 mop, a->unpriv, memidx); in op_addr_ldst_imm_pre()
3335 static void op_addr_ldst_imm_post(DisasContext *s, arg_ldst_imm *a, in op_addr_ldst_imm_post() argument
3338 if (a->w) { in op_addr_ldst_imm_post()
3339 if (a->p) { in op_addr_ldst_imm_post()
3342 tcg_gen_mov_i64(cpu_reg_sp(s, a->rn), dirty_addr); in op_addr_ldst_imm_post()
3346 static bool trans_STR_i(DisasContext *s, arg_ldst_imm *a) in trans_STR_i() argument
3348 bool iss_sf, iss_valid = !a->w; in trans_STR_i()
3350 int memidx = get_a64_user_mem_index(s, a->unpriv); in trans_STR_i()
3351 MemOp mop = finalize_memop(s, a->sz + a->sign * MO_SIGN); in trans_STR_i()
3353 op_addr_ldst_imm_pre(s, a, &clean_addr, &dirty_addr, a->imm, true, mop); in trans_STR_i()
3355 tcg_rt = cpu_reg(s, a->rt); in trans_STR_i()
3356 iss_sf = ldst_iss_sf(a->sz, a->sign, a->ext); in trans_STR_i()
3359 iss_valid, a->rt, iss_sf, false); in trans_STR_i()
3360 op_addr_ldst_imm_post(s, a, dirty_addr, a->imm); in trans_STR_i()
3364 static bool trans_LDR_i(DisasContext *s, arg_ldst_imm *a) in trans_LDR_i() argument
3366 bool iss_sf, iss_valid = !a->w; in trans_LDR_i()
3368 int memidx = get_a64_user_mem_index(s, a->unpriv); in trans_LDR_i()
3369 MemOp mop = finalize_memop(s, a->sz + a->sign * MO_SIGN); in trans_LDR_i()
3371 op_addr_ldst_imm_pre(s, a, &clean_addr, &dirty_addr, a->imm, false, mop); in trans_LDR_i()
3373 tcg_rt = cpu_reg(s, a->rt); in trans_LDR_i()
3374 iss_sf = ldst_iss_sf(a->sz, a->sign, a->ext); in trans_LDR_i()
3377 a->ext, memidx, iss_valid, a->rt, iss_sf, false); in trans_LDR_i()
3378 op_addr_ldst_imm_post(s, a, dirty_addr, a->imm); in trans_LDR_i()
3382 static bool trans_STR_v_i(DisasContext *s, arg_ldst_imm *a) in trans_STR_v_i() argument
3390 mop = finalize_memop_asimd(s, a->sz); in trans_STR_v_i()
3391 op_addr_ldst_imm_pre(s, a, &clean_addr, &dirty_addr, a->imm, true, mop); in trans_STR_v_i()
3392 do_fp_st(s, a->rt, clean_addr, mop); in trans_STR_v_i()
3393 op_addr_ldst_imm_post(s, a, dirty_addr, a->imm); in trans_STR_v_i()
3397 static bool trans_LDR_v_i(DisasContext *s, arg_ldst_imm *a) in trans_LDR_v_i() argument
3405 mop = finalize_memop_asimd(s, a->sz); in trans_LDR_v_i()
3406 op_addr_ldst_imm_pre(s, a, &clean_addr, &dirty_addr, a->imm, false, mop); in trans_LDR_v_i()
3407 do_fp_ld(s, a->rt, clean_addr, mop); in trans_LDR_v_i()
3408 op_addr_ldst_imm_post(s, a, dirty_addr, a->imm); in trans_LDR_v_i()
3412 static void op_addr_ldst_pre(DisasContext *s, arg_ldst *a, in op_addr_ldst_pre() argument
3418 if (a->rn == 31) { in op_addr_ldst_pre()
3421 *dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in op_addr_ldst_pre()
3423 tcg_rm = read_cpu_reg(s, a->rm, 1); in op_addr_ldst_pre()
3424 ext_and_shift_reg(tcg_rm, tcg_rm, a->opt, a->s ? a->sz : 0); in op_addr_ldst_pre()
3430 static bool trans_LDR(DisasContext *s, arg_ldst *a) in trans_LDR() argument
3433 bool iss_sf = ldst_iss_sf(a->sz, a->sign, a->ext); in trans_LDR()
3436 if (extract32(a->opt, 1, 1) == 0) { in trans_LDR()
3440 memop = finalize_memop(s, a->sz + a->sign * MO_SIGN); in trans_LDR()
3441 op_addr_ldst_pre(s, a, &clean_addr, &dirty_addr, false, memop); in trans_LDR()
3442 tcg_rt = cpu_reg(s, a->rt); in trans_LDR()
3444 a->ext, true, a->rt, iss_sf, false); in trans_LDR()
3448 static bool trans_STR(DisasContext *s, arg_ldst *a) in trans_STR() argument
3451 bool iss_sf = ldst_iss_sf(a->sz, a->sign, a->ext); in trans_STR()
3454 if (extract32(a->opt, 1, 1) == 0) { in trans_STR()
3458 memop = finalize_memop(s, a->sz); in trans_STR()
3459 op_addr_ldst_pre(s, a, &clean_addr, &dirty_addr, true, memop); in trans_STR()
3460 tcg_rt = cpu_reg(s, a->rt); in trans_STR()
3461 do_gpr_st(s, tcg_rt, clean_addr, memop, true, a->rt, iss_sf, false); in trans_STR()
3465 static bool trans_LDR_v(DisasContext *s, arg_ldst *a) in trans_LDR_v() argument
3470 if (extract32(a->opt, 1, 1) == 0) { in trans_LDR_v()
3478 memop = finalize_memop_asimd(s, a->sz); in trans_LDR_v()
3479 op_addr_ldst_pre(s, a, &clean_addr, &dirty_addr, false, memop); in trans_LDR_v()
3480 do_fp_ld(s, a->rt, clean_addr, memop); in trans_LDR_v()
3484 static bool trans_STR_v(DisasContext *s, arg_ldst *a) in trans_STR_v() argument
3489 if (extract32(a->opt, 1, 1) == 0) { in trans_STR_v()
3497 memop = finalize_memop_asimd(s, a->sz); in trans_STR_v()
3498 op_addr_ldst_pre(s, a, &clean_addr, &dirty_addr, true, memop); in trans_STR_v()
3499 do_fp_st(s, a->rt, clean_addr, memop); in trans_STR_v()
3504 static bool do_atomic_ld(DisasContext *s, arg_atomic *a, AtomicThreeOpFn *fn, in do_atomic_ld() argument
3507 MemOp mop = a->sz | sign; in do_atomic_ld()
3510 if (a->rn == 31) { in do_atomic_ld()
3513 mop = check_atomic_align(s, a->rn, mop); in do_atomic_ld()
3514 clean_addr = gen_mte_check1(s, cpu_reg_sp(s, a->rn), false, in do_atomic_ld()
3515 a->rn != 31, mop); in do_atomic_ld()
3516 tcg_rs = read_cpu_reg(s, a->rs, true); in do_atomic_ld()
3517 tcg_rt = cpu_reg(s, a->rt); in do_atomic_ld()
3528 switch (a->sz) { in do_atomic_ld()
3547 TRANS_FEAT(LDADD, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_add_i64, 0, false)
3548 TRANS_FEAT(LDCLR, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_and_i64, 0, true)
3549 TRANS_FEAT(LDEOR, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_xor_i64, 0, false)
3550 TRANS_FEAT(LDSET, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_or_i64, 0, false)
3551 TRANS_FEAT(LDSMAX, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_smax_i64, MO_SIGN, false) in TRANS_FEAT() argument
3552 TRANS_FEAT(LDSMIN, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_smin_i64, MO_SIGN, false) in TRANS_FEAT()
3553 TRANS_FEAT(LDUMAX, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_umax_i64, 0, false) in TRANS_FEAT()
3554 TRANS_FEAT(LDUMIN, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_fetch_umin_i64, 0, false) in TRANS_FEAT()
3555 TRANS_FEAT(SWP, aa64_atomics, do_atomic_ld, a, tcg_gen_atomic_xchg_i64, 0, false) in TRANS_FEAT()
3557 static bool trans_LDAPR(DisasContext *s, arg_LDAPR *a) in TRANS_FEAT()
3559 bool iss_sf = ldst_iss_sf(a->sz, false, false); in TRANS_FEAT()
3567 if (a->rn == 31) { in TRANS_FEAT()
3570 mop = check_ordered_align(s, a->rn, 0, false, a->sz); in TRANS_FEAT()
3571 clean_addr = gen_mte_check1(s, cpu_reg_sp(s, a->rn), false, in TRANS_FEAT()
3572 a->rn != 31, mop); in TRANS_FEAT()
3580 do_gpr_ld(s, cpu_reg(s, a->rt), clean_addr, mop, false, in TRANS_FEAT()
3581 true, a->rt, iss_sf, true); in TRANS_FEAT()
3586 static bool trans_LDRA(DisasContext *s, arg_LDRA *a) in trans_LDRA() argument
3596 if (a->rn == 31) { in trans_LDRA()
3599 dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in trans_LDRA()
3602 if (!a->m) { in trans_LDRA()
3611 tcg_gen_addi_i64(dirty_addr, dirty_addr, a->imm); in trans_LDRA()
3617 a->w || a->rn != 31, memop); in trans_LDRA()
3619 tcg_rt = cpu_reg(s, a->rt); in trans_LDRA()
3621 /* extend */ false, /* iss_valid */ !a->w, in trans_LDRA()
3622 /* iss_srt */ a->rt, /* iss_sf */ true, /* iss_ar */ false); in trans_LDRA()
3624 if (a->w) { in trans_LDRA()
3625 tcg_gen_mov_i64(cpu_reg_sp(s, a->rn), dirty_addr); in trans_LDRA()
3630 static bool trans_LDAPR_i(DisasContext *s, arg_ldapr_stlr_i *a) in trans_LDAPR_i() argument
3633 MemOp mop = a->sz | (a->sign ? MO_SIGN : 0); in trans_LDAPR_i()
3634 bool iss_sf = ldst_iss_sf(a->sz, a->sign, a->ext); in trans_LDAPR_i()
3640 if (a->rn == 31) { in trans_LDAPR_i()
3644 mop = check_ordered_align(s, a->rn, a->imm, false, mop); in trans_LDAPR_i()
3645 dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in trans_LDAPR_i()
3646 tcg_gen_addi_i64(dirty_addr, dirty_addr, a->imm); in trans_LDAPR_i()
3653 do_gpr_ld(s, cpu_reg(s, a->rt), clean_addr, mop, a->ext, true, in trans_LDAPR_i()
3654 a->rt, iss_sf, true); in trans_LDAPR_i()
3659 static bool trans_STLR_i(DisasContext *s, arg_ldapr_stlr_i *a) in trans_STLR_i() argument
3662 MemOp mop = a->sz; in trans_STLR_i()
3663 bool iss_sf = ldst_iss_sf(a->sz, a->sign, a->ext); in trans_STLR_i()
3671 if (a->rn == 31) { in trans_STLR_i()
3675 mop = check_ordered_align(s, a->rn, a->imm, true, mop); in trans_STLR_i()
3676 dirty_addr = read_cpu_reg_sp(s, a->rn, 1); in trans_STLR_i()
3677 tcg_gen_addi_i64(dirty_addr, dirty_addr, a->imm); in trans_STLR_i()
3682 do_gpr_st(s, cpu_reg(s, a->rt), clean_addr, mop, true, a->rt, iss_sf, true); in trans_STLR_i()
3686 static bool trans_LD_mult(DisasContext *s, arg_ldst_mult *a) in trans_LD_mult() argument
3694 int size = a->sz; in trans_LD_mult()
3696 if (!a->p && a->rm != 0) { in trans_LD_mult()
3700 if (size == 3 && !a->q && a->selem != 1) { in trans_LD_mult()
3707 if (a->rn == 31) { in trans_LD_mult()
3717 total = a->rpt * a->selem * (a->q ? 16 : 8); in trans_LD_mult()
3718 tcg_rn = cpu_reg_sp(s, a->rn); in trans_LD_mult()
3724 clean_addr = gen_mte_checkN(s, tcg_rn, false, a->p || a->rn != 31, total, in trans_LD_mult()
3732 if (a->selem == 1 && endian == MO_LE) { in trans_LD_mult()
3741 elements = (a->q ? 16 : 8) >> size; in trans_LD_mult()
3743 for (r = 0; r < a->rpt; r++) { in trans_LD_mult()
3747 for (xs = 0; xs < a->selem; xs++) { in trans_LD_mult()
3748 int tt = (a->rt + r + xs) % 32; in trans_LD_mult()
3762 for (r = 0; r < a->rpt * a->selem; r++) { in trans_LD_mult()
3763 int tt = (a->rt + r) % 32; in trans_LD_mult()
3764 clear_vec_high(s, a->q, tt); in trans_LD_mult()
3767 if (a->p) { in trans_LD_mult()
3768 if (a->rm == 31) { in trans_LD_mult()
3771 tcg_gen_add_i64(tcg_rn, tcg_rn, cpu_reg(s, a->rm)); in trans_LD_mult()
3777 static bool trans_ST_mult(DisasContext *s, arg_ldst_mult *a) in trans_ST_mult() argument
3785 int size = a->sz; in trans_ST_mult()
3787 if (!a->p && a->rm != 0) { in trans_ST_mult()
3791 if (size == 3 && !a->q && a->selem != 1) { in trans_ST_mult()
3798 if (a->rn == 31) { in trans_ST_mult()
3808 total = a->rpt * a->selem * (a->q ? 16 : 8); in trans_ST_mult()
3809 tcg_rn = cpu_reg_sp(s, a->rn); in trans_ST_mult()
3815 clean_addr = gen_mte_checkN(s, tcg_rn, true, a->p || a->rn != 31, total, in trans_ST_mult()
3823 if (a->selem == 1 && endian == MO_LE) { in trans_ST_mult()
3832 elements = (a->q ? 16 : 8) >> size; in trans_ST_mult()
3834 for (r = 0; r < a->rpt; r++) { in trans_ST_mult()
3838 for (xs = 0; xs < a->selem; xs++) { in trans_ST_mult()
3839 int tt = (a->rt + r + xs) % 32; in trans_ST_mult()
3846 if (a->p) { in trans_ST_mult()
3847 if (a->rm == 31) { in trans_ST_mult()
3850 tcg_gen_add_i64(tcg_rn, tcg_rn, cpu_reg(s, a->rm)); in trans_ST_mult()
3856 static bool trans_ST_single(DisasContext *s, arg_ldst_single *a) in trans_ST_single() argument
3862 if (!a->p && a->rm != 0) { in trans_ST_single()
3869 if (a->rn == 31) { in trans_ST_single()
3873 total = a->selem << a->scale; in trans_ST_single()
3874 tcg_rn = cpu_reg_sp(s, a->rn); in trans_ST_single()
3876 mop = finalize_memop_asimd(s, a->scale); in trans_ST_single()
3877 clean_addr = gen_mte_checkN(s, tcg_rn, true, a->p || a->rn != 31, in trans_ST_single()
3880 tcg_ebytes = tcg_constant_i64(1 << a->scale); in trans_ST_single()
3881 for (xs = 0, rt = a->rt; xs < a->selem; xs++, rt = (rt + 1) % 32) { in trans_ST_single()
3882 do_vec_st(s, rt, a->index, clean_addr, mop); in trans_ST_single()
3886 if (a->p) { in trans_ST_single()
3887 if (a->rm == 31) { in trans_ST_single()
3890 tcg_gen_add_i64(tcg_rn, tcg_rn, cpu_reg(s, a->rm)); in trans_ST_single()
3896 static bool trans_LD_single(DisasContext *s, arg_ldst_single *a) in trans_LD_single() argument
3902 if (!a->p && a->rm != 0) { in trans_LD_single()
3909 if (a->rn == 31) { in trans_LD_single()
3913 total = a->selem << a->scale; in trans_LD_single()
3914 tcg_rn = cpu_reg_sp(s, a->rn); in trans_LD_single()
3916 mop = finalize_memop_asimd(s, a->scale); in trans_LD_single()
3917 clean_addr = gen_mte_checkN(s, tcg_rn, false, a->p || a->rn != 31, in trans_LD_single()
3920 tcg_ebytes = tcg_constant_i64(1 << a->scale); in trans_LD_single()
3921 for (xs = 0, rt = a->rt; xs < a->selem; xs++, rt = (rt + 1) % 32) { in trans_LD_single()
3922 do_vec_ld(s, rt, a->index, clean_addr, mop); in trans_LD_single()
3926 if (a->p) { in trans_LD_single()
3927 if (a->rm == 31) { in trans_LD_single()
3930 tcg_gen_add_i64(tcg_rn, tcg_rn, cpu_reg(s, a->rm)); in trans_LD_single()
3936 static bool trans_LD_single_repl(DisasContext *s, arg_LD_single_repl *a) in trans_LD_single_repl() argument
3942 if (!a->p && a->rm != 0) { in trans_LD_single_repl()
3949 if (a->rn == 31) { in trans_LD_single_repl()
3953 total = a->selem << a->scale; in trans_LD_single_repl()
3954 tcg_rn = cpu_reg_sp(s, a->rn); in trans_LD_single_repl()
3956 mop = finalize_memop_asimd(s, a->scale); in trans_LD_single_repl()
3957 clean_addr = gen_mte_checkN(s, tcg_rn, false, a->p || a->rn != 31, in trans_LD_single_repl()
3960 tcg_ebytes = tcg_constant_i64(1 << a->scale); in trans_LD_single_repl()
3961 for (xs = 0, rt = a->rt; xs < a->selem; xs++, rt = (rt + 1) % 32) { in trans_LD_single_repl()
3966 tcg_gen_gvec_dup_i64(a->scale, vec_full_reg_offset(s, rt), in trans_LD_single_repl()
3967 (a->q + 1) * 8, vec_full_reg_size(s), tcg_tmp); in trans_LD_single_repl()
3971 if (a->p) { in trans_LD_single_repl()
3972 if (a->rm == 31) { in trans_LD_single_repl()
3975 tcg_gen_add_i64(tcg_rn, tcg_rn, cpu_reg(s, a->rm)); in trans_LD_single_repl()
3981 static bool trans_STZGM(DisasContext *s, arg_ldst_tag *a) in trans_STZGM() argument
3993 if (a->rn == 31) { in trans_STZGM()
3997 addr = read_cpu_reg_sp(s, a->rn, true); in trans_STZGM()
3998 tcg_gen_addi_i64(addr, addr, a->imm); in trans_STZGM()
3999 tcg_rt = cpu_reg(s, a->rt); in trans_STZGM()
4014 static bool trans_STGM(DisasContext *s, arg_ldst_tag *a) in trans_STGM() argument
4025 if (a->rn == 31) { in trans_STGM()
4029 addr = read_cpu_reg_sp(s, a->rn, true); in trans_STGM()
4030 tcg_gen_addi_i64(addr, addr, a->imm); in trans_STGM()
4031 tcg_rt = cpu_reg(s, a->rt); in trans_STGM()
4046 static bool trans_LDGM(DisasContext *s, arg_ldst_tag *a) in trans_LDGM() argument
4057 if (a->rn == 31) { in trans_LDGM()
4061 addr = read_cpu_reg_sp(s, a->rn, true); in trans_LDGM()
4062 tcg_gen_addi_i64(addr, addr, a->imm); in trans_LDGM()
4063 tcg_rt = cpu_reg(s, a->rt); in trans_LDGM()
4080 static bool trans_LDG(DisasContext *s, arg_ldst_tag *a) in trans_LDG() argument
4088 if (a->rn == 31) { in trans_LDG()
4092 addr = read_cpu_reg_sp(s, a->rn, true); in trans_LDG()
4093 if (!a->p) { in trans_LDG()
4095 tcg_gen_addi_i64(addr, addr, a->imm); in trans_LDG()
4099 tcg_rt = cpu_reg(s, a->rt); in trans_LDG()
4112 if (a->w) { in trans_LDG()
4114 if (a->p) { in trans_LDG()
4116 tcg_gen_addi_i64(addr, addr, a->imm); in trans_LDG()
4118 tcg_gen_mov_i64(cpu_reg_sp(s, a->rn), addr); in trans_LDG()
4123 static bool do_STG(DisasContext *s, arg_ldst_tag *a, bool is_zero, bool is_pair) in do_STG() argument
4127 if (a->rn == 31) { in do_STG()
4131 addr = read_cpu_reg_sp(s, a->rn, true); in do_STG()
4132 if (!a->p) { in do_STG()
4134 tcg_gen_addi_i64(addr, addr, a->imm); in do_STG()
4136 tcg_rt = cpu_reg_sp(s, a->rt); in do_STG()
4179 if (a->w) { in do_STG()
4181 if (a->p) { in do_STG()
4183 tcg_gen_addi_i64(addr, addr, a->imm); in do_STG()
4185 tcg_gen_mov_i64(cpu_reg_sp(s, a->rn), addr); in do_STG()
4190 TRANS_FEAT(STG, aa64_mte_insn_reg, do_STG, a, false, false)
4191 TRANS_FEAT(STZG, aa64_mte_insn_reg, do_STG, a, true, false)
4192 TRANS_FEAT(ST2G, aa64_mte_insn_reg, do_STG, a, false, true)
4193 TRANS_FEAT(STZ2G, aa64_mte_insn_reg, do_STG, a, true, true)
4197 static bool do_SET(DisasContext *s, arg_set *a, bool is_epilogue, in do_SET() argument
4212 if (a->rs == a->rn || a->rs == a->rd || a->rn == a->rd || in do_SET()
4213 a->rd == 31 || a->rn == 31) { in do_SET()
4217 memidx = get_a64_user_mem_index(s, a->unpriv); in do_SET()
4223 syndrome = syn_mop(true, is_setg, (a->nontemp << 1) | a->unpriv, in do_SET()
4224 is_epilogue, false, true, a->rd, a->rs, a->rn); in do_SET()
4226 if (is_setg ? s->ata[a->unpriv] : s->mte_active[a->unpriv]) { in do_SET()
4245 TRANS_FEAT(SETP, aa64_mops, do_SET, a, false, false, gen_helper_setp)
4246 TRANS_FEAT(SETM, aa64_mops, do_SET, a, false, false, gen_helper_setm)
4247 TRANS_FEAT(SETE, aa64_mops, do_SET, a, true, false, gen_helper_sete)
4248 TRANS_FEAT(SETGP, aa64_mops, do_SET, a, false, true, gen_helper_setgp)
4249 TRANS_FEAT(SETGM, aa64_mops, do_SET, a, false, true, gen_helper_setgm)
4250 TRANS_FEAT(SETGE, aa64_mops, do_SET, a, true, true, gen_helper_setge)
4254 static bool do_CPY(DisasContext *s, arg_cpy *a, bool is_epilogue, CpyFn fn) in do_CPY() argument
4258 bool wunpriv = extract32(a->options, 0, 1); in do_CPY()
4259 bool runpriv = extract32(a->options, 1, 1); in do_CPY()
4266 if (a->rs == a->rn || a->rs == a->rd || a->rn == a->rd || in do_CPY()
4267 a->rd == 31 || a->rs == 31 || a->rn == 31) { in do_CPY()
4278 syndrome = syn_mop(false, false, a->options, is_epilogue, in do_CPY()
4279 false, true, a->rd, a->rs, a->rn); in do_CPY()
4305 TRANS_FEAT(CPYP, aa64_mops, do_CPY, a, false, gen_helper_cpyp)
4306 TRANS_FEAT(CPYM, aa64_mops, do_CPY, a, false, gen_helper_cpym)
4307 TRANS_FEAT(CPYE, aa64_mops, do_CPY, a, true, gen_helper_cpye)
4308 TRANS_FEAT(CPYFP, aa64_mops, do_CPY, a, false, gen_helper_cpyfp)
4309 TRANS_FEAT(CPYFM, aa64_mops, do_CPY, a, false, gen_helper_cpyfm)
4310 TRANS_FEAT(CPYFE, aa64_mops, do_CPY, a, true, gen_helper_cpyfe)
4314 static bool gen_rri(DisasContext *s, arg_rri_sf *a, in gen_rri() argument
4317 TCGv_i64 tcg_rn = rn_sp ? cpu_reg_sp(s, a->rn) : cpu_reg(s, a->rn); in gen_rri()
4318 TCGv_i64 tcg_rd = rd_sp ? cpu_reg_sp(s, a->rd) : cpu_reg(s, a->rd); in gen_rri()
4319 TCGv_i64 tcg_imm = tcg_constant_i64(a->imm); in gen_rri()
4322 if (!a->sf) { in gen_rri()
4332 static bool trans_ADR(DisasContext *s, arg_ri *a) in trans_ADR() argument
4334 gen_pc_plus_diff(s, cpu_reg(s, a->rd), a->imm); in trans_ADR()
4338 static bool trans_ADRP(DisasContext *s, arg_ri *a) in trans_ADRP() argument
4340 int64_t offset = (int64_t)a->imm << 12; in trans_ADRP()
4344 gen_pc_plus_diff(s, cpu_reg(s, a->rd), offset); in trans_ADRP()
4351 TRANS(ADD_i, gen_rri, a, 1, 1, tcg_gen_add_i64)
4352 TRANS(SUB_i, gen_rri, a, 1, 1, tcg_gen_sub_i64)
4353 TRANS(ADDS_i, gen_rri, a, 0, 1, a->sf ? gen_add64_CC : gen_add32_CC)
4354 TRANS(SUBS_i, gen_rri, a, 0, 1, a->sf ? gen_sub64_CC : gen_sub32_CC)
4360 static bool gen_add_sub_imm_with_tags(DisasContext *s, arg_rri_tag *a, in gen_add_sub_imm_with_tags() argument
4366 imm = a->uimm6 << LOG2_TAG_GRANULE; in gen_add_sub_imm_with_tags()
4371 tcg_rn = cpu_reg_sp(s, a->rn); in gen_add_sub_imm_with_tags()
4372 tcg_rd = cpu_reg_sp(s, a->rd); in gen_add_sub_imm_with_tags()
4377 tcg_constant_i32(a->uimm4)); in gen_add_sub_imm_with_tags()
4385 TRANS_FEAT(ADDG_i, aa64_mte_insn_reg, gen_add_sub_imm_with_tags, a, false) in TRANS_FEAT() argument
4386 TRANS_FEAT(SUBG_i, aa64_mte_insn_reg, gen_add_sub_imm_with_tags, a, true) in TRANS_FEAT()
4473 static bool gen_rri_log(DisasContext *s, arg_rri_log *a, bool set_cc, in gen_rri_log() argument
4480 if (!logic_imm_decode_wmask(&imm, extract32(a->dbm, 12, 1), in gen_rri_log()
4481 extract32(a->dbm, 0, 6), in gen_rri_log()
4482 extract32(a->dbm, 6, 6))) { in gen_rri_log()
4485 if (!a->sf) { in gen_rri_log()
4489 tcg_rd = set_cc ? cpu_reg(s, a->rd) : cpu_reg_sp(s, a->rd); in gen_rri_log()
4490 tcg_rn = cpu_reg(s, a->rn); in gen_rri_log()
4494 gen_logic_CC(a->sf, tcg_rd); in gen_rri_log()
4496 if (!a->sf) { in gen_rri_log()
4502 TRANS(AND_i, gen_rri_log, a, false, tcg_gen_andi_i64) in TRANS() argument
4503 TRANS(ORR_i, gen_rri_log, a, false, tcg_gen_ori_i64) in TRANS()
4504 TRANS(EOR_i, gen_rri_log, a, false, tcg_gen_xori_i64) in TRANS()
4505 TRANS(ANDS_i, gen_rri_log, a, true, tcg_gen_andi_i64) in TRANS()
4511 static bool trans_MOVZ(DisasContext *s, arg_movw *a) in TRANS()
4513 int pos = a->hw << 4; in TRANS()
4514 tcg_gen_movi_i64(cpu_reg(s, a->rd), (uint64_t)a->imm << pos); in TRANS()
4518 static bool trans_MOVN(DisasContext *s, arg_movw *a) in trans_MOVN() argument
4520 int pos = a->hw << 4; in trans_MOVN()
4521 uint64_t imm = a->imm; in trans_MOVN()
4524 if (!a->sf) { in trans_MOVN()
4527 tcg_gen_movi_i64(cpu_reg(s, a->rd), imm); in trans_MOVN()
4531 static bool trans_MOVK(DisasContext *s, arg_movw *a) in trans_MOVK() argument
4533 int pos = a->hw << 4; in trans_MOVK()
4536 tcg_rd = cpu_reg(s, a->rd); in trans_MOVK()
4537 tcg_im = tcg_constant_i64(a->imm); in trans_MOVK()
4539 if (!a->sf) { in trans_MOVK()
4549 static bool trans_SBFM(DisasContext *s, arg_SBFM *a) in trans_SBFM() argument
4551 TCGv_i64 tcg_rd = cpu_reg(s, a->rd); in trans_SBFM()
4552 TCGv_i64 tcg_tmp = read_cpu_reg(s, a->rn, 1); in trans_SBFM()
4553 unsigned int bitsize = a->sf ? 64 : 32; in trans_SBFM()
4554 unsigned int ri = a->immr; in trans_SBFM()
4555 unsigned int si = a->imms; in trans_SBFM()
4562 if (!a->sf) { in trans_SBFM()
4589 static bool trans_UBFM(DisasContext *s, arg_UBFM *a) in trans_UBFM() argument
4591 TCGv_i64 tcg_rd = cpu_reg(s, a->rd); in trans_UBFM()
4592 TCGv_i64 tcg_tmp = read_cpu_reg(s, a->rn, 1); in trans_UBFM()
4593 unsigned int bitsize = a->sf ? 64 : 32; in trans_UBFM()
4594 unsigned int ri = a->immr; in trans_UBFM()
4595 unsigned int si = a->imms; in trans_UBFM()
4598 tcg_rd = cpu_reg(s, a->rd); in trans_UBFM()
4599 tcg_tmp = read_cpu_reg(s, a->rn, 1); in trans_UBFM()
4614 static bool trans_BFM(DisasContext *s, arg_BFM *a) in trans_BFM() argument
4616 TCGv_i64 tcg_rd = cpu_reg(s, a->rd); in trans_BFM()
4617 TCGv_i64 tcg_tmp = read_cpu_reg(s, a->rn, 1); in trans_BFM()
4618 unsigned int bitsize = a->sf ? 64 : 32; in trans_BFM()
4619 unsigned int ri = a->immr; in trans_BFM()
4620 unsigned int si = a->imms; in trans_BFM()
4623 tcg_rd = cpu_reg(s, a->rd); in trans_BFM()
4624 tcg_tmp = read_cpu_reg(s, a->rn, 1); in trans_BFM()
4638 if (!a->sf) { in trans_BFM()
4644 static bool trans_EXTR(DisasContext *s, arg_extract *a) in trans_EXTR() argument
4648 tcg_rd = cpu_reg(s, a->rd); in trans_EXTR()
4650 if (unlikely(a->imm == 0)) { in trans_EXTR()
4655 if (a->sf) { in trans_EXTR()
4656 tcg_gen_mov_i64(tcg_rd, cpu_reg(s, a->rm)); in trans_EXTR()
4658 tcg_gen_ext32u_i64(tcg_rd, cpu_reg(s, a->rm)); in trans_EXTR()
4661 tcg_rm = cpu_reg(s, a->rm); in trans_EXTR()
4662 tcg_rn = cpu_reg(s, a->rn); in trans_EXTR()
4664 if (a->sf) { in trans_EXTR()
4666 tcg_gen_extract2_i64(tcg_rd, tcg_rm, tcg_rn, a->imm); in trans_EXTR()
4671 if (a->rm == a->rn) { in trans_EXTR()
4672 tcg_gen_rotri_i32(t0, t0, a->imm); in trans_EXTR()
4676 tcg_gen_extract2_i32(t0, t0, t1, a->imm); in trans_EXTR()
4684 static bool trans_TBL_TBX(DisasContext *s, arg_TBL_TBX *a) in trans_TBL_TBX() argument
4687 int len = (a->len + 1) * 16; in trans_TBL_TBX()
4689 tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, a->rd), in trans_TBL_TBX()
4690 vec_full_reg_offset(s, a->rm), tcg_env, in trans_TBL_TBX()
4691 a->q ? 16 : 8, vec_full_reg_size(s), in trans_TBL_TBX()
4692 (len << 6) | (a->tbx << 5) | a->rn, in trans_TBL_TBX()
4700 static bool do_simd_permute(DisasContext *s, arg_qrrr_e *a, in do_simd_permute() argument
4703 MemOp esz = a->esz; in do_simd_permute()
4704 int datasize = a->q ? 16 : 8; in do_simd_permute()
4708 if (esz == MO_64 && !a->q) { in do_simd_permute()
4716 tcg_res[1] = a->q ? tcg_temp_new_i64() : NULL; in do_simd_permute()
4723 read_vec_element(s, tcg_ele, (idx & elements ? a->rm : a->rn), in do_simd_permute()
4735 for (int i = a->q; i >= 0; --i) { in do_simd_permute()
4736 write_vec_element(s, tcg_res[i], a->rd, i, MO_64); in do_simd_permute()
4738 clear_vec_high(s, a->q, a->rd); in do_simd_permute()
4747 TRANS(UZP1, do_simd_permute, a, permute_load_uzp, 0)
4748 TRANS(UZP2, do_simd_permute, a, permute_load_uzp, 1)
4755 TRANS(TRN1, do_simd_permute, a, permute_load_trn, 0)
4756 TRANS(TRN2, do_simd_permute, a, permute_load_trn, 1)
4763 TRANS(ZIP1, do_simd_permute, a, permute_load_zip, 0)
4764 TRANS(ZIP2, do_simd_permute, a, permute_load_zip, 1)
4770 TRANS_FEAT(AESE, aa64_aes, do_gvec_op3_ool, a, 0, gen_helper_crypto_aese)
4771 TRANS_FEAT(AESD, aa64_aes, do_gvec_op3_ool, a, 0, gen_helper_crypto_aesd)
4772 TRANS_FEAT(AESMC, aa64_aes, do_gvec_op2_ool, a, 0, gen_helper_crypto_aesmc)
4773 TRANS_FEAT(AESIMC, aa64_aes, do_gvec_op2_ool, a, 0, gen_helper_crypto_aesimc)
4775 TRANS_FEAT(SHA1C, aa64_sha1, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha1c)
4776 TRANS_FEAT(SHA1P, aa64_sha1, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha1p)
4777 TRANS_FEAT(SHA1M, aa64_sha1, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha1m)
4778 TRANS_FEAT(SHA1SU0, aa64_sha1, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha1su0)
4780 TRANS_FEAT(SHA256H, aa64_sha256, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha256h)
4781 TRANS_FEAT(SHA256H2, aa64_sha256, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha256h2)
4782 TRANS_FEAT(SHA256SU1, aa64_sha256, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha256su1)
4784 TRANS_FEAT(SHA1H, aa64_sha1, do_gvec_op2_ool, a, 0, gen_helper_crypto_sha1h)
4785 TRANS_FEAT(SHA1SU1, aa64_sha1, do_gvec_op2_ool, a, 0, gen_helper_crypto_sha1su1)
4786 TRANS_FEAT(SHA256SU0, aa64_sha256, do_gvec_op2_ool, a, 0, gen_helper_crypto_sha256su0)
4788 TRANS_FEAT(SHA512H, aa64_sha512, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha512h)
4789 TRANS_FEAT(SHA512H2, aa64_sha512, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha512h2)
4790 TRANS_FEAT(SHA512SU1, aa64_sha512, do_gvec_op3_ool, a, 0, gen_helper_crypto_sha512su1)
4791 TRANS_FEAT(RAX1, aa64_sha3, do_gvec_fn3, a, gen_gvec_rax1) in TRANS_FEAT() argument
4792 TRANS_FEAT(SM3PARTW1, aa64_sm3, do_gvec_op3_ool, a, 0, gen_helper_crypto_sm3partw1) in TRANS_FEAT()
4793 TRANS_FEAT(SM3PARTW2, aa64_sm3, do_gvec_op3_ool, a, 0, gen_helper_crypto_sm3partw2) in TRANS_FEAT()
4794 TRANS_FEAT(SM4EKEY, aa64_sm4, do_gvec_op3_ool, a, 0, gen_helper_crypto_sm4ekey) in TRANS_FEAT()
4796 TRANS_FEAT(SHA512SU0, aa64_sha512, do_gvec_op2_ool, a, 0, gen_helper_crypto_sha512su0) in TRANS_FEAT()
4797 TRANS_FEAT(SM4E, aa64_sm4, do_gvec_op3_ool, a, 0, gen_helper_crypto_sm4e) in TRANS_FEAT()
4799 TRANS_FEAT(EOR3, aa64_sha3, do_gvec_fn4, a, gen_gvec_eor3) in TRANS_FEAT()
4800 TRANS_FEAT(BCAX, aa64_sha3, do_gvec_fn4, a, gen_gvec_bcax) in TRANS_FEAT()
4802 static bool trans_SM3SS1(DisasContext *s, arg_SM3SS1 *a) in TRANS_FEAT()
4814 read_vec_element_i32(s, tcg_op1, a->rn, 3, MO_32); in TRANS_FEAT()
4815 read_vec_element_i32(s, tcg_op2, a->rm, 3, MO_32); in TRANS_FEAT()
4816 read_vec_element_i32(s, tcg_op3, a->ra, 3, MO_32); in TRANS_FEAT()
4825 dofs = vec_full_reg_offset(s, a->rd); in TRANS_FEAT()
4827 write_vec_element_i32(s, tcg_res, a->rd, 3, MO_32); in TRANS_FEAT()
4832 static bool do_crypto3i(DisasContext *s, arg_crypto3i *a, gen_helper_gvec_3 *fn) in do_crypto3i() argument
4835 gen_gvec_op3_ool(s, true, a->rd, a->rn, a->rm, a->imm, fn); in do_crypto3i()
4839 TRANS_FEAT(SM3TT1A, aa64_sm3, do_crypto3i, a, gen_helper_crypto_sm3tt1a) in TRANS_FEAT() argument
4840 TRANS_FEAT(SM3TT1B, aa64_sm3, do_crypto3i, a, gen_helper_crypto_sm3tt1b) in TRANS_FEAT()
4841 TRANS_FEAT(SM3TT2A, aa64_sm3, do_crypto3i, a, gen_helper_crypto_sm3tt2a) in TRANS_FEAT()
4842 TRANS_FEAT(SM3TT2B, aa64_sm3, do_crypto3i, a, gen_helper_crypto_sm3tt2b) in TRANS_FEAT()
4844 static bool trans_XAR(DisasContext *s, arg_XAR *a) in TRANS_FEAT()
4850 gen_gvec_xar(MO_64, vec_full_reg_offset(s, a->rd), in TRANS_FEAT()
4851 vec_full_reg_offset(s, a->rn), in TRANS_FEAT()
4852 vec_full_reg_offset(s, a->rm), a->imm, 16, in TRANS_FEAT()
4873 static bool trans_DUP_element_s(DisasContext *s, arg_DUP_element_s *a) in trans_DUP_element_s() argument
4878 if (!decode_esz_idx(a->imm, &esz, &idx)) { in trans_DUP_element_s()
4887 read_vec_element(s, tmp, a->rn, idx, esz); in trans_DUP_element_s()
4888 write_fp_dreg(s, a->rd, tmp); in trans_DUP_element_s()
4893 static bool trans_DUP_element_v(DisasContext *s, arg_DUP_element_v *a) in trans_DUP_element_v() argument
4898 if (!decode_esz_idx(a->imm, &esz, &idx)) { in trans_DUP_element_v()
4901 if (esz == MO_64 && !a->q) { in trans_DUP_element_v()
4905 tcg_gen_gvec_dup_mem(esz, vec_full_reg_offset(s, a->rd), in trans_DUP_element_v()
4906 vec_reg_offset(s, a->rn, idx, esz), in trans_DUP_element_v()
4907 a->q ? 16 : 8, vec_full_reg_size(s)); in trans_DUP_element_v()
4912 static bool trans_DUP_general(DisasContext *s, arg_DUP_general *a) in trans_DUP_general() argument
4917 if (!decode_esz_idx(a->imm, &esz, &idx)) { in trans_DUP_general()
4920 if (esz == MO_64 && !a->q) { in trans_DUP_general()
4924 tcg_gen_gvec_dup_i64(esz, vec_full_reg_offset(s, a->rd), in trans_DUP_general()
4925 a->q ? 16 : 8, vec_full_reg_size(s), in trans_DUP_general()
4926 cpu_reg(s, a->rn)); in trans_DUP_general()
4931 static bool do_smov_umov(DisasContext *s, arg_SMOV *a, MemOp is_signed) in do_smov_umov() argument
4936 if (!decode_esz_idx(a->imm, &esz, &idx)) { in do_smov_umov()
4940 if (esz == MO_64 || (esz == MO_32 && !a->q)) { in do_smov_umov()
4944 if (esz == MO_64 ? !a->q : a->q) { in do_smov_umov()
4949 TCGv_i64 tcg_rd = cpu_reg(s, a->rd); in do_smov_umov()
4950 read_vec_element(s, tcg_rd, a->rn, idx, esz | is_signed); in do_smov_umov()
4951 if (is_signed && !a->q) { in do_smov_umov()
4958 TRANS(SMOV, do_smov_umov, a, MO_SIGN) in TRANS() argument
4959 TRANS(UMOV, do_smov_umov, a, 0) in TRANS()
4961 static bool trans_INS_general(DisasContext *s, arg_INS_general *a) in TRANS()
4966 if (!decode_esz_idx(a->imm, &esz, &idx)) { in TRANS()
4970 write_vec_element(s, cpu_reg(s, a->rn), a->rd, idx, esz); in TRANS()
4971 clear_vec_high(s, true, a->rd); in TRANS()
4976 static bool trans_INS_element(DisasContext *s, arg_INS_element *a) in trans_INS_element() argument
4981 if (!decode_esz_idx(a->di, &esz, &didx)) { in trans_INS_element()
4984 sidx = a->si >> esz; in trans_INS_element()
4988 read_vec_element(s, tmp, a->rn, sidx, esz); in trans_INS_element()
4989 write_vec_element(s, tmp, a->rd, didx, esz); in trans_INS_element()
4992 clear_vec_high(s, true, a->rd); in trans_INS_element()
5007 static bool do_fp3_scalar(DisasContext *s, arg_rrr_e *a, const FPScalar *f) in do_fp3_scalar() argument
5009 switch (a->esz) { in do_fp3_scalar()
5012 TCGv_i64 t0 = read_fp_dreg(s, a->rn); in do_fp3_scalar()
5013 TCGv_i64 t1 = read_fp_dreg(s, a->rm); in do_fp3_scalar()
5015 write_fp_dreg(s, a->rd, t0); in do_fp3_scalar()
5020 TCGv_i32 t0 = read_fp_sreg(s, a->rn); in do_fp3_scalar()
5021 TCGv_i32 t1 = read_fp_sreg(s, a->rm); in do_fp3_scalar()
5023 write_fp_sreg(s, a->rd, t0); in do_fp3_scalar()
5031 TCGv_i32 t0 = read_fp_hreg(s, a->rn); in do_fp3_scalar()
5032 TCGv_i32 t1 = read_fp_hreg(s, a->rm); in do_fp3_scalar()
5034 write_fp_sreg(s, a->rd, t0); in do_fp3_scalar()
5048 TRANS(FADD_s, do_fp3_scalar, a, &f_scalar_fadd)
5055 TRANS(FSUB_s, do_fp3_scalar, a, &f_scalar_fsub)
5062 TRANS(FDIV_s, do_fp3_scalar, a, &f_scalar_fdiv)
5069 TRANS(FMUL_s, do_fp3_scalar, a, &f_scalar_fmul)
5076 TRANS(FMAX_s, do_fp3_scalar, a, &f_scalar_fmax)
5083 TRANS(FMIN_s, do_fp3_scalar, a, &f_scalar_fmin)
5090 TRANS(FMAXNM_s, do_fp3_scalar, a, &f_scalar_fmaxnm)
5097 TRANS(FMINNM_s, do_fp3_scalar, a, &f_scalar_fminnm)
5104 TRANS(FMULX_s, do_fp3_scalar, a, &f_scalar_fmulx)
5129 TRANS(FNMUL_s, do_fp3_scalar, a, &f_scalar_fnmul)
5136 TRANS(FCMEQ_s, do_fp3_scalar, a, &f_scalar_fcmeq)
5143 TRANS(FCMGE_s, do_fp3_scalar, a, &f_scalar_fcmge)
5150 TRANS(FCMGT_s, do_fp3_scalar, a, &f_scalar_fcmgt)
5157 TRANS(FACGE_s, do_fp3_scalar, a, &f_scalar_facge)
5164 TRANS(FACGT_s, do_fp3_scalar, a, &f_scalar_facgt)
5189 TRANS(FABD_s, do_fp3_scalar, a, &f_scalar_fabd)
5196 TRANS(FRECPS_s, do_fp3_scalar, a, &f_scalar_frecps)
5203 TRANS(FRSQRTS_s, do_fp3_scalar, a, &f_scalar_frsqrts)
5205 static bool do_satacc_s(DisasContext *s, arg_rrr_e *a, in do_satacc_s() argument
5211 MemOp esz = a->esz; in do_satacc_s()
5221 read_vec_element(s, t1, a->rn, 0, esz | sgn_n); in do_satacc_s()
5222 read_vec_element(s, t2, a->rm, 0, esz | sgn_m); in do_satacc_s()
5232 write_fp_dreg(s, a->rd, t0); in do_satacc_s()
5237 TRANS(SQADD_s, do_satacc_s, a, MO_SIGN, MO_SIGN, gen_sqadd_bhs, gen_sqadd_d) in TRANS() argument
5238 TRANS(SQSUB_s, do_satacc_s, a, MO_SIGN, MO_SIGN, gen_sqsub_bhs, gen_sqsub_d) in TRANS()
5239 TRANS(UQADD_s, do_satacc_s, a, 0, 0, gen_uqadd_bhs, gen_uqadd_d) in TRANS()
5240 TRANS(UQSUB_s, do_satacc_s, a, 0, 0, gen_uqsub_bhs, gen_uqsub_d) in TRANS()
5241 TRANS(SUQADD_s, do_satacc_s, a, MO_SIGN, 0, gen_suqadd_bhs, gen_suqadd_d) in TRANS()
5242 TRANS(USQADD_s, do_satacc_s, a, 0, MO_SIGN, gen_usqadd_bhs, gen_usqadd_d) in TRANS()
5244 static bool do_int3_scalar_d(DisasContext *s, arg_rrr_e *a, in TRANS()
5251 read_vec_element(s, t0, a->rn, 0, MO_64); in TRANS()
5252 read_vec_element(s, t1, a->rm, 0, MO_64); in TRANS()
5254 write_fp_dreg(s, a->rd, t0); in TRANS()
5259 TRANS(SSHL_s, do_int3_scalar_d, a, gen_sshl_i64)
5260 TRANS(USHL_s, do_int3_scalar_d, a, gen_ushl_i64)
5261 TRANS(SRSHL_s, do_int3_scalar_d, a, gen_helper_neon_rshl_s64)
5262 TRANS(URSHL_s, do_int3_scalar_d, a, gen_helper_neon_rshl_u64)
5263 TRANS(ADD_s, do_int3_scalar_d, a, tcg_gen_add_i64)
5264 TRANS(SUB_s, do_int3_scalar_d, a, tcg_gen_sub_i64)
5271 static bool do_env_scalar2(DisasContext *s, arg_rrr_e *a, const ENVScalar2 *f) in do_env_scalar2() argument
5276 if (a->esz == MO_64) { in do_env_scalar2()
5277 TCGv_i64 t0 = read_fp_dreg(s, a->rn); in do_env_scalar2()
5278 TCGv_i64 t1 = read_fp_dreg(s, a->rm); in do_env_scalar2()
5280 write_fp_dreg(s, a->rd, t0); in do_env_scalar2()
5285 read_vec_element_i32(s, t0, a->rn, 0, a->esz); in do_env_scalar2()
5286 read_vec_element_i32(s, t1, a->rm, 0, a->esz); in do_env_scalar2()
5287 f->gen_bhs[a->esz](t0, tcg_env, t0, t1); in do_env_scalar2()
5288 write_fp_sreg(s, a->rd, t0); in do_env_scalar2()
5299 TRANS(SQSHL_s, do_env_scalar2, a, &f_scalar_sqshl)
5307 TRANS(UQSHL_s, do_env_scalar2, a, &f_scalar_uqshl)
5315 TRANS(SQRSHL_s, do_env_scalar2, a, &f_scalar_sqrshl)
5323 TRANS(UQRSHL_s, do_env_scalar2, a, &f_scalar_uqrshl)
5325 static bool do_env_scalar2_hs(DisasContext *s, arg_rrr_e *a, in do_env_scalar2_hs() argument
5328 if (a->esz == MO_16 || a->esz == MO_32) { in do_env_scalar2_hs()
5329 return do_env_scalar2(s, a, f); in do_env_scalar2_hs()
5337 TRANS(SQDMULH_s, do_env_scalar2_hs, a, &f_scalar_sqdmulh)
5342 TRANS(SQRDMULH_s, do_env_scalar2_hs, a, &f_scalar_sqrdmulh)
5348 static bool do_env_scalar3_hs(DisasContext *s, arg_rrr_e *a, in do_env_scalar3_hs() argument
5353 if (a->esz != MO_16 && a->esz != MO_32) { in do_env_scalar3_hs()
5363 read_vec_element_i32(s, t0, a->rn, 0, a->esz); in do_env_scalar3_hs()
5364 read_vec_element_i32(s, t1, a->rm, 0, a->esz); in do_env_scalar3_hs()
5365 read_vec_element_i32(s, t2, a->rd, 0, a->esz); in do_env_scalar3_hs()
5366 f->gen_hs[a->esz - 1](t0, tcg_env, t0, t1, t2); in do_env_scalar3_hs()
5367 write_fp_sreg(s, a->rd, t0); in do_env_scalar3_hs()
5374 TRANS_FEAT(SQRDMLAH_s, aa64_rdm, do_env_scalar3_hs, a, &f_scalar_sqrdmlah)
5379 TRANS_FEAT(SQRDMLSH_s, aa64_rdm, do_env_scalar3_hs, a, &f_scalar_sqrdmlsh)
5381 static bool do_cmop_d(DisasContext *s, arg_rrr_e *a, TCGCond cond) in do_cmop_d() argument
5384 TCGv_i64 t0 = read_fp_dreg(s, a->rn); in do_cmop_d()
5385 TCGv_i64 t1 = read_fp_dreg(s, a->rm); in do_cmop_d()
5387 write_fp_dreg(s, a->rd, t0); in do_cmop_d()
5392 TRANS(CMGT_s, do_cmop_d, a, TCG_COND_GT) in TRANS() argument
5393 TRANS(CMHI_s, do_cmop_d, a, TCG_COND_GTU) in TRANS()
5394 TRANS(CMGE_s, do_cmop_d, a, TCG_COND_GE) in TRANS()
5395 TRANS(CMHS_s, do_cmop_d, a, TCG_COND_GEU) in TRANS()
5396 TRANS(CMEQ_s, do_cmop_d, a, TCG_COND_EQ) in TRANS()
5397 TRANS(CMTST_s, do_cmop_d, a, TCG_COND_TSTNE) in TRANS()
5399 static bool do_fp3_vector(DisasContext *s, arg_qrrr_e *a, int data, in TRANS()
5402 MemOp esz = a->esz; in TRANS()
5406 if (!a->q) { in TRANS()
5421 gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm, in TRANS()
5432 TRANS(FADD_v, do_fp3_vector, a, 0, f_vector_fadd)
5439 TRANS(FSUB_v, do_fp3_vector, a, 0, f_vector_fsub)
5446 TRANS(FDIV_v, do_fp3_vector, a, 0, f_vector_fdiv)
5453 TRANS(FMUL_v, do_fp3_vector, a, 0, f_vector_fmul)
5460 TRANS(FMAX_v, do_fp3_vector, a, 0, f_vector_fmax)
5467 TRANS(FMIN_v, do_fp3_vector, a, 0, f_vector_fmin)
5474 TRANS(FMAXNM_v, do_fp3_vector, a, 0, f_vector_fmaxnm)
5481 TRANS(FMINNM_v, do_fp3_vector, a, 0, f_vector_fminnm)
5488 TRANS(FMULX_v, do_fp3_vector, a, 0, f_vector_fmulx)
5495 TRANS(FMLA_v, do_fp3_vector, a, 0, f_vector_fmla)
5502 TRANS(FMLS_v, do_fp3_vector, a, 0, f_vector_fmls)
5509 TRANS(FCMEQ_v, do_fp3_vector, a, 0, f_vector_fcmeq)
5516 TRANS(FCMGE_v, do_fp3_vector, a, 0, f_vector_fcmge)
5523 TRANS(FCMGT_v, do_fp3_vector, a, 0, f_vector_fcmgt)
5530 TRANS(FACGE_v, do_fp3_vector, a, 0, f_vector_facge)
5537 TRANS(FACGT_v, do_fp3_vector, a, 0, f_vector_facgt)
5544 TRANS(FABD_v, do_fp3_vector, a, 0, f_vector_fabd)
5551 TRANS(FRECPS_v, do_fp3_vector, a, 0, f_vector_frecps)
5558 TRANS(FRSQRTS_v, do_fp3_vector, a, 0, f_vector_frsqrts)
5565 TRANS(FADDP_v, do_fp3_vector, a, 0, f_vector_faddp)
5572 TRANS(FMAXP_v, do_fp3_vector, a, 0, f_vector_fmaxp)
5579 TRANS(FMINP_v, do_fp3_vector, a, 0, f_vector_fminp)
5586 TRANS(FMAXNMP_v, do_fp3_vector, a, 0, f_vector_fmaxnmp)
5593 TRANS(FMINNMP_v, do_fp3_vector, a, 0, f_vector_fminnmp)
5595 static bool do_fmlal(DisasContext *s, arg_qrrr_e *a, bool is_s, bool is_2) in do_fmlal() argument
5599 tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd), in do_fmlal()
5600 vec_full_reg_offset(s, a->rn), in do_fmlal()
5601 vec_full_reg_offset(s, a->rm), tcg_env, in do_fmlal()
5602 a->q ? 16 : 8, vec_full_reg_size(s), in do_fmlal()
5608 TRANS_FEAT(FMLAL_v, aa64_fhm, do_fmlal, a, false, false) in TRANS_FEAT() argument
5609 TRANS_FEAT(FMLSL_v, aa64_fhm, do_fmlal, a, true, false) in TRANS_FEAT()
5610 TRANS_FEAT(FMLAL2_v, aa64_fhm, do_fmlal, a, false, true) in TRANS_FEAT()
5611 TRANS_FEAT(FMLSL2_v, aa64_fhm, do_fmlal, a, true, true) in TRANS_FEAT()
5613 TRANS(ADDP_v, do_gvec_fn3, a, gen_gvec_addp) in TRANS_FEAT()
5614 TRANS(SMAXP_v, do_gvec_fn3_no64, a, gen_gvec_smaxp) in TRANS_FEAT()
5615 TRANS(SMINP_v, do_gvec_fn3_no64, a, gen_gvec_sminp) in TRANS_FEAT()
5616 TRANS(UMAXP_v, do_gvec_fn3_no64, a, gen_gvec_umaxp) in TRANS_FEAT()
5617 TRANS(UMINP_v, do_gvec_fn3_no64, a, gen_gvec_uminp) in TRANS_FEAT()
5619 TRANS(AND_v, do_gvec_fn3, a, tcg_gen_gvec_and) in TRANS_FEAT()
5620 TRANS(BIC_v, do_gvec_fn3, a, tcg_gen_gvec_andc) in TRANS_FEAT()
5621 TRANS(ORR_v, do_gvec_fn3, a, tcg_gen_gvec_or) in TRANS_FEAT()
5622 TRANS(ORN_v, do_gvec_fn3, a, tcg_gen_gvec_orc) in TRANS_FEAT()
5623 TRANS(EOR_v, do_gvec_fn3, a, tcg_gen_gvec_xor) in TRANS_FEAT()
5625 static bool do_bitsel(DisasContext *s, bool is_q, int d, int a, int b, int c) in TRANS_FEAT()
5628 gen_gvec_fn4(s, is_q, d, a, b, c, tcg_gen_gvec_bitsel, 0); in TRANS_FEAT()
5633 TRANS(BSL_v, do_bitsel, a->q, a->rd, a->rd, a->rn, a->rm)
5634 TRANS(BIT_v, do_bitsel, a->q, a->rd, a->rm, a->rn, a->rd)
5635 TRANS(BIF_v, do_bitsel, a->q, a->rd, a->rm, a->rd, a->rn)
5637 TRANS(SQADD_v, do_gvec_fn3, a, gen_gvec_sqadd_qc) in TRANS() argument
5638 TRANS(UQADD_v, do_gvec_fn3, a, gen_gvec_uqadd_qc) in TRANS()
5639 TRANS(SQSUB_v, do_gvec_fn3, a, gen_gvec_sqsub_qc) in TRANS()
5640 TRANS(UQSUB_v, do_gvec_fn3, a, gen_gvec_uqsub_qc) in TRANS()
5641 TRANS(SUQADD_v, do_gvec_fn3, a, gen_gvec_suqadd_qc) in TRANS()
5642 TRANS(USQADD_v, do_gvec_fn3, a, gen_gvec_usqadd_qc) in TRANS()
5644 TRANS(SSHL_v, do_gvec_fn3, a, gen_gvec_sshl) in TRANS()
5645 TRANS(USHL_v, do_gvec_fn3, a, gen_gvec_ushl) in TRANS()
5646 TRANS(SRSHL_v, do_gvec_fn3, a, gen_gvec_srshl) in TRANS()
5647 TRANS(URSHL_v, do_gvec_fn3, a, gen_gvec_urshl) in TRANS()
5648 TRANS(SQSHL_v, do_gvec_fn3, a, gen_neon_sqshl) in TRANS()
5649 TRANS(UQSHL_v, do_gvec_fn3, a, gen_neon_uqshl) in TRANS()
5650 TRANS(SQRSHL_v, do_gvec_fn3, a, gen_neon_sqrshl) in TRANS()
5651 TRANS(UQRSHL_v, do_gvec_fn3, a, gen_neon_uqrshl) in TRANS()
5653 TRANS(ADD_v, do_gvec_fn3, a, tcg_gen_gvec_add) in TRANS()
5654 TRANS(SUB_v, do_gvec_fn3, a, tcg_gen_gvec_sub) in TRANS()
5655 TRANS(SHADD_v, do_gvec_fn3_no64, a, gen_gvec_shadd) in TRANS()
5656 TRANS(UHADD_v, do_gvec_fn3_no64, a, gen_gvec_uhadd) in TRANS()
5657 TRANS(SHSUB_v, do_gvec_fn3_no64, a, gen_gvec_shsub) in TRANS()
5658 TRANS(UHSUB_v, do_gvec_fn3_no64, a, gen_gvec_uhsub) in TRANS()
5659 TRANS(SRHADD_v, do_gvec_fn3_no64, a, gen_gvec_srhadd) in TRANS()
5660 TRANS(URHADD_v, do_gvec_fn3_no64, a, gen_gvec_urhadd) in TRANS()
5661 TRANS(SMAX_v, do_gvec_fn3_no64, a, tcg_gen_gvec_smax) in TRANS()
5662 TRANS(UMAX_v, do_gvec_fn3_no64, a, tcg_gen_gvec_umax) in TRANS()
5663 TRANS(SMIN_v, do_gvec_fn3_no64, a, tcg_gen_gvec_smin) in TRANS()
5664 TRANS(UMIN_v, do_gvec_fn3_no64, a, tcg_gen_gvec_umin) in TRANS()
5665 TRANS(SABA_v, do_gvec_fn3_no64, a, gen_gvec_saba) in TRANS()
5666 TRANS(UABA_v, do_gvec_fn3_no64, a, gen_gvec_uaba) in TRANS()
5667 TRANS(SABD_v, do_gvec_fn3_no64, a, gen_gvec_sabd) in TRANS()
5668 TRANS(UABD_v, do_gvec_fn3_no64, a, gen_gvec_uabd) in TRANS()
5669 TRANS(MUL_v, do_gvec_fn3_no64, a, tcg_gen_gvec_mul) in TRANS()
5670 TRANS(PMUL_v, do_gvec_op3_ool, a, 0, gen_helper_gvec_pmul_b) in TRANS()
5671 TRANS(MLA_v, do_gvec_fn3_no64, a, gen_gvec_mla) in TRANS()
5672 TRANS(MLS_v, do_gvec_fn3_no64, a, gen_gvec_mls) in TRANS()
5674 static bool do_cmop_v(DisasContext *s, arg_qrrr_e *a, TCGCond cond) in TRANS()
5676 if (a->esz == MO_64 && !a->q) { in TRANS()
5680 tcg_gen_gvec_cmp(cond, a->esz, in TRANS()
5681 vec_full_reg_offset(s, a->rd), in TRANS()
5682 vec_full_reg_offset(s, a->rn), in TRANS()
5683 vec_full_reg_offset(s, a->rm), in TRANS()
5684 a->q ? 16 : 8, vec_full_reg_size(s)); in TRANS()
5689 TRANS(CMGT_v, do_cmop_v, a, TCG_COND_GT) in TRANS() argument
5690 TRANS(CMHI_v, do_cmop_v, a, TCG_COND_GTU) in TRANS()
5691 TRANS(CMGE_v, do_cmop_v, a, TCG_COND_GE) in TRANS()
5692 TRANS(CMHS_v, do_cmop_v, a, TCG_COND_GEU) in TRANS()
5693 TRANS(CMEQ_v, do_cmop_v, a, TCG_COND_EQ) in TRANS()
5694 TRANS(CMTST_v, do_gvec_fn3, a, gen_gvec_cmtst) in TRANS()
5696 TRANS(SQDMULH_v, do_gvec_fn3_no8_no64, a, gen_gvec_sqdmulh_qc) in TRANS()
5697 TRANS(SQRDMULH_v, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmulh_qc) in TRANS()
5698 TRANS_FEAT(SQRDMLAH_v, aa64_rdm, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmlah_qc) in TRANS()
5699 TRANS_FEAT(SQRDMLSH_v, aa64_rdm, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmlsh_qc) in TRANS()
5701 static bool do_dot_vector(DisasContext *s, arg_qrrr_e *a, in TRANS()
5705 gen_gvec_op4_ool(s, a->q, a->rd, a->rn, a->rm, a->rd, 0, fn); in TRANS()
5710 static bool do_dot_vector_env(DisasContext *s, arg_qrrr_e *a, in do_dot_vector_env() argument
5714 gen_gvec_op4_env(s, a->q, a->rd, a->rn, a->rm, a->rd, 0, fn); in do_dot_vector_env()
5719 TRANS_FEAT(SDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_sdot_b) in TRANS_FEAT() argument
5720 TRANS_FEAT(UDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_udot_b) in TRANS_FEAT()
5721 TRANS_FEAT(USDOT_v, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usdot_b) in TRANS_FEAT()
5722 TRANS_FEAT(BFDOT_v, aa64_bf16, do_dot_vector_env, a, gen_helper_gvec_bfdot) in TRANS_FEAT()
5723 TRANS_FEAT(BFMMLA, aa64_bf16, do_dot_vector_env, a, gen_helper_gvec_bfmmla) in TRANS_FEAT()
5724 TRANS_FEAT(SMMLA, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_smmla_b) in TRANS_FEAT()
5725 TRANS_FEAT(UMMLA, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_ummla_b) in TRANS_FEAT()
5726 TRANS_FEAT(USMMLA, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usmmla_b) in TRANS_FEAT()
5728 static bool trans_BFMLAL_v(DisasContext *s, arg_qrrr_e *a) in TRANS_FEAT()
5735 gen_gvec_op4_fpst(s, true, a->rd, a->rn, a->rm, a->rd, false, a->q, in TRANS_FEAT()
5746 TRANS_FEAT(FCADD_90, aa64_fcma, do_fp3_vector, a, 0, f_vector_fcadd)
5747 TRANS_FEAT(FCADD_270, aa64_fcma, do_fp3_vector, a, 1, f_vector_fcadd)
5749 static bool trans_FCMLA_v(DisasContext *s, arg_FCMLA_v *a) in trans_FCMLA_v() argument
5756 switch (a->esz) { in trans_FCMLA_v()
5758 if (!a->q) { in trans_FCMLA_v()
5776 gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd, in trans_FCMLA_v()
5777 a->esz == MO_16, a->rot, fn); in trans_FCMLA_v()
5860 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5863 a->esz, a->q, a->rd, a->rn, a->rm, -1,
5866 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5869 a->esz, a->q, a->rd, a->rn, a->rm, -1,
5872 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5875 a->esz, a->q, a->rd, a->rn, a->rm, -1,
5879 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, a->idx,
5882 a->esz, a->q, a->rd, a->rn, a->rm, a->idx,
5885 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, a->idx,
5888 a->esz, a->q, a->rd, a->rn, a->rm, a->idx,
5891 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, a->idx,
5894 a->esz, a->q, a->rd, a->rn, a->rm, a->idx,
5932 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5935 a->esz, a->q, a->rd, a->rn, a->rm, -1,
5938 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5941 a->esz, a->q, a->rd, a->rn, a->rm, -1,
5944 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5947 a->esz, a->q, a->rd, a->rn, a->rm, -1,
5950 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
5953 a->esz, a->q, a->rd, a->rn, a->rm, -1,
6007 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
6008 a->esz == MO_16 ? gen_sqdmull_h : gen_sqdmull_s, false)
6010 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
6011 a->esz == MO_16 ? gen_sqdmlal_h : gen_sqdmlal_s, true)
6013 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, -1,
6014 a->esz == MO_16 ? gen_sqdmlsl_h : gen_sqdmlsl_s, true)
6017 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, a->idx,
6018 a->esz == MO_16 ? gen_sqdmull_h : gen_sqdmull_s, false)
6020 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, a->idx,
6021 a->esz == MO_16 ? gen_sqdmlal_h : gen_sqdmlal_s, true)
6023 a->esz | MO_SIGN, a->q, a->rd, a->rn, a->rm, a->idx,
6024 a->esz == MO_16 ? gen_sqdmlsl_h : gen_sqdmlsl_s, true)
6026 static bool do_addsub_wide(DisasContext *s, arg_qrrr_e *a, in do_addsub_wide() argument
6030 MemOp esz = a->esz; in do_addsub_wide()
6032 bool top = a->q; in do_addsub_wide()
6049 read_vec_element(s, tcg_op1, a->rm, elt + top_half, esz | sign); in do_addsub_wide()
6050 read_vec_element(s, tcg_op0, a->rn, elt, esz + 1); in do_addsub_wide()
6056 write_vec_element(s, tcg_op0, a->rd, elt, esz + 1); in do_addsub_wide()
6058 clear_vec_high(s, 1, a->rd); in do_addsub_wide()
6062 TRANS(SADDW, do_addsub_wide, a, MO_SIGN, false) in TRANS() argument
6063 TRANS(UADDW, do_addsub_wide, a, 0, false) in TRANS()
6064 TRANS(SSUBW, do_addsub_wide, a, MO_SIGN, true) in TRANS()
6065 TRANS(USUBW, do_addsub_wide, a, 0, true) in TRANS()
6067 static bool do_addsub_highnarrow(DisasContext *s, arg_qrrr_e *a, in TRANS()
6071 MemOp esz = a->esz; in TRANS()
6073 bool top = a->q; in TRANS()
6099 read_vec_element(s, tcg_op1, a->rm, elt, esz + 1); in TRANS()
6100 read_vec_element(s, tcg_op0, a->rn, elt, esz + 1); in TRANS()
6110 write_vec_element(s, tcg_op0, a->rd, elt + top_half, esz); in TRANS()
6112 clear_vec_high(s, top, a->rd); in TRANS()
6116 TRANS(ADDHN, do_addsub_highnarrow, a, false, false) in TRANS() argument
6117 TRANS(SUBHN, do_addsub_highnarrow, a, true, false) in TRANS()
6118 TRANS(RADDHN, do_addsub_highnarrow, a, false, true) in TRANS()
6119 TRANS(RSUBHN, do_addsub_highnarrow, a, true, true) in TRANS()
6121 static bool do_pmull(DisasContext *s, arg_qrrr_e *a, gen_helper_gvec_3 *fn) in TRANS()
6125 gen_gvec_op3_ool(s, true, a->rd, a->rn, a->rm, a->q, fn); in TRANS()
6130 TRANS(PMULL_p8, do_pmull, a, gen_helper_neon_pmull_h) in TRANS() argument
6131 TRANS_FEAT(PMULL_p64, aa64_pmull, do_pmull, a, gen_helper_gvec_pmull_q) in TRANS()
6137 static bool do_fp3_scalar_idx(DisasContext *s, arg_rrx_e *a, const FPScalar *f) in TRANS()
6139 switch (a->esz) { in TRANS()
6142 TCGv_i64 t0 = read_fp_dreg(s, a->rn); in TRANS()
6145 read_vec_element(s, t1, a->rm, a->idx, MO_64); in TRANS()
6147 write_fp_dreg(s, a->rd, t0); in TRANS()
6152 TCGv_i32 t0 = read_fp_sreg(s, a->rn); in TRANS()
6155 read_vec_element_i32(s, t1, a->rm, a->idx, MO_32); in TRANS()
6157 write_fp_sreg(s, a->rd, t0); in TRANS()
6165 TCGv_i32 t0 = read_fp_hreg(s, a->rn); in TRANS()
6168 read_vec_element_i32(s, t1, a->rm, a->idx, MO_16); in TRANS()
6170 write_fp_sreg(s, a->rd, t0); in TRANS()
6179 TRANS(FMUL_si, do_fp3_scalar_idx, a, &f_scalar_fmul)
6180 TRANS(FMULX_si, do_fp3_scalar_idx, a, &f_scalar_fmulx)
6182 static bool do_fmla_scalar_idx(DisasContext *s, arg_rrx_e *a, bool neg) in do_fmla_scalar_idx() argument
6184 switch (a->esz) { in do_fmla_scalar_idx()
6187 TCGv_i64 t0 = read_fp_dreg(s, a->rd); in do_fmla_scalar_idx()
6188 TCGv_i64 t1 = read_fp_dreg(s, a->rn); in do_fmla_scalar_idx()
6191 read_vec_element(s, t2, a->rm, a->idx, MO_64); in do_fmla_scalar_idx()
6196 write_fp_dreg(s, a->rd, t0); in do_fmla_scalar_idx()
6201 TCGv_i32 t0 = read_fp_sreg(s, a->rd); in do_fmla_scalar_idx()
6202 TCGv_i32 t1 = read_fp_sreg(s, a->rn); in do_fmla_scalar_idx()
6205 read_vec_element_i32(s, t2, a->rm, a->idx, MO_32); in do_fmla_scalar_idx()
6210 write_fp_sreg(s, a->rd, t0); in do_fmla_scalar_idx()
6218 TCGv_i32 t0 = read_fp_hreg(s, a->rd); in do_fmla_scalar_idx()
6219 TCGv_i32 t1 = read_fp_hreg(s, a->rn); in do_fmla_scalar_idx()
6222 read_vec_element_i32(s, t2, a->rm, a->idx, MO_16); in do_fmla_scalar_idx()
6228 write_fp_sreg(s, a->rd, t0); in do_fmla_scalar_idx()
6237 TRANS(FMLA_si, do_fmla_scalar_idx, a, false) in TRANS() argument
6238 TRANS(FMLS_si, do_fmla_scalar_idx, a, true) in TRANS()
6240 static bool do_env_scalar2_idx_hs(DisasContext *s, arg_rrx_e *a, in TRANS()
6243 if (a->esz < MO_16 || a->esz > MO_32) { in TRANS()
6250 read_vec_element_i32(s, t0, a->rn, 0, a->esz); in TRANS()
6251 read_vec_element_i32(s, t1, a->rm, a->idx, a->esz); in TRANS()
6252 f->gen_bhs[a->esz](t0, tcg_env, t0, t1); in TRANS()
6253 write_fp_sreg(s, a->rd, t0); in TRANS()
6258 TRANS(SQDMULH_si, do_env_scalar2_idx_hs, a, &f_scalar_sqdmulh)
6259 TRANS(SQRDMULH_si, do_env_scalar2_idx_hs, a, &f_scalar_sqrdmulh)
6261 static bool do_env_scalar3_idx_hs(DisasContext *s, arg_rrx_e *a, in do_env_scalar3_idx_hs() argument
6264 if (a->esz < MO_16 || a->esz > MO_32) { in do_env_scalar3_idx_hs()
6272 read_vec_element_i32(s, t0, a->rn, 0, a->esz); in do_env_scalar3_idx_hs()
6273 read_vec_element_i32(s, t1, a->rm, a->idx, a->esz); in do_env_scalar3_idx_hs()
6274 read_vec_element_i32(s, t2, a->rd, 0, a->esz); in do_env_scalar3_idx_hs()
6275 f->gen_hs[a->esz - 1](t0, tcg_env, t0, t1, t2); in do_env_scalar3_idx_hs()
6276 write_fp_sreg(s, a->rd, t0); in do_env_scalar3_idx_hs()
6281 TRANS_FEAT(SQRDMLAH_si, aa64_rdm, do_env_scalar3_idx_hs, a, &f_scalar_sqrdmlah)
6282 TRANS_FEAT(SQRDMLSH_si, aa64_rdm, do_env_scalar3_idx_hs, a, &f_scalar_sqrdmlsh)
6284 static bool do_scalar_muladd_widening_idx(DisasContext *s, arg_rrx_e *a, in do_scalar_muladd_widening_idx() argument
6294 read_vec_element(s, t0, a->rd, 0, a->esz + 1); in do_scalar_muladd_widening_idx()
6296 read_vec_element(s, t1, a->rn, 0, a->esz | MO_SIGN); in do_scalar_muladd_widening_idx()
6297 read_vec_element(s, t2, a->rm, a->idx, a->esz | MO_SIGN); in do_scalar_muladd_widening_idx()
6302 dofs = vec_full_reg_offset(s, a->rd); in do_scalar_muladd_widening_idx()
6304 write_vec_element(s, t0, a->rd, 0, a->esz + 1); in do_scalar_muladd_widening_idx()
6309 TRANS(SQDMULL_si, do_scalar_muladd_widening_idx, a,
6310 a->esz == MO_16 ? gen_sqdmull_h : gen_sqdmull_s, false)
6311 TRANS(SQDMLAL_si, do_scalar_muladd_widening_idx, a,
6312 a->esz == MO_16 ? gen_sqdmlal_h : gen_sqdmlal_s, true)
6313 TRANS(SQDMLSL_si, do_scalar_muladd_widening_idx, a,
6314 a->esz == MO_16 ? gen_sqdmlsl_h : gen_sqdmlsl_s, true)
6316 static bool do_fp3_vector_idx(DisasContext *s, arg_qrrx_e *a, in do_fp3_vector_idx() argument
6319 MemOp esz = a->esz; in do_fp3_vector_idx()
6323 if (!a->q) { in do_fp3_vector_idx()
6338 gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm, in do_fp3_vector_idx()
6339 esz == MO_16, a->idx, fns[esz - 1]); in do_fp3_vector_idx()
6349 TRANS(FMUL_vi, do_fp3_vector_idx, a, f_vector_idx_fmul)
6356 TRANS(FMULX_vi, do_fp3_vector_idx, a, f_vector_idx_fmulx) in TRANS() argument
6358 static bool do_fmla_vector_idx(DisasContext *s, arg_qrrx_e *a, bool neg) in TRANS()
6365 MemOp esz = a->esz; in TRANS()
6369 if (!a->q) { in TRANS()
6384 gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd, in TRANS()
6385 esz == MO_16, (a->idx << 1) | neg, in TRANS()
6391 TRANS(FMLA_vi, do_fmla_vector_idx, a, false) in TRANS() argument
6392 TRANS(FMLS_vi, do_fmla_vector_idx, a, true) in TRANS()
6394 static bool do_fmlal_idx(DisasContext *s, arg_qrrx_e *a, bool is_s, bool is_2) in TRANS()
6397 int data = (a->idx << 2) | (is_2 << 1) | is_s; in TRANS()
6398 tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd), in TRANS()
6399 vec_full_reg_offset(s, a->rn), in TRANS()
6400 vec_full_reg_offset(s, a->rm), tcg_env, in TRANS()
6401 a->q ? 16 : 8, vec_full_reg_size(s), in TRANS()
6407 TRANS_FEAT(FMLAL_vi, aa64_fhm, do_fmlal_idx, a, false, false) in TRANS_FEAT() argument
6408 TRANS_FEAT(FMLSL_vi, aa64_fhm, do_fmlal_idx, a, true, false) in TRANS_FEAT()
6409 TRANS_FEAT(FMLAL2_vi, aa64_fhm, do_fmlal_idx, a, false, true) in TRANS_FEAT()
6410 TRANS_FEAT(FMLSL2_vi, aa64_fhm, do_fmlal_idx, a, true, true) in TRANS_FEAT()
6412 static bool do_int3_vector_idx(DisasContext *s, arg_qrrx_e *a, in TRANS_FEAT()
6415 assert(a->esz == MO_16 || a->esz == MO_32); in TRANS_FEAT()
6417 gen_gvec_op3_ool(s, a->q, a->rd, a->rn, a->rm, a->idx, fns[a->esz - 1]); in TRANS_FEAT()
6426 TRANS(MUL_vi, do_int3_vector_idx, a, f_vector_idx_mul) in TRANS() argument
6428 static bool do_mla_vector_idx(DisasContext *s, arg_qrrx_e *a, bool sub) in TRANS()
6435 assert(a->esz == MO_16 || a->esz == MO_32); in TRANS()
6437 gen_gvec_op4_ool(s, a->q, a->rd, a->rn, a->rm, a->rd, in TRANS()
6438 a->idx, fns[a->esz - 1][sub]); in TRANS()
6443 TRANS(MLA_vi, do_mla_vector_idx, a, false) in TRANS() argument
6444 TRANS(MLS_vi, do_mla_vector_idx, a, true) in TRANS()
6446 static bool do_int3_qc_vector_idx(DisasContext *s, arg_qrrx_e *a, in TRANS()
6449 assert(a->esz == MO_16 || a->esz == MO_32); in TRANS()
6451 tcg_gen_gvec_4_ool(vec_full_reg_offset(s, a->rd), in TRANS()
6452 vec_full_reg_offset(s, a->rn), in TRANS()
6453 vec_full_reg_offset(s, a->rm), in TRANS()
6455 a->q ? 16 : 8, vec_full_reg_size(s), in TRANS()
6456 a->idx, fns[a->esz - 1]); in TRANS()
6465 TRANS(SQDMULH_vi, do_int3_qc_vector_idx, a, f_vector_idx_sqdmulh)
6471 TRANS(SQRDMULH_vi, do_int3_qc_vector_idx, a, f_vector_idx_sqrdmulh)
6477 TRANS_FEAT(SQRDMLAH_vi, aa64_rdm, do_int3_qc_vector_idx, a,
6484 TRANS_FEAT(SQRDMLSH_vi, aa64_rdm, do_int3_qc_vector_idx, a, in TRANS_FEAT() argument
6487 static bool do_dot_vector_idx(DisasContext *s, arg_qrrx_e *a, in TRANS_FEAT()
6491 gen_gvec_op4_ool(s, a->q, a->rd, a->rn, a->rm, a->rd, a->idx, fn); in TRANS_FEAT()
6496 static bool do_dot_vector_idx_env(DisasContext *s, arg_qrrx_e *a, in do_dot_vector_idx_env() argument
6500 gen_gvec_op4_env(s, a->q, a->rd, a->rn, a->rm, a->rd, a->idx, fn); in do_dot_vector_idx_env()
6505 TRANS_FEAT(SDOT_vi, aa64_dp, do_dot_vector_idx, a, gen_helper_gvec_sdot_idx_b) in TRANS_FEAT() argument
6506 TRANS_FEAT(UDOT_vi, aa64_dp, do_dot_vector_idx, a, gen_helper_gvec_udot_idx_b) in TRANS_FEAT()
6507 TRANS_FEAT(SUDOT_vi, aa64_i8mm, do_dot_vector_idx, a, in TRANS_FEAT()
6509 TRANS_FEAT(USDOT_vi, aa64_i8mm, do_dot_vector_idx, a, in TRANS_FEAT()
6511 TRANS_FEAT(BFDOT_vi, aa64_bf16, do_dot_vector_idx_env, a, in TRANS_FEAT()
6514 static bool trans_BFMLAL_vi(DisasContext *s, arg_qrrx_e *a) in TRANS_FEAT()
6521 gen_gvec_op4_fpst(s, true, a->rd, a->rn, a->rm, a->rd, 0, in TRANS_FEAT()
6522 (a->idx << 1) | a->q, in TRANS_FEAT()
6528 static bool trans_FCMLA_vi(DisasContext *s, arg_FCMLA_vi *a) in trans_FCMLA_vi() argument
6535 switch (a->esz) { in trans_FCMLA_vi()
6549 gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd, in trans_FCMLA_vi()
6550 a->esz == MO_16, (a->idx << 2) | a->rot, fn); in trans_FCMLA_vi()
6559 static bool do_fp3_scalar_pair(DisasContext *s, arg_rr_e *a, const FPScalar *f) in do_fp3_scalar_pair() argument
6561 switch (a->esz) { in do_fp3_scalar_pair()
6567 read_vec_element(s, t0, a->rn, 0, MO_64); in do_fp3_scalar_pair()
6568 read_vec_element(s, t1, a->rn, 1, MO_64); in do_fp3_scalar_pair()
6570 write_fp_dreg(s, a->rd, t0); in do_fp3_scalar_pair()
6578 read_vec_element_i32(s, t0, a->rn, 0, MO_32); in do_fp3_scalar_pair()
6579 read_vec_element_i32(s, t1, a->rn, 1, MO_32); in do_fp3_scalar_pair()
6581 write_fp_sreg(s, a->rd, t0); in do_fp3_scalar_pair()
6592 read_vec_element_i32(s, t0, a->rn, 0, MO_16); in do_fp3_scalar_pair()
6593 read_vec_element_i32(s, t1, a->rn, 1, MO_16); in do_fp3_scalar_pair()
6595 write_fp_sreg(s, a->rd, t0); in do_fp3_scalar_pair()
6604 TRANS(FADDP_s, do_fp3_scalar_pair, a, &f_scalar_fadd)
6605 TRANS(FMAXP_s, do_fp3_scalar_pair, a, &f_scalar_fmax)
6606 TRANS(FMINP_s, do_fp3_scalar_pair, a, &f_scalar_fmin)
6607 TRANS(FMAXNMP_s, do_fp3_scalar_pair, a, &f_scalar_fmaxnm)
6608 TRANS(FMINNMP_s, do_fp3_scalar_pair, a, &f_scalar_fminnm)
6610 static bool trans_ADDP_s(DisasContext *s, arg_rr_e *a) in trans_ADDP_s() argument
6616 read_vec_element(s, t0, a->rn, 0, MO_64); in trans_ADDP_s()
6617 read_vec_element(s, t1, a->rn, 1, MO_64); in trans_ADDP_s()
6619 write_fp_dreg(s, a->rd, t0); in trans_ADDP_s()
6628 static bool trans_FCSEL(DisasContext *s, arg_FCSEL *a) in trans_FCSEL() argument
6633 switch (a->esz) { in trans_FCSEL()
6653 read_vec_element(s, t_true, a->rn, 0, a->esz); in trans_FCSEL()
6654 read_vec_element(s, t_false, a->rm, 0, a->esz); in trans_FCSEL()
6656 a64_test_cc(&c, a->cond); in trans_FCSEL()
6664 write_fp_dreg(s, a->rd, t_true); in trans_FCSEL()
6672 static bool trans_EXT_d(DisasContext *s, arg_EXT_d *a) in trans_EXT_d() argument
6675 TCGv_i64 lo = read_fp_dreg(s, a->rn); in trans_EXT_d()
6676 if (a->imm != 0) { in trans_EXT_d()
6677 TCGv_i64 hi = read_fp_dreg(s, a->rm); in trans_EXT_d()
6678 tcg_gen_extract2_i64(lo, lo, hi, a->imm * 8); in trans_EXT_d()
6680 write_fp_dreg(s, a->rd, lo); in trans_EXT_d()
6685 static bool trans_EXT_q(DisasContext *s, arg_EXT_q *a) in trans_EXT_q() argument
6688 int pos = (a->imm & 7) * 8; in trans_EXT_q()
6689 int elt = a->imm >> 3; in trans_EXT_q()
6698 read_vec_element(s, lo, a->rn, elt, MO_64); in trans_EXT_q()
6700 read_vec_element(s, hi, elt & 2 ? a->rm : a->rn, elt & 1, MO_64); in trans_EXT_q()
6706 read_vec_element(s, hh, a->rm, elt & 1, MO_64); in trans_EXT_q()
6710 write_vec_element(s, lo, a->rd, 0, MO_64); in trans_EXT_q()
6711 write_vec_element(s, hi, a->rd, 1, MO_64); in trans_EXT_q()
6712 clear_vec_high(s, true, a->rd); in trans_EXT_q()
6720 static bool do_fmadd(DisasContext *s, arg_rrrr_e *a, bool neg_a, bool neg_n) in do_fmadd() argument
6729 switch (a->esz) { in do_fmadd()
6732 TCGv_i64 tn = read_fp_dreg(s, a->rn); in do_fmadd()
6733 TCGv_i64 tm = read_fp_dreg(s, a->rm); in do_fmadd()
6734 TCGv_i64 ta = read_fp_dreg(s, a->ra); in do_fmadd()
6744 write_fp_dreg(s, a->rd, ta); in do_fmadd()
6750 TCGv_i32 tn = read_fp_sreg(s, a->rn); in do_fmadd()
6751 TCGv_i32 tm = read_fp_sreg(s, a->rm); in do_fmadd()
6752 TCGv_i32 ta = read_fp_sreg(s, a->ra); in do_fmadd()
6762 write_fp_sreg(s, a->rd, ta); in do_fmadd()
6771 TCGv_i32 tn = read_fp_hreg(s, a->rn); in do_fmadd()
6772 TCGv_i32 tm = read_fp_hreg(s, a->rm); in do_fmadd()
6773 TCGv_i32 ta = read_fp_hreg(s, a->ra); in do_fmadd()
6783 write_fp_sreg(s, a->rd, ta); in do_fmadd()
6793 TRANS(FMADD, do_fmadd, a, false, false) in TRANS() argument
6794 TRANS(FNMADD, do_fmadd, a, true, true) in TRANS()
6795 TRANS(FMSUB, do_fmadd, a, false, true) in TRANS()
6796 TRANS(FNMSUB, do_fmadd, a, true, false) in TRANS()
6802 static bool do_int_reduction(DisasContext *s, arg_qrr_e *a, bool widen, in TRANS()
6806 MemOp src_mop = a->esz | src_sign; in TRANS()
6807 int elements = (a->q ? 16 : 8) >> a->esz; in TRANS()
6820 read_vec_element(s, tcg_res, a->rn, 0, src_mop); in TRANS()
6822 read_vec_element(s, tcg_elt, a->rn, i, src_mop); in TRANS()
6826 tcg_gen_ext_i64(tcg_res, tcg_res, a->esz + widen); in TRANS()
6827 write_fp_dreg(s, a->rd, tcg_res); in TRANS()
6831 TRANS(ADDV, do_int_reduction, a, false, 0, tcg_gen_add_i64)
6832 TRANS(SADDLV, do_int_reduction, a, true, MO_SIGN, tcg_gen_add_i64) in TRANS() argument
6833 TRANS(UADDLV, do_int_reduction, a, true, 0, tcg_gen_add_i64) in TRANS()
6834 TRANS(SMAXV, do_int_reduction, a, false, MO_SIGN, tcg_gen_smax_i64) in TRANS()
6835 TRANS(UMAXV, do_int_reduction, a, false, 0, tcg_gen_umax_i64) in TRANS()
6836 TRANS(SMINV, do_int_reduction, a, false, MO_SIGN, tcg_gen_smin_i64) in TRANS()
6837 TRANS(UMINV, do_int_reduction, a, false, 0, tcg_gen_umin_i64) in TRANS()
6869 static bool do_fp_reduction(DisasContext *s, arg_qrr_e *a, in do_fp_reduction() argument
6873 MemOp esz = a->esz; in do_fp_reduction()
6874 int elts = (a->q ? 16 : 8) >> esz; in do_fp_reduction()
6876 TCGv_i32 res = do_reduction_op(s, a->rn, esz, 0, elts, fpst, fn); in do_fp_reduction()
6877 write_fp_sreg(s, a->rd, res); in do_fp_reduction()
6882 TRANS_FEAT(FMAXNMV_h, aa64_fp16, do_fp_reduction, a, gen_helper_advsimd_maxnumh) in TRANS_FEAT() argument
6883 TRANS_FEAT(FMINNMV_h, aa64_fp16, do_fp_reduction, a, gen_helper_advsimd_minnumh) in TRANS_FEAT()
6884 TRANS_FEAT(FMAXV_h, aa64_fp16, do_fp_reduction, a, gen_helper_advsimd_maxh) in TRANS_FEAT()
6885 TRANS_FEAT(FMINV_h, aa64_fp16, do_fp_reduction, a, gen_helper_advsimd_minh) in TRANS_FEAT()
6887 TRANS(FMAXNMV_s, do_fp_reduction, a, gen_helper_vfp_maxnums) in TRANS_FEAT()
6888 TRANS(FMINNMV_s, do_fp_reduction, a, gen_helper_vfp_minnums) in TRANS_FEAT()
6889 TRANS(FMAXV_s, do_fp_reduction, a, gen_helper_vfp_maxs) in TRANS_FEAT()
6890 TRANS(FMINV_s, do_fp_reduction, a, gen_helper_vfp_mins) in TRANS_FEAT()
6896 static bool trans_FMOVI_s(DisasContext *s, arg_FMOVI_s *a) in TRANS_FEAT()
6898 switch (a->esz) { in TRANS_FEAT()
6911 uint64_t imm = vfp_expand_imm(a->esz, a->imm); in TRANS_FEAT()
6912 write_fp_dreg(s, a->rd, tcg_constant_i64(imm)); in TRANS_FEAT()
6921 static bool trans_FMOVI_v_h(DisasContext *s, arg_FMOVI_v_h *a) in trans_FMOVI_v_h() argument
6927 tcg_gen_gvec_dup_imm(MO_16, vec_full_reg_offset(s, a->rd), in trans_FMOVI_v_h()
6928 a->q ? 16 : 8, vec_full_reg_size(s), in trans_FMOVI_v_h()
6929 vfp_expand_imm(MO_16, a->abcdefgh)); in trans_FMOVI_v_h()
6940 static bool trans_Vimm(DisasContext *s, arg_Vimm *a) in trans_Vimm() argument
6945 if ((a->cmode & 1) && a->cmode < 12) { in trans_Vimm()
6947 fn = a->op ? tcg_gen_gvec_andi : tcg_gen_gvec_ori; in trans_Vimm()
6950 if (a->cmode == 15 && a->op == 1 && a->q == 0) { in trans_Vimm()
6957 uint64_t imm = asimd_imm_const(a->abcdefgh, a->cmode, a->op); in trans_Vimm()
6958 gen_gvec_fn2i(s, a->q, a->rd, a->rd, imm, fn, MO_64); in trans_Vimm()
6967 static bool do_vec_shift_imm(DisasContext *s, arg_qrri_e *a, GVecGen2iFn *fn) in do_vec_shift_imm() argument
6970 gen_gvec_fn2i(s, a->q, a->rd, a->rn, a->imm, fn, a->esz); in do_vec_shift_imm()
6975 TRANS(SSHR_v, do_vec_shift_imm, a, gen_gvec_sshr)
6976 TRANS(USHR_v, do_vec_shift_imm, a, gen_gvec_ushr)
6977 TRANS(SSRA_v, do_vec_shift_imm, a, gen_gvec_ssra)
6978 TRANS(USRA_v, do_vec_shift_imm, a, gen_gvec_usra)
6979 TRANS(SRSHR_v, do_vec_shift_imm, a, gen_gvec_srshr)
6980 TRANS(URSHR_v, do_vec_shift_imm, a, gen_gvec_urshr)
6981 TRANS(SRSRA_v, do_vec_shift_imm, a, gen_gvec_srsra)
6982 TRANS(URSRA_v, do_vec_shift_imm, a, gen_gvec_ursra)
6983 TRANS(SRI_v, do_vec_shift_imm, a, gen_gvec_sri)
6984 TRANS(SHL_v, do_vec_shift_imm, a, tcg_gen_gvec_shli)
6985 TRANS(SLI_v, do_vec_shift_imm, a, gen_gvec_sli);
6986 TRANS(SQSHL_vi, do_vec_shift_imm, a, gen_neon_sqshli) in TRANS() argument
6987 TRANS(UQSHL_vi, do_vec_shift_imm, a, gen_neon_uqshli) in TRANS()
6988 TRANS(SQSHLU_vi, do_vec_shift_imm, a, gen_neon_sqshlui) in TRANS()
6990 static bool do_vec_shift_imm_wide(DisasContext *s, arg_qrri_e *a, bool is_u) in TRANS()
6993 int esz = a->esz; in TRANS()
7007 read_vec_element(s, tcg_rn, a->rn, a->q, MO_64); in TRANS()
7016 tcg_gen_shli_i64(tcg_rd, tcg_rd, a->imm); in TRANS()
7017 write_vec_element(s, tcg_rd, a->rd, i, esz + 1); in TRANS()
7019 clear_vec_high(s, true, a->rd); in TRANS()
7023 TRANS(SSHLL_v, do_vec_shift_imm_wide, a, false) in TRANS() argument
7024 TRANS(USHLL_v, do_vec_shift_imm_wide, a, true) in TRANS()
7136 static bool do_vec_shift_imm_narrow(DisasContext *s, arg_qrri_e *a, in do_vec_shift_imm_narrow() argument
7140 int esz = a->esz; in do_vec_shift_imm_narrow()
7157 read_vec_element(s, tcg_rn, a->rn, i, (esz + 1) | sign); in do_vec_shift_imm_narrow()
7158 fn(tcg_rn, tcg_rn, a->imm); in do_vec_shift_imm_narrow()
7162 write_vec_element(s, tcg_rd, a->rd, a->q, MO_64); in do_vec_shift_imm_narrow()
7163 clear_vec_high(s, a->q, a->rd); in do_vec_shift_imm_narrow()
7288 TRANS(SHRN_v, do_vec_shift_imm_narrow, a, shrn_fns, 0)
7295 TRANS(RSHRN_v, do_vec_shift_imm_narrow, a, rshrn_fns, 0)
7302 TRANS(SQSHRN_v, do_vec_shift_imm_narrow, a, sqshrn_fns, MO_SIGN)
7309 TRANS(UQSHRN_v, do_vec_shift_imm_narrow, a, uqshrn_fns, 0)
7316 TRANS(SQSHRUN_v, do_vec_shift_imm_narrow, a, sqshrun_fns, MO_SIGN)
7323 TRANS(SQRSHRN_v, do_vec_shift_imm_narrow, a, sqrshrn_fns, MO_SIGN)
7330 TRANS(UQRSHRN_v, do_vec_shift_imm_narrow, a, uqrshrn_fns, 0)
7337 TRANS(SQRSHRUN_v, do_vec_shift_imm_narrow, a, sqrshrun_fns, MO_SIGN) in TRANS() argument
7343 static bool do_scalar_shift_imm(DisasContext *s, arg_rri_e *a, in TRANS()
7351 read_vec_element(s, rn, a->rn, 0, a->esz | sign); in TRANS()
7353 read_vec_element(s, rd, a->rd, 0, a->esz | sign); in TRANS()
7355 fn(rd, rn, a->imm); in TRANS()
7356 write_fp_dreg(s, a->rd, rd); in TRANS()
7361 TRANS(SSHR_s, do_scalar_shift_imm, a, gen_sshr_d, false, 0)
7362 TRANS(USHR_s, do_scalar_shift_imm, a, gen_ushr_d, false, 0)
7363 TRANS(SSRA_s, do_scalar_shift_imm, a, gen_ssra_d, true, 0)
7364 TRANS(USRA_s, do_scalar_shift_imm, a, gen_usra_d, true, 0)
7365 TRANS(SRSHR_s, do_scalar_shift_imm, a, gen_srshr_d, false, 0)
7366 TRANS(URSHR_s, do_scalar_shift_imm, a, gen_urshr_d, false, 0)
7367 TRANS(SRSRA_s, do_scalar_shift_imm, a, gen_srsra_d, true, 0)
7368 TRANS(URSRA_s, do_scalar_shift_imm, a, gen_ursra_d, true, 0)
7369 TRANS(SRI_s, do_scalar_shift_imm, a, gen_sri_d, true, 0)
7371 TRANS(SHL_s, do_scalar_shift_imm, a, tcg_gen_shli_i64, false, 0)
7372 TRANS(SLI_s, do_scalar_shift_imm, a, gen_sli_d, true, 0)
7456 TRANS(SQSHL_si, do_scalar_shift_imm, a, f_scalar_sqshli[a->esz], false, 0)
7457 TRANS(UQSHL_si, do_scalar_shift_imm, a, f_scalar_uqshli[a->esz], false, 0)
7458 TRANS(SQSHLU_si, do_scalar_shift_imm, a, f_scalar_sqshlui[a->esz], false, 0)
7460 static bool do_scalar_shift_imm_narrow(DisasContext *s, arg_rri_e *a, in do_scalar_shift_imm_narrow() argument
7464 MemOp esz = a->esz; in do_scalar_shift_imm_narrow()
7472 read_vec_element(s, rn, a->rn, 0, (esz + 1) | sign); in do_scalar_shift_imm_narrow()
7473 fns[esz](rd, rn, a->imm); in do_scalar_shift_imm_narrow()
7477 write_fp_dreg(s, a->rd, rd); in do_scalar_shift_imm_narrow()
7482 TRANS(SQSHRN_si, do_scalar_shift_imm_narrow, a, sqshrn_fns, MO_SIGN, true) in TRANS() argument
7483 TRANS(SQRSHRN_si, do_scalar_shift_imm_narrow, a, sqrshrn_fns, MO_SIGN, true) in TRANS()
7484 TRANS(UQSHRN_si, do_scalar_shift_imm_narrow, a, uqshrn_fns, 0, false) in TRANS()
7485 TRANS(UQRSHRN_si, do_scalar_shift_imm_narrow, a, uqrshrn_fns, 0, false) in TRANS()
7486 TRANS(SQSHRUN_si, do_scalar_shift_imm_narrow, a, sqshrun_fns, MO_SIGN, false) in TRANS()
7487 TRANS(SQRSHRUN_si, do_scalar_shift_imm_narrow, a, sqrshrun_fns, MO_SIGN, false) in TRANS()
11298 int fpop, opcode, a, u; in disas_simd_two_reg_misc_fp16() local
11318 a = extract32(insn, 23, 1); in disas_simd_two_reg_misc_fp16()
11324 fpop = deposit32(opcode, 5, 1, a); in disas_simd_two_reg_misc_fp16()
11590 static bool trans_OK(DisasContext *s, arg_OK *a) in trans_OK() argument
11595 static bool trans_FAIL(DisasContext *s, arg_OK *a) in trans_FAIL() argument