提交 e6d767b7 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/rth/tags/pull-pa-20170907' into staging

Conversion to TranslatorOps

# gpg: Signature made Thu 07 Sep 2017 19:42:48 BST
# gpg:                using RSA key 0x64DF38E8AF7E215F
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A  05C0 64DF 38E8 AF7E 215F

* remotes/rth/tags/pull-pa-20170907:
  target/hppa: Convert to TranslatorOps
  target/hppa: Convert to DisasContextBase
  target/hppa: Convert to DisasJumpType
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
...@@ -24,10 +24,9 @@ ...@@ -24,10 +24,9 @@
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "tcg-op.h" #include "tcg-op.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "exec/helper-gen.h" #include "exec/helper-gen.h"
#include "exec/translator.h"
#include "trace-tcg.h" #include "trace-tcg.h"
#include "exec/log.h" #include "exec/log.h"
...@@ -39,7 +38,7 @@ typedef struct DisasCond { ...@@ -39,7 +38,7 @@ typedef struct DisasCond {
} DisasCond; } DisasCond;
typedef struct DisasContext { typedef struct DisasContext {
struct TranslationBlock *tb; DisasContextBase base;
CPUState *cs; CPUState *cs;
target_ulong iaoq_f; target_ulong iaoq_f;
...@@ -53,35 +52,24 @@ typedef struct DisasContext { ...@@ -53,35 +52,24 @@ typedef struct DisasContext {
DisasCond null_cond; DisasCond null_cond;
TCGLabel *null_lab; TCGLabel *null_lab;
bool singlestep_enabled;
bool psw_n_nonzero; bool psw_n_nonzero;
} DisasContext; } DisasContext;
/* Return values from translate_one, indicating the state of the TB. /* Target-specific return values from translate_one, indicating the
Note that zero indicates that we are not exiting the TB. */ state of the TB. Note that DISAS_NEXT indicates that we are not
exiting the TB. */
typedef enum {
NO_EXIT,
/* We have emitted one or more goto_tb. No fixup required. */
EXIT_GOTO_TB,
/* We are not using a goto_tb (for whatever reason), but have updated /* We are not using a goto_tb (for whatever reason), but have updated
the iaq (for whatever reason), so don't do it again on exit. */ the iaq (for whatever reason), so don't do it again on exit. */
EXIT_IAQ_N_UPDATED, #define DISAS_IAQ_N_UPDATED DISAS_TARGET_0
/* We are exiting the TB, but have neither emitted a goto_tb, nor /* We are exiting the TB, but have neither emitted a goto_tb, nor
updated the iaq for the next instruction to be executed. */ updated the iaq for the next instruction to be executed. */
EXIT_IAQ_N_STALE, #define DISAS_IAQ_N_STALE DISAS_TARGET_1
/* We are ending the TB with a noreturn function call, e.g. longjmp.
No following code will be executed. */
EXIT_NORETURN,
} ExitStatus;
typedef struct DisasInsn { typedef struct DisasInsn {
uint32_t insn, mask; uint32_t insn, mask;
ExitStatus (*trans)(DisasContext *ctx, uint32_t insn, DisasJumpType (*trans)(DisasContext *ctx, uint32_t insn,
const struct DisasInsn *f); const struct DisasInsn *f);
union { union {
void (*ttt)(TCGv, TCGv, TCGv); void (*ttt)(TCGv, TCGv, TCGv);
...@@ -415,7 +403,7 @@ static void nullify_set(DisasContext *ctx, bool x) ...@@ -415,7 +403,7 @@ static void nullify_set(DisasContext *ctx, bool x)
/* Mark the end of an instruction that may have been nullified. /* Mark the end of an instruction that may have been nullified.
This is the pair to nullify_over. */ This is the pair to nullify_over. */
static ExitStatus nullify_end(DisasContext *ctx, ExitStatus status) static DisasJumpType nullify_end(DisasContext *ctx, DisasJumpType status)
{ {
TCGLabel *null_lab = ctx->null_lab; TCGLabel *null_lab = ctx->null_lab;
...@@ -441,9 +429,9 @@ static ExitStatus nullify_end(DisasContext *ctx, ExitStatus status) ...@@ -441,9 +429,9 @@ static ExitStatus nullify_end(DisasContext *ctx, ExitStatus status)
ctx->null_cond = cond_make_n(); ctx->null_cond = cond_make_n();
} }
assert(status != EXIT_GOTO_TB && status != EXIT_IAQ_N_UPDATED); assert(status != DISAS_NORETURN && status != DISAS_IAQ_N_UPDATED);
if (status == EXIT_NORETURN) { if (status == DISAS_NORETURN) {
status = NO_EXIT; status = DISAS_NEXT;
} }
return status; return status;
} }
...@@ -469,16 +457,16 @@ static void gen_excp_1(int exception) ...@@ -469,16 +457,16 @@ static void gen_excp_1(int exception)
tcg_temp_free_i32(t); tcg_temp_free_i32(t);
} }
static ExitStatus gen_excp(DisasContext *ctx, int exception) static DisasJumpType gen_excp(DisasContext *ctx, int exception)
{ {
copy_iaoq_entry(cpu_iaoq_f, ctx->iaoq_f, cpu_iaoq_f); copy_iaoq_entry(cpu_iaoq_f, ctx->iaoq_f, cpu_iaoq_f);
copy_iaoq_entry(cpu_iaoq_b, ctx->iaoq_b, cpu_iaoq_b); copy_iaoq_entry(cpu_iaoq_b, ctx->iaoq_b, cpu_iaoq_b);
nullify_save(ctx); nullify_save(ctx);
gen_excp_1(exception); gen_excp_1(exception);
return EXIT_NORETURN; return DISAS_NORETURN;
} }
static ExitStatus gen_illegal(DisasContext *ctx) static DisasJumpType gen_illegal(DisasContext *ctx)
{ {
nullify_over(ctx); nullify_over(ctx);
return nullify_end(ctx, gen_excp(ctx, EXCP_SIGILL)); return nullify_end(ctx, gen_excp(ctx, EXCP_SIGILL));
...@@ -487,7 +475,7 @@ static ExitStatus gen_illegal(DisasContext *ctx) ...@@ -487,7 +475,7 @@ static ExitStatus gen_illegal(DisasContext *ctx)
static bool use_goto_tb(DisasContext *ctx, target_ulong dest) static bool use_goto_tb(DisasContext *ctx, target_ulong dest)
{ {
/* Suppress goto_tb in the case of single-steping and IO. */ /* Suppress goto_tb in the case of single-steping and IO. */
if ((ctx->tb->cflags & CF_LAST_IO) || ctx->singlestep_enabled) { if ((ctx->base.tb->cflags & CF_LAST_IO) || ctx->base.singlestep_enabled) {
return false; return false;
} }
return true; return true;
...@@ -510,11 +498,11 @@ static void gen_goto_tb(DisasContext *ctx, int which, ...@@ -510,11 +498,11 @@ static void gen_goto_tb(DisasContext *ctx, int which,
tcg_gen_goto_tb(which); tcg_gen_goto_tb(which);
tcg_gen_movi_tl(cpu_iaoq_f, f); tcg_gen_movi_tl(cpu_iaoq_f, f);
tcg_gen_movi_tl(cpu_iaoq_b, b); tcg_gen_movi_tl(cpu_iaoq_b, b);
tcg_gen_exit_tb((uintptr_t)ctx->tb + which); tcg_gen_exit_tb((uintptr_t)ctx->base.tb + which);
} else { } else {
copy_iaoq_entry(cpu_iaoq_f, f, cpu_iaoq_b); copy_iaoq_entry(cpu_iaoq_f, f, cpu_iaoq_b);
copy_iaoq_entry(cpu_iaoq_b, b, ctx->iaoq_n_var); copy_iaoq_entry(cpu_iaoq_b, b, ctx->iaoq_n_var);
if (ctx->singlestep_enabled) { if (ctx->base.singlestep_enabled) {
gen_excp_1(EXCP_DEBUG); gen_excp_1(EXCP_DEBUG);
} else { } else {
tcg_gen_lookup_and_goto_ptr(cpu_iaoq_f); tcg_gen_lookup_and_goto_ptr(cpu_iaoq_f);
...@@ -839,7 +827,7 @@ static TCGv do_sub_sv(DisasContext *ctx, TCGv res, TCGv in1, TCGv in2) ...@@ -839,7 +827,7 @@ static TCGv do_sub_sv(DisasContext *ctx, TCGv res, TCGv in1, TCGv in2)
return sv; return sv;
} }
static ExitStatus do_add(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2, static DisasJumpType do_add(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2,
unsigned shift, bool is_l, bool is_tsv, bool is_tc, unsigned shift, bool is_l, bool is_tsv, bool is_tc,
bool is_c, unsigned cf) bool is_c, unsigned cf)
{ {
...@@ -908,10 +896,10 @@ static ExitStatus do_add(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2, ...@@ -908,10 +896,10 @@ static ExitStatus do_add(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2,
/* Install the new nullification. */ /* Install the new nullification. */
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
ctx->null_cond = cond; ctx->null_cond = cond;
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus do_sub(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2, static DisasJumpType do_sub(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2,
bool is_tsv, bool is_b, bool is_tc, unsigned cf) bool is_tsv, bool is_b, bool is_tc, unsigned cf)
{ {
TCGv dest, sv, cb, cb_msb, zero, tmp; TCGv dest, sv, cb, cb_msb, zero, tmp;
...@@ -974,10 +962,10 @@ static ExitStatus do_sub(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2, ...@@ -974,10 +962,10 @@ static ExitStatus do_sub(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2,
/* Install the new nullification. */ /* Install the new nullification. */
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
ctx->null_cond = cond; ctx->null_cond = cond;
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus do_cmpclr(DisasContext *ctx, unsigned rt, TCGv in1, static DisasJumpType do_cmpclr(DisasContext *ctx, unsigned rt, TCGv in1,
TCGv in2, unsigned cf) TCGv in2, unsigned cf)
{ {
TCGv dest, sv; TCGv dest, sv;
...@@ -1003,10 +991,10 @@ static ExitStatus do_cmpclr(DisasContext *ctx, unsigned rt, TCGv in1, ...@@ -1003,10 +991,10 @@ static ExitStatus do_cmpclr(DisasContext *ctx, unsigned rt, TCGv in1,
/* Install the new nullification. */ /* Install the new nullification. */
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
ctx->null_cond = cond; ctx->null_cond = cond;
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus do_log(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2, static DisasJumpType do_log(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2,
unsigned cf, void (*fn)(TCGv, TCGv, TCGv)) unsigned cf, void (*fn)(TCGv, TCGv, TCGv))
{ {
TCGv dest = dest_gpr(ctx, rt); TCGv dest = dest_gpr(ctx, rt);
...@@ -1020,10 +1008,10 @@ static ExitStatus do_log(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2, ...@@ -1020,10 +1008,10 @@ static ExitStatus do_log(DisasContext *ctx, unsigned rt, TCGv in1, TCGv in2,
if (cf) { if (cf) {
ctx->null_cond = do_log_cond(cf, dest); ctx->null_cond = do_log_cond(cf, dest);
} }
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus do_unit(DisasContext *ctx, unsigned rt, TCGv in1, static DisasJumpType do_unit(DisasContext *ctx, unsigned rt, TCGv in1,
TCGv in2, unsigned cf, bool is_tc, TCGv in2, unsigned cf, bool is_tc,
void (*fn)(TCGv, TCGv, TCGv)) void (*fn)(TCGv, TCGv, TCGv))
{ {
...@@ -1053,7 +1041,7 @@ static ExitStatus do_unit(DisasContext *ctx, unsigned rt, TCGv in1, ...@@ -1053,7 +1041,7 @@ static ExitStatus do_unit(DisasContext *ctx, unsigned rt, TCGv in1,
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
ctx->null_cond = cond; ctx->null_cond = cond;
} }
return NO_EXIT; return DISAS_NEXT;
} }
/* Emit a memory load. The modify parameter should be /* Emit a memory load. The modify parameter should be
...@@ -1185,7 +1173,7 @@ static void do_store_64(DisasContext *ctx, TCGv_i64 src, unsigned rb, ...@@ -1185,7 +1173,7 @@ static void do_store_64(DisasContext *ctx, TCGv_i64 src, unsigned rb,
#define do_store_tl do_store_32 #define do_store_tl do_store_32
#endif #endif
static ExitStatus do_load(DisasContext *ctx, unsigned rt, unsigned rb, static DisasJumpType do_load(DisasContext *ctx, unsigned rt, unsigned rb,
unsigned rx, int scale, target_long disp, unsigned rx, int scale, target_long disp,
int modify, TCGMemOp mop) int modify, TCGMemOp mop)
{ {
...@@ -1203,10 +1191,10 @@ static ExitStatus do_load(DisasContext *ctx, unsigned rt, unsigned rb, ...@@ -1203,10 +1191,10 @@ static ExitStatus do_load(DisasContext *ctx, unsigned rt, unsigned rb,
do_load_tl(ctx, dest, rb, rx, scale, disp, modify, mop); do_load_tl(ctx, dest, rb, rx, scale, disp, modify, mop);
save_gpr(ctx, rt, dest); save_gpr(ctx, rt, dest);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_floadw(DisasContext *ctx, unsigned rt, unsigned rb, static DisasJumpType do_floadw(DisasContext *ctx, unsigned rt, unsigned rb,
unsigned rx, int scale, target_long disp, unsigned rx, int scale, target_long disp,
int modify) int modify)
{ {
...@@ -1223,10 +1211,10 @@ static ExitStatus do_floadw(DisasContext *ctx, unsigned rt, unsigned rb, ...@@ -1223,10 +1211,10 @@ static ExitStatus do_floadw(DisasContext *ctx, unsigned rt, unsigned rb,
gen_helper_loaded_fr0(cpu_env); gen_helper_loaded_fr0(cpu_env);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_floadd(DisasContext *ctx, unsigned rt, unsigned rb, static DisasJumpType do_floadd(DisasContext *ctx, unsigned rt, unsigned rb,
unsigned rx, int scale, target_long disp, unsigned rx, int scale, target_long disp,
int modify) int modify)
{ {
...@@ -1243,18 +1231,18 @@ static ExitStatus do_floadd(DisasContext *ctx, unsigned rt, unsigned rb, ...@@ -1243,18 +1231,18 @@ static ExitStatus do_floadd(DisasContext *ctx, unsigned rt, unsigned rb,
gen_helper_loaded_fr0(cpu_env); gen_helper_loaded_fr0(cpu_env);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_store(DisasContext *ctx, unsigned rt, unsigned rb, static DisasJumpType do_store(DisasContext *ctx, unsigned rt, unsigned rb,
target_long disp, int modify, TCGMemOp mop) target_long disp, int modify, TCGMemOp mop)
{ {
nullify_over(ctx); nullify_over(ctx);
do_store_tl(ctx, load_gpr(ctx, rt), rb, 0, 0, disp, modify, mop); do_store_tl(ctx, load_gpr(ctx, rt), rb, 0, 0, disp, modify, mop);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fstorew(DisasContext *ctx, unsigned rt, unsigned rb, static DisasJumpType do_fstorew(DisasContext *ctx, unsigned rt, unsigned rb,
unsigned rx, int scale, target_long disp, unsigned rx, int scale, target_long disp,
int modify) int modify)
{ {
...@@ -1266,10 +1254,10 @@ static ExitStatus do_fstorew(DisasContext *ctx, unsigned rt, unsigned rb, ...@@ -1266,10 +1254,10 @@ static ExitStatus do_fstorew(DisasContext *ctx, unsigned rt, unsigned rb,
do_store_32(ctx, tmp, rb, rx, scale, disp, modify, MO_TEUL); do_store_32(ctx, tmp, rb, rx, scale, disp, modify, MO_TEUL);
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fstored(DisasContext *ctx, unsigned rt, unsigned rb, static DisasJumpType do_fstored(DisasContext *ctx, unsigned rt, unsigned rb,
unsigned rx, int scale, target_long disp, unsigned rx, int scale, target_long disp,
int modify) int modify)
{ {
...@@ -1281,10 +1269,10 @@ static ExitStatus do_fstored(DisasContext *ctx, unsigned rt, unsigned rb, ...@@ -1281,10 +1269,10 @@ static ExitStatus do_fstored(DisasContext *ctx, unsigned rt, unsigned rb,
do_store_64(ctx, tmp, rb, rx, scale, disp, modify, MO_TEQ); do_store_64(ctx, tmp, rb, rx, scale, disp, modify, MO_TEQ);
tcg_temp_free_i64(tmp); tcg_temp_free_i64(tmp);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fop_wew(DisasContext *ctx, unsigned rt, unsigned ra, static DisasJumpType do_fop_wew(DisasContext *ctx, unsigned rt, unsigned ra,
void (*func)(TCGv_i32, TCGv_env, TCGv_i32)) void (*func)(TCGv_i32, TCGv_env, TCGv_i32))
{ {
TCGv_i32 tmp; TCGv_i32 tmp;
...@@ -1296,10 +1284,10 @@ static ExitStatus do_fop_wew(DisasContext *ctx, unsigned rt, unsigned ra, ...@@ -1296,10 +1284,10 @@ static ExitStatus do_fop_wew(DisasContext *ctx, unsigned rt, unsigned ra,
save_frw_i32(rt, tmp); save_frw_i32(rt, tmp);
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fop_wed(DisasContext *ctx, unsigned rt, unsigned ra, static DisasJumpType do_fop_wed(DisasContext *ctx, unsigned rt, unsigned ra,
void (*func)(TCGv_i32, TCGv_env, TCGv_i64)) void (*func)(TCGv_i32, TCGv_env, TCGv_i64))
{ {
TCGv_i32 dst; TCGv_i32 dst;
...@@ -1314,10 +1302,10 @@ static ExitStatus do_fop_wed(DisasContext *ctx, unsigned rt, unsigned ra, ...@@ -1314,10 +1302,10 @@ static ExitStatus do_fop_wed(DisasContext *ctx, unsigned rt, unsigned ra,
tcg_temp_free_i64(src); tcg_temp_free_i64(src);
save_frw_i32(rt, dst); save_frw_i32(rt, dst);
tcg_temp_free_i32(dst); tcg_temp_free_i32(dst);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fop_ded(DisasContext *ctx, unsigned rt, unsigned ra, static DisasJumpType do_fop_ded(DisasContext *ctx, unsigned rt, unsigned ra,
void (*func)(TCGv_i64, TCGv_env, TCGv_i64)) void (*func)(TCGv_i64, TCGv_env, TCGv_i64))
{ {
TCGv_i64 tmp; TCGv_i64 tmp;
...@@ -1329,10 +1317,10 @@ static ExitStatus do_fop_ded(DisasContext *ctx, unsigned rt, unsigned ra, ...@@ -1329,10 +1317,10 @@ static ExitStatus do_fop_ded(DisasContext *ctx, unsigned rt, unsigned ra,
save_frd(rt, tmp); save_frd(rt, tmp);
tcg_temp_free_i64(tmp); tcg_temp_free_i64(tmp);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fop_dew(DisasContext *ctx, unsigned rt, unsigned ra, static DisasJumpType do_fop_dew(DisasContext *ctx, unsigned rt, unsigned ra,
void (*func)(TCGv_i64, TCGv_env, TCGv_i32)) void (*func)(TCGv_i64, TCGv_env, TCGv_i32))
{ {
TCGv_i32 src; TCGv_i32 src;
...@@ -1347,10 +1335,10 @@ static ExitStatus do_fop_dew(DisasContext *ctx, unsigned rt, unsigned ra, ...@@ -1347,10 +1335,10 @@ static ExitStatus do_fop_dew(DisasContext *ctx, unsigned rt, unsigned ra,
tcg_temp_free_i32(src); tcg_temp_free_i32(src);
save_frd(rt, dst); save_frd(rt, dst);
tcg_temp_free_i64(dst); tcg_temp_free_i64(dst);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fop_weww(DisasContext *ctx, unsigned rt, static DisasJumpType do_fop_weww(DisasContext *ctx, unsigned rt,
unsigned ra, unsigned rb, unsigned ra, unsigned rb,
void (*func)(TCGv_i32, TCGv_env, void (*func)(TCGv_i32, TCGv_env,
TCGv_i32, TCGv_i32)) TCGv_i32, TCGv_i32))
...@@ -1366,10 +1354,10 @@ static ExitStatus do_fop_weww(DisasContext *ctx, unsigned rt, ...@@ -1366,10 +1354,10 @@ static ExitStatus do_fop_weww(DisasContext *ctx, unsigned rt,
tcg_temp_free_i32(b); tcg_temp_free_i32(b);
save_frw_i32(rt, a); save_frw_i32(rt, a);
tcg_temp_free_i32(a); tcg_temp_free_i32(a);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus do_fop_dedd(DisasContext *ctx, unsigned rt, static DisasJumpType do_fop_dedd(DisasContext *ctx, unsigned rt,
unsigned ra, unsigned rb, unsigned ra, unsigned rb,
void (*func)(TCGv_i64, TCGv_env, void (*func)(TCGv_i64, TCGv_env,
TCGv_i64, TCGv_i64)) TCGv_i64, TCGv_i64))
...@@ -1385,12 +1373,12 @@ static ExitStatus do_fop_dedd(DisasContext *ctx, unsigned rt, ...@@ -1385,12 +1373,12 @@ static ExitStatus do_fop_dedd(DisasContext *ctx, unsigned rt,
tcg_temp_free_i64(b); tcg_temp_free_i64(b);
save_frd(rt, a); save_frd(rt, a);
tcg_temp_free_i64(a); tcg_temp_free_i64(a);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
/* Emit an unconditional branch to a direct target, which may or may not /* Emit an unconditional branch to a direct target, which may or may not
have already had nullification handled. */ have already had nullification handled. */
static ExitStatus do_dbranch(DisasContext *ctx, target_ulong dest, static DisasJumpType do_dbranch(DisasContext *ctx, target_ulong dest,
unsigned link, bool is_n) unsigned link, bool is_n)
{ {
if (ctx->null_cond.c == TCG_COND_NEVER && ctx->null_lab == NULL) { if (ctx->null_cond.c == TCG_COND_NEVER && ctx->null_lab == NULL) {
...@@ -1401,7 +1389,7 @@ static ExitStatus do_dbranch(DisasContext *ctx, target_ulong dest, ...@@ -1401,7 +1389,7 @@ static ExitStatus do_dbranch(DisasContext *ctx, target_ulong dest,
if (is_n) { if (is_n) {
ctx->null_cond.c = TCG_COND_ALWAYS; ctx->null_cond.c = TCG_COND_ALWAYS;
} }
return NO_EXIT; return DISAS_NEXT;
} else { } else {
nullify_over(ctx); nullify_over(ctx);
...@@ -1417,17 +1405,17 @@ static ExitStatus do_dbranch(DisasContext *ctx, target_ulong dest, ...@@ -1417,17 +1405,17 @@ static ExitStatus do_dbranch(DisasContext *ctx, target_ulong dest,
gen_goto_tb(ctx, 0, ctx->iaoq_b, dest); gen_goto_tb(ctx, 0, ctx->iaoq_b, dest);
} }
nullify_end(ctx, NO_EXIT); nullify_end(ctx, DISAS_NEXT);
nullify_set(ctx, 0); nullify_set(ctx, 0);
gen_goto_tb(ctx, 1, ctx->iaoq_b, ctx->iaoq_n); gen_goto_tb(ctx, 1, ctx->iaoq_b, ctx->iaoq_n);
return EXIT_GOTO_TB; return DISAS_NORETURN;
} }
} }
/* Emit a conditional branch to a direct target. If the branch itself /* Emit a conditional branch to a direct target. If the branch itself
is nullified, we should have already used nullify_over. */ is nullified, we should have already used nullify_over. */
static ExitStatus do_cbranch(DisasContext *ctx, target_long disp, bool is_n, static DisasJumpType do_cbranch(DisasContext *ctx, target_long disp, bool is_n,
DisasCond *cond) DisasCond *cond)
{ {
target_ulong dest = iaoq_dest(ctx, disp); target_ulong dest = iaoq_dest(ctx, disp);
...@@ -1480,15 +1468,15 @@ static ExitStatus do_cbranch(DisasContext *ctx, target_long disp, bool is_n, ...@@ -1480,15 +1468,15 @@ static ExitStatus do_cbranch(DisasContext *ctx, target_long disp, bool is_n,
if (ctx->null_lab) { if (ctx->null_lab) {
gen_set_label(ctx->null_lab); gen_set_label(ctx->null_lab);
ctx->null_lab = NULL; ctx->null_lab = NULL;
return EXIT_IAQ_N_STALE; return DISAS_IAQ_N_STALE;
} else { } else {
return EXIT_GOTO_TB; return DISAS_NORETURN;
} }
} }
/* Emit an unconditional branch to an indirect target. This handles /* Emit an unconditional branch to an indirect target. This handles
nullification of the branch itself. */ nullification of the branch itself. */
static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest, static DisasJumpType do_ibranch(DisasContext *ctx, TCGv dest,
unsigned link, bool is_n) unsigned link, bool is_n)
{ {
TCGv a0, a1, next, tmp; TCGv a0, a1, next, tmp;
...@@ -1528,7 +1516,7 @@ static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest, ...@@ -1528,7 +1516,7 @@ static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest,
tcg_gen_movi_tl(cpu_gr[link], ctx->iaoq_n); tcg_gen_movi_tl(cpu_gr[link], ctx->iaoq_n);
} }
tcg_gen_lookup_and_goto_ptr(cpu_iaoq_f); tcg_gen_lookup_and_goto_ptr(cpu_iaoq_f);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} else { } else {
cond_prep(&ctx->null_cond); cond_prep(&ctx->null_cond);
c = ctx->null_cond.c; c = ctx->null_cond.c;
...@@ -1560,7 +1548,7 @@ static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest, ...@@ -1560,7 +1548,7 @@ static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest,
} }
} }
return NO_EXIT; return DISAS_NEXT;
} }
/* On Linux, page zero is normally marked execute only + gateway. /* On Linux, page zero is normally marked execute only + gateway.
...@@ -1570,7 +1558,7 @@ static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest, ...@@ -1570,7 +1558,7 @@ static ExitStatus do_ibranch(DisasContext *ctx, TCGv dest,
in than the "be disp(sr2,r0)" instruction that probably sent us in than the "be disp(sr2,r0)" instruction that probably sent us
here, is the easiest way to handle the branch delay slot on the here, is the easiest way to handle the branch delay slot on the
aforementioned BE. */ aforementioned BE. */
static ExitStatus do_page_zero(DisasContext *ctx) static DisasJumpType do_page_zero(DisasContext *ctx)
{ {
/* If by some means we get here with PSW[N]=1, that implies that /* If by some means we get here with PSW[N]=1, that implies that
the B,GATE instruction would be skipped, and we'd fault on the the B,GATE instruction would be skipped, and we'd fault on the
...@@ -1598,54 +1586,54 @@ static ExitStatus do_page_zero(DisasContext *ctx) ...@@ -1598,54 +1586,54 @@ static ExitStatus do_page_zero(DisasContext *ctx)
switch (ctx->iaoq_f) { switch (ctx->iaoq_f) {
case 0x00: /* Null pointer call */ case 0x00: /* Null pointer call */
gen_excp_1(EXCP_SIGSEGV); gen_excp_1(EXCP_SIGSEGV);
return EXIT_NORETURN; return DISAS_NORETURN;
case 0xb0: /* LWS */ case 0xb0: /* LWS */
gen_excp_1(EXCP_SYSCALL_LWS); gen_excp_1(EXCP_SYSCALL_LWS);
return EXIT_NORETURN; return DISAS_NORETURN;
case 0xe0: /* SET_THREAD_POINTER */ case 0xe0: /* SET_THREAD_POINTER */
tcg_gen_mov_tl(cpu_cr27, cpu_gr[26]); tcg_gen_mov_tl(cpu_cr27, cpu_gr[26]);
tcg_gen_mov_tl(cpu_iaoq_f, cpu_gr[31]); tcg_gen_mov_tl(cpu_iaoq_f, cpu_gr[31]);
tcg_gen_addi_tl(cpu_iaoq_b, cpu_iaoq_f, 4); tcg_gen_addi_tl(cpu_iaoq_b, cpu_iaoq_f, 4);
return EXIT_IAQ_N_UPDATED; return DISAS_IAQ_N_UPDATED;
case 0x100: /* SYSCALL */ case 0x100: /* SYSCALL */
gen_excp_1(EXCP_SYSCALL); gen_excp_1(EXCP_SYSCALL);
return EXIT_NORETURN; return DISAS_NORETURN;
default: default:
do_sigill: do_sigill:
gen_excp_1(EXCP_SIGILL); gen_excp_1(EXCP_SIGILL);
return EXIT_NORETURN; return DISAS_NORETURN;
} }
} }
static ExitStatus trans_nop(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_nop(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_break(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_break(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
nullify_over(ctx); nullify_over(ctx);
return nullify_end(ctx, gen_excp(ctx, EXCP_DEBUG)); return nullify_end(ctx, gen_excp(ctx, EXCP_DEBUG));
} }
static ExitStatus trans_sync(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_sync(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
/* No point in nullifying the memory barrier. */ /* No point in nullifying the memory barrier. */
tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL); tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_mfia(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_mfia(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -1654,10 +1642,10 @@ static ExitStatus trans_mfia(DisasContext *ctx, uint32_t insn, ...@@ -1654,10 +1642,10 @@ static ExitStatus trans_mfia(DisasContext *ctx, uint32_t insn,
save_gpr(ctx, rt, tmp); save_gpr(ctx, rt, tmp);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_mfsp(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_mfsp(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -1668,10 +1656,10 @@ static ExitStatus trans_mfsp(DisasContext *ctx, uint32_t insn, ...@@ -1668,10 +1656,10 @@ static ExitStatus trans_mfsp(DisasContext *ctx, uint32_t insn,
save_gpr(ctx, rt, tmp); save_gpr(ctx, rt, tmp);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_mfctl(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_mfctl(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -1708,10 +1696,10 @@ static ExitStatus trans_mfctl(DisasContext *ctx, uint32_t insn, ...@@ -1708,10 +1696,10 @@ static ExitStatus trans_mfctl(DisasContext *ctx, uint32_t insn,
} }
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_mtctl(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_mtctl(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rin = extract32(insn, 16, 5); unsigned rin = extract32(insn, 16, 5);
...@@ -1729,10 +1717,10 @@ static ExitStatus trans_mtctl(DisasContext *ctx, uint32_t insn, ...@@ -1729,10 +1717,10 @@ static ExitStatus trans_mtctl(DisasContext *ctx, uint32_t insn,
} }
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_mtsarcm(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_mtsarcm(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rin = extract32(insn, 16, 5); unsigned rin = extract32(insn, 16, 5);
...@@ -1744,10 +1732,10 @@ static ExitStatus trans_mtsarcm(DisasContext *ctx, uint32_t insn, ...@@ -1744,10 +1732,10 @@ static ExitStatus trans_mtsarcm(DisasContext *ctx, uint32_t insn,
tcg_temp_free(tmp); tcg_temp_free(tmp);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_ldsid(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ldsid(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -1758,7 +1746,7 @@ static ExitStatus trans_ldsid(DisasContext *ctx, uint32_t insn, ...@@ -1758,7 +1746,7 @@ static ExitStatus trans_ldsid(DisasContext *ctx, uint32_t insn,
save_gpr(ctx, rt, dest); save_gpr(ctx, rt, dest);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static const DisasInsn table_system[] = { static const DisasInsn table_system[] = {
...@@ -1774,7 +1762,7 @@ static const DisasInsn table_system[] = { ...@@ -1774,7 +1762,7 @@ static const DisasInsn table_system[] = {
{ 0x000010a0u, 0xfc1f3fe0u, trans_ldsid }, { 0x000010a0u, 0xfc1f3fe0u, trans_ldsid },
}; };
static ExitStatus trans_base_idx_mod(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_base_idx_mod(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rb = extract32(insn, 21, 5); unsigned rb = extract32(insn, 21, 5);
...@@ -1788,10 +1776,10 @@ static ExitStatus trans_base_idx_mod(DisasContext *ctx, uint32_t insn, ...@@ -1788,10 +1776,10 @@ static ExitStatus trans_base_idx_mod(DisasContext *ctx, uint32_t insn,
save_gpr(ctx, rb, dest); save_gpr(ctx, rb, dest);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_probe(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_probe(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -1809,7 +1797,7 @@ static ExitStatus trans_probe(DisasContext *ctx, uint32_t insn, ...@@ -1809,7 +1797,7 @@ static ExitStatus trans_probe(DisasContext *ctx, uint32_t insn,
gen_helper_probe_r(dest, load_gpr(ctx, rb)); gen_helper_probe_r(dest, load_gpr(ctx, rb));
} }
save_gpr(ctx, rt, dest); save_gpr(ctx, rt, dest);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static const DisasInsn table_mem_mgmt[] = { static const DisasInsn table_mem_mgmt[] = {
...@@ -1830,7 +1818,7 @@ static const DisasInsn table_mem_mgmt[] = { ...@@ -1830,7 +1818,7 @@ static const DisasInsn table_mem_mgmt[] = {
{ 0x04003180u, 0xfc003fa0u, trans_probe }, /* probei */ { 0x04003180u, 0xfc003fa0u, trans_probe }, /* probei */
}; };
static ExitStatus trans_add(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_add(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -1844,7 +1832,7 @@ static ExitStatus trans_add(DisasContext *ctx, uint32_t insn, ...@@ -1844,7 +1832,7 @@ static ExitStatus trans_add(DisasContext *ctx, uint32_t insn,
bool is_l = false; bool is_l = false;
bool is_tc = false; bool is_tc = false;
bool is_tsv = false; bool is_tsv = false;
ExitStatus ret; DisasJumpType ret;
switch (ext) { switch (ext) {
case 0x6: /* ADD, SHLADD */ case 0x6: /* ADD, SHLADD */
...@@ -1874,7 +1862,7 @@ static ExitStatus trans_add(DisasContext *ctx, uint32_t insn, ...@@ -1874,7 +1862,7 @@ static ExitStatus trans_add(DisasContext *ctx, uint32_t insn,
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_sub(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_sub(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -1886,7 +1874,7 @@ static ExitStatus trans_sub(DisasContext *ctx, uint32_t insn, ...@@ -1886,7 +1874,7 @@ static ExitStatus trans_sub(DisasContext *ctx, uint32_t insn,
bool is_b = false; bool is_b = false;
bool is_tc = false; bool is_tc = false;
bool is_tsv = false; bool is_tsv = false;
ExitStatus ret; DisasJumpType ret;
switch (ext) { switch (ext) {
case 0x10: /* SUB */ case 0x10: /* SUB */
...@@ -1919,7 +1907,7 @@ static ExitStatus trans_sub(DisasContext *ctx, uint32_t insn, ...@@ -1919,7 +1907,7 @@ static ExitStatus trans_sub(DisasContext *ctx, uint32_t insn,
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_log(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_log(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -1927,7 +1915,7 @@ static ExitStatus trans_log(DisasContext *ctx, uint32_t insn, ...@@ -1927,7 +1915,7 @@ static ExitStatus trans_log(DisasContext *ctx, uint32_t insn,
unsigned cf = extract32(insn, 12, 4); unsigned cf = extract32(insn, 12, 4);
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
TCGv tcg_r1, tcg_r2; TCGv tcg_r1, tcg_r2;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -1939,7 +1927,7 @@ static ExitStatus trans_log(DisasContext *ctx, uint32_t insn, ...@@ -1939,7 +1927,7 @@ static ExitStatus trans_log(DisasContext *ctx, uint32_t insn,
} }
/* OR r,0,t -> COPY (according to gas) */ /* OR r,0,t -> COPY (according to gas) */
static ExitStatus trans_copy(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_copy(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r1 = extract32(insn, 16, 5); unsigned r1 = extract32(insn, 16, 5);
...@@ -1953,10 +1941,10 @@ static ExitStatus trans_copy(DisasContext *ctx, uint32_t insn, ...@@ -1953,10 +1941,10 @@ static ExitStatus trans_copy(DisasContext *ctx, uint32_t insn,
save_gpr(ctx, rt, cpu_gr[r1]); save_gpr(ctx, rt, cpu_gr[r1]);
} }
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_cmpclr(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_cmpclr(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -1964,7 +1952,7 @@ static ExitStatus trans_cmpclr(DisasContext *ctx, uint32_t insn, ...@@ -1964,7 +1952,7 @@ static ExitStatus trans_cmpclr(DisasContext *ctx, uint32_t insn,
unsigned cf = extract32(insn, 12, 4); unsigned cf = extract32(insn, 12, 4);
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
TCGv tcg_r1, tcg_r2; TCGv tcg_r1, tcg_r2;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -1975,7 +1963,7 @@ static ExitStatus trans_cmpclr(DisasContext *ctx, uint32_t insn, ...@@ -1975,7 +1963,7 @@ static ExitStatus trans_cmpclr(DisasContext *ctx, uint32_t insn,
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_uxor(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_uxor(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -1983,7 +1971,7 @@ static ExitStatus trans_uxor(DisasContext *ctx, uint32_t insn, ...@@ -1983,7 +1971,7 @@ static ExitStatus trans_uxor(DisasContext *ctx, uint32_t insn,
unsigned cf = extract32(insn, 12, 4); unsigned cf = extract32(insn, 12, 4);
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
TCGv tcg_r1, tcg_r2; TCGv tcg_r1, tcg_r2;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -1994,7 +1982,7 @@ static ExitStatus trans_uxor(DisasContext *ctx, uint32_t insn, ...@@ -1994,7 +1982,7 @@ static ExitStatus trans_uxor(DisasContext *ctx, uint32_t insn,
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_uaddcm(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_uaddcm(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -2003,7 +1991,7 @@ static ExitStatus trans_uaddcm(DisasContext *ctx, uint32_t insn, ...@@ -2003,7 +1991,7 @@ static ExitStatus trans_uaddcm(DisasContext *ctx, uint32_t insn,
unsigned is_tc = extract32(insn, 6, 1); unsigned is_tc = extract32(insn, 6, 1);
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
TCGv tcg_r1, tcg_r2, tmp; TCGv tcg_r1, tcg_r2, tmp;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -2016,7 +2004,7 @@ static ExitStatus trans_uaddcm(DisasContext *ctx, uint32_t insn, ...@@ -2016,7 +2004,7 @@ static ExitStatus trans_uaddcm(DisasContext *ctx, uint32_t insn,
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_dcor(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_dcor(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -2024,7 +2012,7 @@ static ExitStatus trans_dcor(DisasContext *ctx, uint32_t insn, ...@@ -2024,7 +2012,7 @@ static ExitStatus trans_dcor(DisasContext *ctx, uint32_t insn,
unsigned is_i = extract32(insn, 6, 1); unsigned is_i = extract32(insn, 6, 1);
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
TCGv tmp; TCGv tmp;
ExitStatus ret; DisasJumpType ret;
nullify_over(ctx); nullify_over(ctx);
...@@ -2041,7 +2029,7 @@ static ExitStatus trans_dcor(DisasContext *ctx, uint32_t insn, ...@@ -2041,7 +2029,7 @@ static ExitStatus trans_dcor(DisasContext *ctx, uint32_t insn,
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_ds(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ds(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
...@@ -2105,7 +2093,7 @@ static ExitStatus trans_ds(DisasContext *ctx, uint32_t insn, ...@@ -2105,7 +2093,7 @@ static ExitStatus trans_ds(DisasContext *ctx, uint32_t insn,
tcg_temp_free(add2); tcg_temp_free(add2);
tcg_temp_free(dest); tcg_temp_free(dest);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static const DisasInsn table_arith_log[] = { static const DisasInsn table_arith_log[] = {
...@@ -2126,7 +2114,7 @@ static const DisasInsn table_arith_log[] = { ...@@ -2126,7 +2114,7 @@ static const DisasInsn table_arith_log[] = {
{ 0x08000200u, 0xfc000320u, trans_add }, /* shladd */ { 0x08000200u, 0xfc000320u, trans_add }, /* shladd */
}; };
static ExitStatus trans_addi(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_addi(DisasContext *ctx, uint32_t insn)
{ {
target_long im = low_sextract(insn, 0, 11); target_long im = low_sextract(insn, 0, 11);
unsigned e1 = extract32(insn, 11, 1); unsigned e1 = extract32(insn, 11, 1);
...@@ -2135,7 +2123,7 @@ static ExitStatus trans_addi(DisasContext *ctx, uint32_t insn) ...@@ -2135,7 +2123,7 @@ static ExitStatus trans_addi(DisasContext *ctx, uint32_t insn)
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
unsigned o1 = extract32(insn, 26, 1); unsigned o1 = extract32(insn, 26, 1);
TCGv tcg_im, tcg_r2; TCGv tcg_im, tcg_r2;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -2148,7 +2136,7 @@ static ExitStatus trans_addi(DisasContext *ctx, uint32_t insn) ...@@ -2148,7 +2136,7 @@ static ExitStatus trans_addi(DisasContext *ctx, uint32_t insn)
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_subi(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_subi(DisasContext *ctx, uint32_t insn)
{ {
target_long im = low_sextract(insn, 0, 11); target_long im = low_sextract(insn, 0, 11);
unsigned e1 = extract32(insn, 11, 1); unsigned e1 = extract32(insn, 11, 1);
...@@ -2156,7 +2144,7 @@ static ExitStatus trans_subi(DisasContext *ctx, uint32_t insn) ...@@ -2156,7 +2144,7 @@ static ExitStatus trans_subi(DisasContext *ctx, uint32_t insn)
unsigned rt = extract32(insn, 16, 5); unsigned rt = extract32(insn, 16, 5);
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
TCGv tcg_im, tcg_r2; TCGv tcg_im, tcg_r2;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -2169,14 +2157,14 @@ static ExitStatus trans_subi(DisasContext *ctx, uint32_t insn) ...@@ -2169,14 +2157,14 @@ static ExitStatus trans_subi(DisasContext *ctx, uint32_t insn)
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_cmpiclr(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_cmpiclr(DisasContext *ctx, uint32_t insn)
{ {
target_long im = low_sextract(insn, 0, 11); target_long im = low_sextract(insn, 0, 11);
unsigned cf = extract32(insn, 12, 4); unsigned cf = extract32(insn, 12, 4);
unsigned rt = extract32(insn, 16, 5); unsigned rt = extract32(insn, 16, 5);
unsigned r2 = extract32(insn, 21, 5); unsigned r2 = extract32(insn, 21, 5);
TCGv tcg_im, tcg_r2; TCGv tcg_im, tcg_r2;
ExitStatus ret; DisasJumpType ret;
if (cf) { if (cf) {
nullify_over(ctx); nullify_over(ctx);
...@@ -2189,7 +2177,7 @@ static ExitStatus trans_cmpiclr(DisasContext *ctx, uint32_t insn) ...@@ -2189,7 +2177,7 @@ static ExitStatus trans_cmpiclr(DisasContext *ctx, uint32_t insn)
return nullify_end(ctx, ret); return nullify_end(ctx, ret);
} }
static ExitStatus trans_ld_idx_i(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ld_idx_i(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -2204,7 +2192,7 @@ static ExitStatus trans_ld_idx_i(DisasContext *ctx, uint32_t insn, ...@@ -2204,7 +2192,7 @@ static ExitStatus trans_ld_idx_i(DisasContext *ctx, uint32_t insn,
return do_load(ctx, rt, rb, 0, 0, disp, modify, mop); return do_load(ctx, rt, rb, 0, 0, disp, modify, mop);
} }
static ExitStatus trans_ld_idx_x(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ld_idx_x(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -2218,7 +2206,7 @@ static ExitStatus trans_ld_idx_x(DisasContext *ctx, uint32_t insn, ...@@ -2218,7 +2206,7 @@ static ExitStatus trans_ld_idx_x(DisasContext *ctx, uint32_t insn,
return do_load(ctx, rt, rb, rx, u ? sz : 0, 0, m, mop); return do_load(ctx, rt, rb, rx, u ? sz : 0, 0, m, mop);
} }
static ExitStatus trans_st_idx_i(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_st_idx_i(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
int disp = low_sextract(insn, 0, 5); int disp = low_sextract(insn, 0, 5);
...@@ -2233,7 +2221,7 @@ static ExitStatus trans_st_idx_i(DisasContext *ctx, uint32_t insn, ...@@ -2233,7 +2221,7 @@ static ExitStatus trans_st_idx_i(DisasContext *ctx, uint32_t insn,
return do_store(ctx, rr, rb, disp, modify, mop); return do_store(ctx, rr, rb, disp, modify, mop);
} }
static ExitStatus trans_ldcw(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ldcw(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -2285,10 +2273,10 @@ static ExitStatus trans_ldcw(DisasContext *ctx, uint32_t insn, ...@@ -2285,10 +2273,10 @@ static ExitStatus trans_ldcw(DisasContext *ctx, uint32_t insn,
} }
save_gpr(ctx, rt, dest); save_gpr(ctx, rt, dest);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_stby(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_stby(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
target_long disp = low_sextract(insn, 0, 5); target_long disp = low_sextract(insn, 0, 5);
...@@ -2321,7 +2309,7 @@ static ExitStatus trans_stby(DisasContext *ctx, uint32_t insn, ...@@ -2321,7 +2309,7 @@ static ExitStatus trans_stby(DisasContext *ctx, uint32_t insn,
} }
tcg_temp_free(addr); tcg_temp_free(addr);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static const DisasInsn table_index_mem[] = { static const DisasInsn table_index_mem[] = {
...@@ -2332,7 +2320,7 @@ static const DisasInsn table_index_mem[] = { ...@@ -2332,7 +2320,7 @@ static const DisasInsn table_index_mem[] = {
{ 0x0c001300u, 0xfc0013c0, trans_stby }, { 0x0c001300u, 0xfc0013c0, trans_stby },
}; };
static ExitStatus trans_ldil(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_ldil(DisasContext *ctx, uint32_t insn)
{ {
unsigned rt = extract32(insn, 21, 5); unsigned rt = extract32(insn, 21, 5);
target_long i = assemble_21(insn); target_long i = assemble_21(insn);
...@@ -2342,10 +2330,10 @@ static ExitStatus trans_ldil(DisasContext *ctx, uint32_t insn) ...@@ -2342,10 +2330,10 @@ static ExitStatus trans_ldil(DisasContext *ctx, uint32_t insn)
save_gpr(ctx, rt, tcg_rt); save_gpr(ctx, rt, tcg_rt);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_addil(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_addil(DisasContext *ctx, uint32_t insn)
{ {
unsigned rt = extract32(insn, 21, 5); unsigned rt = extract32(insn, 21, 5);
target_long i = assemble_21(insn); target_long i = assemble_21(insn);
...@@ -2356,10 +2344,10 @@ static ExitStatus trans_addil(DisasContext *ctx, uint32_t insn) ...@@ -2356,10 +2344,10 @@ static ExitStatus trans_addil(DisasContext *ctx, uint32_t insn)
save_gpr(ctx, 1, tcg_r1); save_gpr(ctx, 1, tcg_r1);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_ldo(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_ldo(DisasContext *ctx, uint32_t insn)
{ {
unsigned rb = extract32(insn, 21, 5); unsigned rb = extract32(insn, 21, 5);
unsigned rt = extract32(insn, 16, 5); unsigned rt = extract32(insn, 16, 5);
...@@ -2376,10 +2364,10 @@ static ExitStatus trans_ldo(DisasContext *ctx, uint32_t insn) ...@@ -2376,10 +2364,10 @@ static ExitStatus trans_ldo(DisasContext *ctx, uint32_t insn)
save_gpr(ctx, rt, tcg_rt); save_gpr(ctx, rt, tcg_rt);
cond_free(&ctx->null_cond); cond_free(&ctx->null_cond);
return NO_EXIT; return DISAS_NEXT;
} }
static ExitStatus trans_load(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_load(DisasContext *ctx, uint32_t insn,
bool is_mod, TCGMemOp mop) bool is_mod, TCGMemOp mop)
{ {
unsigned rb = extract32(insn, 21, 5); unsigned rb = extract32(insn, 21, 5);
...@@ -2389,7 +2377,7 @@ static ExitStatus trans_load(DisasContext *ctx, uint32_t insn, ...@@ -2389,7 +2377,7 @@ static ExitStatus trans_load(DisasContext *ctx, uint32_t insn,
return do_load(ctx, rt, rb, 0, 0, i, is_mod ? (i < 0 ? -1 : 1) : 0, mop); return do_load(ctx, rt, rb, 0, 0, i, is_mod ? (i < 0 ? -1 : 1) : 0, mop);
} }
static ExitStatus trans_load_w(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_load_w(DisasContext *ctx, uint32_t insn)
{ {
unsigned rb = extract32(insn, 21, 5); unsigned rb = extract32(insn, 21, 5);
unsigned rt = extract32(insn, 16, 5); unsigned rt = extract32(insn, 16, 5);
...@@ -2410,7 +2398,7 @@ static ExitStatus trans_load_w(DisasContext *ctx, uint32_t insn) ...@@ -2410,7 +2398,7 @@ static ExitStatus trans_load_w(DisasContext *ctx, uint32_t insn)
} }
} }
static ExitStatus trans_fload_mod(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_fload_mod(DisasContext *ctx, uint32_t insn)
{ {
target_long i = assemble_16a(insn); target_long i = assemble_16a(insn);
unsigned t1 = extract32(insn, 1, 1); unsigned t1 = extract32(insn, 1, 1);
...@@ -2422,7 +2410,7 @@ static ExitStatus trans_fload_mod(DisasContext *ctx, uint32_t insn) ...@@ -2422,7 +2410,7 @@ static ExitStatus trans_fload_mod(DisasContext *ctx, uint32_t insn)
return do_floadw(ctx, t1 * 32 + t0, rb, 0, 0, i, (a ? -1 : 1)); return do_floadw(ctx, t1 * 32 + t0, rb, 0, 0, i, (a ? -1 : 1));
} }
static ExitStatus trans_store(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_store(DisasContext *ctx, uint32_t insn,
bool is_mod, TCGMemOp mop) bool is_mod, TCGMemOp mop)
{ {
unsigned rb = extract32(insn, 21, 5); unsigned rb = extract32(insn, 21, 5);
...@@ -2432,7 +2420,7 @@ static ExitStatus trans_store(DisasContext *ctx, uint32_t insn, ...@@ -2432,7 +2420,7 @@ static ExitStatus trans_store(DisasContext *ctx, uint32_t insn,
return do_store(ctx, rt, rb, i, is_mod ? (i < 0 ? -1 : 1) : 0, mop); return do_store(ctx, rt, rb, i, is_mod ? (i < 0 ? -1 : 1) : 0, mop);
} }
static ExitStatus trans_store_w(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_store_w(DisasContext *ctx, uint32_t insn)
{ {
unsigned rb = extract32(insn, 21, 5); unsigned rb = extract32(insn, 21, 5);
unsigned rt = extract32(insn, 16, 5); unsigned rt = extract32(insn, 16, 5);
...@@ -2452,7 +2440,7 @@ static ExitStatus trans_store_w(DisasContext *ctx, uint32_t insn) ...@@ -2452,7 +2440,7 @@ static ExitStatus trans_store_w(DisasContext *ctx, uint32_t insn)
} }
} }
static ExitStatus trans_fstore_mod(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_fstore_mod(DisasContext *ctx, uint32_t insn)
{ {
target_long i = assemble_16a(insn); target_long i = assemble_16a(insn);
unsigned t1 = extract32(insn, 1, 1); unsigned t1 = extract32(insn, 1, 1);
...@@ -2464,7 +2452,7 @@ static ExitStatus trans_fstore_mod(DisasContext *ctx, uint32_t insn) ...@@ -2464,7 +2452,7 @@ static ExitStatus trans_fstore_mod(DisasContext *ctx, uint32_t insn)
return do_fstorew(ctx, t1 * 32 + t0, rb, 0, 0, i, (a ? -1 : 1)); return do_fstorew(ctx, t1 * 32 + t0, rb, 0, 0, i, (a ? -1 : 1));
} }
static ExitStatus trans_copr_w(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_copr_w(DisasContext *ctx, uint32_t insn)
{ {
unsigned t0 = extract32(insn, 0, 5); unsigned t0 = extract32(insn, 0, 5);
unsigned m = extract32(insn, 5, 1); unsigned m = extract32(insn, 5, 1);
...@@ -2499,7 +2487,7 @@ static ExitStatus trans_copr_w(DisasContext *ctx, uint32_t insn) ...@@ -2499,7 +2487,7 @@ static ExitStatus trans_copr_w(DisasContext *ctx, uint32_t insn)
return gen_illegal(ctx); return gen_illegal(ctx);
} }
static ExitStatus trans_copr_dw(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_copr_dw(DisasContext *ctx, uint32_t insn)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
unsigned m = extract32(insn, 5, 1); unsigned m = extract32(insn, 5, 1);
...@@ -2533,7 +2521,7 @@ static ExitStatus trans_copr_dw(DisasContext *ctx, uint32_t insn) ...@@ -2533,7 +2521,7 @@ static ExitStatus trans_copr_dw(DisasContext *ctx, uint32_t insn)
} }
} }
static ExitStatus trans_cmpb(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_cmpb(DisasContext *ctx, uint32_t insn,
bool is_true, bool is_imm, bool is_dw) bool is_true, bool is_imm, bool is_dw)
{ {
target_long disp = assemble_12(insn) * 4; target_long disp = assemble_12(insn) * 4;
...@@ -2565,7 +2553,7 @@ static ExitStatus trans_cmpb(DisasContext *ctx, uint32_t insn, ...@@ -2565,7 +2553,7 @@ static ExitStatus trans_cmpb(DisasContext *ctx, uint32_t insn,
return do_cbranch(ctx, disp, n, &cond); return do_cbranch(ctx, disp, n, &cond);
} }
static ExitStatus trans_addb(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_addb(DisasContext *ctx, uint32_t insn,
bool is_true, bool is_imm) bool is_true, bool is_imm)
{ {
target_long disp = assemble_12(insn) * 4; target_long disp = assemble_12(insn) * 4;
...@@ -2607,7 +2595,7 @@ static ExitStatus trans_addb(DisasContext *ctx, uint32_t insn, ...@@ -2607,7 +2595,7 @@ static ExitStatus trans_addb(DisasContext *ctx, uint32_t insn,
return do_cbranch(ctx, disp, n, &cond); return do_cbranch(ctx, disp, n, &cond);
} }
static ExitStatus trans_bb(DisasContext *ctx, uint32_t insn) static DisasJumpType trans_bb(DisasContext *ctx, uint32_t insn)
{ {
target_long disp = assemble_12(insn) * 4; target_long disp = assemble_12(insn) * 4;
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -2633,7 +2621,7 @@ static ExitStatus trans_bb(DisasContext *ctx, uint32_t insn) ...@@ -2633,7 +2621,7 @@ static ExitStatus trans_bb(DisasContext *ctx, uint32_t insn)
return do_cbranch(ctx, disp, n, &cond); return do_cbranch(ctx, disp, n, &cond);
} }
static ExitStatus trans_movb(DisasContext *ctx, uint32_t insn, bool is_imm) static DisasJumpType trans_movb(DisasContext *ctx, uint32_t insn, bool is_imm)
{ {
target_long disp = assemble_12(insn) * 4; target_long disp = assemble_12(insn) * 4;
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -2658,7 +2646,7 @@ static ExitStatus trans_movb(DisasContext *ctx, uint32_t insn, bool is_imm) ...@@ -2658,7 +2646,7 @@ static ExitStatus trans_movb(DisasContext *ctx, uint32_t insn, bool is_imm)
return do_cbranch(ctx, disp, n, &cond); return do_cbranch(ctx, disp, n, &cond);
} }
static ExitStatus trans_shrpw_sar(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_shrpw_sar(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -2700,10 +2688,10 @@ static ExitStatus trans_shrpw_sar(DisasContext *ctx, uint32_t insn, ...@@ -2700,10 +2688,10 @@ static ExitStatus trans_shrpw_sar(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_shrpw_imm(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_shrpw_imm(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -2741,10 +2729,10 @@ static ExitStatus trans_shrpw_imm(DisasContext *ctx, uint32_t insn, ...@@ -2741,10 +2729,10 @@ static ExitStatus trans_shrpw_imm(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_extrw_sar(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_extrw_sar(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned clen = extract32(insn, 0, 5); unsigned clen = extract32(insn, 0, 5);
...@@ -2780,10 +2768,10 @@ static ExitStatus trans_extrw_sar(DisasContext *ctx, uint32_t insn, ...@@ -2780,10 +2768,10 @@ static ExitStatus trans_extrw_sar(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_extrw_imm(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_extrw_imm(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned clen = extract32(insn, 0, 5); unsigned clen = extract32(insn, 0, 5);
...@@ -2814,7 +2802,7 @@ static ExitStatus trans_extrw_imm(DisasContext *ctx, uint32_t insn, ...@@ -2814,7 +2802,7 @@ static ExitStatus trans_extrw_imm(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static const DisasInsn table_sh_ex[] = { static const DisasInsn table_sh_ex[] = {
...@@ -2824,7 +2812,7 @@ static const DisasInsn table_sh_ex[] = { ...@@ -2824,7 +2812,7 @@ static const DisasInsn table_sh_ex[] = {
{ 0xd0001800u, 0xfc001800u, trans_extrw_imm }, { 0xd0001800u, 0xfc001800u, trans_extrw_imm },
}; };
static ExitStatus trans_depw_imm_c(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_depw_imm_c(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned clen = extract32(insn, 0, 5); unsigned clen = extract32(insn, 0, 5);
...@@ -2865,10 +2853,10 @@ static ExitStatus trans_depw_imm_c(DisasContext *ctx, uint32_t insn, ...@@ -2865,10 +2853,10 @@ static ExitStatus trans_depw_imm_c(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_depw_imm(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_depw_imm(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned clen = extract32(insn, 0, 5); unsigned clen = extract32(insn, 0, 5);
...@@ -2902,10 +2890,10 @@ static ExitStatus trans_depw_imm(DisasContext *ctx, uint32_t insn, ...@@ -2902,10 +2890,10 @@ static ExitStatus trans_depw_imm(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_depw_sar(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_depw_sar(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned clen = extract32(insn, 0, 5); unsigned clen = extract32(insn, 0, 5);
...@@ -2954,7 +2942,7 @@ static ExitStatus trans_depw_sar(DisasContext *ctx, uint32_t insn, ...@@ -2954,7 +2942,7 @@ static ExitStatus trans_depw_sar(DisasContext *ctx, uint32_t insn,
if (c) { if (c) {
ctx->null_cond = do_sed_cond(c, dest); ctx->null_cond = do_sed_cond(c, dest);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static const DisasInsn table_depw[] = { static const DisasInsn table_depw[] = {
...@@ -2963,7 +2951,7 @@ static const DisasInsn table_depw[] = { ...@@ -2963,7 +2951,7 @@ static const DisasInsn table_depw[] = {
{ 0xd4001800u, 0xfc001800u, trans_depw_imm_c }, { 0xd4001800u, 0xfc001800u, trans_depw_imm_c },
}; };
static ExitStatus trans_be(DisasContext *ctx, uint32_t insn, bool is_l) static DisasJumpType trans_be(DisasContext *ctx, uint32_t insn, bool is_l)
{ {
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
unsigned b = extract32(insn, 21, 5); unsigned b = extract32(insn, 21, 5);
...@@ -2988,7 +2976,7 @@ static ExitStatus trans_be(DisasContext *ctx, uint32_t insn, bool is_l) ...@@ -2988,7 +2976,7 @@ static ExitStatus trans_be(DisasContext *ctx, uint32_t insn, bool is_l)
} }
} }
static ExitStatus trans_bl(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_bl(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -2998,7 +2986,7 @@ static ExitStatus trans_bl(DisasContext *ctx, uint32_t insn, ...@@ -2998,7 +2986,7 @@ static ExitStatus trans_bl(DisasContext *ctx, uint32_t insn,
return do_dbranch(ctx, iaoq_dest(ctx, disp), link, n); return do_dbranch(ctx, iaoq_dest(ctx, disp), link, n);
} }
static ExitStatus trans_bl_long(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_bl_long(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -3007,7 +2995,7 @@ static ExitStatus trans_bl_long(DisasContext *ctx, uint32_t insn, ...@@ -3007,7 +2995,7 @@ static ExitStatus trans_bl_long(DisasContext *ctx, uint32_t insn,
return do_dbranch(ctx, iaoq_dest(ctx, disp), 2, n); return do_dbranch(ctx, iaoq_dest(ctx, disp), 2, n);
} }
static ExitStatus trans_blr(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_blr(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -3020,7 +3008,7 @@ static ExitStatus trans_blr(DisasContext *ctx, uint32_t insn, ...@@ -3020,7 +3008,7 @@ static ExitStatus trans_blr(DisasContext *ctx, uint32_t insn,
return do_ibranch(ctx, tmp, link, n); return do_ibranch(ctx, tmp, link, n);
} }
static ExitStatus trans_bv(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_bv(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -3038,7 +3026,7 @@ static ExitStatus trans_bv(DisasContext *ctx, uint32_t insn, ...@@ -3038,7 +3026,7 @@ static ExitStatus trans_bv(DisasContext *ctx, uint32_t insn,
return do_ibranch(ctx, dest, 0, n); return do_ibranch(ctx, dest, 0, n);
} }
static ExitStatus trans_bve(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_bve(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned n = extract32(insn, 1, 1); unsigned n = extract32(insn, 1, 1);
...@@ -3056,7 +3044,7 @@ static const DisasInsn table_branch[] = { ...@@ -3056,7 +3044,7 @@ static const DisasInsn table_branch[] = {
{ 0xe800d000u, 0xfc00dffcu, trans_bve }, { 0xe800d000u, 0xfc00dffcu, trans_bve },
}; };
static ExitStatus trans_fop_wew_0c(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_wew_0c(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3064,7 +3052,7 @@ static ExitStatus trans_fop_wew_0c(DisasContext *ctx, uint32_t insn, ...@@ -3064,7 +3052,7 @@ static ExitStatus trans_fop_wew_0c(DisasContext *ctx, uint32_t insn,
return do_fop_wew(ctx, rt, ra, di->f.wew); return do_fop_wew(ctx, rt, ra, di->f.wew);
} }
static ExitStatus trans_fop_wew_0e(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_wew_0e(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = assemble_rt64(insn); unsigned rt = assemble_rt64(insn);
...@@ -3072,7 +3060,7 @@ static ExitStatus trans_fop_wew_0e(DisasContext *ctx, uint32_t insn, ...@@ -3072,7 +3060,7 @@ static ExitStatus trans_fop_wew_0e(DisasContext *ctx, uint32_t insn,
return do_fop_wew(ctx, rt, ra, di->f.wew); return do_fop_wew(ctx, rt, ra, di->f.wew);
} }
static ExitStatus trans_fop_ded(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_ded(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3080,7 +3068,7 @@ static ExitStatus trans_fop_ded(DisasContext *ctx, uint32_t insn, ...@@ -3080,7 +3068,7 @@ static ExitStatus trans_fop_ded(DisasContext *ctx, uint32_t insn,
return do_fop_ded(ctx, rt, ra, di->f.ded); return do_fop_ded(ctx, rt, ra, di->f.ded);
} }
static ExitStatus trans_fop_wed_0c(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_wed_0c(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3088,7 +3076,7 @@ static ExitStatus trans_fop_wed_0c(DisasContext *ctx, uint32_t insn, ...@@ -3088,7 +3076,7 @@ static ExitStatus trans_fop_wed_0c(DisasContext *ctx, uint32_t insn,
return do_fop_wed(ctx, rt, ra, di->f.wed); return do_fop_wed(ctx, rt, ra, di->f.wed);
} }
static ExitStatus trans_fop_wed_0e(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_wed_0e(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = assemble_rt64(insn); unsigned rt = assemble_rt64(insn);
...@@ -3096,7 +3084,7 @@ static ExitStatus trans_fop_wed_0e(DisasContext *ctx, uint32_t insn, ...@@ -3096,7 +3084,7 @@ static ExitStatus trans_fop_wed_0e(DisasContext *ctx, uint32_t insn,
return do_fop_wed(ctx, rt, ra, di->f.wed); return do_fop_wed(ctx, rt, ra, di->f.wed);
} }
static ExitStatus trans_fop_dew_0c(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_dew_0c(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3104,7 +3092,7 @@ static ExitStatus trans_fop_dew_0c(DisasContext *ctx, uint32_t insn, ...@@ -3104,7 +3092,7 @@ static ExitStatus trans_fop_dew_0c(DisasContext *ctx, uint32_t insn,
return do_fop_dew(ctx, rt, ra, di->f.dew); return do_fop_dew(ctx, rt, ra, di->f.dew);
} }
static ExitStatus trans_fop_dew_0e(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_dew_0e(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3112,7 +3100,7 @@ static ExitStatus trans_fop_dew_0e(DisasContext *ctx, uint32_t insn, ...@@ -3112,7 +3100,7 @@ static ExitStatus trans_fop_dew_0e(DisasContext *ctx, uint32_t insn,
return do_fop_dew(ctx, rt, ra, di->f.dew); return do_fop_dew(ctx, rt, ra, di->f.dew);
} }
static ExitStatus trans_fop_weww_0c(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_weww_0c(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3121,7 +3109,7 @@ static ExitStatus trans_fop_weww_0c(DisasContext *ctx, uint32_t insn, ...@@ -3121,7 +3109,7 @@ static ExitStatus trans_fop_weww_0c(DisasContext *ctx, uint32_t insn,
return do_fop_weww(ctx, rt, ra, rb, di->f.weww); return do_fop_weww(ctx, rt, ra, rb, di->f.weww);
} }
static ExitStatus trans_fop_weww_0e(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_weww_0e(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = assemble_rt64(insn); unsigned rt = assemble_rt64(insn);
...@@ -3130,7 +3118,7 @@ static ExitStatus trans_fop_weww_0e(DisasContext *ctx, uint32_t insn, ...@@ -3130,7 +3118,7 @@ static ExitStatus trans_fop_weww_0e(DisasContext *ctx, uint32_t insn,
return do_fop_weww(ctx, rt, ra, rb, di->f.weww); return do_fop_weww(ctx, rt, ra, rb, di->f.weww);
} }
static ExitStatus trans_fop_dedd(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fop_dedd(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3179,7 +3167,7 @@ static void gen_fnegabs_d(TCGv_i64 dst, TCGv_env unused, TCGv_i64 src) ...@@ -3179,7 +3167,7 @@ static void gen_fnegabs_d(TCGv_i64 dst, TCGv_env unused, TCGv_i64 src)
tcg_gen_ori_i64(dst, src, INT64_MIN); tcg_gen_ori_i64(dst, src, INT64_MIN);
} }
static ExitStatus do_fcmp_s(DisasContext *ctx, unsigned ra, unsigned rb, static DisasJumpType do_fcmp_s(DisasContext *ctx, unsigned ra, unsigned rb,
unsigned y, unsigned c) unsigned y, unsigned c)
{ {
TCGv_i32 ta, tb, tc, ty; TCGv_i32 ta, tb, tc, ty;
...@@ -3198,10 +3186,10 @@ static ExitStatus do_fcmp_s(DisasContext *ctx, unsigned ra, unsigned rb, ...@@ -3198,10 +3186,10 @@ static ExitStatus do_fcmp_s(DisasContext *ctx, unsigned ra, unsigned rb,
tcg_temp_free_i32(ty); tcg_temp_free_i32(ty);
tcg_temp_free_i32(tc); tcg_temp_free_i32(tc);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_fcmp_s_0c(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fcmp_s_0c(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned c = extract32(insn, 0, 5); unsigned c = extract32(insn, 0, 5);
...@@ -3211,7 +3199,7 @@ static ExitStatus trans_fcmp_s_0c(DisasContext *ctx, uint32_t insn, ...@@ -3211,7 +3199,7 @@ static ExitStatus trans_fcmp_s_0c(DisasContext *ctx, uint32_t insn,
return do_fcmp_s(ctx, ra, rb, y, c); return do_fcmp_s(ctx, ra, rb, y, c);
} }
static ExitStatus trans_fcmp_s_0e(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fcmp_s_0e(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned c = extract32(insn, 0, 5); unsigned c = extract32(insn, 0, 5);
...@@ -3221,7 +3209,7 @@ static ExitStatus trans_fcmp_s_0e(DisasContext *ctx, uint32_t insn, ...@@ -3221,7 +3209,7 @@ static ExitStatus trans_fcmp_s_0e(DisasContext *ctx, uint32_t insn,
return do_fcmp_s(ctx, ra, rb, y, c); return do_fcmp_s(ctx, ra, rb, y, c);
} }
static ExitStatus trans_fcmp_d(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fcmp_d(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned c = extract32(insn, 0, 5); unsigned c = extract32(insn, 0, 5);
...@@ -3245,10 +3233,10 @@ static ExitStatus trans_fcmp_d(DisasContext *ctx, uint32_t insn, ...@@ -3245,10 +3233,10 @@ static ExitStatus trans_fcmp_d(DisasContext *ctx, uint32_t insn,
tcg_temp_free_i32(ty); tcg_temp_free_i32(ty);
tcg_temp_free_i32(tc); tcg_temp_free_i32(tc);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_ftest_t(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ftest_t(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned y = extract32(insn, 13, 3); unsigned y = extract32(insn, 13, 3);
...@@ -3263,10 +3251,10 @@ static ExitStatus trans_ftest_t(DisasContext *ctx, uint32_t insn, ...@@ -3263,10 +3251,10 @@ static ExitStatus trans_ftest_t(DisasContext *ctx, uint32_t insn,
ctx->null_cond = cond_make_0(TCG_COND_NE, t); ctx->null_cond = cond_make_0(TCG_COND_NE, t);
tcg_temp_free(t); tcg_temp_free(t);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_ftest_q(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_ftest_q(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned c = extract32(insn, 0, 5); unsigned c = extract32(insn, 0, 5);
...@@ -3317,10 +3305,10 @@ static ExitStatus trans_ftest_q(DisasContext *ctx, uint32_t insn, ...@@ -3317,10 +3305,10 @@ static ExitStatus trans_ftest_q(DisasContext *ctx, uint32_t insn,
ctx->null_cond = cond_make_0(TCG_COND_EQ, t); ctx->null_cond = cond_make_0(TCG_COND_EQ, t);
} }
done: done:
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_xmpyu(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_xmpyu(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3337,7 +3325,7 @@ static ExitStatus trans_xmpyu(DisasContext *ctx, uint32_t insn, ...@@ -3337,7 +3325,7 @@ static ExitStatus trans_xmpyu(DisasContext *ctx, uint32_t insn,
tcg_temp_free_i64(a); tcg_temp_free_i64(a);
tcg_temp_free_i64(b); tcg_temp_free_i64(b);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
#define FOP_DED trans_fop_ded, .f.ded #define FOP_DED trans_fop_ded, .f.ded
...@@ -3512,7 +3500,8 @@ static inline int fmpyadd_s_reg(unsigned r) ...@@ -3512,7 +3500,8 @@ static inline int fmpyadd_s_reg(unsigned r)
return (r & 16) * 2 + 16 + (r & 15); return (r & 16) * 2 + 16 + (r & 15);
} }
static ExitStatus trans_fmpyadd(DisasContext *ctx, uint32_t insn, bool is_sub) static DisasJumpType trans_fmpyadd(DisasContext *ctx,
uint32_t insn, bool is_sub)
{ {
unsigned tm = extract32(insn, 0, 5); unsigned tm = extract32(insn, 0, 5);
unsigned f = extract32(insn, 5, 1); unsigned f = extract32(insn, 5, 1);
...@@ -3540,10 +3529,10 @@ static ExitStatus trans_fmpyadd(DisasContext *ctx, uint32_t insn, bool is_sub) ...@@ -3540,10 +3529,10 @@ static ExitStatus trans_fmpyadd(DisasContext *ctx, uint32_t insn, bool is_sub)
is_sub ? gen_helper_fsub_d : gen_helper_fadd_d); is_sub ? gen_helper_fsub_d : gen_helper_fadd_d);
} }
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_fmpyfadd_s(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fmpyfadd_s(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = assemble_rt64(insn); unsigned rt = assemble_rt64(insn);
...@@ -3568,10 +3557,10 @@ static ExitStatus trans_fmpyfadd_s(DisasContext *ctx, uint32_t insn, ...@@ -3568,10 +3557,10 @@ static ExitStatus trans_fmpyfadd_s(DisasContext *ctx, uint32_t insn,
tcg_temp_free_i32(c); tcg_temp_free_i32(c);
save_frw_i32(rt, a); save_frw_i32(rt, a);
tcg_temp_free_i32(a); tcg_temp_free_i32(a);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static ExitStatus trans_fmpyfadd_d(DisasContext *ctx, uint32_t insn, static DisasJumpType trans_fmpyfadd_d(DisasContext *ctx, uint32_t insn,
const DisasInsn *di) const DisasInsn *di)
{ {
unsigned rt = extract32(insn, 0, 5); unsigned rt = extract32(insn, 0, 5);
...@@ -3596,7 +3585,7 @@ static ExitStatus trans_fmpyfadd_d(DisasContext *ctx, uint32_t insn, ...@@ -3596,7 +3585,7 @@ static ExitStatus trans_fmpyfadd_d(DisasContext *ctx, uint32_t insn,
tcg_temp_free_i64(c); tcg_temp_free_i64(c);
save_frd(rt, a); save_frd(rt, a);
tcg_temp_free_i64(a); tcg_temp_free_i64(a);
return nullify_end(ctx, NO_EXIT); return nullify_end(ctx, DISAS_NEXT);
} }
static const DisasInsn table_fp_fused[] = { static const DisasInsn table_fp_fused[] = {
...@@ -3604,7 +3593,7 @@ static const DisasInsn table_fp_fused[] = { ...@@ -3604,7 +3593,7 @@ static const DisasInsn table_fp_fused[] = {
{ 0xb8000800u, 0xfc0019c0u, trans_fmpyfadd_d } { 0xb8000800u, 0xfc0019c0u, trans_fmpyfadd_d }
}; };
static ExitStatus translate_table_int(DisasContext *ctx, uint32_t insn, static DisasJumpType translate_table_int(DisasContext *ctx, uint32_t insn,
const DisasInsn table[], size_t n) const DisasInsn table[], size_t n)
{ {
size_t i; size_t i;
...@@ -3619,7 +3608,7 @@ static ExitStatus translate_table_int(DisasContext *ctx, uint32_t insn, ...@@ -3619,7 +3608,7 @@ static ExitStatus translate_table_int(DisasContext *ctx, uint32_t insn,
#define translate_table(ctx, insn, table) \ #define translate_table(ctx, insn, table) \
translate_table_int(ctx, insn, table, ARRAY_SIZE(table)) translate_table_int(ctx, insn, table, ARRAY_SIZE(table))
static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
{ {
uint32_t opc = extract32(insn, 26, 6); uint32_t opc = extract32(insn, 26, 6);
...@@ -3740,188 +3729,201 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) ...@@ -3740,188 +3729,201 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
return gen_illegal(ctx); return gen_illegal(ctx);
} }
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) static int hppa_tr_init_disas_context(DisasContextBase *dcbase,
CPUState *cs, int max_insns)
{ {
CPUHPPAState *env = cs->env_ptr; DisasContext *ctx = container_of(dcbase, DisasContext, base);
DisasContext ctx; TranslationBlock *tb = ctx->base.tb;
ExitStatus ret; int i, bound;
int num_insns, max_insns, i;
ctx.tb = tb; ctx->cs = cs;
ctx.cs = cs; ctx->iaoq_f = tb->pc;
ctx.iaoq_f = tb->pc; ctx->iaoq_b = tb->cs_base;
ctx.iaoq_b = tb->cs_base; ctx->iaoq_n = -1;
ctx.singlestep_enabled = cs->singlestep_enabled; TCGV_UNUSED(ctx->iaoq_n_var);
ctx.ntemps = 0; ctx->ntemps = 0;
for (i = 0; i < ARRAY_SIZE(ctx.temps); ++i) { for (i = 0; i < ARRAY_SIZE(ctx->temps); ++i) {
TCGV_UNUSED(ctx.temps[i]); TCGV_UNUSED(ctx->temps[i]);
} }
/* Compute the maximum number of insns to execute, as bounded by bound = -(tb->pc | TARGET_PAGE_MASK) / 4;
(1) icount, (2) single-stepping, (3) branch delay slots, or return MIN(max_insns, bound);
(4) the number of insns remaining on the current page. */ }
max_insns = tb->cflags & CF_COUNT_MASK;
if (max_insns == 0) {
max_insns = CF_COUNT_MASK;
}
if (ctx.singlestep_enabled || singlestep) {
max_insns = 1;
} else if (max_insns > TCG_MAX_INSNS) {
max_insns = TCG_MAX_INSNS;
}
num_insns = 0; static void hppa_tr_tb_start(DisasContextBase *dcbase, CPUState *cs)
gen_tb_start(tb); {
DisasContext *ctx = container_of(dcbase, DisasContext, base);
/* Seed the nullification status from PSW[N], as shown in TB->FLAGS. */ /* Seed the nullification status from PSW[N], as shown in TB->FLAGS. */
ctx.null_cond = cond_make_f(); ctx->null_cond = cond_make_f();
ctx.psw_n_nonzero = false; ctx->psw_n_nonzero = false;
if (tb->flags & 1) { if (ctx->base.tb->flags & 1) {
ctx.null_cond.c = TCG_COND_ALWAYS; ctx->null_cond.c = TCG_COND_ALWAYS;
ctx.psw_n_nonzero = true; ctx->psw_n_nonzero = true;
} }
ctx.null_lab = NULL; ctx->null_lab = NULL;
}
do { static void hppa_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
tcg_gen_insn_start(ctx.iaoq_f, ctx.iaoq_b); {
num_insns++; DisasContext *ctx = container_of(dcbase, DisasContext, base);
if (unlikely(cpu_breakpoint_test(cs, ctx.iaoq_f, BP_ANY))) { tcg_gen_insn_start(ctx->iaoq_f, ctx->iaoq_b);
ret = gen_excp(&ctx, EXCP_DEBUG); }
break;
} static bool hppa_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs,
if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) { const CPUBreakpoint *bp)
gen_io_start(); {
} DisasContext *ctx = container_of(dcbase, DisasContext, base);
ctx->base.is_jmp = gen_excp(ctx, EXCP_DEBUG);
ctx->base.pc_next = ctx->iaoq_f + 4;
return true;
}
static void hppa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
{
DisasContext *ctx = container_of(dcbase, DisasContext, base);
CPUHPPAState *env = cs->env_ptr;
DisasJumpType ret;
int i, n;
if (ctx.iaoq_f < TARGET_PAGE_SIZE) { /* Execute one insn. */
ret = do_page_zero(&ctx); if (ctx->iaoq_f < TARGET_PAGE_SIZE) {
assert(ret != NO_EXIT); ret = do_page_zero(ctx);
assert(ret != DISAS_NEXT);
} else { } else {
/* Always fetch the insn, even if nullified, so that we check /* Always fetch the insn, even if nullified, so that we check
the page permissions for execute. */ the page permissions for execute. */
uint32_t insn = cpu_ldl_code(env, ctx.iaoq_f); uint32_t insn = cpu_ldl_code(env, ctx->iaoq_f);
/* Set up the IA queue for the next insn. /* Set up the IA queue for the next insn.
This will be overwritten by a branch. */ This will be overwritten by a branch. */
if (ctx.iaoq_b == -1) { if (ctx->iaoq_b == -1) {
ctx.iaoq_n = -1; ctx->iaoq_n = -1;
ctx.iaoq_n_var = get_temp(&ctx); ctx->iaoq_n_var = get_temp(ctx);
tcg_gen_addi_tl(ctx.iaoq_n_var, cpu_iaoq_b, 4); tcg_gen_addi_tl(ctx->iaoq_n_var, cpu_iaoq_b, 4);
} else { } else {
ctx.iaoq_n = ctx.iaoq_b + 4; ctx->iaoq_n = ctx->iaoq_b + 4;
TCGV_UNUSED(ctx.iaoq_n_var); TCGV_UNUSED(ctx->iaoq_n_var);
} }
if (unlikely(ctx.null_cond.c == TCG_COND_ALWAYS)) { if (unlikely(ctx->null_cond.c == TCG_COND_ALWAYS)) {
ctx.null_cond.c = TCG_COND_NEVER; ctx->null_cond.c = TCG_COND_NEVER;
ret = NO_EXIT; ret = DISAS_NEXT;
} else { } else {
ret = translate_one(&ctx, insn); ret = translate_one(ctx, insn);
assert(ctx.null_lab == NULL); assert(ctx->null_lab == NULL);
} }
} }
for (i = 0; i < ctx.ntemps; ++i) { /* Free any temporaries allocated. */
tcg_temp_free(ctx.temps[i]); for (i = 0, n = ctx->ntemps; i < n; ++i) {
TCGV_UNUSED(ctx.temps[i]); tcg_temp_free(ctx->temps[i]);
TCGV_UNUSED(ctx->temps[i]);
} }
ctx.ntemps = 0; ctx->ntemps = 0;
/* If we see non-linear instructions, exhaust instruction count, /* Advance the insn queue. */
or run out of buffer space, stop generation. */
/* ??? The non-linear instruction restriction is purely due to /* ??? The non-linear instruction restriction is purely due to
the debugging dump. Otherwise we *could* follow unconditional the debugging dump. Otherwise we *could* follow unconditional
branches within the same page. */ branches within the same page. */
if (ret == NO_EXIT if (ret == DISAS_NEXT && ctx->iaoq_b != ctx->iaoq_f + 4) {
&& (ctx.iaoq_b != ctx.iaoq_f + 4 if (ctx->null_cond.c == TCG_COND_NEVER
|| num_insns >= max_insns || ctx->null_cond.c == TCG_COND_ALWAYS) {
|| tcg_op_buf_full())) { nullify_set(ctx, ctx->null_cond.c == TCG_COND_ALWAYS);
if (ctx.null_cond.c == TCG_COND_NEVER gen_goto_tb(ctx, 0, ctx->iaoq_b, ctx->iaoq_n);
|| ctx.null_cond.c == TCG_COND_ALWAYS) { ret = DISAS_NORETURN;
nullify_set(&ctx, ctx.null_cond.c == TCG_COND_ALWAYS);
gen_goto_tb(&ctx, 0, ctx.iaoq_b, ctx.iaoq_n);
ret = EXIT_GOTO_TB;
} else { } else {
ret = EXIT_IAQ_N_STALE; ret = DISAS_IAQ_N_STALE;
} }
} }
ctx->iaoq_f = ctx->iaoq_b;
ctx->iaoq_b = ctx->iaoq_n;
ctx->base.is_jmp = ret;
ctx.iaoq_f = ctx.iaoq_b; if (ret == DISAS_NORETURN || ret == DISAS_IAQ_N_UPDATED) {
ctx.iaoq_b = ctx.iaoq_n; return;
if (ret == EXIT_NORETURN
|| ret == EXIT_GOTO_TB
|| ret == EXIT_IAQ_N_UPDATED) {
break;
} }
if (ctx.iaoq_f == -1) { if (ctx->iaoq_f == -1) {
tcg_gen_mov_tl(cpu_iaoq_f, cpu_iaoq_b); tcg_gen_mov_tl(cpu_iaoq_f, cpu_iaoq_b);
copy_iaoq_entry(cpu_iaoq_b, ctx.iaoq_n, ctx.iaoq_n_var); copy_iaoq_entry(cpu_iaoq_b, ctx->iaoq_n, ctx->iaoq_n_var);
nullify_save(&ctx); nullify_save(ctx);
ret = EXIT_IAQ_N_UPDATED; ctx->base.is_jmp = DISAS_IAQ_N_UPDATED;
break; } else if (ctx->iaoq_b == -1) {
} tcg_gen_mov_tl(cpu_iaoq_b, ctx->iaoq_n_var);
if (ctx.iaoq_b == -1) {
tcg_gen_mov_tl(cpu_iaoq_b, ctx.iaoq_n_var);
} }
} while (ret == NO_EXIT); }
if (tb->cflags & CF_LAST_IO) { static void hppa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
gen_io_end(); {
} DisasContext *ctx = container_of(dcbase, DisasContext, base);
switch (ret) { switch (ctx->base.is_jmp) {
case EXIT_GOTO_TB: case DISAS_NORETURN:
case EXIT_NORETURN:
break; break;
case EXIT_IAQ_N_STALE: case DISAS_TOO_MANY:
copy_iaoq_entry(cpu_iaoq_f, ctx.iaoq_f, cpu_iaoq_f); case DISAS_IAQ_N_STALE:
copy_iaoq_entry(cpu_iaoq_b, ctx.iaoq_b, cpu_iaoq_b); copy_iaoq_entry(cpu_iaoq_f, ctx->iaoq_f, cpu_iaoq_f);
nullify_save(&ctx); copy_iaoq_entry(cpu_iaoq_b, ctx->iaoq_b, cpu_iaoq_b);
nullify_save(ctx);
/* FALLTHRU */ /* FALLTHRU */
case EXIT_IAQ_N_UPDATED: case DISAS_IAQ_N_UPDATED:
if (ctx.singlestep_enabled) { if (ctx->base.singlestep_enabled) {
gen_excp_1(EXCP_DEBUG); gen_excp_1(EXCP_DEBUG);
} else { } else {
tcg_gen_lookup_and_goto_ptr(cpu_iaoq_f); tcg_gen_lookup_and_goto_ptr(cpu_iaoq_f);
} }
break; break;
default: default:
abort(); g_assert_not_reached();
} }
gen_tb_end(tb, num_insns); /* We don't actually use this during normal translation,
but we should interact with the generic main loop. */
ctx->base.pc_next = ctx->base.tb->pc + 4 * ctx->base.num_insns;
}
tb->size = num_insns * 4; static void hppa_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
tb->icount = num_insns; {
TranslationBlock *tb = dcbase->tb;
#ifdef DEBUG_DISAS
if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)
&& qemu_log_in_addr_range(tb->pc)) {
qemu_log_lock();
switch (tb->pc) { switch (tb->pc) {
case 0x00: case 0x00:
qemu_log("IN:\n0x00000000: (null)\n\n"); qemu_log("IN:\n0x00000000: (null)\n");
break; break;
case 0xb0: case 0xb0:
qemu_log("IN:\n0x000000b0: light-weight-syscall\n\n"); qemu_log("IN:\n0x000000b0: light-weight-syscall\n");
break; break;
case 0xe0: case 0xe0:
qemu_log("IN:\n0x000000e0: set-thread-pointer-syscall\n\n"); qemu_log("IN:\n0x000000e0: set-thread-pointer-syscall\n");
break; break;
case 0x100: case 0x100:
qemu_log("IN:\n0x00000100: syscall\n\n"); qemu_log("IN:\n0x00000100: syscall\n");
break; break;
default: default:
qemu_log("IN: %s\n", lookup_symbol(tb->pc)); qemu_log("IN: %s\n", lookup_symbol(tb->pc));
log_target_disas(cs, tb->pc, tb->size, 1); log_target_disas(cs, tb->pc, tb->size, 1);
qemu_log("\n");
break; break;
} }
qemu_log_unlock(); }
}
#endif static const TranslatorOps hppa_tr_ops = {
.init_disas_context = hppa_tr_init_disas_context,
.tb_start = hppa_tr_tb_start,
.insn_start = hppa_tr_insn_start,
.breakpoint_check = hppa_tr_breakpoint_check,
.translate_insn = hppa_tr_translate_insn,
.tb_stop = hppa_tr_tb_stop,
.disas_log = hppa_tr_disas_log,
};
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
{
DisasContext ctx;
translator_loop(&hppa_tr_ops, &ctx.base, cs, tb);
} }
void restore_state_to_opc(CPUHPPAState *env, TranslationBlock *tb, void restore_state_to_opc(CPUHPPAState *env, TranslationBlock *tb,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册