Commit 023d8ca21fab3cb29be506946476ffc16c479a17
1 parent
5dafc53f
target-alpha: factorize load/store code
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5353 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
65 additions
and
134 deletions
target-alpha/translate.c
| ... | ... | @@ -256,7 +256,7 @@ static always_inline void gen_invalid (DisasContext *ctx) |
| 256 | 256 | gen_excp(ctx, EXCP_OPCDEC, 0); |
| 257 | 257 | } |
| 258 | 258 | |
| 259 | -static always_inline void gen_load_mem (DisasContext *ctx, | |
| 259 | +static always_inline void gen_load_mem_dyngen (DisasContext *ctx, | |
| 260 | 260 | void (*gen_load_op)(DisasContext *ctx), |
| 261 | 261 | int ra, int rb, int32_t disp16, |
| 262 | 262 | int clear) |
| ... | ... | @@ -277,7 +277,31 @@ static always_inline void gen_load_mem (DisasContext *ctx, |
| 277 | 277 | } |
| 278 | 278 | } |
| 279 | 279 | |
| 280 | -static always_inline void gen_store_mem (DisasContext *ctx, | |
| 280 | +static always_inline void gen_load_mem (DisasContext *ctx, | |
| 281 | + void (*tcg_gen_qemu_load)(TCGv t0, TCGv t1, int flags), | |
| 282 | + int ra, int rb, int32_t disp16, | |
| 283 | + int clear) | |
| 284 | +{ | |
| 285 | + TCGv addr; | |
| 286 | + | |
| 287 | + if (unlikely(ra == 31)) | |
| 288 | + return; | |
| 289 | + | |
| 290 | + addr = tcg_temp_new(TCG_TYPE_I64); | |
| 291 | + if (rb != 31) { | |
| 292 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
| 293 | + if (clear) | |
| 294 | + tcg_gen_andi_i64(addr, addr, ~0x7); | |
| 295 | + } else { | |
| 296 | + if (clear) | |
| 297 | + disp16 &= ~0x7; | |
| 298 | + tcg_gen_movi_i64(addr, disp16); | |
| 299 | + } | |
| 300 | + tcg_gen_qemu_load(cpu_ir[ra], addr, ctx->mem_idx); | |
| 301 | + tcg_temp_free(addr); | |
| 302 | +} | |
| 303 | + | |
| 304 | +static always_inline void gen_store_mem_dyngen (DisasContext *ctx, | |
| 281 | 305 | void (*gen_store_op)(DisasContext *ctx), |
| 282 | 306 | int ra, int rb, int32_t disp16, |
| 283 | 307 | int clear) |
| ... | ... | @@ -295,6 +319,31 @@ static always_inline void gen_store_mem (DisasContext *ctx, |
| 295 | 319 | (*gen_store_op)(ctx); |
| 296 | 320 | } |
| 297 | 321 | |
| 322 | +static always_inline void gen_store_mem (DisasContext *ctx, | |
| 323 | + void (*tcg_gen_qemu_store)(TCGv t0, TCGv t1, int flags), | |
| 324 | + int ra, int rb, int32_t disp16, | |
| 325 | + int clear) | |
| 326 | +{ | |
| 327 | + TCGv addr = tcg_temp_new(TCG_TYPE_I64); | |
| 328 | + if (rb != 31) { | |
| 329 | + tcg_gen_addi_i64(addr, cpu_ir[rb], disp16); | |
| 330 | + if (clear) | |
| 331 | + tcg_gen_andi_i64(addr, addr, ~0x7); | |
| 332 | + } else { | |
| 333 | + if (clear) | |
| 334 | + disp16 &= ~0x7; | |
| 335 | + tcg_gen_movi_i64(addr, disp16); | |
| 336 | + } | |
| 337 | + if (ra != 31) | |
| 338 | + tcg_gen_qemu_store(cpu_ir[ra], addr, ctx->mem_idx); | |
| 339 | + else { | |
| 340 | + TCGv zero = tcg_const_i64(0); | |
| 341 | + tcg_gen_qemu_store(zero, addr, ctx->mem_idx); | |
| 342 | + tcg_temp_free(zero); | |
| 343 | + } | |
| 344 | + tcg_temp_free(addr); | |
| 345 | +} | |
| 346 | + | |
| 298 | 347 | static always_inline void gen_load_fmem (DisasContext *ctx, |
| 299 | 348 | void (*gen_load_fop)(DisasContext *ctx), |
| 300 | 349 | int ra, int rb, int32_t disp16) |
| ... | ... | @@ -655,103 +704,29 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 655 | 704 | /* LDBU */ |
| 656 | 705 | if (!(ctx->amask & AMASK_BWX)) |
| 657 | 706 | goto invalid_opc; |
| 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 | - } | |
| 707 | + gen_load_mem(ctx, &tcg_gen_qemu_ld8u, ra, rb, disp16, 0); | |
| 667 | 708 | break; |
| 668 | 709 | case 0x0B: |
| 669 | 710 | /* LDQ_U */ |
| 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 | - } | |
| 711 | + gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1); | |
| 680 | 712 | break; |
| 681 | 713 | case 0x0C: |
| 682 | 714 | /* LDWU */ |
| 683 | 715 | if (!(ctx->amask & AMASK_BWX)) |
| 684 | 716 | goto invalid_opc; |
| 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 | - } | |
| 717 | + gen_load_mem(ctx, &tcg_gen_qemu_ld16u, ra, rb, disp16, 1); | |
| 694 | 718 | break; |
| 695 | 719 | case 0x0D: |
| 696 | 720 | /* STW */ |
| 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 | - } | |
| 721 | + gen_store_mem(ctx, &tcg_gen_qemu_st16, ra, rb, disp16, 0); | |
| 715 | 722 | break; |
| 716 | 723 | case 0x0E: |
| 717 | 724 | /* STB */ |
| 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 | - } | |
| 725 | + gen_store_mem(ctx, &tcg_gen_qemu_st8, ra, rb, disp16, 0); | |
| 736 | 726 | break; |
| 737 | 727 | case 0x0F: |
| 738 | 728 | /* STQ_U */ |
| 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 | - } | |
| 729 | + gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1); | |
| 755 | 730 | break; |
| 756 | 731 | case 0x10: |
| 757 | 732 | switch (fn7) { |
| ... | ... | @@ -2189,79 +2164,35 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 2189 | 2164 | break; |
| 2190 | 2165 | case 0x28: |
| 2191 | 2166 | /* LDL */ |
| 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 | - } | |
| 2167 | + gen_load_mem(ctx, &tcg_gen_qemu_ld32s, ra, rb, disp16, 0); | |
| 2201 | 2168 | break; |
| 2202 | 2169 | case 0x29: |
| 2203 | 2170 | /* LDQ */ |
| 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 | - } | |
| 2171 | + gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0); | |
| 2213 | 2172 | break; |
| 2214 | 2173 | case 0x2A: |
| 2215 | 2174 | /* LDL_L */ |
| 2216 | - gen_load_mem(ctx, &gen_ldl_l, ra, rb, disp16, 0); | |
| 2175 | + gen_load_mem_dyngen(ctx, &gen_ldl_l, ra, rb, disp16, 0); | |
| 2217 | 2176 | break; |
| 2218 | 2177 | case 0x2B: |
| 2219 | 2178 | /* LDQ_L */ |
| 2220 | - gen_load_mem(ctx, &gen_ldq_l, ra, rb, disp16, 0); | |
| 2179 | + gen_load_mem_dyngen(ctx, &gen_ldq_l, ra, rb, disp16, 0); | |
| 2221 | 2180 | break; |
| 2222 | 2181 | case 0x2C: |
| 2223 | 2182 | /* STL */ |
| 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 | - } | |
| 2183 | + gen_store_mem(ctx, &tcg_gen_qemu_st32, ra, rb, disp16, 0); | |
| 2239 | 2184 | break; |
| 2240 | 2185 | case 0x2D: |
| 2241 | 2186 | /* STQ */ |
| 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 | - } | |
| 2187 | + gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0); | |
| 2257 | 2188 | break; |
| 2258 | 2189 | case 0x2E: |
| 2259 | 2190 | /* STL_C */ |
| 2260 | - gen_store_mem(ctx, &gen_stl_c, ra, rb, disp16, 0); | |
| 2191 | + gen_store_mem_dyngen(ctx, &gen_stl_c, ra, rb, disp16, 0); | |
| 2261 | 2192 | break; |
| 2262 | 2193 | case 0x2F: |
| 2263 | 2194 | /* STQ_C */ |
| 2264 | - gen_store_mem(ctx, &gen_stq_c, ra, rb, disp16, 0); | |
| 2195 | + gen_store_mem_dyngen(ctx, &gen_stq_c, ra, rb, disp16, 0); | |
| 2265 | 2196 | break; |
| 2266 | 2197 | case 0x30: |
| 2267 | 2198 | /* BR */ | ... | ... |