Commit 7d55170268abe2fedc96a662edff52bfe68763a6
1 parent
2e56350e
Fix compilation on Sparc host, implement ld and st
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4457 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
15 additions
and
9 deletions
cpu-exec.c
| @@ -53,19 +53,14 @@ static unsigned long next_tb; | @@ -53,19 +53,14 @@ static unsigned long next_tb; | ||
| 53 | // Work around ugly bugs in glibc that mangle global register contents | 53 | // Work around ugly bugs in glibc that mangle global register contents |
| 54 | 54 | ||
| 55 | static volatile void *saved_env; | 55 | static volatile void *saved_env; |
| 56 | -static volatile unsigned long saved_t0, saved_i7; | ||
| 57 | #undef SAVE_GLOBALS | 56 | #undef SAVE_GLOBALS |
| 58 | #define SAVE_GLOBALS() do { \ | 57 | #define SAVE_GLOBALS() do { \ |
| 59 | saved_env = env; \ | 58 | saved_env = env; \ |
| 60 | - saved_t0 = T0; \ | ||
| 61 | - asm volatile ("st %%i7, [%0]" : : "r" (&saved_i7)); \ | ||
| 62 | } while(0) | 59 | } while(0) |
| 63 | 60 | ||
| 64 | #undef RESTORE_GLOBALS | 61 | #undef RESTORE_GLOBALS |
| 65 | #define RESTORE_GLOBALS() do { \ | 62 | #define RESTORE_GLOBALS() do { \ |
| 66 | env = (void *)saved_env; \ | 63 | env = (void *)saved_env; \ |
| 67 | - T0 = saved_t0; \ | ||
| 68 | - asm volatile ("ld [%0], %%i7" : : "r" (&saved_i7)); \ | ||
| 69 | } while(0) | 64 | } while(0) |
| 70 | 65 | ||
| 71 | static int sparc_setjmp(jmp_buf buf) | 66 | static int sparc_setjmp(jmp_buf buf) |
tcg/sparc/tcg-target.c
| @@ -266,13 +266,19 @@ static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, in | @@ -266,13 +266,19 @@ static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, in | ||
| 266 | static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, | 266 | static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, |
| 267 | int arg1, tcg_target_long arg2) | 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 | static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, | 275 | static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, |
| 273 | int arg1, tcg_target_long arg2) | 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 | static inline void tcg_out_arith(TCGContext *s, int rd, int rs1, int rs2, | 284 | static inline void tcg_out_arith(TCGContext *s, int rd, int rs1, int rs2, |
| @@ -312,10 +318,14 @@ static inline void tcg_out_nop(TCGContext *s) | @@ -312,10 +318,14 @@ static inline void tcg_out_nop(TCGContext *s) | ||
| 312 | tcg_out32(s, SETHI | INSN_RD(TCG_REG_G0) | 0); | 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 | tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) | | 324 | tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) | |
| 318 | INSN_IMM13(-TCG_TARGET_STACK_MINFRAME)); | 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 | static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, | 331 | static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
tcg/sparc/tcg-target.h
| @@ -84,8 +84,9 @@ enum { | @@ -84,8 +84,9 @@ enum { | ||
| 84 | /* optional instructions */ | 84 | /* optional instructions */ |
| 85 | //#define TCG_TARGET_HAS_bswap_i32 | 85 | //#define TCG_TARGET_HAS_bswap_i32 |
| 86 | //#define TCG_TARGET_HAS_bswap_i64 | 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 | /* Note: must be synced with dyngen-exec.h */ | 91 | /* Note: must be synced with dyngen-exec.h */ |
| 91 | #ifdef HOST_SOLARIS | 92 | #ifdef HOST_SOLARIS |