Commit dc011987f266878ad29009e4fdbc27f666ab31d2
1 parent
6ef905f6
Use unsigned 32-bit load for ld/lduw
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3051 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
14 additions
and
1 deletions
target-sparc/op_mem.h
| @@ -103,6 +103,11 @@ void OPPROTO glue(op_casx, MEMSUFFIX)(void) | @@ -103,6 +103,11 @@ void OPPROTO glue(op_casx, MEMSUFFIX)(void) | ||
| 103 | T2 = tmp; | 103 | T2 = tmp; |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | +void OPPROTO glue(op_lduw, MEMSUFFIX)(void) | ||
| 107 | +{ | ||
| 108 | + T1 = (uint64_t)(glue(ldl, MEMSUFFIX)(T0) & 0xffffffff); | ||
| 109 | +} | ||
| 110 | + | ||
| 106 | void OPPROTO glue(op_ldsw, MEMSUFFIX)(void) | 111 | void OPPROTO glue(op_ldsw, MEMSUFFIX)(void) |
| 107 | { | 112 | { |
| 108 | T1 = (int64_t)(glue(ldl, MEMSUFFIX)(T0) & 0xffffffff); | 113 | T1 = (int64_t)(glue(ldl, MEMSUFFIX)(T0) & 0xffffffff); |
target-sparc/translate.c
| @@ -470,6 +470,7 @@ OP_LD_TABLE(ldf); | @@ -470,6 +470,7 @@ OP_LD_TABLE(ldf); | ||
| 470 | OP_LD_TABLE(lddf); | 470 | OP_LD_TABLE(lddf); |
| 471 | 471 | ||
| 472 | #ifdef TARGET_SPARC64 | 472 | #ifdef TARGET_SPARC64 |
| 473 | +OP_LD_TABLE(lduw); | ||
| 473 | OP_LD_TABLE(ldsw); | 474 | OP_LD_TABLE(ldsw); |
| 474 | OP_LD_TABLE(ldx); | 475 | OP_LD_TABLE(ldx); |
| 475 | OP_LD_TABLE(stx); | 476 | OP_LD_TABLE(stx); |
| @@ -2810,7 +2811,11 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2810,7 +2811,11 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2810 | (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { | 2811 | (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { |
| 2811 | switch (xop) { | 2812 | switch (xop) { |
| 2812 | case 0x0: /* load word */ | 2813 | case 0x0: /* load word */ |
| 2814 | +#ifndef TARGET_SPARC64 | ||
| 2813 | gen_op_ldst(ld); | 2815 | gen_op_ldst(ld); |
| 2816 | +#else | ||
| 2817 | + gen_op_ldst(lduw); | ||
| 2818 | +#endif | ||
| 2814 | break; | 2819 | break; |
| 2815 | case 0x1: /* load unsigned byte */ | 2820 | case 0x1: /* load unsigned byte */ |
| 2816 | gen_op_ldst(ldub); | 2821 | gen_op_ldst(ldub); |
| @@ -2844,8 +2849,10 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2844,8 +2849,10 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2844 | goto illegal_insn; | 2849 | goto illegal_insn; |
| 2845 | if (!supervisor(dc)) | 2850 | if (!supervisor(dc)) |
| 2846 | goto priv_insn; | 2851 | goto priv_insn; |
| 2847 | -#endif | ||
| 2848 | gen_op_lda(insn, 1, 4, 0); | 2852 | gen_op_lda(insn, 1, 4, 0); |
| 2853 | +#else | ||
| 2854 | + gen_op_lduwa(insn, 1, 4, 0); | ||
| 2855 | +#endif | ||
| 2849 | break; | 2856 | break; |
| 2850 | case 0x11: /* load unsigned byte alternate */ | 2857 | case 0x11: /* load unsigned byte alternate */ |
| 2851 | #ifndef TARGET_SPARC64 | 2858 | #ifndef TARGET_SPARC64 |
| @@ -2926,6 +2933,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2926,6 +2933,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2926 | (void) &gen_op_ldfa; | 2933 | (void) &gen_op_ldfa; |
| 2927 | (void) &gen_op_lddfa; | 2934 | (void) &gen_op_lddfa; |
| 2928 | #else | 2935 | #else |
| 2936 | + (void) &gen_op_lda; | ||
| 2929 | #if !defined(CONFIG_USER_ONLY) | 2937 | #if !defined(CONFIG_USER_ONLY) |
| 2930 | (void) &gen_op_cas; | 2938 | (void) &gen_op_cas; |
| 2931 | (void) &gen_op_casx; | 2939 | (void) &gen_op_casx; |