Lines Matching refs:dc

215 static void gen_update_fprs_dirty(DisasContext *dc, int rd)  in gen_update_fprs_dirty()  argument
221 if (!(dc->fprs_dirty & bit)) { in gen_update_fprs_dirty()
222 dc->fprs_dirty |= bit; in gen_update_fprs_dirty()
244 static TCGv_i32 gen_load_fpr_F(DisasContext *dc, unsigned int src) in gen_load_fpr_F() argument
251 static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v) in gen_store_fpr_F() argument
254 gen_update_fprs_dirty(dc, dst); in gen_store_fpr_F()
264 static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src) in gen_load_fpr_D() argument
271 static void gen_store_fpr_D(DisasContext *dc, unsigned int dst, TCGv_i64 v) in gen_store_fpr_D() argument
274 gen_update_fprs_dirty(dc, dst); in gen_store_fpr_D()
277 static TCGv_i128 gen_load_fpr_Q(DisasContext *dc, unsigned int src) in gen_load_fpr_Q() argument
280 TCGv_i64 h = gen_load_fpr_D(dc, src); in gen_load_fpr_Q()
281 TCGv_i64 l = gen_load_fpr_D(dc, src + 2); in gen_load_fpr_Q()
287 static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v) in gen_store_fpr_Q() argument
293 gen_store_fpr_D(dc, dst, h); in gen_store_fpr_Q()
294 gen_store_fpr_D(dc, dst + 2, l); in gen_store_fpr_Q()
299 #define supervisor(dc) 0 argument
300 #define hypervisor(dc) 0 argument
303 #define hypervisor(dc) (dc->hypervisor) argument
304 #define supervisor(dc) (dc->supervisor | dc->hypervisor) argument
306 #define supervisor(dc) (dc->supervisor) argument
307 #define hypervisor(dc) 0 argument
312 # define AM_CHECK(dc) false argument
314 # define AM_CHECK(dc) true argument
316 # define AM_CHECK(dc) false argument
318 # define AM_CHECK(dc) ((dc)->address_mask_32bit) argument
321 static void gen_address_mask(DisasContext *dc, TCGv addr) in gen_address_mask() argument
323 if (AM_CHECK(dc)) { in gen_address_mask()
328 static target_ulong address_mask_i(DisasContext *dc, target_ulong addr) in address_mask_i() argument
330 return AM_CHECK(dc) ? (uint32_t)addr : addr; in address_mask_i()
333 static TCGv gen_load_gpr(DisasContext *dc, int reg) in gen_load_gpr() argument
345 static void gen_store_gpr(DisasContext *dc, int reg, TCGv v) in gen_store_gpr() argument
353 static TCGv gen_dest_gpr(DisasContext *dc, int reg) in gen_dest_gpr() argument
994 static void finishing_insn(DisasContext *dc) in finishing_insn() argument
1001 if (dc->cpu_cond_live) { in finishing_insn()
1003 dc->cpu_cond_live = false; in finishing_insn()
1007 static void gen_generic_branch(DisasContext *dc) in gen_generic_branch() argument
1009 TCGv npc0 = tcg_constant_tl(dc->jump_pc[0]); in gen_generic_branch()
1010 TCGv npc1 = tcg_constant_tl(dc->jump_pc[1]); in gen_generic_branch()
1011 TCGv c2 = tcg_constant_tl(dc->jump.c2); in gen_generic_branch()
1013 tcg_gen_movcond_tl(dc->jump.cond, cpu_npc, dc->jump.c1, c2, npc0, npc1); in gen_generic_branch()
1018 static void flush_cond(DisasContext *dc) in flush_cond() argument
1020 if (dc->npc == JUMP_PC) { in flush_cond()
1021 gen_generic_branch(dc); in flush_cond()
1022 dc->npc = DYNAMIC_PC_LOOKUP; in flush_cond()
1026 static void save_npc(DisasContext *dc) in save_npc() argument
1028 if (dc->npc & 3) { in save_npc()
1029 switch (dc->npc) { in save_npc()
1031 gen_generic_branch(dc); in save_npc()
1032 dc->npc = DYNAMIC_PC_LOOKUP; in save_npc()
1041 tcg_gen_movi_tl(cpu_npc, dc->npc); in save_npc()
1045 static void save_state(DisasContext *dc) in save_state() argument
1047 tcg_gen_movi_tl(cpu_pc, dc->pc); in save_state()
1048 save_npc(dc); in save_state()
1051 static void gen_exception(DisasContext *dc, int which) in gen_exception() argument
1053 finishing_insn(dc); in gen_exception()
1054 save_state(dc); in gen_exception()
1056 dc->base.is_jmp = DISAS_NORETURN; in gen_exception()
1059 static TCGLabel *delay_exceptionv(DisasContext *dc, TCGv_i32 excp) in delay_exceptionv() argument
1063 e->next = dc->delay_excp_list; in delay_exceptionv()
1064 dc->delay_excp_list = e; in delay_exceptionv()
1068 e->pc = dc->pc; in delay_exceptionv()
1071 e->npc = dc->npc; in delay_exceptionv()
1076 static TCGLabel *delay_exception(DisasContext *dc, int excp) in delay_exception() argument
1078 return delay_exceptionv(dc, tcg_constant_i32(excp)); in delay_exception()
1081 static void gen_check_align(DisasContext *dc, TCGv addr, int mask) in gen_check_align() argument
1088 flush_cond(dc); in gen_check_align()
1089 lab = delay_exception(dc, TT_UNALIGNED); in gen_check_align()
1093 static void gen_mov_pc_npc(DisasContext *dc) in gen_mov_pc_npc() argument
1095 finishing_insn(dc); in gen_mov_pc_npc()
1097 if (dc->npc & 3) { in gen_mov_pc_npc()
1098 switch (dc->npc) { in gen_mov_pc_npc()
1100 gen_generic_branch(dc); in gen_mov_pc_npc()
1102 dc->pc = DYNAMIC_PC_LOOKUP; in gen_mov_pc_npc()
1107 dc->pc = dc->npc; in gen_mov_pc_npc()
1113 dc->pc = dc->npc; in gen_mov_pc_npc()
1118 DisasContext *dc) in gen_compare() argument
1454 static void gen_op_fpexception_im(DisasContext *dc, int ftt) in gen_op_fpexception_im() argument
1463 gen_exception(dc, TT_FP_EXCP); in gen_op_fpexception_im()
1466 static int gen_trap_ifnofpu(DisasContext *dc) in gen_trap_ifnofpu() argument
1469 if (!dc->fpu_enabled) { in gen_trap_ifnofpu()
1470 gen_exception(dc, TT_NFPU_INSN); in gen_trap_ifnofpu()
1502 static DisasASI resolve_asi(DisasContext *dc, int asi, MemOp memop) in resolve_asi() argument
1505 int mem_idx = dc->mem_idx; in resolve_asi()
1516 gen_exception(dc, TT_ILL_INSN); in resolve_asi()
1518 } else if (supervisor(dc) in resolve_asi()
1524 && (dc->def->features & CPU_FEATURE_CASA))) { in resolve_asi()
1560 mem_idx = (dc->mem_idx == MMU_PHYS_IDX) ? MMU_PHYS_IDX : mem_idx; in resolve_asi()
1562 gen_exception(dc, TT_PRIV_INSN); in resolve_asi()
1567 asi = dc->asi; in resolve_asi()
1575 if (!supervisor(dc) && asi < 0x80) { in resolve_asi()
1576 gen_exception(dc, TT_PRIV_ACT); in resolve_asi()
1596 if (hypervisor(dc)) { in resolve_asi()
1751 static void gen_ld_asi(DisasContext *dc, DisasASI *da, TCGv dst, TCGv addr) in gen_ld_asi() argument
1757 gen_exception(dc, TT_ILL_INSN); in gen_ld_asi()
1782 save_state(dc); in gen_ld_asi()
1797 static void gen_st_asi(DisasContext *dc, DisasASI *da, TCGv src, TCGv addr) in gen_st_asi() argument
1805 gen_exception(dc, TT_ILL_INSN); in gen_st_asi()
1807 } else if (!(dc->def->features & CPU_FEATURE_HYPV)) { in gen_st_asi()
1809 gen_exception(dc, TT_ILL_INSN); in gen_st_asi()
1858 save_state(dc); in gen_st_asi()
1870 dc->npc = DYNAMIC_PC; in gen_st_asi()
1876 static void gen_swap_asi(DisasContext *dc, DisasASI *da, in gen_swap_asi() argument
1888 gen_exception(dc, TT_DATA_ACCESS); in gen_swap_asi()
1893 static void gen_cas_asi(DisasContext *dc, DisasASI *da, in gen_cas_asi() argument
1905 gen_exception(dc, TT_DATA_ACCESS); in gen_cas_asi()
1910 static void gen_ldstub_asi(DisasContext *dc, DisasASI *da, TCGv dst, TCGv addr) in gen_ldstub_asi() argument
1922 if (tb_cflags(dc->base.tb) & CF_PARALLEL) { in gen_ldstub_asi()
1929 save_state(dc); in gen_ldstub_asi()
1939 dc->npc = DYNAMIC_PC; in gen_ldstub_asi()
1945 static void gen_ldf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size, in gen_ldf_asi() argument
1969 gen_store_fpr_F(dc, rd, d32); in gen_ldf_asi()
1975 gen_store_fpr_D(dc, rd, d64); in gen_ldf_asi()
1985 gen_store_fpr_D(dc, rd, d64); in gen_ldf_asi()
1986 gen_store_fpr_D(dc, rd + 2, l64); in gen_ldf_asi()
2002 gen_store_fpr_D(dc, rd + 2 * i, d64); in gen_ldf_asi()
2010 gen_exception(dc, TT_ILL_INSN); in gen_ldf_asi()
2019 gen_store_fpr_D(dc, rd, d64); in gen_ldf_asi()
2021 gen_exception(dc, TT_ILL_INSN); in gen_ldf_asi()
2030 save_state(dc); in gen_ldf_asi()
2041 gen_store_fpr_F(dc, rd, d32); in gen_ldf_asi()
2046 gen_store_fpr_D(dc, rd, d64); in gen_ldf_asi()
2055 gen_store_fpr_D(dc, rd, d64); in gen_ldf_asi()
2056 gen_store_fpr_D(dc, rd + 2, l64); in gen_ldf_asi()
2066 static void gen_stf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size, in gen_stf_asi() argument
2088 d32 = gen_load_fpr_F(dc, rd); in gen_stf_asi()
2092 d64 = gen_load_fpr_D(dc, rd); in gen_stf_asi()
2101 d64 = gen_load_fpr_D(dc, rd); in gen_stf_asi()
2105 d64 = gen_load_fpr_D(dc, rd + 2); in gen_stf_asi()
2119 d64 = gen_load_fpr_D(dc, rd + 2 * i); in gen_stf_asi()
2129 gen_exception(dc, TT_ILL_INSN); in gen_stf_asi()
2136 d64 = gen_load_fpr_D(dc, rd); in gen_stf_asi()
2139 gen_exception(dc, TT_ILL_INSN); in gen_stf_asi()
2147 gen_exception(dc, TT_ILL_INSN); in gen_stf_asi()
2152 static void gen_ldda_asi(DisasContext *dc, DisasASI *da, TCGv addr, int rd) in gen_ldda_asi() argument
2154 TCGv hi = gen_dest_gpr(dc, rd); in gen_ldda_asi()
2155 TCGv lo = gen_dest_gpr(dc, rd + 1); in gen_ldda_asi()
2231 save_state(dc); in gen_ldda_asi()
2244 gen_store_gpr(dc, rd, hi); in gen_ldda_asi()
2245 gen_store_gpr(dc, rd + 1, lo); in gen_ldda_asi()
2248 static void gen_stda_asi(DisasContext *dc, DisasASI *da, TCGv addr, int rd) in gen_stda_asi() argument
2250 TCGv hi = gen_load_gpr(dc, rd); in gen_stda_asi()
2251 TCGv lo = gen_load_gpr(dc, rd + 1); in gen_stda_asi()
2332 save_state(dc); in gen_stda_asi()
2339 static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs) in gen_fmovs() argument
2352 s1 = gen_load_fpr_F(dc, rs); in gen_fmovs()
2353 s2 = gen_load_fpr_F(dc, rd); in gen_fmovs()
2359 gen_store_fpr_F(dc, rd, dst); in gen_fmovs()
2365 static void gen_fmovd(DisasContext *dc, DisasCompare *cmp, int rd, int rs) in gen_fmovd() argument
2370 gen_load_fpr_D(dc, rs), in gen_fmovd()
2371 gen_load_fpr_D(dc, rd)); in gen_fmovd()
2372 gen_store_fpr_D(dc, rd, dst); in gen_fmovd()
2378 static void gen_fmovq(DisasContext *dc, DisasCompare *cmp, int rd, int rs) in gen_fmovq() argument
2386 gen_load_fpr_D(dc, rs), in gen_fmovq()
2387 gen_load_fpr_D(dc, rd)); in gen_fmovq()
2389 gen_load_fpr_D(dc, rs + 2), in gen_fmovq()
2390 gen_load_fpr_D(dc, rd + 2)); in gen_fmovq()
2391 gen_store_fpr_D(dc, rd, h); in gen_fmovq()
2392 gen_store_fpr_D(dc, rd + 2, l); in gen_fmovq()
2422 static int extract_dfpreg(DisasContext *dc, int x) in extract_dfpreg() argument
2431 static int extract_qfpreg(DisasContext *dc, int x) in extract_qfpreg() argument
2444 static bool trans_##NAME(DisasContext *dc, arg_##NAME *a) \
2445 { return avail_##AVAIL(dc) && FUNC(dc, __VA_ARGS__); }
2485 static bool advance_pc(DisasContext *dc) in advance_pc() argument
2489 finishing_insn(dc); in advance_pc()
2491 if (dc->npc & 3) { in advance_pc()
2492 switch (dc->npc) { in advance_pc()
2495 dc->pc = dc->npc; in advance_pc()
2503 tcg_gen_brcondi_tl(dc->jump.cond, dc->jump.c1, dc->jump.c2, l1); in advance_pc()
2506 gen_goto_tb(dc, 1, dc->jump_pc[1], dc->jump_pc[1] + 4); in advance_pc()
2510 gen_goto_tb(dc, 0, dc->jump_pc[0], dc->jump_pc[0] + 4); in advance_pc()
2512 dc->base.is_jmp = DISAS_NORETURN; in advance_pc()
2519 dc->pc = dc->npc; in advance_pc()
2520 dc->npc = dc->npc + 4; in advance_pc()
2529 static bool advance_jump_cond(DisasContext *dc, DisasCompare *cmp, in advance_jump_cond() argument
2532 target_ulong dest = address_mask_i(dc, dc->pc + disp * 4); in advance_jump_cond()
2535 finishing_insn(dc); in advance_jump_cond()
2539 dc->pc = dest; in advance_jump_cond()
2540 dc->npc = dest + 4; in advance_jump_cond()
2542 gen_mov_pc_npc(dc); in advance_jump_cond()
2543 dc->npc = dest; in advance_jump_cond()
2549 npc = dc->npc; in advance_jump_cond()
2551 gen_mov_pc_npc(dc); in advance_jump_cond()
2557 dc->pc = npc + (annul ? 4 : 0); in advance_jump_cond()
2558 dc->npc = dc->pc + 4; in advance_jump_cond()
2563 flush_cond(dc); in advance_jump_cond()
2564 npc = dc->npc; in advance_jump_cond()
2570 gen_goto_tb(dc, 0, npc, dest); in advance_jump_cond()
2572 gen_goto_tb(dc, 1, npc + 4, npc + 8); in advance_jump_cond()
2574 dc->base.is_jmp = DISAS_NORETURN; in advance_jump_cond()
2585 dc->pc = npc; in advance_jump_cond()
2591 dc->pc = npc; in advance_jump_cond()
2592 dc->npc = JUMP_PC; in advance_jump_cond()
2593 dc->jump = *cmp; in advance_jump_cond()
2594 dc->jump_pc[0] = dest; in advance_jump_cond()
2595 dc->jump_pc[1] = npc + 4; in advance_jump_cond()
2603 dc->cpu_cond_live = true; in advance_jump_cond()
2609 static bool raise_priv(DisasContext *dc) in raise_priv() argument
2611 gen_exception(dc, TT_PRIV_INSN); in raise_priv()
2615 static bool raise_unimpfpop(DisasContext *dc) in raise_unimpfpop() argument
2617 gen_op_fpexception_im(dc, FSR_FTT_UNIMPFPOP); in raise_unimpfpop()
2621 static bool gen_trap_float128(DisasContext *dc) in gen_trap_float128() argument
2623 if (dc->def->features & CPU_FEATURE_FLOAT128) { in gen_trap_float128()
2626 return raise_unimpfpop(dc); in gen_trap_float128()
2629 static bool do_bpcc(DisasContext *dc, arg_bcc *a) in do_bpcc() argument
2633 gen_compare(&cmp, a->cc, a->cond, dc); in do_bpcc()
2634 return advance_jump_cond(dc, &cmp, a->a, a->i); in do_bpcc()
2640 static bool do_fbpfcc(DisasContext *dc, arg_bcc *a) in TRANS()
2644 if (gen_trap_ifnofpu(dc)) { in TRANS()
2648 return advance_jump_cond(dc, &cmp, a->a, a->i); in TRANS()
2654 static bool trans_BPr(DisasContext *dc, arg_BPr *a) in TRANS()
2658 if (!avail_64(dc)) { in TRANS()
2661 if (!gen_compare_reg(&cmp, a->cond, gen_load_gpr(dc, a->rs1))) { in TRANS()
2664 return advance_jump_cond(dc, &cmp, a->a, a->i); in TRANS()
2667 static bool trans_CALL(DisasContext *dc, arg_CALL *a) in trans_CALL() argument
2669 target_long target = address_mask_i(dc, dc->pc + a->i * 4); in trans_CALL()
2671 gen_store_gpr(dc, 15, tcg_constant_tl(dc->pc)); in trans_CALL()
2672 gen_mov_pc_npc(dc); in trans_CALL()
2673 dc->npc = target; in trans_CALL()
2677 static bool trans_NCP(DisasContext *dc, arg_NCP *a) in trans_NCP() argument
2686 gen_exception(dc, TT_NCP_INSN); in trans_NCP()
2691 static bool trans_SETHI(DisasContext *dc, arg_SETHI *a) in trans_SETHI() argument
2695 gen_store_gpr(dc, a->rd, tcg_constant_tl((uint32_t)a->i << 10)); in trans_SETHI()
2697 return advance_pc(dc); in trans_SETHI()
2704 static bool do_tcc(DisasContext *dc, int cond, int cc, in do_tcc() argument
2707 int mask = ((dc->def->features & CPU_FEATURE_HYPV) && supervisor(dc) in do_tcc()
2715 return advance_pc(dc); in do_tcc()
2726 tcg_gen_trunc_tl_i32(trap, gen_load_gpr(dc, rs1)); in do_tcc()
2731 tcg_gen_trunc_tl_i32(t2, gen_load_gpr(dc, rs2_or_imm)); in do_tcc()
2738 finishing_insn(dc); in do_tcc()
2742 save_state(dc); in do_tcc()
2744 dc->base.is_jmp = DISAS_NORETURN; in do_tcc()
2749 flush_cond(dc); in do_tcc()
2750 lab = delay_exceptionv(dc, trap); in do_tcc()
2751 gen_compare(&cmp, cc, cond, dc); in do_tcc()
2754 return advance_pc(dc); in do_tcc()
2757 static bool trans_Tcc_r(DisasContext *dc, arg_Tcc_r *a) in trans_Tcc_r() argument
2759 if (avail_32(dc) && a->cc) { in trans_Tcc_r()
2762 return do_tcc(dc, a->cond, a->cc, a->rs1, false, a->rs2); in trans_Tcc_r()
2765 static bool trans_Tcc_i_v7(DisasContext *dc, arg_Tcc_i_v7 *a) in trans_Tcc_i_v7() argument
2767 if (avail_64(dc)) { in trans_Tcc_i_v7()
2770 return do_tcc(dc, a->cond, 0, a->rs1, true, a->i); in trans_Tcc_i_v7()
2773 static bool trans_Tcc_i_v9(DisasContext *dc, arg_Tcc_i_v9 *a) in trans_Tcc_i_v9() argument
2775 if (avail_32(dc)) { in trans_Tcc_i_v9()
2778 return do_tcc(dc, a->cond, a->cc, a->rs1, true, a->i); in trans_Tcc_i_v9()
2781 static bool trans_STBAR(DisasContext *dc, arg_STBAR *a) in trans_STBAR() argument
2784 return advance_pc(dc); in trans_STBAR()
2787 static bool trans_MEMBAR(DisasContext *dc, arg_MEMBAR *a) in trans_MEMBAR() argument
2789 if (avail_32(dc)) { in trans_MEMBAR()
2798 dc->base.is_jmp = DISAS_EXIT; in trans_MEMBAR()
2800 return advance_pc(dc); in trans_MEMBAR()
2803 static bool do_rd_special(DisasContext *dc, bool priv, int rd, in do_rd_special() argument
2807 return raise_priv(dc); in do_rd_special()
2809 gen_store_gpr(dc, rd, func(dc, gen_dest_gpr(dc, rd))); in do_rd_special()
2810 return advance_pc(dc); in do_rd_special()
2813 static TCGv do_rdy(DisasContext *dc, TCGv dst) in do_rdy() argument
2818 static bool trans_RDY(DisasContext *dc, arg_RDY *a) in trans_RDY() argument
2825 if (avail_64(dc) && a->rs1 != 0) { in trans_RDY()
2828 return do_rd_special(dc, true, a->rd, do_rdy); in trans_RDY()
2831 static TCGv do_rd_leon3_config(DisasContext *dc, TCGv dst) in do_rd_leon3_config() argument
2839 static TCGv do_rdccr(DisasContext *dc, TCGv dst) in do_rdccr() argument
2847 static TCGv do_rdasi(DisasContext *dc, TCGv dst) in do_rdasi() argument
2850 return tcg_constant_tl(dc->asi); in do_rdasi()
2858 static TCGv do_rdtick(DisasContext *dc, TCGv dst) in do_rdtick() argument
2863 if (translator_io_start(&dc->base)) { in do_rdtick()
2864 dc->base.is_jmp = DISAS_EXIT; in do_rdtick()
2867 tcg_constant_i32(dc->mem_idx)); in do_rdtick()
2874 static TCGv do_rdpc(DisasContext *dc, TCGv dst) in do_rdpc() argument
2876 return tcg_constant_tl(address_mask_i(dc, dc->pc)); in do_rdpc()
2881 static TCGv do_rdfprs(DisasContext *dc, TCGv dst) in do_rdfprs() argument
2889 static TCGv do_rdgsr(DisasContext *dc, TCGv dst) in do_rdgsr() argument
2891 gen_trap_ifnofpu(dc); in do_rdgsr()
2897 static TCGv do_rdsoftint(DisasContext *dc, TCGv dst) in do_rdsoftint() argument
2903 TRANS(RDSOFTINT, 64, do_rd_special, supervisor(dc), a->rd, do_rdsoftint)
2905 static TCGv do_rdtick_cmpr(DisasContext *dc, TCGv dst) in do_rdtick_cmpr() argument
2914 static TCGv do_rdstick(DisasContext *dc, TCGv dst) in do_rdstick() argument
2919 if (translator_io_start(&dc->base)) { in do_rdstick()
2920 dc->base.is_jmp = DISAS_EXIT; in do_rdstick()
2923 tcg_constant_i32(dc->mem_idx)); in do_rdstick()
2930 static TCGv do_rdstick_cmpr(DisasContext *dc, TCGv dst) in do_rdstick_cmpr() argument
2937 TRANS(RDSTICK_CMPR, 64, do_rd_special, supervisor(dc), a->rd, do_rdstick_cmpr)
2944 static TCGv do_rdstrand_status(DisasContext *dc, TCGv dst) in do_rdstrand_status() argument
2951 static TCGv do_rdpsr(DisasContext *dc, TCGv dst) in do_rdpsr() argument
2957 TRANS(RDPSR, 32, do_rd_special, supervisor(dc), a->rd, do_rdpsr)
2959 static TCGv do_rdhpstate(DisasContext *dc, TCGv dst) in do_rdhpstate() argument
2965 TRANS(RDHPR_hpstate, HYPV, do_rd_special, hypervisor(dc), a->rd, do_rdhpstate)
2967 static TCGv do_rdhtstate(DisasContext *dc, TCGv dst) in do_rdhtstate() argument
2982 TRANS(RDHPR_htstate, HYPV, do_rd_special, hypervisor(dc), a->rd, do_rdhtstate)
2984 static TCGv do_rdhintp(DisasContext *dc, TCGv dst) in do_rdhintp() argument
2990 TRANS(RDHPR_hintp, HYPV, do_rd_special, hypervisor(dc), a->rd, do_rdhintp)
2992 static TCGv do_rdhtba(DisasContext *dc, TCGv dst) in do_rdhtba() argument
2998 TRANS(RDHPR_htba, HYPV, do_rd_special, hypervisor(dc), a->rd, do_rdhtba)
3000 static TCGv do_rdhver(DisasContext *dc, TCGv dst) in do_rdhver() argument
3006 TRANS(RDHPR_hver, HYPV, do_rd_special, hypervisor(dc), a->rd, do_rdhver)
3008 static TCGv do_rdhstick_cmpr(DisasContext *dc, TCGv dst) in do_rdhstick_cmpr() argument
3014 TRANS(RDHPR_hstick_cmpr, HYPV, do_rd_special, hypervisor(dc), a->rd,
3017 static TCGv do_rdwim(DisasContext *dc, TCGv dst) in do_rdwim() argument
3023 TRANS(RDWIM, 32, do_rd_special, supervisor(dc), a->rd, do_rdwim)
3025 static TCGv do_rdtpc(DisasContext *dc, TCGv dst) in do_rdtpc() argument
3038 TRANS(RDPR_tpc, 64, do_rd_special, supervisor(dc), a->rd, do_rdtpc)
3040 static TCGv do_rdtnpc(DisasContext *dc, TCGv dst) in do_rdtnpc() argument
3053 TRANS(RDPR_tnpc, 64, do_rd_special, supervisor(dc), a->rd, do_rdtnpc)
3055 static TCGv do_rdtstate(DisasContext *dc, TCGv dst) in do_rdtstate() argument
3068 TRANS(RDPR_tstate, 64, do_rd_special, supervisor(dc), a->rd, do_rdtstate)
3070 static TCGv do_rdtt(DisasContext *dc, TCGv dst) in do_rdtt() argument
3083 TRANS(RDPR_tt, 64, do_rd_special, supervisor(dc), a->rd, do_rdtt)
3084 TRANS(RDPR_tick, 64, do_rd_special, supervisor(dc), a->rd, do_rdtick)
3086 static TCGv do_rdtba(DisasContext *dc, TCGv dst) in do_rdtba() argument
3091 TRANS(RDTBR, 32, do_rd_special, supervisor(dc), a->rd, do_rdtba)
3092 TRANS(RDPR_tba, 64, do_rd_special, supervisor(dc), a->rd, do_rdtba)
3094 static TCGv do_rdpstate(DisasContext *dc, TCGv dst) in do_rdpstate() argument
3100 TRANS(RDPR_pstate, 64, do_rd_special, supervisor(dc), a->rd, do_rdpstate)
3102 static TCGv do_rdtl(DisasContext *dc, TCGv dst) in do_rdtl() argument
3108 TRANS(RDPR_tl, 64, do_rd_special, supervisor(dc), a->rd, do_rdtl)
3110 static TCGv do_rdpil(DisasContext *dc, TCGv dst) in do_rdpil() argument
3116 TRANS(RDPR_pil, 64, do_rd_special, supervisor(dc), a->rd, do_rdpil)
3118 static TCGv do_rdcwp(DisasContext *dc, TCGv dst) in do_rdcwp() argument
3124 TRANS(RDPR_cwp, 64, do_rd_special, supervisor(dc), a->rd, do_rdcwp)
3126 static TCGv do_rdcansave(DisasContext *dc, TCGv dst) in do_rdcansave() argument
3132 TRANS(RDPR_cansave, 64, do_rd_special, supervisor(dc), a->rd, do_rdcansave)
3134 static TCGv do_rdcanrestore(DisasContext *dc, TCGv dst) in do_rdcanrestore() argument
3140 TRANS(RDPR_canrestore, 64, do_rd_special, supervisor(dc), a->rd,
3143 static TCGv do_rdcleanwin(DisasContext *dc, TCGv dst) in do_rdcleanwin() argument
3149 TRANS(RDPR_cleanwin, 64, do_rd_special, supervisor(dc), a->rd, do_rdcleanwin)
3151 static TCGv do_rdotherwin(DisasContext *dc, TCGv dst) in do_rdotherwin() argument
3157 TRANS(RDPR_otherwin, 64, do_rd_special, supervisor(dc), a->rd, do_rdotherwin)
3159 static TCGv do_rdwstate(DisasContext *dc, TCGv dst) in do_rdwstate() argument
3165 TRANS(RDPR_wstate, 64, do_rd_special, supervisor(dc), a->rd, do_rdwstate)
3167 static TCGv do_rdgl(DisasContext *dc, TCGv dst) in do_rdgl() argument
3173 TRANS(RDPR_gl, GL, do_rd_special, supervisor(dc), a->rd, do_rdgl)
3176 static TCGv do_rdssr(DisasContext *dc, TCGv dst) in do_rdssr() argument
3182 TRANS(RDPR_strand_status, HYPV, do_rd_special, hypervisor(dc), a->rd, do_rdssr)
3184 static TCGv do_rdver(DisasContext *dc, TCGv dst) in do_rdver() argument
3190 TRANS(RDPR_ver, 64, do_rd_special, supervisor(dc), a->rd, do_rdver)
3192 static bool trans_FLUSHW(DisasContext *dc, arg_FLUSHW *a) in trans_FLUSHW() argument
3194 if (avail_64(dc)) { in trans_FLUSHW()
3196 return advance_pc(dc); in trans_FLUSHW()
3201 static bool do_wr_special(DisasContext *dc, arg_r_r_ri *a, bool priv, in do_wr_special() argument
3211 return raise_priv(dc); in do_wr_special()
3217 TCGv src1 = gen_load_gpr(dc, a->rs1); in do_wr_special()
3225 tcg_gen_xor_tl(src, src1, gen_load_gpr(dc, a->rs2_or_imm)); in do_wr_special()
3229 func(dc, src); in do_wr_special()
3230 return advance_pc(dc); in do_wr_special()
3233 static void do_wry(DisasContext *dc, TCGv src) in do_wry() argument
3240 static void do_wrccr(DisasContext *dc, TCGv src) in TRANS()
3247 static void do_wrasi(DisasContext *dc, TCGv src) in do_wrasi() argument
3254 dc->base.is_jmp = DISAS_EXIT; in do_wrasi()
3259 static void do_wrfprs(DisasContext *dc, TCGv src) in do_wrfprs() argument
3263 dc->fprs_dirty = 0; in do_wrfprs()
3264 dc->base.is_jmp = DISAS_EXIT; in do_wrfprs()
3272 static void do_wrgsr(DisasContext *dc, TCGv src) in do_wrgsr() argument
3274 gen_trap_ifnofpu(dc); in do_wrgsr()
3280 static void do_wrsoftint_set(DisasContext *dc, TCGv src) in do_wrsoftint_set() argument
3285 TRANS(WRSOFTINT_SET, 64, do_wr_special, a, supervisor(dc), do_wrsoftint_set)
3287 static void do_wrsoftint_clr(DisasContext *dc, TCGv src) in do_wrsoftint_clr() argument
3292 TRANS(WRSOFTINT_CLR, 64, do_wr_special, a, supervisor(dc), do_wrsoftint_clr)
3294 static void do_wrsoftint(DisasContext *dc, TCGv src) in do_wrsoftint() argument
3299 TRANS(WRSOFTINT, 64, do_wr_special, a, supervisor(dc), do_wrsoftint)
3301 static void do_wrtick_cmpr(DisasContext *dc, TCGv src) in do_wrtick_cmpr() argument
3307 translator_io_start(&dc->base); in do_wrtick_cmpr()
3310 dc->base.is_jmp = DISAS_EXIT; in do_wrtick_cmpr()
3313 TRANS(WRTICK_CMPR, 64, do_wr_special, a, supervisor(dc), do_wrtick_cmpr)
3315 static void do_wrstick(DisasContext *dc, TCGv src) in do_wrstick() argument
3321 translator_io_start(&dc->base); in do_wrstick()
3324 dc->base.is_jmp = DISAS_EXIT; in do_wrstick()
3330 TRANS(WRSTICK, 64, do_wr_special, a, supervisor(dc), do_wrstick)
3332 static void do_wrstick_cmpr(DisasContext *dc, TCGv src) in do_wrstick_cmpr() argument
3338 translator_io_start(&dc->base); in do_wrstick_cmpr()
3341 dc->base.is_jmp = DISAS_EXIT; in do_wrstick_cmpr()
3344 TRANS(WRSTICK_CMPR, 64, do_wr_special, a, supervisor(dc), do_wrstick_cmpr)
3346 static void do_wrpowerdown(DisasContext *dc, TCGv src) in do_wrpowerdown() argument
3348 finishing_insn(dc); in do_wrpowerdown()
3349 save_state(dc); in do_wrpowerdown()
3353 TRANS(WRPOWERDOWN, POWERDOWN, do_wr_special, a, supervisor(dc), do_wrpowerdown) in TRANS() argument
3355 static void do_wrmwait(DisasContext *dc, TCGv src) in TRANS()
3361 dc->base.is_jmp = DISAS_EXIT; in TRANS()
3366 static void do_wrpsr(DisasContext *dc, TCGv src) in TRANS()
3369 dc->base.is_jmp = DISAS_EXIT; in TRANS()
3372 TRANS(WRPSR, 32, do_wr_special, a, supervisor(dc), do_wrpsr)
3374 static void do_wrwim(DisasContext *dc, TCGv src) in do_wrwim() argument
3376 target_ulong mask = MAKE_64BIT_MASK(0, dc->def->nwindows); in do_wrwim()
3383 TRANS(WRWIM, 32, do_wr_special, a, supervisor(dc), do_wrwim)
3385 static void do_wrtpc(DisasContext *dc, TCGv src) in do_wrtpc() argument
3397 TRANS(WRPR_tpc, 64, do_wr_special, a, supervisor(dc), do_wrtpc)
3399 static void do_wrtnpc(DisasContext *dc, TCGv src) in do_wrtnpc() argument
3411 TRANS(WRPR_tnpc, 64, do_wr_special, a, supervisor(dc), do_wrtnpc)
3413 static void do_wrtstate(DisasContext *dc, TCGv src) in do_wrtstate() argument
3425 TRANS(WRPR_tstate, 64, do_wr_special, a, supervisor(dc), do_wrtstate)
3427 static void do_wrtt(DisasContext *dc, TCGv src) in do_wrtt() argument
3439 TRANS(WRPR_tt, 64, do_wr_special, a, supervisor(dc), do_wrtt)
3441 static void do_wrtick(DisasContext *dc, TCGv src) in do_wrtick() argument
3446 translator_io_start(&dc->base); in do_wrtick()
3449 dc->base.is_jmp = DISAS_EXIT; in do_wrtick()
3452 TRANS(WRPR_tick, 64, do_wr_special, a, supervisor(dc), do_wrtick)
3454 static void do_wrtba(DisasContext *dc, TCGv src) in do_wrtba() argument
3459 TRANS(WRPR_tba, 64, do_wr_special, a, supervisor(dc), do_wrtba)
3461 static void do_wrpstate(DisasContext *dc, TCGv src) in do_wrpstate() argument
3463 save_state(dc); in do_wrpstate()
3464 if (translator_io_start(&dc->base)) { in do_wrpstate()
3465 dc->base.is_jmp = DISAS_EXIT; in do_wrpstate()
3468 dc->npc = DYNAMIC_PC; in do_wrpstate()
3471 TRANS(WRPR_pstate, 64, do_wr_special, a, supervisor(dc), do_wrpstate)
3473 static void do_wrtl(DisasContext *dc, TCGv src) in do_wrtl() argument
3475 save_state(dc); in do_wrtl()
3477 dc->npc = DYNAMIC_PC; in do_wrtl()
3480 TRANS(WRPR_tl, 64, do_wr_special, a, supervisor(dc), do_wrtl)
3482 static void do_wrpil(DisasContext *dc, TCGv src) in do_wrpil() argument
3484 if (translator_io_start(&dc->base)) { in do_wrpil()
3485 dc->base.is_jmp = DISAS_EXIT; in do_wrpil()
3490 TRANS(WRPR_pil, 64, do_wr_special, a, supervisor(dc), do_wrpil)
3492 static void do_wrcwp(DisasContext *dc, TCGv src) in do_wrcwp() argument
3497 TRANS(WRPR_cwp, 64, do_wr_special, a, supervisor(dc), do_wrcwp)
3499 static void do_wrcansave(DisasContext *dc, TCGv src) in do_wrcansave() argument
3504 TRANS(WRPR_cansave, 64, do_wr_special, a, supervisor(dc), do_wrcansave)
3506 static void do_wrcanrestore(DisasContext *dc, TCGv src) in do_wrcanrestore() argument
3511 TRANS(WRPR_canrestore, 64, do_wr_special, a, supervisor(dc), do_wrcanrestore)
3513 static void do_wrcleanwin(DisasContext *dc, TCGv src) in do_wrcleanwin() argument
3518 TRANS(WRPR_cleanwin, 64, do_wr_special, a, supervisor(dc), do_wrcleanwin)
3520 static void do_wrotherwin(DisasContext *dc, TCGv src) in do_wrotherwin() argument
3525 TRANS(WRPR_otherwin, 64, do_wr_special, a, supervisor(dc), do_wrotherwin)
3527 static void do_wrwstate(DisasContext *dc, TCGv src) in do_wrwstate() argument
3532 TRANS(WRPR_wstate, 64, do_wr_special, a, supervisor(dc), do_wrwstate)
3534 static void do_wrgl(DisasContext *dc, TCGv src) in do_wrgl() argument
3539 TRANS(WRPR_gl, GL, do_wr_special, a, supervisor(dc), do_wrgl) in TRANS() argument
3542 static void do_wrssr(DisasContext *dc, TCGv src) in TRANS()
3547 TRANS(WRPR_strand_status, HYPV, do_wr_special, a, hypervisor(dc), do_wrssr) in TRANS() argument
3549 TRANS(WRTBR, 32, do_wr_special, a, supervisor(dc), do_wrtba) in TRANS()
3551 static void do_wrhpstate(DisasContext *dc, TCGv src) in TRANS()
3554 dc->base.is_jmp = DISAS_EXIT; in TRANS()
3557 TRANS(WRHPR_hpstate, HYPV, do_wr_special, a, hypervisor(dc), do_wrhpstate) in TRANS() argument
3559 static void do_wrhtstate(DisasContext *dc, TCGv src) in TRANS()
3573 TRANS(WRHPR_htstate, HYPV, do_wr_special, a, hypervisor(dc), do_wrhtstate) in TRANS() argument
3575 static void do_wrhintp(DisasContext *dc, TCGv src) in TRANS()
3580 TRANS(WRHPR_hintp, HYPV, do_wr_special, a, hypervisor(dc), do_wrhintp) in TRANS() argument
3582 static void do_wrhtba(DisasContext *dc, TCGv src) in TRANS()
3587 TRANS(WRHPR_htba, HYPV, do_wr_special, a, hypervisor(dc), do_wrhtba) in TRANS() argument
3589 static void do_wrhstick_cmpr(DisasContext *dc, TCGv src) in TRANS()
3595 translator_io_start(&dc->base); in TRANS()
3598 dc->base.is_jmp = DISAS_EXIT; in TRANS()
3601 TRANS(WRHPR_hstick_cmpr, HYPV, do_wr_special, a, hypervisor(dc), in TRANS() argument
3604 static bool do_saved_restored(DisasContext *dc, bool saved) in TRANS()
3606 if (!supervisor(dc)) { in TRANS()
3607 return raise_priv(dc); in TRANS()
3614 return advance_pc(dc); in TRANS()
3620 static bool trans_NOP(DisasContext *dc, arg_NOP *a) in trans_NOP() argument
3622 return advance_pc(dc); in trans_NOP()
3632 static bool do_arith_int(DisasContext *dc, arg_r_r_ri_cc *a, in do_arith_int() argument
3647 dst = gen_dest_gpr(dc, a->rd); in do_arith_int()
3649 src1 = gen_load_gpr(dc, a->rs1); in do_arith_int()
3671 gen_store_gpr(dc, a->rd, dst); in do_arith_int()
3672 return advance_pc(dc); in do_arith_int()
3675 static bool do_arith(DisasContext *dc, arg_r_r_ri_cc *a, in do_arith() argument
3681 return do_arith_int(dc, a, func_cc, NULL, false); in do_arith()
3683 return do_arith_int(dc, a, func, funci, false); in do_arith()
3686 static bool do_logic(DisasContext *dc, arg_r_r_ri_cc *a, in do_logic() argument
3690 return do_arith_int(dc, a, func, funci, a->cc); in do_logic()
3720 static bool trans_OR(DisasContext *dc, arg_r_r_ri_cc *a) in TRANS()
3725 gen_store_gpr(dc, a->rd, tcg_constant_tl(a->rs2_or_imm)); in TRANS()
3730 gen_store_gpr(dc, a->rd, cpu_regs[a->rs2_or_imm]); in TRANS()
3732 return advance_pc(dc); in TRANS()
3734 return do_logic(dc, a, tcg_gen_or_tl, tcg_gen_ori_tl); in TRANS()
3737 static bool trans_UDIV(DisasContext *dc, arg_r_r_ri *a) in trans_UDIV() argument
3742 if (!avail_DIV(dc)) { in trans_UDIV()
3751 gen_exception(dc, TT_DIV_ZERO); in trans_UDIV()
3761 finishing_insn(dc); in trans_UDIV()
3762 flush_cond(dc); in trans_UDIV()
3767 lab = delay_exception(dc, TT_DIV_ZERO); in trans_UDIV()
3779 tcg_gen_concat_tl_i64(t1, gen_load_gpr(dc, a->rs1), cpu_y); in trans_UDIV()
3784 dst = gen_dest_gpr(dc, a->rd); in trans_UDIV()
3786 gen_store_gpr(dc, a->rd, dst); in trans_UDIV()
3787 return advance_pc(dc); in trans_UDIV()
3790 static bool trans_UDIVX(DisasContext *dc, arg_r_r_ri *a) in trans_UDIVX() argument
3794 if (!avail_64(dc)) { in trans_UDIVX()
3803 gen_exception(dc, TT_DIV_ZERO); in trans_UDIVX()
3812 finishing_insn(dc); in trans_UDIVX()
3813 flush_cond(dc); in trans_UDIVX()
3815 lab = delay_exception(dc, TT_DIV_ZERO); in trans_UDIVX()
3820 dst = gen_dest_gpr(dc, a->rd); in trans_UDIVX()
3821 src1 = gen_load_gpr(dc, a->rs1); in trans_UDIVX()
3824 gen_store_gpr(dc, a->rd, dst); in trans_UDIVX()
3825 return advance_pc(dc); in trans_UDIVX()
3828 static bool trans_SDIVX(DisasContext *dc, arg_r_r_ri *a) in trans_SDIVX() argument
3832 if (!avail_64(dc)) { in trans_SDIVX()
3841 gen_exception(dc, TT_DIV_ZERO); in trans_SDIVX()
3845 dst = gen_dest_gpr(dc, a->rd); in trans_SDIVX()
3846 src1 = gen_load_gpr(dc, a->rs1); in trans_SDIVX()
3851 gen_store_gpr(dc, a->rd, dst); in trans_SDIVX()
3852 return advance_pc(dc); in trans_SDIVX()
3859 finishing_insn(dc); in trans_SDIVX()
3860 flush_cond(dc); in trans_SDIVX()
3862 lab = delay_exception(dc, TT_DIV_ZERO); in trans_SDIVX()
3881 gen_store_gpr(dc, a->rd, dst); in trans_SDIVX()
3882 return advance_pc(dc); in trans_SDIVX()
3885 static bool gen_edge(DisasContext *dc, arg_r_r_r *a, in gen_edge() argument
3889 uint64_t amask = address_mask_i(dc, -8); in gen_edge()
3891 dst = gen_dest_gpr(dc, a->rd); in gen_edge()
3892 s1 = gen_load_gpr(dc, a->rs1); in gen_edge()
3893 s2 = gen_load_gpr(dc, a->rs2); in gen_edge()
3946 gen_store_gpr(dc, a->rd, dst); in gen_edge()
3947 return advance_pc(dc); in gen_edge()
3964 static bool do_rr(DisasContext *dc, arg_r_r *a, in do_rr() argument
3967 TCGv dst = gen_dest_gpr(dc, a->rd); in do_rr()
3968 TCGv src = gen_load_gpr(dc, a->rs); in do_rr()
3971 gen_store_gpr(dc, a->rd, dst); in do_rr()
3972 return advance_pc(dc); in do_rr()
3977 static bool do_rrr(DisasContext *dc, arg_r_r_r *a, in TRANS()
3980 TCGv dst = gen_dest_gpr(dc, a->rd); in TRANS()
3981 TCGv src1 = gen_load_gpr(dc, a->rs1); in TRANS()
3982 TCGv src2 = gen_load_gpr(dc, a->rs2); in TRANS()
3985 gen_store_gpr(dc, a->rd, dst); in TRANS()
3986 return advance_pc(dc); in TRANS()
4043 static bool do_cmask(DisasContext *dc, int rs2, void (*func)(TCGv, TCGv, TCGv)) in TRANS()
4045 func(cpu_gsr, cpu_gsr, gen_load_gpr(dc, rs2)); in TRANS()
4053 static bool do_shift_r(DisasContext *dc, arg_shiftr *a, bool l, bool u) in do_shift_r() argument
4058 if (avail_32(dc) && a->x) { in do_shift_r()
4063 tcg_gen_andi_tl(src2, gen_load_gpr(dc, a->rs2), a->x ? 63 : 31); in do_shift_r()
4064 src1 = gen_load_gpr(dc, a->rs1); in do_shift_r()
4065 dst = gen_dest_gpr(dc, a->rd); in do_shift_r()
4085 gen_store_gpr(dc, a->rd, dst); in do_shift_r()
4086 return advance_pc(dc); in do_shift_r()
4093 static bool do_shift_i(DisasContext *dc, arg_shifti *a, bool l, bool u) in TRANS()
4098 if (avail_32(dc) && (a->x || a->i >= 32)) { in TRANS()
4102 src1 = gen_load_gpr(dc, a->rs1); in TRANS()
4103 dst = gen_dest_gpr(dc, a->rd); in TRANS()
4105 if (avail_32(dc) || a->x) { in TRANS()
4122 gen_store_gpr(dc, a->rd, dst); in TRANS()
4123 return advance_pc(dc); in TRANS()
4130 static TCGv gen_rs2_or_imm(DisasContext *dc, bool imm, int rs2_or_imm) in TRANS()
4143 static bool do_mov_cond(DisasContext *dc, DisasCompare *cmp, int rd, TCGv src2) in do_mov_cond() argument
4145 TCGv dst = gen_load_gpr(dc, rd); in do_mov_cond()
4149 gen_store_gpr(dc, rd, dst); in do_mov_cond()
4150 return advance_pc(dc); in do_mov_cond()
4153 static bool trans_MOVcc(DisasContext *dc, arg_MOVcc *a) in trans_MOVcc() argument
4155 TCGv src2 = gen_rs2_or_imm(dc, a->imm, a->rs2_or_imm); in trans_MOVcc()
4161 gen_compare(&cmp, a->cc, a->cond, dc); in trans_MOVcc()
4162 return do_mov_cond(dc, &cmp, a->rd, src2); in trans_MOVcc()
4165 static bool trans_MOVfcc(DisasContext *dc, arg_MOVfcc *a) in trans_MOVfcc() argument
4167 TCGv src2 = gen_rs2_or_imm(dc, a->imm, a->rs2_or_imm); in trans_MOVfcc()
4174 return do_mov_cond(dc, &cmp, a->rd, src2); in trans_MOVfcc()
4177 static bool trans_MOVR(DisasContext *dc, arg_MOVR *a) in trans_MOVR() argument
4179 TCGv src2 = gen_rs2_or_imm(dc, a->imm, a->rs2_or_imm); in trans_MOVR()
4185 if (!gen_compare_reg(&cmp, a->cond, gen_load_gpr(dc, a->rs1))) { in trans_MOVR()
4188 return do_mov_cond(dc, &cmp, a->rd, src2); in trans_MOVR()
4191 static bool do_add_special(DisasContext *dc, arg_r_r_ri *a, in do_add_special() argument
4192 bool (*func)(DisasContext *dc, int rd, TCGv src)) in do_add_special() argument
4207 src1 = gen_load_gpr(dc, a->rs1); in do_add_special()
4213 return func(dc, a->rd, sum); in do_add_special()
4216 static bool do_jmpl(DisasContext *dc, int rd, TCGv src) in do_jmpl() argument
4222 target_ulong cur_pc = dc->pc; in do_jmpl()
4224 gen_check_align(dc, src, 3); in do_jmpl()
4226 gen_mov_pc_npc(dc); in do_jmpl()
4228 gen_address_mask(dc, cpu_npc); in do_jmpl()
4229 gen_store_gpr(dc, rd, tcg_constant_tl(cur_pc)); in do_jmpl()
4231 dc->npc = DYNAMIC_PC_LOOKUP; in do_jmpl()
4237 static bool do_rett(DisasContext *dc, int rd, TCGv src) in TRANS()
4239 if (!supervisor(dc)) { in TRANS()
4240 return raise_priv(dc); in TRANS()
4243 gen_check_align(dc, src, 3); in TRANS()
4245 gen_mov_pc_npc(dc); in TRANS()
4249 dc->npc = DYNAMIC_PC; in TRANS()
4255 static bool do_return(DisasContext *dc, int rd, TCGv src) in do_return() argument
4257 gen_check_align(dc, src, 3); in do_return()
4260 gen_mov_pc_npc(dc); in do_return()
4262 gen_address_mask(dc, cpu_npc); in do_return()
4264 dc->npc = DYNAMIC_PC_LOOKUP; in do_return()
4270 static bool do_save(DisasContext *dc, int rd, TCGv src) in do_save() argument
4273 gen_store_gpr(dc, rd, src); in do_save()
4274 return advance_pc(dc); in do_save()
4279 static bool do_restore(DisasContext *dc, int rd, TCGv src) in TRANS()
4282 gen_store_gpr(dc, rd, src); in TRANS()
4283 return advance_pc(dc); in TRANS()
4288 static bool do_done_retry(DisasContext *dc, bool done) in TRANS()
4290 if (!supervisor(dc)) { in TRANS()
4291 return raise_priv(dc); in TRANS()
4293 dc->npc = DYNAMIC_PC; in TRANS()
4294 dc->pc = DYNAMIC_PC; in TRANS()
4295 translator_io_start(&dc->base); in TRANS()
4311 static TCGv gen_ldst_addr(DisasContext *dc, int rs1, bool imm, int rs2_or_imm) in gen_ldst_addr() argument
4320 addr = gen_load_gpr(dc, rs1); in gen_ldst_addr()
4330 if (AM_CHECK(dc)) { in gen_ldst_addr()
4340 static bool do_ld_gpr(DisasContext *dc, arg_r_r_ri_asi *a, MemOp mop) in do_ld_gpr() argument
4342 TCGv reg, addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in do_ld_gpr()
4348 da = resolve_asi(dc, a->asi, mop); in do_ld_gpr()
4350 reg = gen_dest_gpr(dc, a->rd); in do_ld_gpr()
4351 gen_ld_asi(dc, &da, reg, addr); in do_ld_gpr()
4352 gen_store_gpr(dc, a->rd, reg); in do_ld_gpr()
4353 return advance_pc(dc); in do_ld_gpr()
4364 static bool do_st_gpr(DisasContext *dc, arg_r_r_ri_asi *a, MemOp mop) in TRANS()
4366 TCGv reg, addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in TRANS()
4372 da = resolve_asi(dc, a->asi, mop); in TRANS()
4374 reg = gen_load_gpr(dc, a->rd); in TRANS()
4375 gen_st_asi(dc, &da, reg, addr); in TRANS()
4376 return advance_pc(dc); in TRANS()
4384 static bool trans_LDD(DisasContext *dc, arg_r_r_ri_asi *a) in TRANS()
4392 addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in TRANS()
4396 da = resolve_asi(dc, a->asi, MO_TEUQ); in TRANS()
4397 gen_ldda_asi(dc, &da, addr, a->rd); in TRANS()
4398 return advance_pc(dc); in TRANS()
4401 static bool trans_STD(DisasContext *dc, arg_r_r_ri_asi *a) in trans_STD() argument
4409 addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in trans_STD()
4413 da = resolve_asi(dc, a->asi, MO_TEUQ); in trans_STD()
4414 gen_stda_asi(dc, &da, addr, a->rd); in trans_STD()
4415 return advance_pc(dc); in trans_STD()
4418 static bool trans_LDSTUB(DisasContext *dc, arg_r_r_ri_asi *a) in trans_LDSTUB() argument
4423 addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in trans_LDSTUB()
4427 da = resolve_asi(dc, a->asi, MO_UB); in trans_LDSTUB()
4429 reg = gen_dest_gpr(dc, a->rd); in trans_LDSTUB()
4430 gen_ldstub_asi(dc, &da, reg, addr); in trans_LDSTUB()
4431 gen_store_gpr(dc, a->rd, reg); in trans_LDSTUB()
4432 return advance_pc(dc); in trans_LDSTUB()
4435 static bool trans_SWAP(DisasContext *dc, arg_r_r_ri_asi *a) in trans_SWAP() argument
4440 addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in trans_SWAP()
4444 da = resolve_asi(dc, a->asi, MO_TEUL); in trans_SWAP()
4446 dst = gen_dest_gpr(dc, a->rd); in trans_SWAP()
4447 src = gen_load_gpr(dc, a->rd); in trans_SWAP()
4448 gen_swap_asi(dc, &da, dst, src, addr); in trans_SWAP()
4449 gen_store_gpr(dc, a->rd, dst); in trans_SWAP()
4450 return advance_pc(dc); in trans_SWAP()
4453 static bool do_casa(DisasContext *dc, arg_r_r_ri_asi *a, MemOp mop) in do_casa() argument
4458 addr = gen_ldst_addr(dc, a->rs1, true, 0); in do_casa()
4462 da = resolve_asi(dc, a->asi, mop); in do_casa()
4464 o = gen_dest_gpr(dc, a->rd); in do_casa()
4465 n = gen_load_gpr(dc, a->rd); in do_casa()
4466 c = gen_load_gpr(dc, a->rs2_or_imm); in do_casa()
4467 gen_cas_asi(dc, &da, o, n, c, addr); in do_casa()
4468 gen_store_gpr(dc, a->rd, o); in do_casa()
4469 return advance_pc(dc); in do_casa()
4475 static bool do_ld_fpr(DisasContext *dc, arg_r_r_ri_asi *a, MemOp sz) in TRANS()
4477 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in TRANS()
4483 if (gen_trap_ifnofpu(dc)) { in TRANS()
4486 if (sz == MO_128 && gen_trap_float128(dc)) { in TRANS()
4489 da = resolve_asi(dc, a->asi, MO_TE | sz); in TRANS()
4490 gen_ldf_asi(dc, &da, sz, addr, a->rd); in TRANS()
4491 gen_update_fprs_dirty(dc, a->rd); in TRANS()
4492 return advance_pc(dc); in TRANS()
4503 static bool do_st_fpr(DisasContext *dc, arg_r_r_ri_asi *a, MemOp sz) in TRANS()
4505 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in TRANS()
4511 if (gen_trap_ifnofpu(dc)) { in TRANS()
4514 if (sz == MO_128 && gen_trap_float128(dc)) { in TRANS()
4517 da = resolve_asi(dc, a->asi, MO_TE | sz); in TRANS()
4518 gen_stf_asi(dc, &da, sz, addr, a->rd); in TRANS()
4519 return advance_pc(dc); in TRANS()
4530 static bool trans_STDFQ(DisasContext *dc, arg_STDFQ *a) in TRANS()
4532 if (!avail_32(dc)) { in TRANS()
4535 if (!supervisor(dc)) { in TRANS()
4536 return raise_priv(dc); in TRANS()
4538 if (gen_trap_ifnofpu(dc)) { in TRANS()
4541 gen_op_fpexception_im(dc, FSR_FTT_SEQ_ERROR); in TRANS()
4545 static bool trans_LDFSR(DisasContext *dc, arg_r_r_ri *a) in trans_LDFSR() argument
4547 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in trans_LDFSR()
4553 if (gen_trap_ifnofpu(dc)) { in trans_LDFSR()
4558 tcg_gen_qemu_ld_i32(tmp, addr, dc->mem_idx, MO_TEUL | MO_ALIGN); in trans_LDFSR()
4564 return advance_pc(dc); in trans_LDFSR()
4567 static bool do_ldxfsr(DisasContext *dc, arg_r_r_ri *a, bool entire) in do_ldxfsr() argument
4570 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in do_ldxfsr()
4577 if (gen_trap_ifnofpu(dc)) { in do_ldxfsr()
4582 tcg_gen_qemu_ld_i64(t64, addr, dc->mem_idx, MO_TEUQ | MO_ALIGN); in do_ldxfsr()
4597 return advance_pc(dc); in do_ldxfsr()
4606 static bool do_stfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop) in TRANS()
4608 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); in TRANS()
4614 if (gen_trap_ifnofpu(dc)) { in TRANS()
4620 tcg_gen_qemu_st_tl(fsr, addr, dc->mem_idx, mop | MO_ALIGN); in TRANS()
4621 return advance_pc(dc); in TRANS()
4627 static bool do_fc(DisasContext *dc, int rd, int32_t c) in TRANS()
4629 if (gen_trap_ifnofpu(dc)) { in TRANS()
4632 gen_store_fpr_F(dc, rd, tcg_constant_i32(c)); in TRANS()
4633 return advance_pc(dc); in TRANS()
4639 static bool do_dc(DisasContext *dc, int rd, int64_t c) in do_dc() argument
4641 if (gen_trap_ifnofpu(dc)) { in do_dc()
4644 gen_store_fpr_D(dc, rd, tcg_constant_i64(c)); in do_dc()
4645 return advance_pc(dc); in do_dc()
4651 static bool do_ff(DisasContext *dc, arg_r_r *a, in do_ff() argument
4656 if (gen_trap_ifnofpu(dc)) { in do_ff()
4660 tmp = gen_load_fpr_F(dc, a->rs); in do_ff()
4662 gen_store_fpr_F(dc, a->rd, tmp); in do_ff()
4663 return advance_pc(dc); in do_ff()
4672 static bool do_fd(DisasContext *dc, arg_r_r *a, in TRANS()
4678 if (gen_trap_ifnofpu(dc)) { in TRANS()
4683 src = gen_load_fpr_D(dc, a->rs); in TRANS()
4685 gen_store_fpr_F(dc, a->rd, dst); in TRANS()
4686 return advance_pc(dc); in TRANS()
4692 static bool do_env_ff(DisasContext *dc, arg_r_r *a, in TRANS()
4697 if (gen_trap_ifnofpu(dc)) { in TRANS()
4701 tmp = gen_load_fpr_F(dc, a->rs); in TRANS()
4703 gen_store_fpr_F(dc, a->rd, tmp); in TRANS()
4704 return advance_pc(dc); in TRANS()
4711 static bool do_env_fd(DisasContext *dc, arg_r_r *a, in TRANS()
4717 if (gen_trap_ifnofpu(dc)) { in TRANS()
4722 src = gen_load_fpr_D(dc, a->rs); in TRANS()
4724 gen_store_fpr_F(dc, a->rd, dst); in TRANS()
4725 return advance_pc(dc); in TRANS()
4732 static bool do_dd(DisasContext *dc, arg_r_r *a, in TRANS()
4737 if (gen_trap_ifnofpu(dc)) { in TRANS()
4742 src = gen_load_fpr_D(dc, a->rs); in TRANS()
4744 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
4745 return advance_pc(dc); in TRANS()
4754 static bool do_env_dd(DisasContext *dc, arg_r_r *a, in TRANS()
4759 if (gen_trap_ifnofpu(dc)) { in TRANS()
4764 src = gen_load_fpr_D(dc, a->rs); in TRANS()
4766 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
4767 return advance_pc(dc); in TRANS()
4774 static bool do_df(DisasContext *dc, arg_r_r *a, in TRANS()
4780 if (gen_trap_ifnofpu(dc)) { in TRANS()
4785 src = gen_load_fpr_F(dc, a->rs); in TRANS()
4787 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
4788 return advance_pc(dc); in TRANS()
4793 static bool do_env_df(DisasContext *dc, arg_r_r *a, in TRANS()
4799 if (gen_trap_ifnofpu(dc)) { in TRANS()
4804 src = gen_load_fpr_F(dc, a->rs); in TRANS()
4806 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
4807 return advance_pc(dc); in TRANS()
4814 static bool do_qq(DisasContext *dc, arg_r_r *a, in TRANS()
4819 if (gen_trap_ifnofpu(dc)) { in TRANS()
4822 if (gen_trap_float128(dc)) { in TRANS()
4827 t = gen_load_fpr_Q(dc, a->rs); in TRANS()
4829 gen_store_fpr_Q(dc, a->rd, t); in TRANS()
4830 return advance_pc(dc); in TRANS()
4837 static bool do_env_qq(DisasContext *dc, arg_r_r *a, in do_env_qq() argument
4842 if (gen_trap_ifnofpu(dc)) { in do_env_qq()
4845 if (gen_trap_float128(dc)) { in do_env_qq()
4849 t = gen_load_fpr_Q(dc, a->rs); in do_env_qq()
4851 gen_store_fpr_Q(dc, a->rd, t); in do_env_qq()
4852 return advance_pc(dc); in do_env_qq()
4857 static bool do_env_fq(DisasContext *dc, arg_r_r *a, in TRANS()
4863 if (gen_trap_ifnofpu(dc)) { in TRANS()
4866 if (gen_trap_float128(dc)) { in TRANS()
4870 src = gen_load_fpr_Q(dc, a->rs); in TRANS()
4873 gen_store_fpr_F(dc, a->rd, dst); in TRANS()
4874 return advance_pc(dc); in TRANS()
4880 static bool do_env_dq(DisasContext *dc, arg_r_r *a, in TRANS()
4886 if (gen_trap_ifnofpu(dc)) { in TRANS()
4889 if (gen_trap_float128(dc)) { in TRANS()
4893 src = gen_load_fpr_Q(dc, a->rs); in TRANS()
4896 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
4897 return advance_pc(dc); in TRANS()
4903 static bool do_env_qf(DisasContext *dc, arg_r_r *a, in TRANS()
4909 if (gen_trap_ifnofpu(dc)) { in TRANS()
4912 if (gen_trap_float128(dc)) { in TRANS()
4916 src = gen_load_fpr_F(dc, a->rs); in TRANS()
4919 gen_store_fpr_Q(dc, a->rd, dst); in TRANS()
4920 return advance_pc(dc); in TRANS()
4926 static bool do_env_qd(DisasContext *dc, arg_r_r *a, in TRANS()
4932 if (gen_trap_ifnofpu(dc)) { in TRANS()
4935 if (gen_trap_float128(dc)) { in TRANS()
4939 src = gen_load_fpr_D(dc, a->rs); in TRANS()
4942 gen_store_fpr_Q(dc, a->rd, dst); in TRANS()
4943 return advance_pc(dc); in TRANS()
4949 static bool do_fff(DisasContext *dc, arg_r_r_r *a, in TRANS()
4954 if (gen_trap_ifnofpu(dc)) { in TRANS()
4958 src1 = gen_load_fpr_F(dc, a->rs1); in TRANS()
4959 src2 = gen_load_fpr_F(dc, a->rs2); in TRANS()
4961 gen_store_fpr_F(dc, a->rd, src1); in TRANS()
4962 return advance_pc(dc); in TRANS()
4987 static bool do_env_fff(DisasContext *dc, arg_r_r_r *a, in TRANS()
4992 if (gen_trap_ifnofpu(dc)) { in TRANS()
4996 src1 = gen_load_fpr_F(dc, a->rs1); in TRANS()
4997 src2 = gen_load_fpr_F(dc, a->rs2); in TRANS()
4999 gen_store_fpr_F(dc, a->rd, src1); in TRANS()
5000 return advance_pc(dc); in TRANS()
5010 static bool do_dff(DisasContext *dc, arg_r_r_r *a, in TRANS()
5016 if (gen_trap_ifnofpu(dc)) { in TRANS()
5021 src1 = gen_load_fpr_F(dc, a->rs1); in TRANS()
5022 src2 = gen_load_fpr_F(dc, a->rs2); in TRANS()
5024 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5025 return advance_pc(dc); in TRANS()
5034 static bool do_dfd(DisasContext *dc, arg_r_r_r *a, in TRANS()
5040 if (gen_trap_ifnofpu(dc)) { in TRANS()
5045 src1 = gen_load_fpr_F(dc, a->rs1); in TRANS()
5046 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5048 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5049 return advance_pc(dc); in TRANS()
5054 static bool do_gvec_ddd(DisasContext *dc, arg_r_r_r *a, MemOp vece, in TRANS()
5058 if (gen_trap_ifnofpu(dc)) { in TRANS()
5064 return advance_pc(dc); in TRANS()
5111 static bool do_ddd(DisasContext *dc, arg_r_r_r *a, in TRANS()
5116 if (gen_trap_ifnofpu(dc)) { in TRANS()
5121 src1 = gen_load_fpr_D(dc, a->rs1); in TRANS()
5122 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5124 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5125 return advance_pc(dc); in TRANS()
5153 static bool do_rdd(DisasContext *dc, arg_r_r_r *a, in TRANS()
5159 if (gen_trap_ifnofpu(dc)) { in TRANS()
5163 dst = gen_dest_gpr(dc, a->rd); in TRANS()
5164 src1 = gen_load_fpr_D(dc, a->rs1); in TRANS()
5165 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5167 gen_store_gpr(dc, a->rd, dst); in TRANS()
5168 return advance_pc(dc); in TRANS()
5196 static bool do_env_ddd(DisasContext *dc, arg_r_r_r *a, in TRANS()
5201 if (gen_trap_ifnofpu(dc)) { in TRANS()
5206 src1 = gen_load_fpr_D(dc, a->rs1); in TRANS()
5207 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5209 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5210 return advance_pc(dc); in TRANS()
5220 static bool trans_FsMULd(DisasContext *dc, arg_r_r_r *a) in TRANS()
5225 if (gen_trap_ifnofpu(dc)) { in TRANS()
5228 if (!(dc->def->features & CPU_FEATURE_FSMULD)) { in TRANS()
5229 return raise_unimpfpop(dc); in TRANS()
5233 src1 = gen_load_fpr_F(dc, a->rs1); in TRANS()
5234 src2 = gen_load_fpr_F(dc, a->rs2); in TRANS()
5236 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5237 return advance_pc(dc); in TRANS()
5240 static bool trans_FNsMULd(DisasContext *dc, arg_r_r_r *a) in trans_FNsMULd() argument
5245 if (!avail_VIS3(dc)) { in trans_FNsMULd()
5248 if (gen_trap_ifnofpu(dc)) { in trans_FNsMULd()
5252 src1 = gen_load_fpr_F(dc, a->rs1); in trans_FNsMULd()
5253 src2 = gen_load_fpr_F(dc, a->rs2); in trans_FNsMULd()
5255 gen_store_fpr_D(dc, a->rd, dst); in trans_FNsMULd()
5256 return advance_pc(dc); in trans_FNsMULd()
5259 static bool do_ffff(DisasContext *dc, arg_r_r_r_r *a, in do_ffff() argument
5264 if (gen_trap_ifnofpu(dc)) { in do_ffff()
5268 src1 = gen_load_fpr_F(dc, a->rs1); in do_ffff()
5269 src2 = gen_load_fpr_F(dc, a->rs2); in do_ffff()
5270 src3 = gen_load_fpr_F(dc, a->rs3); in do_ffff()
5273 gen_store_fpr_F(dc, a->rd, dst); in do_ffff()
5274 return advance_pc(dc); in do_ffff()
5282 static bool do_dddd(DisasContext *dc, arg_r_r_r_r *a, in TRANS()
5287 if (gen_trap_ifnofpu(dc)) { in TRANS()
5292 src1 = gen_load_fpr_D(dc, a->rs1); in TRANS()
5293 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5294 src3 = gen_load_fpr_D(dc, a->rs3); in TRANS()
5296 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5297 return advance_pc(dc); in TRANS()
5308 static bool trans_FALIGNDATAi(DisasContext *dc, arg_r_r_r *a) in TRANS()
5313 if (!avail_VIS4(dc)) { in TRANS()
5316 if (gen_trap_ifnofpu(dc)) { in TRANS()
5321 src1 = gen_load_fpr_D(dc, a->rd); in TRANS()
5322 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5323 src3 = gen_load_gpr(dc, a->rs1); in TRANS()
5325 gen_store_fpr_D(dc, a->rd, dst); in TRANS()
5326 return advance_pc(dc); in TRANS()
5329 static bool do_env_qqq(DisasContext *dc, arg_r_r_r *a, in do_env_qqq() argument
5334 if (gen_trap_ifnofpu(dc)) { in do_env_qqq()
5337 if (gen_trap_float128(dc)) { in do_env_qqq()
5341 src1 = gen_load_fpr_Q(dc, a->rs1); in do_env_qqq()
5342 src2 = gen_load_fpr_Q(dc, a->rs2); in do_env_qqq()
5344 gen_store_fpr_Q(dc, a->rd, src1); in do_env_qqq()
5345 return advance_pc(dc); in do_env_qqq()
5353 static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a) in TRANS()
5358 if (gen_trap_ifnofpu(dc)) { in TRANS()
5361 if (gen_trap_float128(dc)) { in TRANS()
5365 src1 = gen_load_fpr_D(dc, a->rs1); in TRANS()
5366 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5369 gen_store_fpr_Q(dc, a->rd, dst); in TRANS()
5370 return advance_pc(dc); in TRANS()
5373 static bool do_fmovr(DisasContext *dc, arg_FMOVRs *a, bool is_128, in do_fmovr() argument
5378 if (!gen_compare_reg(&cmp, a->cond, gen_load_gpr(dc, a->rs1))) { in do_fmovr()
5381 if (gen_trap_ifnofpu(dc)) { in do_fmovr()
5384 if (is_128 && gen_trap_float128(dc)) { in do_fmovr()
5389 func(dc, &cmp, a->rd, a->rs2); in do_fmovr()
5390 return advance_pc(dc); in do_fmovr()
5397 static bool do_fmovcc(DisasContext *dc, arg_FMOVscc *a, bool is_128, in do_fmovcc() argument
5402 if (gen_trap_ifnofpu(dc)) { in do_fmovcc()
5405 if (is_128 && gen_trap_float128(dc)) { in do_fmovcc()
5410 gen_compare(&cmp, a->cc, a->cond, dc); in do_fmovcc()
5411 func(dc, &cmp, a->rd, a->rs2); in do_fmovcc()
5412 return advance_pc(dc); in do_fmovcc()
5419 static bool do_fmovfcc(DisasContext *dc, arg_FMOVsfcc *a, bool is_128, in do_fmovfcc() argument
5424 if (gen_trap_ifnofpu(dc)) { in do_fmovfcc()
5427 if (is_128 && gen_trap_float128(dc)) { in do_fmovfcc()
5433 func(dc, &cmp, a->rd, a->rs2); in do_fmovfcc()
5434 return advance_pc(dc); in do_fmovfcc()
5441 static bool do_fcmps(DisasContext *dc, arg_FCMPs *a, bool e) in do_fcmps() argument
5445 if (avail_32(dc) && a->cc != 0) { in do_fcmps()
5448 if (gen_trap_ifnofpu(dc)) { in do_fcmps()
5452 src1 = gen_load_fpr_F(dc, a->rs1); in do_fcmps()
5453 src2 = gen_load_fpr_F(dc, a->rs2); in do_fcmps()
5459 return advance_pc(dc); in do_fcmps()
5465 static bool do_fcmpd(DisasContext *dc, arg_FCMPd *a, bool e) in TRANS()
5469 if (avail_32(dc) && a->cc != 0) { in TRANS()
5472 if (gen_trap_ifnofpu(dc)) { in TRANS()
5476 src1 = gen_load_fpr_D(dc, a->rs1); in TRANS()
5477 src2 = gen_load_fpr_D(dc, a->rs2); in TRANS()
5483 return advance_pc(dc); in TRANS()
5489 static bool do_fcmpq(DisasContext *dc, arg_FCMPq *a, bool e) in TRANS()
5493 if (avail_32(dc) && a->cc != 0) { in TRANS()
5496 if (gen_trap_ifnofpu(dc)) { in TRANS()
5499 if (gen_trap_float128(dc)) { in TRANS()
5503 src1 = gen_load_fpr_Q(dc, a->rs1); in TRANS()
5504 src2 = gen_load_fpr_Q(dc, a->rs2); in TRANS()
5510 return advance_pc(dc); in TRANS()
5516 static bool trans_FLCMPs(DisasContext *dc, arg_FLCMPs *a) in TRANS()
5520 if (!avail_VIS3(dc)) { in TRANS()
5523 if (gen_trap_ifnofpu(dc)) { in TRANS()
5527 src1 = gen_load_fpr_F(dc, a->rs1); in TRANS()
5528 src2 = gen_load_fpr_F(dc, a->rs2); in TRANS()
5530 return advance_pc(dc); in TRANS()
5533 static bool trans_FLCMPd(DisasContext *dc, arg_FLCMPd *a) in trans_FLCMPd() argument
5537 if (!avail_VIS3(dc)) { in trans_FLCMPd()
5540 if (gen_trap_ifnofpu(dc)) { in trans_FLCMPd()
5544 src1 = gen_load_fpr_D(dc, a->rs1); in trans_FLCMPd()
5545 src2 = gen_load_fpr_D(dc, a->rs2); in trans_FLCMPd()
5547 return advance_pc(dc); in trans_FLCMPd()
5550 static bool do_movf2r(DisasContext *dc, arg_r_r *a, in do_movf2r() argument
5556 if (gen_trap_ifnofpu(dc)) { in do_movf2r()
5559 dst = gen_dest_gpr(dc, a->rd); in do_movf2r()
5561 gen_store_gpr(dc, a->rd, dst); in do_movf2r()
5562 return advance_pc(dc); in do_movf2r()
5569 static bool do_movr2f(DisasContext *dc, arg_r_r *a, in TRANS()
5575 if (gen_trap_ifnofpu(dc)) { in TRANS()
5578 src = gen_load_gpr(dc, a->rs); in TRANS()
5580 return advance_pc(dc); in TRANS()
5588 DisasContext *dc = container_of(dcbase, DisasContext, base); in TRANS() local
5591 dc->pc = dc->base.pc_first; in TRANS()
5592 dc->npc = (target_ulong)dc->base.tb->cs_base; in TRANS()
5593 dc->mem_idx = dc->base.tb->flags & TB_FLAG_MMU_MASK; in TRANS()
5594 dc->def = &cpu_env(cs)->def; in TRANS()
5595 dc->fpu_enabled = tb_fpu_enabled(dc->base.tb->flags); in TRANS()
5596 dc->address_mask_32bit = tb_am_enabled(dc->base.tb->flags); in TRANS()
5598 dc->supervisor = (dc->base.tb->flags & TB_FLAG_SUPER) != 0; in TRANS()
5601 dc->fprs_dirty = 0; in TRANS()
5602 dc->asi = (dc->base.tb->flags >> TB_FLAG_ASI_SHIFT) & 0xff; in TRANS()
5604 dc->hypervisor = (dc->base.tb->flags & TB_FLAG_HYPER) != 0; in TRANS()
5611 bound = -(dc->base.pc_first | TARGET_PAGE_MASK) / 4; in TRANS()
5612 dc->base.max_insns = MIN(dc->base.max_insns, bound); in TRANS()
5621 DisasContext *dc = container_of(dcbase, DisasContext, base); in sparc_tr_insn_start() local
5622 target_ulong npc = dc->npc; in sparc_tr_insn_start()
5627 assert(dc->jump_pc[1] == dc->pc + 4); in sparc_tr_insn_start()
5628 npc = dc->jump_pc[0] | JUMP_PC; in sparc_tr_insn_start()
5638 tcg_gen_insn_start(dc->pc, npc); in sparc_tr_insn_start()
5643 DisasContext *dc = container_of(dcbase, DisasContext, base); in sparc_tr_translate_insn() local
5646 insn = translator_ldl(cpu_env(cs), &dc->base, dc->pc); in sparc_tr_translate_insn()
5647 dc->base.pc_next += 4; in sparc_tr_translate_insn()
5649 if (!decode(dc, insn)) { in sparc_tr_translate_insn()
5650 gen_exception(dc, TT_ILL_INSN); in sparc_tr_translate_insn()
5653 if (dc->base.is_jmp == DISAS_NORETURN) { in sparc_tr_translate_insn()
5656 if (dc->pc != dc->base.pc_next) { in sparc_tr_translate_insn()
5657 dc->base.is_jmp = DISAS_TOO_MANY; in sparc_tr_translate_insn()
5663 DisasContext *dc = container_of(dcbase, DisasContext, base); in sparc_tr_tb_stop() local
5667 finishing_insn(dc); in sparc_tr_tb_stop()
5669 switch (dc->base.is_jmp) { in sparc_tr_tb_stop()
5672 if (((dc->pc | dc->npc) & 3) == 0) { in sparc_tr_tb_stop()
5674 gen_goto_tb(dc, 0, dc->pc, dc->npc); in sparc_tr_tb_stop()
5679 if (dc->pc & 3) { in sparc_tr_tb_stop()
5680 switch (dc->pc) { in sparc_tr_tb_stop()
5690 tcg_gen_movi_tl(cpu_pc, dc->pc); in sparc_tr_tb_stop()
5693 if (dc->npc & 3) { in sparc_tr_tb_stop()
5694 switch (dc->npc) { in sparc_tr_tb_stop()
5696 gen_generic_branch(dc); in sparc_tr_tb_stop()
5707 tcg_gen_movi_tl(cpu_npc, dc->npc); in sparc_tr_tb_stop()
5721 save_state(dc); in sparc_tr_tb_stop()
5729 for (e = dc->delay_excp_list; e ; e = e_next) { in sparc_tr_tb_stop()
5754 DisasContext dc = {}; in gen_intermediate_code() local
5756 translator_loop(cs, tb, max_insns, pc, host_pc, &sparc_tr_ops, &dc.base); in gen_intermediate_code()