Revision eb23b556 target-unicore32/translate.c
b/target-unicore32/translate.c | ||
---|---|---|
64 | 64 |
|
65 | 65 |
for (i = 0; i < 32; i++) { |
66 | 66 |
cpu_R[i] = tcg_global_mem_new_i32(TCG_AREG0, |
67 |
offsetof(CPUState, regs[i]), regnames[i]); |
|
67 |
offsetof(CPUUniCore32State, regs[i]), regnames[i]);
|
|
68 | 68 |
} |
69 | 69 |
|
70 | 70 |
#define GEN_HELPER 2 |
... | ... | |
94 | 94 |
return tmp; |
95 | 95 |
} |
96 | 96 |
|
97 |
#define load_cpu_field(name) load_cpu_offset(offsetof(CPUState, name)) |
|
97 |
#define load_cpu_field(name) load_cpu_offset(offsetof(CPUUniCore32State, name))
|
|
98 | 98 |
|
99 | 99 |
static inline void store_cpu_offset(TCGv var, int offset) |
100 | 100 |
{ |
... | ... | |
103 | 103 |
} |
104 | 104 |
|
105 | 105 |
#define store_cpu_field(var, name) \ |
106 |
store_cpu_offset(var, offsetof(CPUState, name)) |
|
106 |
store_cpu_offset(var, offsetof(CPUUniCore32State, name))
|
|
107 | 107 |
|
108 | 108 |
/* Set a variable to the value of a CPU register. */ |
109 | 109 |
static void load_reg_var(DisasContext *s, TCGv var, int reg) |
... | ... | |
223 | 223 |
return tmp1; |
224 | 224 |
} |
225 | 225 |
|
226 |
#define gen_set_CF(var) tcg_gen_st_i32(var, cpu_env, offsetof(CPUState, CF)) |
|
226 |
#define gen_set_CF(var) tcg_gen_st_i32(var, cpu_env, offsetof(CPUUniCore32State, CF))
|
|
227 | 227 |
|
228 | 228 |
/* Set CF to the top bit of var. */ |
229 | 229 |
static void gen_set_CF_bit31(TCGv var) |
... | ... | |
237 | 237 |
/* Set N and Z flags from var. */ |
238 | 238 |
static inline void gen_logic_CC(TCGv var) |
239 | 239 |
{ |
240 |
tcg_gen_st_i32(var, cpu_env, offsetof(CPUState, NF)); |
|
241 |
tcg_gen_st_i32(var, cpu_env, offsetof(CPUState, ZF)); |
|
240 |
tcg_gen_st_i32(var, cpu_env, offsetof(CPUUniCore32State, NF));
|
|
241 |
tcg_gen_st_i32(var, cpu_env, offsetof(CPUUniCore32State, ZF));
|
|
242 | 242 |
} |
243 | 243 |
|
244 | 244 |
/* dest = T0 + T1 + CF. */ |
... | ... | |
634 | 634 |
static inline long ucf64_reg_offset(int reg) |
635 | 635 |
{ |
636 | 636 |
if (reg & 1) { |
637 |
return offsetof(CPUState, ucf64.regs[reg >> 1]) |
|
637 |
return offsetof(CPUUniCore32State, ucf64.regs[reg >> 1])
|
|
638 | 638 |
+ offsetof(CPU_DoubleU, l.upper); |
639 | 639 |
} else { |
640 |
return offsetof(CPUState, ucf64.regs[reg >> 1]) |
|
640 |
return offsetof(CPUUniCore32State, ucf64.regs[reg >> 1])
|
|
641 | 641 |
+ offsetof(CPU_DoubleU, l.lower); |
642 | 642 |
} |
643 | 643 |
} |
... | ... | |
646 | 646 |
#define ucf64_gen_st32(var, reg) store_cpu_offset(var, ucf64_reg_offset(reg)) |
647 | 647 |
|
648 | 648 |
/* UniCore-F64 single load/store I_offset */ |
649 |
static void do_ucf64_ldst_i(CPUState *env, DisasContext *s, uint32_t insn) |
|
649 |
static void do_ucf64_ldst_i(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
650 | 650 |
{ |
651 | 651 |
int offset; |
652 | 652 |
TCGv tmp; |
... | ... | |
692 | 692 |
} |
693 | 693 |
|
694 | 694 |
/* UniCore-F64 load/store multiple words */ |
695 |
static void do_ucf64_ldst_m(CPUState *env, DisasContext *s, uint32_t insn) |
|
695 |
static void do_ucf64_ldst_m(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
696 | 696 |
{ |
697 | 697 |
unsigned int i; |
698 | 698 |
int j, n, freg; |
... | ... | |
777 | 777 |
} |
778 | 778 |
|
779 | 779 |
/* UniCore-F64 mrc/mcr */ |
780 |
static void do_ucf64_trans(CPUState *env, DisasContext *s, uint32_t insn) |
|
780 |
static void do_ucf64_trans(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
781 | 781 |
{ |
782 | 782 |
TCGv tmp; |
783 | 783 |
|
... | ... | |
841 | 841 |
} |
842 | 842 |
|
843 | 843 |
/* UniCore-F64 convert instructions */ |
844 |
static void do_ucf64_fcvt(CPUState *env, DisasContext *s, uint32_t insn) |
|
844 |
static void do_ucf64_fcvt(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
845 | 845 |
{ |
846 | 846 |
if (UCOP_UCF64_FMT == 3) { |
847 | 847 |
ILLEGAL; |
... | ... | |
907 | 907 |
} |
908 | 908 |
|
909 | 909 |
/* UniCore-F64 compare instructions */ |
910 |
static void do_ucf64_fcmp(CPUState *env, DisasContext *s, uint32_t insn) |
|
910 |
static void do_ucf64_fcmp(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
911 | 911 |
{ |
912 | 912 |
if (UCOP_SET(25)) { |
913 | 913 |
ILLEGAL; |
... | ... | |
985 | 985 |
} while (0) |
986 | 986 |
|
987 | 987 |
/* UniCore-F64 data processing */ |
988 |
static void do_ucf64_datap(CPUState *env, DisasContext *s, uint32_t insn) |
|
988 |
static void do_ucf64_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
989 | 989 |
{ |
990 | 990 |
if (UCOP_UCF64_FMT == 3) { |
991 | 991 |
ILLEGAL; |
... | ... | |
1018 | 1018 |
} |
1019 | 1019 |
|
1020 | 1020 |
/* Disassemble an F64 instruction */ |
1021 |
static void disas_ucf64_insn(CPUState *env, DisasContext *s, uint32_t insn) |
|
1021 |
static void disas_ucf64_insn(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1022 | 1022 |
{ |
1023 | 1023 |
if (!UCOP_SET(29)) { |
1024 | 1024 |
if (UCOP_SET(26)) { |
... | ... | |
1123 | 1123 |
s->is_jmp = DISAS_UPDATE; |
1124 | 1124 |
} |
1125 | 1125 |
|
1126 |
static void disas_coproc_insn(CPUState *env, DisasContext *s, uint32_t insn) |
|
1126 |
static void disas_coproc_insn(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1127 | 1127 |
{ |
1128 | 1128 |
switch (UCOP_CPNUM) { |
1129 | 1129 |
case 2: |
... | ... | |
1168 | 1168 |
} |
1169 | 1169 |
|
1170 | 1170 |
/* data processing instructions */ |
1171 |
static void do_datap(CPUState *env, DisasContext *s, uint32_t insn) |
|
1171 |
static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1172 | 1172 |
{ |
1173 | 1173 |
TCGv tmp; |
1174 | 1174 |
TCGv tmp2; |
... | ... | |
1359 | 1359 |
} |
1360 | 1360 |
|
1361 | 1361 |
/* multiply */ |
1362 |
static void do_mult(CPUState *env, DisasContext *s, uint32_t insn) |
|
1362 |
static void do_mult(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1363 | 1363 |
{ |
1364 | 1364 |
TCGv tmp; |
1365 | 1365 |
TCGv tmp2; |
... | ... | |
1399 | 1399 |
} |
1400 | 1400 |
|
1401 | 1401 |
/* miscellaneous instructions */ |
1402 |
static void do_misc(CPUState *env, DisasContext *s, uint32_t insn) |
|
1402 |
static void do_misc(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1403 | 1403 |
{ |
1404 | 1404 |
unsigned int val; |
1405 | 1405 |
TCGv tmp; |
... | ... | |
1475 | 1475 |
} |
1476 | 1476 |
|
1477 | 1477 |
/* load/store I_offset and R_offset */ |
1478 |
static void do_ldst_ir(CPUState *env, DisasContext *s, uint32_t insn) |
|
1478 |
static void do_ldst_ir(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1479 | 1479 |
{ |
1480 | 1480 |
unsigned int i; |
1481 | 1481 |
TCGv tmp; |
... | ... | |
1524 | 1524 |
} |
1525 | 1525 |
|
1526 | 1526 |
/* SWP instruction */ |
1527 |
static void do_swap(CPUState *env, DisasContext *s, uint32_t insn) |
|
1527 |
static void do_swap(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1528 | 1528 |
{ |
1529 | 1529 |
TCGv addr; |
1530 | 1530 |
TCGv tmp; |
... | ... | |
1551 | 1551 |
} |
1552 | 1552 |
|
1553 | 1553 |
/* load/store hw/sb */ |
1554 |
static void do_ldst_hwsb(CPUState *env, DisasContext *s, uint32_t insn) |
|
1554 |
static void do_ldst_hwsb(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1555 | 1555 |
{ |
1556 | 1556 |
TCGv addr; |
1557 | 1557 |
TCGv tmp; |
... | ... | |
1603 | 1603 |
} |
1604 | 1604 |
|
1605 | 1605 |
/* load/store multiple words */ |
1606 |
static void do_ldst_m(CPUState *env, DisasContext *s, uint32_t insn) |
|
1606 |
static void do_ldst_m(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1607 | 1607 |
{ |
1608 | 1608 |
unsigned int val, i; |
1609 | 1609 |
int j, n, reg, user, loaded_base; |
... | ... | |
1743 | 1743 |
} |
1744 | 1744 |
|
1745 | 1745 |
/* branch (and link) */ |
1746 |
static void do_branch(CPUState *env, DisasContext *s, uint32_t insn) |
|
1746 |
static void do_branch(CPUUniCore32State *env, DisasContext *s, uint32_t insn)
|
|
1747 | 1747 |
{ |
1748 | 1748 |
unsigned int val; |
1749 | 1749 |
int32_t offset; |
... | ... | |
1772 | 1772 |
gen_jmp(s, val); |
1773 | 1773 |
} |
1774 | 1774 |
|
1775 |
static void disas_uc32_insn(CPUState *env, DisasContext *s) |
|
1775 |
static void disas_uc32_insn(CPUUniCore32State *env, DisasContext *s)
|
|
1776 | 1776 |
{ |
1777 | 1777 |
unsigned int insn; |
1778 | 1778 |
|
... | ... | |
1850 | 1850 |
/* generate intermediate code in gen_opc_buf and gen_opparam_buf for |
1851 | 1851 |
basic block 'tb'. If search_pc is TRUE, also generate PC |
1852 | 1852 |
information for each intermediate instruction. */ |
1853 |
static inline void gen_intermediate_code_internal(CPUState *env, |
|
1853 |
static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
|
|
1854 | 1854 |
TranslationBlock *tb, int search_pc) |
1855 | 1855 |
{ |
1856 | 1856 |
DisasContext dc1, *dc = &dc1; |
... | ... | |
2030 | 2030 |
} |
2031 | 2031 |
} |
2032 | 2032 |
|
2033 |
void gen_intermediate_code(CPUState *env, TranslationBlock *tb) |
|
2033 |
void gen_intermediate_code(CPUUniCore32State *env, TranslationBlock *tb)
|
|
2034 | 2034 |
{ |
2035 | 2035 |
gen_intermediate_code_internal(env, tb, 0); |
2036 | 2036 |
} |
2037 | 2037 |
|
2038 |
void gen_intermediate_code_pc(CPUState *env, TranslationBlock *tb) |
|
2038 |
void gen_intermediate_code_pc(CPUUniCore32State *env, TranslationBlock *tb)
|
|
2039 | 2039 |
{ |
2040 | 2040 |
gen_intermediate_code_internal(env, tb, 1); |
2041 | 2041 |
} |
... | ... | |
2046 | 2046 |
}; |
2047 | 2047 |
|
2048 | 2048 |
#define UCF64_DUMP_STATE |
2049 |
void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf, |
|
2049 |
void cpu_dump_state(CPUUniCore32State *env, FILE *f, fprintf_function cpu_fprintf,
|
|
2050 | 2050 |
int flags) |
2051 | 2051 |
{ |
2052 | 2052 |
int i; |
... | ... | |
2097 | 2097 |
#endif |
2098 | 2098 |
} |
2099 | 2099 |
|
2100 |
void restore_state_to_opc(CPUState *env, TranslationBlock *tb, int pc_pos) |
|
2100 |
void restore_state_to_opc(CPUUniCore32State *env, TranslationBlock *tb, int pc_pos)
|
|
2101 | 2101 |
{ |
2102 | 2102 |
env->regs[31] = gen_opc_pc[pc_pos]; |
2103 | 2103 |
} |
Also available in: Unified diff