On 06/25/2017 03:28 AM, Lluís Vilanova wrote:
+static TranslatorOps aarch64_translator_ops = {
+ .init_disas_context = aarch64_trblock_init_disas_context,
+ .insn_start = aarch64_trblock_insn_start,
+ .breakpoint_check = aarch64_trblock_breakpoint_check,
+ .disas_insn = aarch64_trblock_disas_insn,
+ .tb_stop = aarch64_trblock_tb_stop,
+ .disas_flags = aarch64_trblock_disas_flags,
+};
const.
+void gen_intermediate_code_a64(DisasContextBase *db, CPUState *cpu,
TranslationBlock *tb)
{
+ translate_block(&aarch64_translator_ops, db, cpu, &cpu_env, tb);
}
...
/* generate intermediate code for basic block 'tb'. */
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
{
DisasContext dc1, *dc = &dc1;
DisasContextBase *db = &dc->base;
/* generate intermediate code */
@@ -12202,97 +12214,11 @@ void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
* the A32/T32 complexity to do with conditional execution/IT blocks/etc.
*/
if (ARM_TBFLAG_AARCH64_STATE(tb->flags)) {
+ gen_intermediate_code_a64(db, cpu, tb);
return;
+ } else {
+ translate_block(&arm_translator_ops, db, cpu, &cpu_env, tb);
}
There's really no point in keeping gen_intermediate_code_a64 is there.
This is better written as
translate_block((ARM_TBFLAG_AARCH64_STATE(tb->flags)
? &aarch64_translator_ops
: &arm_translator_ops),
&dc->base, cpu, tb);
r~