translate.c (5c8f44b7dbdec77eff2ed3e239ea31d649894932) translate.c (faa48d742c2133ec1795d2086be14178c785024a)
1/*
2 * Xilinx MicroBlaze emulation for qemu: main translation routines.
3 *
4 * Copyright (c) 2009 Edgar E. Iglesias.
5 * Copyright (c) 2009-2012 PetaLogix Qld Pty Ltd.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public

--- 646 unchanged lines hidden (view full) ---

655 cpu_R[dc->ra]);
656 if (!dc->rd)
657 tcg_gen_movi_tl(cpu_R[dc->rd], 0);
658}
659
660static void dec_barrel(DisasContext *dc)
661{
662 TCGv t0;
1/*
2 * Xilinx MicroBlaze emulation for qemu: main translation routines.
3 *
4 * Copyright (c) 2009 Edgar E. Iglesias.
5 * Copyright (c) 2009-2012 PetaLogix Qld Pty Ltd.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public

--- 646 unchanged lines hidden (view full) ---

655 cpu_R[dc->ra]);
656 if (!dc->rd)
657 tcg_gen_movi_tl(cpu_R[dc->rd], 0);
658}
659
660static void dec_barrel(DisasContext *dc)
661{
662 TCGv t0;
663 bool s, t;
663 unsigned int imm_w, imm_s;
664 bool s, t, e = false;
664
665 if ((dc->tb_flags & MSR_EE_FLAG)
666 && (dc->cpu->env.pvr.regs[2] & PVR2_ILL_OPCODE_EXC_MASK)
667 && !dc->cpu->cfg.use_barrel) {
668 tcg_gen_movi_tl(cpu_SR[SR_ESR], ESR_EC_ILLEGAL_OP);
669 t_gen_raise_exception(dc, EXCP_HW_EXCP);
670 return;
671 }
672
665
666 if ((dc->tb_flags & MSR_EE_FLAG)
667 && (dc->cpu->env.pvr.regs[2] & PVR2_ILL_OPCODE_EXC_MASK)
668 && !dc->cpu->cfg.use_barrel) {
669 tcg_gen_movi_tl(cpu_SR[SR_ESR], ESR_EC_ILLEGAL_OP);
670 t_gen_raise_exception(dc, EXCP_HW_EXCP);
671 return;
672 }
673
674 if (dc->type_b) {
675 /* Insert and extract are only available in immediate mode. */
676 e = extract32(dc->imm, 14, 1);
677 }
673 s = extract32(dc->imm, 10, 1);
674 t = extract32(dc->imm, 9, 1);
678 s = extract32(dc->imm, 10, 1);
679 t = extract32(dc->imm, 9, 1);
680 imm_w = extract32(dc->imm, 6, 5);
681 imm_s = extract32(dc->imm, 0, 5);
675
682
676 LOG_DIS("bs%s%s r%d r%d r%d\n",
683 LOG_DIS("bs%s%s%s r%d r%d r%d\n",
684 e ? "e" : "",
677 s ? "l" : "r", t ? "a" : "l", dc->rd, dc->ra, dc->rb);
678
685 s ? "l" : "r", t ? "a" : "l", dc->rd, dc->ra, dc->rb);
686
679 t0 = tcg_temp_new();
687 if (e) {
688 if (imm_w + imm_s > 32 || imm_w == 0) {
689 /* These inputs have an undefined behavior. */
690 qemu_log_mask(LOG_GUEST_ERROR, "bsefi: Bad input w=%d s=%d\n",
691 imm_w, imm_s);
692 } else {
693 tcg_gen_extract_i32(cpu_R[dc->rd], cpu_R[dc->ra], imm_s, imm_w);
694 }
695 } else {
696 t0 = tcg_temp_new();
680
697
681 tcg_gen_mov_tl(t0, *(dec_alu_op_b(dc)));
682 tcg_gen_andi_tl(t0, t0, 31);
698 tcg_gen_mov_tl(t0, *(dec_alu_op_b(dc)));
699 tcg_gen_andi_tl(t0, t0, 31);
683
700
684 if (s) {
685 tcg_gen_shl_tl(cpu_R[dc->rd], cpu_R[dc->ra], t0);
686 } else {
687 if (t) {
688 tcg_gen_sar_tl(cpu_R[dc->rd], cpu_R[dc->ra], t0);
701 if (s) {
702 tcg_gen_shl_tl(cpu_R[dc->rd], cpu_R[dc->ra], t0);
689 } else {
703 } else {
690 tcg_gen_shr_tl(cpu_R[dc->rd], cpu_R[dc->ra], t0);
704 if (t) {
705 tcg_gen_sar_tl(cpu_R[dc->rd], cpu_R[dc->ra], t0);
706 } else {
707 tcg_gen_shr_tl(cpu_R[dc->rd], cpu_R[dc->ra], t0);
708 }
691 }
709 }
710 tcg_temp_free(t0);
692 }
711 }
693 tcg_temp_free(t0);
694}
695
696static void dec_bit(DisasContext *dc)
697{
698 CPUState *cs = CPU(dc->cpu);
699 TCGv t0;
700 unsigned int op;
701 int mem_index = cpu_mmu_index(&dc->cpu->env, false);

--- 1172 unchanged lines hidden ---
712}
713
714static void dec_bit(DisasContext *dc)
715{
716 CPUState *cs = CPU(dc->cpu);
717 TCGv t0;
718 unsigned int op;
719 int mem_index = cpu_mmu_index(&dc->cpu->env, false);

--- 1172 unchanged lines hidden ---