Commit 200ae688b21e84f13dcfb4349cf8aaa63dcbe692
1 parent
08ba7963
TCGify the simplest FP instructions.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4737 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
14 additions
and
52 deletions
target-mips/op.c
| ... | ... | @@ -377,14 +377,6 @@ void op_dmultu (void) |
| 377 | 377 | |
| 378 | 378 | #define FLOAT_OP(name, p) void OPPROTO op_float_##name##_##p(void) |
| 379 | 379 | |
| 380 | -FLOAT_OP(cvtps, s) | |
| 381 | -{ | |
| 382 | - WT2 = WT0; | |
| 383 | - WTH2 = WT1; | |
| 384 | - DEBUG_FPU_STATE(); | |
| 385 | - FORCE_RET(); | |
| 386 | -} | |
| 387 | - | |
| 388 | 380 | FLOAT_OP(pll, ps) |
| 389 | 381 | { |
| 390 | 382 | DT2 = ((uint64_t)WT0 << 32) | WT1; |
| ... | ... | @@ -609,25 +601,6 @@ FLOAT_UNOP(abs) |
| 609 | 601 | FLOAT_UNOP(chs) |
| 610 | 602 | #undef FLOAT_UNOP |
| 611 | 603 | |
| 612 | -FLOAT_OP(mov, d) | |
| 613 | -{ | |
| 614 | - FDT2 = FDT0; | |
| 615 | - DEBUG_FPU_STATE(); | |
| 616 | - FORCE_RET(); | |
| 617 | -} | |
| 618 | -FLOAT_OP(mov, s) | |
| 619 | -{ | |
| 620 | - FST2 = FST0; | |
| 621 | - DEBUG_FPU_STATE(); | |
| 622 | - FORCE_RET(); | |
| 623 | -} | |
| 624 | -FLOAT_OP(mov, ps) | |
| 625 | -{ | |
| 626 | - FST2 = FST0; | |
| 627 | - FSTH2 = FSTH0; | |
| 628 | - DEBUG_FPU_STATE(); | |
| 629 | - FORCE_RET(); | |
| 630 | -} | |
| 631 | 604 | FLOAT_OP(alnv, ps) |
| 632 | 605 | { |
| 633 | 606 | switch (T0 & 0x7) { | ... | ... |
target-mips/op_mem.c
| ... | ... | @@ -267,14 +267,3 @@ void glue(op_sdr, MEMSUFFIX) (void) |
| 267 | 267 | FORCE_RET(); |
| 268 | 268 | } |
| 269 | 269 | #endif /* TARGET_MIPS64 */ |
| 270 | - | |
| 271 | -void glue(op_luxc1, MEMSUFFIX) (void) | |
| 272 | -{ | |
| 273 | - DT0 = glue(ldq, MEMSUFFIX)(T0 & ~0x7); | |
| 274 | - FORCE_RET(); | |
| 275 | -} | |
| 276 | -void glue(op_suxc1, MEMSUFFIX) (void) | |
| 277 | -{ | |
| 278 | - glue(stq, MEMSUFFIX)(T0 & ~0x7, DT0); | |
| 279 | - FORCE_RET(); | |
| 280 | -} | ... | ... |
target-mips/translate.c
| ... | ... | @@ -960,8 +960,6 @@ OP_LD_TABLE(wl); |
| 960 | 960 | OP_LD_TABLE(wr); |
| 961 | 961 | OP_ST_TABLE(wl); |
| 962 | 962 | OP_ST_TABLE(wr); |
| 963 | -OP_LD_TABLE(uxc1); | |
| 964 | -OP_ST_TABLE(uxc1); | |
| 965 | 963 | |
| 966 | 964 | #define OP_LD(insn,fname) \ |
| 967 | 965 | void inline op_ldst_##insn(DisasContext *ctx) \ |
| ... | ... | @@ -5651,8 +5649,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 5651 | 5649 | break; |
| 5652 | 5650 | case FOP(6, 16): |
| 5653 | 5651 | gen_load_fpr32(fpu32_T[0], fs); |
| 5654 | - gen_op_float_mov_s(); | |
| 5655 | - gen_store_fpr32(fpu32_T[2], fd); | |
| 5652 | + gen_store_fpr32(fpu32_T[0], fd); | |
| 5656 | 5653 | opn = "mov.s"; |
| 5657 | 5654 | break; |
| 5658 | 5655 | case FOP(7, 16): |
| ... | ... | @@ -5803,9 +5800,12 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 5803 | 5800 | break; |
| 5804 | 5801 | case FOP(38, 16): |
| 5805 | 5802 | check_cp1_64bitmode(ctx); |
| 5806 | - gen_load_fpr32(fpu32_T[1], fs); | |
| 5807 | - gen_load_fpr32(fpu32_T[0], ft); | |
| 5808 | - gen_op_float_cvtps_s(); | |
| 5803 | + gen_load_fpr32(fpu32_T[0], fs); | |
| 5804 | + gen_load_fpr32(fpu32_T[1], ft); | |
| 5805 | + tcg_gen_extu_i32_i64(fpu64_T[0], fpu32_T[0]); | |
| 5806 | + tcg_gen_extu_i32_i64(fpu64_T[1], fpu32_T[1]); | |
| 5807 | + tcg_gen_shli_i64(fpu64_T[1], fpu64_T[1], 32); | |
| 5808 | + tcg_gen_or_i64(fpu64_T[2], fpu64_T[0], fpu64_T[1]); | |
| 5809 | 5809 | gen_store_fpr64(ctx, fpu64_T[2], fd); |
| 5810 | 5810 | opn = "cvt.ps.s"; |
| 5811 | 5811 | break; |
| ... | ... | @@ -5889,8 +5889,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 5889 | 5889 | case FOP(6, 17): |
| 5890 | 5890 | check_cp1_registers(ctx, fs | fd); |
| 5891 | 5891 | gen_load_fpr64(ctx, fpu64_T[0], fs); |
| 5892 | - gen_op_float_mov_d(); | |
| 5893 | - gen_store_fpr64(ctx, fpu64_T[2], fd); | |
| 5892 | + gen_store_fpr64(ctx, fpu64_T[0], fd); | |
| 5894 | 5893 | opn = "mov.d"; |
| 5895 | 5894 | break; |
| 5896 | 5895 | case FOP(7, 17): |
| ... | ... | @@ -6156,9 +6155,8 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 6156 | 6155 | check_cp1_64bitmode(ctx); |
| 6157 | 6156 | gen_load_fpr32(fpu32_T[0], fs); |
| 6158 | 6157 | gen_load_fpr32h(fpu32h_T[0], fs); |
| 6159 | - gen_op_float_mov_ps(); | |
| 6160 | - gen_store_fpr32(fpu32_T[2], fd); | |
| 6161 | - gen_store_fpr32h(fpu32h_T[2], fd); | |
| 6158 | + gen_store_fpr32(fpu32_T[0], fd); | |
| 6159 | + gen_store_fpr32h(fpu32h_T[0], fd); | |
| 6162 | 6160 | opn = "mov.ps"; |
| 6163 | 6161 | break; |
| 6164 | 6162 | case FOP(7, 22): |
| ... | ... | @@ -6407,7 +6405,8 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 6407 | 6405 | break; |
| 6408 | 6406 | case OPC_LUXC1: |
| 6409 | 6407 | check_cp1_64bitmode(ctx); |
| 6410 | - op_ldst(luxc1); | |
| 6408 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], ~0x7); | |
| 6409 | + tcg_gen_qemu_ld64(fpu64_T[0], cpu_T[0], ctx->mem_idx); | |
| 6411 | 6410 | gen_store_fpr64(ctx, fpu64_T[0], fd); |
| 6412 | 6411 | opn = "luxc1"; |
| 6413 | 6412 | break; |
| ... | ... | @@ -6429,7 +6428,8 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 6429 | 6428 | case OPC_SUXC1: |
| 6430 | 6429 | check_cp1_64bitmode(ctx); |
| 6431 | 6430 | gen_load_fpr64(ctx, fpu64_T[0], fs); |
| 6432 | - op_ldst(suxc1); | |
| 6431 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], ~0x7); | |
| 6432 | + tcg_gen_qemu_st64(fpu64_T[0], cpu_T[0], ctx->mem_idx); | |
| 6433 | 6433 | opn = "suxc1"; |
| 6434 | 6434 | store = 1; |
| 6435 | 6435 | break; | ... | ... |