Revision 7d551702
b/cpu-exec.c | ||
---|---|---|
53 | 53 |
// Work around ugly bugs in glibc that mangle global register contents |
54 | 54 |
|
55 | 55 |
static volatile void *saved_env; |
56 |
static volatile unsigned long saved_t0, saved_i7; |
|
57 | 56 |
#undef SAVE_GLOBALS |
58 | 57 |
#define SAVE_GLOBALS() do { \ |
59 | 58 |
saved_env = env; \ |
60 |
saved_t0 = T0; \ |
|
61 |
asm volatile ("st %%i7, [%0]" : : "r" (&saved_i7)); \ |
|
62 | 59 |
} while(0) |
63 | 60 |
|
64 | 61 |
#undef RESTORE_GLOBALS |
65 | 62 |
#define RESTORE_GLOBALS() do { \ |
66 | 63 |
env = (void *)saved_env; \ |
67 |
T0 = saved_t0; \ |
|
68 |
asm volatile ("ld [%0], %%i7" : : "r" (&saved_i7)); \ |
|
69 | 64 |
} while(0) |
70 | 65 |
|
71 | 66 |
static int sparc_setjmp(jmp_buf buf) |
b/tcg/sparc/tcg-target.c | ||
---|---|---|
266 | 266 |
static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, |
267 | 267 |
int arg1, tcg_target_long arg2) |
268 | 268 |
{ |
269 |
fprintf(stderr, "unimplemented %s\n", __func__); |
|
269 |
if (type == TCG_TYPE_I32) |
|
270 |
tcg_out_ldst(s, ret, arg1, arg2, LDUW); |
|
271 |
else |
|
272 |
tcg_out_ldst(s, ret, arg1, arg2, LDX); |
|
270 | 273 |
} |
271 | 274 |
|
272 | 275 |
static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, |
273 | 276 |
int arg1, tcg_target_long arg2) |
274 | 277 |
{ |
275 |
fprintf(stderr, "unimplemented %s\n", __func__); |
|
278 |
if (type == TCG_TYPE_I32) |
|
279 |
tcg_out_ldst(s, arg, arg1, arg2, STW); |
|
280 |
else |
|
281 |
tcg_out_ldst(s, arg, arg1, arg2, STX); |
|
276 | 282 |
} |
277 | 283 |
|
278 | 284 |
static inline void tcg_out_arith(TCGContext *s, int rd, int rs1, int rs2, |
... | ... | |
312 | 318 |
tcg_out32(s, SETHI | INSN_RD(TCG_REG_G0) | 0); |
313 | 319 |
} |
314 | 320 |
|
315 |
static inline void tcg_target_prologue(TCGContext *s) |
|
321 |
/* Generate global QEMU prologue and epilogue code */ |
|
322 |
void tcg_target_qemu_prologue(TCGContext *s) |
|
316 | 323 |
{ |
317 | 324 |
tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) | |
318 | 325 |
INSN_IMM13(-TCG_TARGET_STACK_MINFRAME)); |
326 |
tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_O0) | |
|
327 |
INSN_RS2(TCG_REG_G0)); |
|
328 |
tcg_out_nop(s); |
|
319 | 329 |
} |
320 | 330 |
|
321 | 331 |
static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
b/tcg/sparc/tcg-target.h | ||
---|---|---|
84 | 84 |
/* optional instructions */ |
85 | 85 |
//#define TCG_TARGET_HAS_bswap_i32 |
86 | 86 |
//#define TCG_TARGET_HAS_bswap_i64 |
87 |
//#define TCG_TARGET_HAS_neg_i32 |
|
88 |
//#define TCG_TARGET_HAS_neg_i64 |
|
87 | 89 |
|
88 |
#define TCG_TARGET_NEEDS_PROLOGUE 1 |
|
89 | 90 |
|
90 | 91 |
/* Note: must be synced with dyngen-exec.h */ |
91 | 92 |
#ifdef HOST_SOLARIS |
Also available in: Unified diff