Commit b03d0971b3744cf5778264c9aedb4084f779c774
1 parent
04acd307
target-alpha: switch most load/store ops to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5255 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
128 additions
and
27 deletions
target-alpha/op_mem.h
... | ... | @@ -80,18 +80,11 @@ void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void) \ |
80 | 80 | RETURN(); \ |
81 | 81 | } |
82 | 82 | |
83 | -ALPHA_LD_OP(bu, ldub); | |
84 | -ALPHA_ST_OP(b, stb); | |
85 | -ALPHA_LD_OP(wu, lduw); | |
86 | -ALPHA_ST_OP(w, stw); | |
87 | 83 | ALPHA_LD_OP(l, ldl); |
88 | 84 | ALPHA_ST_OP(l, stl); |
89 | 85 | ALPHA_LD_OP(q, ldq); |
90 | 86 | ALPHA_ST_OP(q, stq); |
91 | 87 | |
92 | -ALPHA_LD_OP(q_u, ldq); | |
93 | -ALPHA_ST_OP(q_u, stq); | |
94 | - | |
95 | 88 | ALPHA_LD_OP(l_l, ldl_l); |
96 | 89 | ALPHA_LD_OP(q_l, ldq_l); |
97 | 90 | ALPHA_ST_OP(l_c, stl_c); | ... | ... |
target-alpha/translate.c
... | ... | @@ -209,16 +209,10 @@ static always_inline void gen_st##width (DisasContext *ctx) \ |
209 | 209 | (*gen_op_st##width[ctx->mem_idx])(); \ |
210 | 210 | } |
211 | 211 | |
212 | -GEN_LD(bu); | |
213 | -GEN_ST(b); | |
214 | -GEN_LD(wu); | |
215 | -GEN_ST(w); | |
216 | 212 | GEN_LD(l); |
217 | 213 | GEN_ST(l); |
218 | 214 | GEN_LD(q); |
219 | 215 | GEN_ST(q); |
220 | -GEN_LD(q_u); | |
221 | -GEN_ST(q_u); | |
222 | 216 | GEN_LD(l_l); |
223 | 217 | GEN_ST(l_c); |
224 | 218 | GEN_LD(q_l); |
... | ... | @@ -661,33 +655,103 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
661 | 655 | /* LDBU */ |
662 | 656 | if (!(ctx->amask & AMASK_BWX)) |
663 | 657 | goto invalid_opc; |
664 | - gen_load_mem(ctx, &gen_ldbu, ra, rb, disp16, 0); | |
658 | + if (likely(ra != 31)) { | |
659 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
660 | + if (rb != 31) | |
661 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
662 | + else | |
663 | + tcg_gen_movi_i64(addr, disp16); | |
664 | + tcg_gen_qemu_ld8u(cpu_ir[ra], addr, ctx->mem_idx); | |
665 | + tcg_temp_free(addr); | |
666 | + } | |
665 | 667 | break; |
666 | 668 | case 0x0B: |
667 | 669 | /* LDQ_U */ |
668 | - gen_load_mem(ctx, &gen_ldq_u, ra, rb, disp16, 1); | |
670 | + if (likely(ra != 31)) { | |
671 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
672 | + if (rb != 31) { | |
673 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
674 | + tcg_gen_andi_i64(addr, addr, ~0x7); | |
675 | + } else | |
676 | + tcg_gen_movi_i64(addr, disp16 & ~0x7); | |
677 | + tcg_gen_qemu_ld64(cpu_ir[ra], addr, ctx->mem_idx); | |
678 | + tcg_temp_free(addr); | |
679 | + } | |
669 | 680 | break; |
670 | 681 | case 0x0C: |
671 | 682 | /* LDWU */ |
672 | 683 | if (!(ctx->amask & AMASK_BWX)) |
673 | 684 | goto invalid_opc; |
674 | - gen_load_mem(ctx, &gen_ldwu, ra, rb, disp16, 0); | |
685 | + if (likely(ra != 31)) { | |
686 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
687 | + if (rb != 31) | |
688 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
689 | + else | |
690 | + tcg_gen_movi_i64(addr, disp16); | |
691 | + tcg_gen_qemu_ld16u(cpu_ir[ra], addr, ctx->mem_idx); | |
692 | + tcg_temp_free(addr); | |
693 | + } | |
675 | 694 | break; |
676 | 695 | case 0x0D: |
677 | 696 | /* STW */ |
678 | - if (!(ctx->amask & AMASK_BWX)) | |
679 | - goto invalid_opc; | |
680 | - gen_store_mem(ctx, &gen_stw, ra, rb, disp16, 0); | |
697 | + { | |
698 | + TCGv addr; | |
699 | + if (!(ctx->amask & AMASK_BWX)) | |
700 | + goto invalid_opc; | |
701 | + addr = tcg_temp_new(TCG_TYPE_I64); | |
702 | + if (rb != 31) | |
703 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
704 | + else | |
705 | + tcg_gen_movi_i64(addr, disp16); | |
706 | + if (ra != 31) | |
707 | + tcg_gen_qemu_st16(cpu_ir[ra], addr, ctx->mem_idx); | |
708 | + else { | |
709 | + TCGv zero = tcg_const_i64(0); | |
710 | + tcg_gen_qemu_st16(zero, addr, ctx->mem_idx); | |
711 | + tcg_temp_free(zero); | |
712 | + } | |
713 | + tcg_temp_free(addr); | |
714 | + } | |
681 | 715 | break; |
682 | 716 | case 0x0E: |
683 | 717 | /* STB */ |
684 | - if (!(ctx->amask & AMASK_BWX)) | |
685 | - goto invalid_opc; | |
686 | - gen_store_mem(ctx, &gen_stb, ra, rb, disp16, 0); | |
718 | + { | |
719 | + TCGv addr; | |
720 | + if (!(ctx->amask & AMASK_BWX)) | |
721 | + goto invalid_opc; | |
722 | + addr = tcg_temp_new(TCG_TYPE_I64); | |
723 | + if (rb != 31) | |
724 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
725 | + else | |
726 | + tcg_gen_movi_i64(addr, disp16); | |
727 | + if (ra != 31) | |
728 | + tcg_gen_qemu_st8(cpu_ir[ra], addr, ctx->mem_idx); | |
729 | + else { | |
730 | + TCGv zero = tcg_const_i64(0); | |
731 | + tcg_gen_qemu_st8(zero, addr, ctx->mem_idx); | |
732 | + tcg_temp_free(zero); | |
733 | + } | |
734 | + tcg_temp_free(addr); | |
735 | + } | |
687 | 736 | break; |
688 | 737 | case 0x0F: |
689 | 738 | /* STQ_U */ |
690 | - gen_store_mem(ctx, &gen_stq_u, ra, rb, disp16, 1); | |
739 | + { | |
740 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
741 | + if (rb != 31) { | |
742 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
743 | + tcg_gen_andi_i64(addr, addr, ~0x7); | |
744 | + } else | |
745 | + tcg_gen_movi_i64(addr, disp16 & ~0x7); | |
746 | + if (ra != 31) | |
747 | + tcg_gen_qemu_st64(cpu_ir[ra], addr, ctx->mem_idx); | |
748 | + else { | |
749 | + TCGv zero = tcg_const_i64(0); | |
750 | + tcg_gen_qemu_st64(zero, addr, ctx->mem_idx); | |
751 | + tcg_temp_free(zero); | |
752 | + } | |
753 | + tcg_temp_free(addr); | |
754 | + } | |
691 | 755 | break; |
692 | 756 | case 0x10: |
693 | 757 | switch (fn7) { |
... | ... | @@ -2125,11 +2189,27 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
2125 | 2189 | break; |
2126 | 2190 | case 0x28: |
2127 | 2191 | /* LDL */ |
2128 | - gen_load_mem(ctx, &gen_ldl, ra, rb, disp16, 0); | |
2192 | + if (likely(ra != 31)) { | |
2193 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
2194 | + if (rb != 31) | |
2195 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
2196 | + else | |
2197 | + tcg_gen_movi_i64(addr, disp16); | |
2198 | + tcg_gen_qemu_ld32s(cpu_ir[ra], addr, ctx->mem_idx); | |
2199 | + tcg_temp_free(addr); | |
2200 | + } | |
2129 | 2201 | break; |
2130 | 2202 | case 0x29: |
2131 | 2203 | /* LDQ */ |
2132 | - gen_load_mem(ctx, &gen_ldq, ra, rb, disp16, 0); | |
2204 | + if (likely(ra != 31)) { | |
2205 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
2206 | + if (rb != 31) | |
2207 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
2208 | + else | |
2209 | + tcg_gen_movi_i64(addr, disp16); | |
2210 | + tcg_gen_qemu_ld64(cpu_ir[ra], addr, ctx->mem_idx); | |
2211 | + tcg_temp_free(addr); | |
2212 | + } | |
2133 | 2213 | break; |
2134 | 2214 | case 0x2A: |
2135 | 2215 | /* LDL_L */ |
... | ... | @@ -2141,11 +2221,39 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
2141 | 2221 | break; |
2142 | 2222 | case 0x2C: |
2143 | 2223 | /* STL */ |
2144 | - gen_store_mem(ctx, &gen_stl, ra, rb, disp16, 0); | |
2224 | + { | |
2225 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
2226 | + if (rb != 31) | |
2227 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
2228 | + else | |
2229 | + tcg_gen_movi_i64(addr, disp16); | |
2230 | + if (ra != 31) | |
2231 | + tcg_gen_qemu_st32(cpu_ir[ra], addr, ctx->mem_idx); | |
2232 | + else { | |
2233 | + TCGv zero = tcg_const_i64(0); | |
2234 | + tcg_gen_qemu_st32(zero, addr, ctx->mem_idx); | |
2235 | + tcg_temp_free(zero); | |
2236 | + } | |
2237 | + tcg_temp_free(addr); | |
2238 | + } | |
2145 | 2239 | break; |
2146 | 2240 | case 0x2D: |
2147 | 2241 | /* STQ */ |
2148 | - gen_store_mem(ctx, &gen_stq, ra, rb, disp16, 0); | |
2242 | + { | |
2243 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
2244 | + if (rb != 31) | |
2245 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
2246 | + else | |
2247 | + tcg_gen_movi_i64(addr, disp16); | |
2248 | + if (ra != 31) | |
2249 | + tcg_gen_qemu_st64(cpu_ir[ra], addr, ctx->mem_idx); | |
2250 | + else { | |
2251 | + TCGv zero = tcg_const_i64(0); | |
2252 | + tcg_gen_qemu_st64(zero, addr, ctx->mem_idx); | |
2253 | + tcg_temp_free(zero); | |
2254 | + } | |
2255 | + tcg_temp_free(addr); | |
2256 | + } | |
2149 | 2257 | break; |
2150 | 2258 | case 0x2E: |
2151 | 2259 | /* STL_C */ | ... | ... |