Lines Matching refs:dc

61 static inline bool is_user(DisasContext *dc)  in is_user()  argument
66 return !(dc->tb_flags & TB_FLAGS_SM); in is_user()
134 static void gen_exception(DisasContext *dc, unsigned int excp) in gen_exception() argument
139 static void gen_illegal_exception(DisasContext *dc) in gen_illegal_exception() argument
141 tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); in gen_illegal_exception()
142 gen_exception(dc, EXCP_ILLEGAL); in gen_illegal_exception()
143 dc->base.is_jmp = DISAS_NORETURN; in gen_illegal_exception()
146 static bool check_v1_3(DisasContext *dc) in check_v1_3() argument
148 return dc->avr >= 0x01030000; in check_v1_3()
151 static bool check_of32s(DisasContext *dc) in check_of32s() argument
153 return dc->cpucfgr & CPUCFGR_OF32S; in check_of32s()
156 static bool check_of64a32s(DisasContext *dc) in check_of64a32s() argument
158 return dc->cpucfgr & CPUCFGR_OF64A32S; in check_of64a32s()
161 static TCGv cpu_R(DisasContext *dc, int reg) in cpu_R() argument
164 return dc->R0; in cpu_R()
174 static void check_r0_write(DisasContext *dc, int reg) in check_r0_write() argument
177 dc->R0 = cpu_regs[0]; in check_r0_write()
181 static void gen_ove_cy(DisasContext *dc) in gen_ove_cy() argument
183 if (dc->tb_flags & SR_OVE) { in gen_ove_cy()
188 static void gen_ove_ov(DisasContext *dc) in gen_ove_ov() argument
190 if (dc->tb_flags & SR_OVE) { in gen_ove_ov()
195 static void gen_ove_cyov(DisasContext *dc) in gen_ove_cyov() argument
197 if (dc->tb_flags & SR_OVE) { in gen_ove_cyov()
202 static void gen_add(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_add() argument
207 tcg_gen_add2_tl(res, cpu_sr_cy, srca, dc->zero, srcb, dc->zero); in gen_add()
214 gen_ove_cyov(dc); in gen_add()
217 static void gen_addc(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_addc() argument
222 tcg_gen_add2_tl(res, cpu_sr_cy, srca, dc->zero, cpu_sr_cy, dc->zero); in gen_addc()
223 tcg_gen_add2_tl(res, cpu_sr_cy, res, cpu_sr_cy, srcb, dc->zero); in gen_addc()
230 gen_ove_cyov(dc); in gen_addc()
233 static void gen_sub(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_sub() argument
245 gen_ove_cyov(dc); in gen_sub()
248 static void gen_mul(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_mul() argument
256 gen_ove_ov(dc); in gen_mul()
259 static void gen_mulu(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_mulu() argument
264 gen_ove_cy(dc); in gen_mulu()
267 static void gen_div(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_div() argument
278 gen_ove_ov(dc); in gen_div()
281 static void gen_divu(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) in gen_divu() argument
291 gen_ove_cy(dc); in gen_divu()
294 static void gen_muld(DisasContext *dc, TCGv srca, TCGv srcb) in gen_muld() argument
312 gen_ove_ov(dc); in gen_muld()
316 static void gen_muldu(DisasContext *dc, TCGv srca, TCGv srcb) in gen_muldu() argument
333 gen_ove_cy(dc); in gen_muldu()
337 static void gen_mac(DisasContext *dc, TCGv srca, TCGv srcb) in gen_mac() argument
358 gen_ove_ov(dc); in gen_mac()
361 static void gen_macu(DisasContext *dc, TCGv srca, TCGv srcb) in gen_macu() argument
375 gen_ove_cy(dc); in gen_macu()
378 static void gen_msb(DisasContext *dc, TCGv srca, TCGv srcb) in gen_msb() argument
399 gen_ove_ov(dc); in gen_msb()
402 static void gen_msbu(DisasContext *dc, TCGv srca, TCGv srcb) in gen_msbu() argument
416 gen_ove_cy(dc); in gen_msbu()
419 static bool trans_l_add(DisasContext *dc, arg_dab *a) in trans_l_add() argument
421 check_r0_write(dc, a->d); in trans_l_add()
422 gen_add(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_add()
426 static bool trans_l_addc(DisasContext *dc, arg_dab *a) in trans_l_addc() argument
428 check_r0_write(dc, a->d); in trans_l_addc()
429 gen_addc(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_addc()
433 static bool trans_l_sub(DisasContext *dc, arg_dab *a) in trans_l_sub() argument
435 check_r0_write(dc, a->d); in trans_l_sub()
436 gen_sub(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sub()
440 static bool trans_l_and(DisasContext *dc, arg_dab *a) in trans_l_and() argument
442 check_r0_write(dc, a->d); in trans_l_and()
443 tcg_gen_and_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_and()
447 static bool trans_l_or(DisasContext *dc, arg_dab *a) in trans_l_or() argument
449 check_r0_write(dc, a->d); in trans_l_or()
450 tcg_gen_or_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_or()
454 static bool trans_l_xor(DisasContext *dc, arg_dab *a) in trans_l_xor() argument
456 check_r0_write(dc, a->d); in trans_l_xor()
457 tcg_gen_xor_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_xor()
461 static bool trans_l_sll(DisasContext *dc, arg_dab *a) in trans_l_sll() argument
463 check_r0_write(dc, a->d); in trans_l_sll()
464 tcg_gen_shl_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sll()
468 static bool trans_l_srl(DisasContext *dc, arg_dab *a) in trans_l_srl() argument
470 check_r0_write(dc, a->d); in trans_l_srl()
471 tcg_gen_shr_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_srl()
475 static bool trans_l_sra(DisasContext *dc, arg_dab *a) in trans_l_sra() argument
477 check_r0_write(dc, a->d); in trans_l_sra()
478 tcg_gen_sar_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sra()
482 static bool trans_l_ror(DisasContext *dc, arg_dab *a) in trans_l_ror() argument
484 check_r0_write(dc, a->d); in trans_l_ror()
485 tcg_gen_rotr_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_ror()
489 static bool trans_l_exths(DisasContext *dc, arg_da *a) in trans_l_exths() argument
491 check_r0_write(dc, a->d); in trans_l_exths()
492 tcg_gen_ext16s_tl(cpu_R(dc, a->d), cpu_R(dc, a->a)); in trans_l_exths()
496 static bool trans_l_extbs(DisasContext *dc, arg_da *a) in trans_l_extbs() argument
498 check_r0_write(dc, a->d); in trans_l_extbs()
499 tcg_gen_ext8s_tl(cpu_R(dc, a->d), cpu_R(dc, a->a)); in trans_l_extbs()
503 static bool trans_l_exthz(DisasContext *dc, arg_da *a) in trans_l_exthz() argument
505 check_r0_write(dc, a->d); in trans_l_exthz()
506 tcg_gen_ext16u_tl(cpu_R(dc, a->d), cpu_R(dc, a->a)); in trans_l_exthz()
510 static bool trans_l_extbz(DisasContext *dc, arg_da *a) in trans_l_extbz() argument
512 check_r0_write(dc, a->d); in trans_l_extbz()
513 tcg_gen_ext8u_tl(cpu_R(dc, a->d), cpu_R(dc, a->a)); in trans_l_extbz()
517 static bool trans_l_cmov(DisasContext *dc, arg_dab *a) in trans_l_cmov() argument
519 check_r0_write(dc, a->d); in trans_l_cmov()
520 tcg_gen_movcond_tl(TCG_COND_NE, cpu_R(dc, a->d), cpu_sr_f, dc->zero, in trans_l_cmov()
521 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_cmov()
525 static bool trans_l_ff1(DisasContext *dc, arg_da *a) in trans_l_ff1() argument
527 check_r0_write(dc, a->d); in trans_l_ff1()
528 tcg_gen_ctzi_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), -1); in trans_l_ff1()
529 tcg_gen_addi_tl(cpu_R(dc, a->d), cpu_R(dc, a->d), 1); in trans_l_ff1()
533 static bool trans_l_fl1(DisasContext *dc, arg_da *a) in trans_l_fl1() argument
535 check_r0_write(dc, a->d); in trans_l_fl1()
536 tcg_gen_clzi_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), TARGET_LONG_BITS); in trans_l_fl1()
537 tcg_gen_subfi_tl(cpu_R(dc, a->d), TARGET_LONG_BITS, cpu_R(dc, a->d)); in trans_l_fl1()
541 static bool trans_l_mul(DisasContext *dc, arg_dab *a) in trans_l_mul() argument
543 check_r0_write(dc, a->d); in trans_l_mul()
544 gen_mul(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_mul()
548 static bool trans_l_mulu(DisasContext *dc, arg_dab *a) in trans_l_mulu() argument
550 check_r0_write(dc, a->d); in trans_l_mulu()
551 gen_mulu(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_mulu()
555 static bool trans_l_div(DisasContext *dc, arg_dab *a) in trans_l_div() argument
557 check_r0_write(dc, a->d); in trans_l_div()
558 gen_div(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_div()
562 static bool trans_l_divu(DisasContext *dc, arg_dab *a) in trans_l_divu() argument
564 check_r0_write(dc, a->d); in trans_l_divu()
565 gen_divu(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_divu()
569 static bool trans_l_muld(DisasContext *dc, arg_ab *a) in trans_l_muld() argument
571 gen_muld(dc, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_muld()
575 static bool trans_l_muldu(DisasContext *dc, arg_ab *a) in trans_l_muldu() argument
577 gen_muldu(dc, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_muldu()
581 static bool trans_l_j(DisasContext *dc, arg_l_j *a) in trans_l_j() argument
583 target_ulong tmp_pc = dc->base.pc_next + a->n * 4; in trans_l_j()
586 dc->jmp_pc_imm = tmp_pc; in trans_l_j()
587 dc->delayed_branch = 2; in trans_l_j()
591 static bool trans_l_jal(DisasContext *dc, arg_l_jal *a) in trans_l_jal() argument
593 target_ulong tmp_pc = dc->base.pc_next + a->n * 4; in trans_l_jal()
594 target_ulong ret_pc = dc->base.pc_next + 8; in trans_l_jal()
600 dc->jmp_pc_imm = tmp_pc; in trans_l_jal()
601 dc->delayed_branch = 2; in trans_l_jal()
606 static void do_bf(DisasContext *dc, arg_l_bf *a, TCGCond cond) in do_bf() argument
608 target_ulong tmp_pc = dc->base.pc_next + a->n * 4; in do_bf()
609 TCGv t_next = tcg_constant_tl(dc->base.pc_next + 8); in do_bf()
612 tcg_gen_movcond_tl(cond, jmp_pc, cpu_sr_f, dc->zero, t_true, t_next); in do_bf()
613 dc->delayed_branch = 2; in do_bf()
616 static bool trans_l_bf(DisasContext *dc, arg_l_bf *a) in trans_l_bf() argument
618 do_bf(dc, a, TCG_COND_NE); in trans_l_bf()
622 static bool trans_l_bnf(DisasContext *dc, arg_l_bf *a) in trans_l_bnf() argument
624 do_bf(dc, a, TCG_COND_EQ); in trans_l_bnf()
628 static bool trans_l_jr(DisasContext *dc, arg_l_jr *a) in trans_l_jr() argument
630 tcg_gen_mov_tl(jmp_pc, cpu_R(dc, a->b)); in trans_l_jr()
631 dc->delayed_branch = 2; in trans_l_jr()
635 static bool trans_l_jalr(DisasContext *dc, arg_l_jalr *a) in trans_l_jalr() argument
637 tcg_gen_mov_tl(jmp_pc, cpu_R(dc, a->b)); in trans_l_jalr()
638 tcg_gen_movi_tl(cpu_regs[9], dc->base.pc_next + 8); in trans_l_jalr()
639 dc->delayed_branch = 2; in trans_l_jalr()
643 static bool trans_l_lwa(DisasContext *dc, arg_load *a) in trans_l_lwa() argument
647 check_r0_write(dc, a->d); in trans_l_lwa()
649 tcg_gen_addi_tl(ea, cpu_R(dc, a->a), a->i); in trans_l_lwa()
650 tcg_gen_qemu_ld_tl(cpu_R(dc, a->d), ea, dc->mem_idx, MO_TEUL); in trans_l_lwa()
652 tcg_gen_mov_tl(cpu_lock_value, cpu_R(dc, a->d)); in trans_l_lwa()
656 static void do_load(DisasContext *dc, arg_load *a, MemOp mop) in do_load() argument
660 check_r0_write(dc, a->d); in do_load()
662 tcg_gen_addi_tl(ea, cpu_R(dc, a->a), a->i); in do_load()
663 tcg_gen_qemu_ld_tl(cpu_R(dc, a->d), ea, dc->mem_idx, mop); in do_load()
666 static bool trans_l_lwz(DisasContext *dc, arg_load *a) in trans_l_lwz() argument
668 do_load(dc, a, MO_TEUL); in trans_l_lwz()
672 static bool trans_l_lws(DisasContext *dc, arg_load *a) in trans_l_lws() argument
674 do_load(dc, a, MO_TESL); in trans_l_lws()
678 static bool trans_l_lbz(DisasContext *dc, arg_load *a) in trans_l_lbz() argument
680 do_load(dc, a, MO_UB); in trans_l_lbz()
684 static bool trans_l_lbs(DisasContext *dc, arg_load *a) in trans_l_lbs() argument
686 do_load(dc, a, MO_SB); in trans_l_lbs()
690 static bool trans_l_lhz(DisasContext *dc, arg_load *a) in trans_l_lhz() argument
692 do_load(dc, a, MO_TEUW); in trans_l_lhz()
696 static bool trans_l_lhs(DisasContext *dc, arg_load *a) in trans_l_lhs() argument
698 do_load(dc, a, MO_TESW); in trans_l_lhs()
702 static bool trans_l_swa(DisasContext *dc, arg_store *a) in trans_l_swa() argument
708 tcg_gen_addi_tl(ea, cpu_R(dc, a->a), a->i); in trans_l_swa()
716 cpu_R(dc, a->b), dc->mem_idx, MO_TEUL); in trans_l_swa()
729 static void do_store(DisasContext *dc, arg_store *a, MemOp mop) in do_store() argument
732 tcg_gen_addi_tl(t0, cpu_R(dc, a->a), a->i); in do_store()
733 tcg_gen_qemu_st_tl(cpu_R(dc, a->b), t0, dc->mem_idx, mop); in do_store()
736 static bool trans_l_sw(DisasContext *dc, arg_store *a) in trans_l_sw() argument
738 do_store(dc, a, MO_TEUL); in trans_l_sw()
742 static bool trans_l_sb(DisasContext *dc, arg_store *a) in trans_l_sb() argument
744 do_store(dc, a, MO_UB); in trans_l_sb()
748 static bool trans_l_sh(DisasContext *dc, arg_store *a) in trans_l_sh() argument
750 do_store(dc, a, MO_TEUW); in trans_l_sh()
754 static bool trans_l_nop(DisasContext *dc, arg_l_nop *a) in trans_l_nop() argument
759 static bool trans_l_adrp(DisasContext *dc, arg_l_adrp *a) in trans_l_adrp() argument
761 if (!check_v1_3(dc)) { in trans_l_adrp()
764 check_r0_write(dc, a->d); in trans_l_adrp()
766 tcg_gen_movi_i32(cpu_R(dc, a->d), in trans_l_adrp()
767 (dc->base.pc_next & TARGET_PAGE_MASK) + in trans_l_adrp()
772 static bool trans_l_addi(DisasContext *dc, arg_rri *a) in trans_l_addi() argument
774 check_r0_write(dc, a->d); in trans_l_addi()
775 gen_add(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), tcg_constant_tl(a->i)); in trans_l_addi()
779 static bool trans_l_addic(DisasContext *dc, arg_rri *a) in trans_l_addic() argument
781 check_r0_write(dc, a->d); in trans_l_addic()
782 gen_addc(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), tcg_constant_tl(a->i)); in trans_l_addic()
786 static bool trans_l_muli(DisasContext *dc, arg_rri *a) in trans_l_muli() argument
788 check_r0_write(dc, a->d); in trans_l_muli()
789 gen_mul(dc, cpu_R(dc, a->d), cpu_R(dc, a->a), tcg_constant_tl(a->i)); in trans_l_muli()
793 static bool trans_l_maci(DisasContext *dc, arg_l_maci *a) in trans_l_maci() argument
795 gen_mac(dc, cpu_R(dc, a->a), tcg_constant_tl(a->i)); in trans_l_maci()
799 static bool trans_l_andi(DisasContext *dc, arg_rrk *a) in trans_l_andi() argument
801 check_r0_write(dc, a->d); in trans_l_andi()
802 tcg_gen_andi_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), a->k); in trans_l_andi()
806 static bool trans_l_ori(DisasContext *dc, arg_rrk *a) in trans_l_ori() argument
808 check_r0_write(dc, a->d); in trans_l_ori()
809 tcg_gen_ori_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), a->k); in trans_l_ori()
813 static bool trans_l_xori(DisasContext *dc, arg_rri *a) in trans_l_xori() argument
815 check_r0_write(dc, a->d); in trans_l_xori()
816 tcg_gen_xori_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), a->i); in trans_l_xori()
820 static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a) in trans_l_mfspr() argument
824 check_r0_write(dc, a->d); in trans_l_mfspr()
826 if (translator_io_start(&dc->base)) { in trans_l_mfspr()
827 if (dc->delayed_branch) { in trans_l_mfspr()
831 tcg_gen_movi_tl(cpu_pc, dc->base.pc_next + 4); in trans_l_mfspr()
833 dc->base.is_jmp = DISAS_EXIT; in trans_l_mfspr()
836 tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k); in trans_l_mfspr()
837 gen_helper_mfspr(cpu_R(dc, a->d), tcg_env, cpu_R(dc, a->d), spr); in trans_l_mfspr()
841 static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a) in trans_l_mtspr() argument
845 translator_io_start(&dc->base); in trans_l_mtspr()
853 if (dc->delayed_branch) { in trans_l_mtspr()
857 tcg_gen_movi_tl(cpu_pc, dc->base.pc_next + 4); in trans_l_mtspr()
859 dc->base.is_jmp = DISAS_EXIT; in trans_l_mtspr()
861 tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k); in trans_l_mtspr()
862 gen_helper_mtspr(tcg_env, spr, cpu_R(dc, a->b)); in trans_l_mtspr()
866 static bool trans_l_mac(DisasContext *dc, arg_ab *a) in trans_l_mac() argument
868 gen_mac(dc, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_mac()
872 static bool trans_l_msb(DisasContext *dc, arg_ab *a) in trans_l_msb() argument
874 gen_msb(dc, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_msb()
878 static bool trans_l_macu(DisasContext *dc, arg_ab *a) in trans_l_macu() argument
880 gen_macu(dc, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_macu()
884 static bool trans_l_msbu(DisasContext *dc, arg_ab *a) in trans_l_msbu() argument
886 gen_msbu(dc, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_msbu()
890 static bool trans_l_slli(DisasContext *dc, arg_dal *a) in trans_l_slli() argument
892 check_r0_write(dc, a->d); in trans_l_slli()
893 tcg_gen_shli_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), in trans_l_slli()
898 static bool trans_l_srli(DisasContext *dc, arg_dal *a) in trans_l_srli() argument
900 check_r0_write(dc, a->d); in trans_l_srli()
901 tcg_gen_shri_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), in trans_l_srli()
906 static bool trans_l_srai(DisasContext *dc, arg_dal *a) in trans_l_srai() argument
908 check_r0_write(dc, a->d); in trans_l_srai()
909 tcg_gen_sari_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), in trans_l_srai()
914 static bool trans_l_rori(DisasContext *dc, arg_dal *a) in trans_l_rori() argument
916 check_r0_write(dc, a->d); in trans_l_rori()
917 tcg_gen_rotri_tl(cpu_R(dc, a->d), cpu_R(dc, a->a), in trans_l_rori()
922 static bool trans_l_movhi(DisasContext *dc, arg_l_movhi *a) in trans_l_movhi() argument
924 check_r0_write(dc, a->d); in trans_l_movhi()
925 tcg_gen_movi_tl(cpu_R(dc, a->d), a->k << 16); in trans_l_movhi()
929 static bool trans_l_macrc(DisasContext *dc, arg_l_macrc *a) in trans_l_macrc() argument
931 check_r0_write(dc, a->d); in trans_l_macrc()
932 tcg_gen_trunc_i64_tl(cpu_R(dc, a->d), cpu_mac); in trans_l_macrc()
937 static bool trans_l_sfeq(DisasContext *dc, arg_ab *a) in trans_l_sfeq() argument
940 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfeq()
944 static bool trans_l_sfne(DisasContext *dc, arg_ab *a) in trans_l_sfne() argument
947 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfne()
951 static bool trans_l_sfgtu(DisasContext *dc, arg_ab *a) in trans_l_sfgtu() argument
954 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfgtu()
958 static bool trans_l_sfgeu(DisasContext *dc, arg_ab *a) in trans_l_sfgeu() argument
961 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfgeu()
965 static bool trans_l_sfltu(DisasContext *dc, arg_ab *a) in trans_l_sfltu() argument
968 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfltu()
972 static bool trans_l_sfleu(DisasContext *dc, arg_ab *a) in trans_l_sfleu() argument
975 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfleu()
979 static bool trans_l_sfgts(DisasContext *dc, arg_ab *a) in trans_l_sfgts() argument
982 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfgts()
986 static bool trans_l_sfges(DisasContext *dc, arg_ab *a) in trans_l_sfges() argument
989 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfges()
993 static bool trans_l_sflts(DisasContext *dc, arg_ab *a) in trans_l_sflts() argument
996 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sflts()
1000 static bool trans_l_sfles(DisasContext *dc, arg_ab *a) in trans_l_sfles() argument
1003 cpu_sr_f, cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_l_sfles()
1007 static bool trans_l_sfeqi(DisasContext *dc, arg_ai *a) in trans_l_sfeqi() argument
1009 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfeqi()
1013 static bool trans_l_sfnei(DisasContext *dc, arg_ai *a) in trans_l_sfnei() argument
1015 tcg_gen_setcondi_tl(TCG_COND_NE, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfnei()
1019 static bool trans_l_sfgtui(DisasContext *dc, arg_ai *a) in trans_l_sfgtui() argument
1021 tcg_gen_setcondi_tl(TCG_COND_GTU, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfgtui()
1025 static bool trans_l_sfgeui(DisasContext *dc, arg_ai *a) in trans_l_sfgeui() argument
1027 tcg_gen_setcondi_tl(TCG_COND_GEU, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfgeui()
1031 static bool trans_l_sfltui(DisasContext *dc, arg_ai *a) in trans_l_sfltui() argument
1033 tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfltui()
1037 static bool trans_l_sfleui(DisasContext *dc, arg_ai *a) in trans_l_sfleui() argument
1039 tcg_gen_setcondi_tl(TCG_COND_LEU, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfleui()
1043 static bool trans_l_sfgtsi(DisasContext *dc, arg_ai *a) in trans_l_sfgtsi() argument
1045 tcg_gen_setcondi_tl(TCG_COND_GT, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfgtsi()
1049 static bool trans_l_sfgesi(DisasContext *dc, arg_ai *a) in trans_l_sfgesi() argument
1051 tcg_gen_setcondi_tl(TCG_COND_GE, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfgesi()
1055 static bool trans_l_sfltsi(DisasContext *dc, arg_ai *a) in trans_l_sfltsi() argument
1057 tcg_gen_setcondi_tl(TCG_COND_LT, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sfltsi()
1061 static bool trans_l_sflesi(DisasContext *dc, arg_ai *a) in trans_l_sflesi() argument
1063 tcg_gen_setcondi_tl(TCG_COND_LE, cpu_sr_f, cpu_R(dc, a->a), a->i); in trans_l_sflesi()
1067 static bool trans_l_sys(DisasContext *dc, arg_l_sys *a) in trans_l_sys() argument
1069 tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); in trans_l_sys()
1070 gen_exception(dc, EXCP_SYSCALL); in trans_l_sys()
1071 dc->base.is_jmp = DISAS_NORETURN; in trans_l_sys()
1075 static bool trans_l_trap(DisasContext *dc, arg_l_trap *a) in trans_l_trap() argument
1077 tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); in trans_l_trap()
1078 gen_exception(dc, EXCP_TRAP); in trans_l_trap()
1079 dc->base.is_jmp = DISAS_NORETURN; in trans_l_trap()
1083 static bool trans_l_msync(DisasContext *dc, arg_l_msync *a) in trans_l_msync() argument
1089 static bool trans_l_psync(DisasContext *dc, arg_l_psync *a) in trans_l_psync() argument
1094 static bool trans_l_csync(DisasContext *dc, arg_l_csync *a) in trans_l_csync() argument
1099 static bool trans_l_rfe(DisasContext *dc, arg_l_rfe *a) in trans_l_rfe() argument
1101 if (is_user(dc)) { in trans_l_rfe()
1102 gen_illegal_exception(dc); in trans_l_rfe()
1105 dc->base.is_jmp = DISAS_EXIT; in trans_l_rfe()
1110 static bool do_fp2(DisasContext *dc, arg_da *a, in do_fp2() argument
1113 if (!check_of32s(dc)) { in do_fp2()
1116 check_r0_write(dc, a->d); in do_fp2()
1117 fn(cpu_R(dc, a->d), tcg_env, cpu_R(dc, a->a)); in do_fp2()
1122 static bool do_fp3(DisasContext *dc, arg_dab *a, in do_fp3() argument
1125 if (!check_of32s(dc)) { in do_fp3()
1128 check_r0_write(dc, a->d); in do_fp3()
1129 fn(cpu_R(dc, a->d), tcg_env, cpu_R(dc, a->a), cpu_R(dc, a->b)); in do_fp3()
1134 static bool do_fpcmp(DisasContext *dc, arg_ab *a, in do_fpcmp() argument
1138 if (!check_of32s(dc)) { in do_fpcmp()
1142 fn(cpu_sr_f, tcg_env, cpu_R(dc, a->b), cpu_R(dc, a->a)); in do_fpcmp()
1144 fn(cpu_sr_f, tcg_env, cpu_R(dc, a->a), cpu_R(dc, a->b)); in do_fpcmp()
1153 static bool trans_lf_add_s(DisasContext *dc, arg_dab *a) in trans_lf_add_s() argument
1155 return do_fp3(dc, a, gen_helper_float_add_s); in trans_lf_add_s()
1158 static bool trans_lf_sub_s(DisasContext *dc, arg_dab *a) in trans_lf_sub_s() argument
1160 return do_fp3(dc, a, gen_helper_float_sub_s); in trans_lf_sub_s()
1163 static bool trans_lf_mul_s(DisasContext *dc, arg_dab *a) in trans_lf_mul_s() argument
1165 return do_fp3(dc, a, gen_helper_float_mul_s); in trans_lf_mul_s()
1168 static bool trans_lf_div_s(DisasContext *dc, arg_dab *a) in trans_lf_div_s() argument
1170 return do_fp3(dc, a, gen_helper_float_div_s); in trans_lf_div_s()
1173 static bool trans_lf_rem_s(DisasContext *dc, arg_dab *a) in trans_lf_rem_s() argument
1175 return do_fp3(dc, a, gen_helper_float_rem_s); in trans_lf_rem_s()
1179 static bool trans_lf_itof_s(DisasContext *dc, arg_da *a) in trans_lf_itof_s() argument
1181 return do_fp2(dc, a, gen_helper_itofs); in trans_lf_itof_s()
1184 static bool trans_lf_ftoi_s(DisasContext *dc, arg_da *a) in trans_lf_ftoi_s() argument
1186 return do_fp2(dc, a, gen_helper_ftois); in trans_lf_ftoi_s()
1189 static bool trans_lf_madd_s(DisasContext *dc, arg_dab *a) in trans_lf_madd_s() argument
1191 if (!check_of32s(dc)) { in trans_lf_madd_s()
1194 check_r0_write(dc, a->d); in trans_lf_madd_s()
1195 gen_helper_float_madd_s(cpu_R(dc, a->d), tcg_env, cpu_R(dc, a->d), in trans_lf_madd_s()
1196 cpu_R(dc, a->a), cpu_R(dc, a->b)); in trans_lf_madd_s()
1201 static bool trans_lf_sfeq_s(DisasContext *dc, arg_ab *a) in trans_lf_sfeq_s() argument
1203 return do_fpcmp(dc, a, gen_helper_float_eq_s, false, false); in trans_lf_sfeq_s()
1206 static bool trans_lf_sfne_s(DisasContext *dc, arg_ab *a) in trans_lf_sfne_s() argument
1208 return do_fpcmp(dc, a, gen_helper_float_eq_s, true, false); in trans_lf_sfne_s()
1211 static bool trans_lf_sfgt_s(DisasContext *dc, arg_ab *a) in trans_lf_sfgt_s() argument
1213 return do_fpcmp(dc, a, gen_helper_float_lt_s, false, true); in trans_lf_sfgt_s()
1216 static bool trans_lf_sfge_s(DisasContext *dc, arg_ab *a) in trans_lf_sfge_s() argument
1218 return do_fpcmp(dc, a, gen_helper_float_le_s, false, true); in trans_lf_sfge_s()
1221 static bool trans_lf_sflt_s(DisasContext *dc, arg_ab *a) in trans_lf_sflt_s() argument
1223 return do_fpcmp(dc, a, gen_helper_float_lt_s, false, false); in trans_lf_sflt_s()
1226 static bool trans_lf_sfle_s(DisasContext *dc, arg_ab *a) in trans_lf_sfle_s() argument
1228 return do_fpcmp(dc, a, gen_helper_float_le_s, false, false); in trans_lf_sfle_s()
1231 static bool trans_lf_sfueq_s(DisasContext *dc, arg_ab *a) in trans_lf_sfueq_s() argument
1233 if (!check_v1_3(dc)) { in trans_lf_sfueq_s()
1236 return do_fpcmp(dc, a, gen_helper_float_ueq_s, false, false); in trans_lf_sfueq_s()
1239 static bool trans_lf_sfult_s(DisasContext *dc, arg_ab *a) in trans_lf_sfult_s() argument
1241 if (!check_v1_3(dc)) { in trans_lf_sfult_s()
1244 return do_fpcmp(dc, a, gen_helper_float_ult_s, false, false); in trans_lf_sfult_s()
1247 static bool trans_lf_sfugt_s(DisasContext *dc, arg_ab *a) in trans_lf_sfugt_s() argument
1249 if (!check_v1_3(dc)) { in trans_lf_sfugt_s()
1252 return do_fpcmp(dc, a, gen_helper_float_ult_s, false, true); in trans_lf_sfugt_s()
1255 static bool trans_lf_sfule_s(DisasContext *dc, arg_ab *a) in trans_lf_sfule_s() argument
1257 if (!check_v1_3(dc)) { in trans_lf_sfule_s()
1260 return do_fpcmp(dc, a, gen_helper_float_ule_s, false, false); in trans_lf_sfule_s()
1263 static bool trans_lf_sfuge_s(DisasContext *dc, arg_ab *a) in trans_lf_sfuge_s() argument
1265 if (!check_v1_3(dc)) { in trans_lf_sfuge_s()
1268 return do_fpcmp(dc, a, gen_helper_float_ule_s, false, true); in trans_lf_sfuge_s()
1271 static bool trans_lf_sfun_s(DisasContext *dc, arg_ab *a) in trans_lf_sfun_s() argument
1273 if (!check_v1_3(dc)) { in trans_lf_sfun_s()
1276 return do_fpcmp(dc, a, gen_helper_float_un_s, false, false); in trans_lf_sfun_s()
1279 static bool check_pair(DisasContext *dc, int r, int p) in check_pair() argument
1284 static void load_pair(DisasContext *dc, TCGv_i64 t, int r, int p) in load_pair() argument
1286 tcg_gen_concat_i32_i64(t, cpu_R(dc, r + 1 + p), cpu_R(dc, r)); in load_pair()
1289 static void save_pair(DisasContext *dc, TCGv_i64 t, int r, int p) in save_pair() argument
1291 tcg_gen_extr_i64_i32(cpu_R(dc, r + 1 + p), cpu_R(dc, r), t); in save_pair()
1294 static bool do_dp3(DisasContext *dc, arg_dab_pair *a, in do_dp3() argument
1299 if (!check_of64a32s(dc) || in do_dp3()
1300 !check_pair(dc, a->a, a->ap) || in do_dp3()
1301 !check_pair(dc, a->b, a->bp) || in do_dp3()
1302 !check_pair(dc, a->d, a->dp)) { in do_dp3()
1305 check_r0_write(dc, a->d); in do_dp3()
1309 load_pair(dc, t0, a->a, a->ap); in do_dp3()
1310 load_pair(dc, t1, a->b, a->bp); in do_dp3()
1312 save_pair(dc, t0, a->d, a->dp); in do_dp3()
1318 static bool do_dp2(DisasContext *dc, arg_da_pair *a, in do_dp2() argument
1323 if (!check_of64a32s(dc) || in do_dp2()
1324 !check_pair(dc, a->a, a->ap) || in do_dp2()
1325 !check_pair(dc, a->d, a->dp)) { in do_dp2()
1328 check_r0_write(dc, a->d); in do_dp2()
1331 load_pair(dc, t0, a->a, a->ap); in do_dp2()
1333 save_pair(dc, t0, a->d, a->dp); in do_dp2()
1339 static bool do_dpcmp(DisasContext *dc, arg_ab_pair *a, in do_dpcmp() argument
1345 if (!check_of64a32s(dc) || in do_dpcmp()
1346 !check_pair(dc, a->a, a->ap) || in do_dpcmp()
1347 !check_pair(dc, a->b, a->bp)) { in do_dpcmp()
1353 load_pair(dc, t0, a->a, a->ap); in do_dpcmp()
1354 load_pair(dc, t1, a->b, a->bp); in do_dpcmp()
1368 static bool trans_lf_add_d(DisasContext *dc, arg_dab_pair *a) in trans_lf_add_d() argument
1370 return do_dp3(dc, a, gen_helper_float_add_d); in trans_lf_add_d()
1373 static bool trans_lf_sub_d(DisasContext *dc, arg_dab_pair *a) in trans_lf_sub_d() argument
1375 return do_dp3(dc, a, gen_helper_float_sub_d); in trans_lf_sub_d()
1378 static bool trans_lf_mul_d(DisasContext *dc, arg_dab_pair *a) in trans_lf_mul_d() argument
1380 return do_dp3(dc, a, gen_helper_float_mul_d); in trans_lf_mul_d()
1383 static bool trans_lf_div_d(DisasContext *dc, arg_dab_pair *a) in trans_lf_div_d() argument
1385 return do_dp3(dc, a, gen_helper_float_div_d); in trans_lf_div_d()
1388 static bool trans_lf_rem_d(DisasContext *dc, arg_dab_pair *a) in trans_lf_rem_d() argument
1390 return do_dp3(dc, a, gen_helper_float_rem_d); in trans_lf_rem_d()
1393 static bool trans_lf_itof_d(DisasContext *dc, arg_da_pair *a) in trans_lf_itof_d() argument
1395 return do_dp2(dc, a, gen_helper_itofd); in trans_lf_itof_d()
1398 static bool trans_lf_ftoi_d(DisasContext *dc, arg_da_pair *a) in trans_lf_ftoi_d() argument
1400 return do_dp2(dc, a, gen_helper_ftoid); in trans_lf_ftoi_d()
1403 static bool trans_lf_stod_d(DisasContext *dc, arg_lf_stod_d *a) in trans_lf_stod_d() argument
1407 if (!check_of64a32s(dc) || in trans_lf_stod_d()
1408 !check_pair(dc, a->d, a->dp)) { in trans_lf_stod_d()
1411 check_r0_write(dc, a->d); in trans_lf_stod_d()
1414 gen_helper_stod(t0, tcg_env, cpu_R(dc, a->a)); in trans_lf_stod_d()
1415 save_pair(dc, t0, a->d, a->dp); in trans_lf_stod_d()
1421 static bool trans_lf_dtos_d(DisasContext *dc, arg_lf_dtos_d *a) in trans_lf_dtos_d() argument
1425 if (!check_of64a32s(dc) || in trans_lf_dtos_d()
1426 !check_pair(dc, a->a, a->ap)) { in trans_lf_dtos_d()
1429 check_r0_write(dc, a->d); in trans_lf_dtos_d()
1432 load_pair(dc, t0, a->a, a->ap); in trans_lf_dtos_d()
1433 gen_helper_dtos(cpu_R(dc, a->d), tcg_env, t0); in trans_lf_dtos_d()
1439 static bool trans_lf_madd_d(DisasContext *dc, arg_dab_pair *a) in trans_lf_madd_d() argument
1443 if (!check_of64a32s(dc) || in trans_lf_madd_d()
1444 !check_pair(dc, a->a, a->ap) || in trans_lf_madd_d()
1445 !check_pair(dc, a->b, a->bp) || in trans_lf_madd_d()
1446 !check_pair(dc, a->d, a->dp)) { in trans_lf_madd_d()
1449 check_r0_write(dc, a->d); in trans_lf_madd_d()
1454 load_pair(dc, t0, a->d, a->dp); in trans_lf_madd_d()
1455 load_pair(dc, t1, a->a, a->ap); in trans_lf_madd_d()
1456 load_pair(dc, t2, a->b, a->bp); in trans_lf_madd_d()
1458 save_pair(dc, t0, a->d, a->dp); in trans_lf_madd_d()
1464 static bool trans_lf_sfeq_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfeq_d() argument
1466 return do_dpcmp(dc, a, gen_helper_float_eq_d, false, false); in trans_lf_sfeq_d()
1469 static bool trans_lf_sfne_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfne_d() argument
1471 return do_dpcmp(dc, a, gen_helper_float_eq_d, true, false); in trans_lf_sfne_d()
1474 static bool trans_lf_sfgt_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfgt_d() argument
1476 return do_dpcmp(dc, a, gen_helper_float_lt_d, false, true); in trans_lf_sfgt_d()
1479 static bool trans_lf_sfge_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfge_d() argument
1481 return do_dpcmp(dc, a, gen_helper_float_le_d, false, true); in trans_lf_sfge_d()
1484 static bool trans_lf_sflt_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sflt_d() argument
1486 return do_dpcmp(dc, a, gen_helper_float_lt_d, false, false); in trans_lf_sflt_d()
1489 static bool trans_lf_sfle_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfle_d() argument
1491 return do_dpcmp(dc, a, gen_helper_float_le_d, false, false); in trans_lf_sfle_d()
1494 static bool trans_lf_sfueq_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfueq_d() argument
1496 return do_dpcmp(dc, a, gen_helper_float_ueq_d, false, false); in trans_lf_sfueq_d()
1499 static bool trans_lf_sfule_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfule_d() argument
1501 return do_dpcmp(dc, a, gen_helper_float_ule_d, false, false); in trans_lf_sfule_d()
1504 static bool trans_lf_sfuge_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfuge_d() argument
1506 return do_dpcmp(dc, a, gen_helper_float_ule_d, false, true); in trans_lf_sfuge_d()
1509 static bool trans_lf_sfult_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfult_d() argument
1511 return do_dpcmp(dc, a, gen_helper_float_ult_d, false, false); in trans_lf_sfult_d()
1514 static bool trans_lf_sfugt_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfugt_d() argument
1516 return do_dpcmp(dc, a, gen_helper_float_ult_d, false, true); in trans_lf_sfugt_d()
1519 static bool trans_lf_sfun_d(DisasContext *dc, arg_ab_pair *a) in trans_lf_sfun_d() argument
1521 return do_dpcmp(dc, a, gen_helper_float_un_d, false, false); in trans_lf_sfun_d()
1526 DisasContext *dc = container_of(dcb, DisasContext, base); in openrisc_tr_init_disas_context() local
1530 dc->mem_idx = cpu_mmu_index(cs, false); in openrisc_tr_init_disas_context()
1531 dc->tb_flags = dc->base.tb->flags; in openrisc_tr_init_disas_context()
1532 dc->delayed_branch = (dc->tb_flags & TB_FLAGS_DFLAG) != 0; in openrisc_tr_init_disas_context()
1533 dc->cpucfgr = env->cpucfgr; in openrisc_tr_init_disas_context()
1534 dc->avr = env->avr; in openrisc_tr_init_disas_context()
1535 dc->jmp_pc_imm = -1; in openrisc_tr_init_disas_context()
1537 bound = -(dc->base.pc_first | TARGET_PAGE_MASK) / 4; in openrisc_tr_init_disas_context()
1538 dc->base.max_insns = MIN(dc->base.max_insns, bound); in openrisc_tr_init_disas_context()
1543 DisasContext *dc = container_of(db, DisasContext, base); in openrisc_tr_tb_start() local
1547 dc->zero = tcg_constant_tl(0); in openrisc_tr_tb_start()
1548 if (dc->tb_flags & TB_FLAGS_R0_0) { in openrisc_tr_tb_start()
1549 dc->R0 = dc->zero; in openrisc_tr_tb_start()
1551 dc->R0 = cpu_regs[0]; in openrisc_tr_tb_start()
1557 DisasContext *dc = container_of(dcbase, DisasContext, base); in openrisc_tr_insn_start() local
1559 tcg_gen_insn_start(dc->base.pc_next, (dc->delayed_branch ? 1 : 0) in openrisc_tr_insn_start()
1560 | (dc->base.num_insns > 1 ? 2 : 0)); in openrisc_tr_insn_start()
1565 DisasContext *dc = container_of(dcbase, DisasContext, base); in openrisc_tr_translate_insn() local
1566 uint32_t insn = translator_ldl(cpu_env(cs), &dc->base, dc->base.pc_next); in openrisc_tr_translate_insn()
1568 if (!decode(dc, insn)) { in openrisc_tr_translate_insn()
1569 gen_illegal_exception(dc); in openrisc_tr_translate_insn()
1571 dc->base.pc_next += 4; in openrisc_tr_translate_insn()
1579 if (dc->delayed_branch in openrisc_tr_translate_insn()
1580 && --dc->delayed_branch == 0 in openrisc_tr_translate_insn()
1581 && dc->base.is_jmp == DISAS_NEXT) { in openrisc_tr_translate_insn()
1582 dc->base.is_jmp = DISAS_JUMP; in openrisc_tr_translate_insn()
1588 DisasContext *dc = container_of(dcbase, DisasContext, base); in openrisc_tr_tb_stop() local
1592 if (dc->base.is_jmp == DISAS_NORETURN) { in openrisc_tr_tb_stop()
1597 if ((dc->tb_flags & TB_FLAGS_DFLAG ? 1 : 0) != (dc->delayed_branch != 0)) { in openrisc_tr_tb_stop()
1598 tcg_gen_movi_i32(cpu_dflag, dc->delayed_branch != 0); in openrisc_tr_tb_stop()
1602 jmp_dest = dc->base.pc_next; in openrisc_tr_tb_stop()
1605 switch (dc->base.is_jmp) { in openrisc_tr_tb_stop()
1607 jmp_dest = dc->jmp_pc_imm; in openrisc_tr_tb_stop()
1622 if (translator_use_goto_tb(&dc->base, jmp_dest)) { in openrisc_tr_tb_stop()
1625 tcg_gen_exit_tb(dc->base.tb, 0); in openrisc_tr_tb_stop()