#include "exec-all.h"
#include "disas.h"
+extern int dyngen_code(uint8_t *gen_code_buf,
+ uint16_t *label_offsets, uint16_t *jmp_offsets,
+ const uint16_t *opc_buf, const uint32_t *opparam_buf, const long *gen_labels);
+
enum {
#define DEF(s, n, copy_size) INDEX_op_ ## s,
#include "opc.h"
NB_OPS,
};
-#include "dyngen.h"
-#include "op.h"
-
uint16_t gen_opc_buf[OPC_BUF_SIZE];
uint32_t gen_opparam_buf[OPPARAM_BUF_SIZE];
long gen_labels[OPC_BUF_SIZE];
uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
#elif defined(TARGET_SPARC)
target_ulong gen_opc_npc[OPC_BUF_SIZE];
+target_ulong gen_opc_jump_pc[2];
#endif
int code_copy_enabled = 1;
#elif defined(TARGET_ARM)
env->regs[15] = gen_opc_pc[j];
#elif defined(TARGET_SPARC)
- /* XXX: restore npc too */
- env->pc = gen_opc_pc[j];
- env->npc = gen_opc_npc[j];
+ {
+ target_ulong npc;
+ env->pc = gen_opc_pc[j];
+ npc = gen_opc_npc[j];
+ if (npc == 1) {
+ /* dynamic NPC: already stored */
+ } else if (npc == 2) {
+ target_ulong t2 = (target_ulong)puc;
+ /* jump PC: use T2 and the jump targets of the translation */
+ if (t2)
+ env->npc = gen_opc_jump_pc[0];
+ else
+ env->npc = gen_opc_jump_pc[1];
+ } else {
+ env->npc = npc;
+ }
+ }
#elif defined(TARGET_PPC)
{
int type;
}
env->access_type = type;
}
+#elif defined(TARGET_MIPS)
+ env->PC = gen_opc_pc[j];
#endif
return 0;
}