Revision 5f68f5ae target-mips/translate.c

b/target-mips/translate.c
1606 1606
    switch (opc) {
1607 1607
#if defined(TARGET_MIPS64)
1608 1608
    case OPC_LWU:
1609
        tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx);
1609
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
1610 1610
        gen_store_gpr(t0, rt);
1611 1611
        opn = "lwu";
1612 1612
        break;
1613 1613
    case OPC_LD:
1614
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1614
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
1615 1615
        gen_store_gpr(t0, rt);
1616 1616
        opn = "ld";
1617 1617
        break;
......
1629 1629
#endif
1630 1630
        tcg_gen_shli_tl(t1, t1, 3);
1631 1631
        tcg_gen_andi_tl(t0, t0, ~7);
1632
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1632
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
1633 1633
        tcg_gen_shl_tl(t0, t0, t1);
1634 1634
        tcg_gen_xori_tl(t1, t1, 63);
1635 1635
        t2 = tcg_const_tl(0x7fffffffffffffffull);
......
1650 1650
#endif
1651 1651
        tcg_gen_shli_tl(t1, t1, 3);
1652 1652
        tcg_gen_andi_tl(t0, t0, ~7);
1653
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1653
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
1654 1654
        tcg_gen_shr_tl(t0, t0, t1);
1655 1655
        tcg_gen_xori_tl(t1, t1, 63);
1656 1656
        t2 = tcg_const_tl(0xfffffffffffffffeull);
......
1667 1667
        t1 = tcg_const_tl(pc_relative_pc(ctx));
1668 1668
        gen_op_addr_add(ctx, t0, t0, t1);
1669 1669
        tcg_temp_free(t1);
1670
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1670
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
1671 1671
        gen_store_gpr(t0, rt);
1672 1672
        opn = "ldpc";
1673 1673
        break;
......
1676 1676
        t1 = tcg_const_tl(pc_relative_pc(ctx));
1677 1677
        gen_op_addr_add(ctx, t0, t0, t1);
1678 1678
        tcg_temp_free(t1);
1679
        tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1679
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
1680 1680
        gen_store_gpr(t0, rt);
1681 1681
        opn = "lwpc";
1682 1682
        break;
1683 1683
    case OPC_LW:
1684
        tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1684
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
1685 1685
        gen_store_gpr(t0, rt);
1686 1686
        opn = "lw";
1687 1687
        break;
1688 1688
    case OPC_LH:
1689
        tcg_gen_qemu_ld16s(t0, t0, ctx->mem_idx);
1689
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
1690 1690
        gen_store_gpr(t0, rt);
1691 1691
        opn = "lh";
1692 1692
        break;
1693 1693
    case OPC_LHU:
1694
        tcg_gen_qemu_ld16u(t0, t0, ctx->mem_idx);
1694
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUW);
1695 1695
        gen_store_gpr(t0, rt);
1696 1696
        opn = "lhu";
1697 1697
        break;
1698 1698
    case OPC_LB:
1699
        tcg_gen_qemu_ld8s(t0, t0, ctx->mem_idx);
1699
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_SB);
1700 1700
        gen_store_gpr(t0, rt);
1701 1701
        opn = "lb";
1702 1702
        break;
1703 1703
    case OPC_LBU:
1704
        tcg_gen_qemu_ld8u(t0, t0, ctx->mem_idx);
1704
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
1705 1705
        gen_store_gpr(t0, rt);
1706 1706
        opn = "lbu";
1707 1707
        break;
......
1713 1713
#endif
1714 1714
        tcg_gen_shli_tl(t1, t1, 3);
1715 1715
        tcg_gen_andi_tl(t0, t0, ~3);
1716
        tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx);
1716
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
1717 1717
        tcg_gen_shl_tl(t0, t0, t1);
1718 1718
        tcg_gen_xori_tl(t1, t1, 31);
1719 1719
        t2 = tcg_const_tl(0x7fffffffull);
......
1735 1735
#endif
1736 1736
        tcg_gen_shli_tl(t1, t1, 3);
1737 1737
        tcg_gen_andi_tl(t0, t0, ~3);
1738
        tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx);
1738
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
1739 1739
        tcg_gen_shr_tl(t0, t0, t1);
1740 1740
        tcg_gen_xori_tl(t1, t1, 31);
1741 1741
        t2 = tcg_const_tl(0xfffffffeull);
......
1774 1774
    switch (opc) {
1775 1775
#if defined(TARGET_MIPS64)
1776 1776
    case OPC_SD:
1777
        tcg_gen_qemu_st64(t1, t0, ctx->mem_idx);
1777
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
1778 1778
        opn = "sd";
1779 1779
        break;
1780 1780
    case OPC_SDL:
......
1789 1789
        break;
1790 1790
#endif
1791 1791
    case OPC_SW:
1792
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1792
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
1793 1793
        opn = "sw";
1794 1794
        break;
1795 1795
    case OPC_SH:
1796
        tcg_gen_qemu_st16(t1, t0, ctx->mem_idx);
1796
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW);
1797 1797
        opn = "sh";
1798 1798
        break;
1799 1799
    case OPC_SB:
1800
        tcg_gen_qemu_st8(t1, t0, ctx->mem_idx);
1800
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_8);
1801 1801
        opn = "sb";
1802 1802
        break;
1803 1803
    case OPC_SWL:
......
1868 1868
    case OPC_LWC1:
1869 1869
        {
1870 1870
            TCGv_i32 fp0 = tcg_temp_new_i32();
1871

  
1872
            tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1873
            tcg_gen_trunc_tl_i32(fp0, t0);
1871
            tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL);
1874 1872
            gen_store_fpr32(fp0, ft);
1875 1873
            tcg_temp_free_i32(fp0);
1876 1874
        }
......
1879 1877
    case OPC_SWC1:
1880 1878
        {
1881 1879
            TCGv_i32 fp0 = tcg_temp_new_i32();
1882
            TCGv t1 = tcg_temp_new();
1883

  
1884 1880
            gen_load_fpr32(fp0, ft);
1885
            tcg_gen_extu_i32_tl(t1, fp0);
1886
            tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1887
            tcg_temp_free(t1);
1881
            tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
1888 1882
            tcg_temp_free_i32(fp0);
1889 1883
        }
1890 1884
        opn = "swc1";
......
1892 1886
    case OPC_LDC1:
1893 1887
        {
1894 1888
            TCGv_i64 fp0 = tcg_temp_new_i64();
1895

  
1896
            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
1889
            tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
1897 1890
            gen_store_fpr64(ctx, fp0, ft);
1898 1891
            tcg_temp_free_i64(fp0);
1899 1892
        }
......
1902 1895
    case OPC_SDC1:
1903 1896
        {
1904 1897
            TCGv_i64 fp0 = tcg_temp_new_i64();
1905

  
1906 1898
            gen_load_fpr64(ctx, fp0, ft);
1907
            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
1899
            tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
1908 1900
            tcg_temp_free_i64(fp0);
1909 1901
        }
1910 1902
        opn = "sdc1";
......
8652 8644
        {
8653 8645
            TCGv_i32 fp0 = tcg_temp_new_i32();
8654 8646

  
8655
            tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
8647
            tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
8656 8648
            tcg_gen_trunc_tl_i32(fp0, t0);
8657 8649
            gen_store_fpr32(fp0, fd);
8658 8650
            tcg_temp_free_i32(fp0);
......
8664 8656
        check_cp1_registers(ctx, fd);
8665 8657
        {
8666 8658
            TCGv_i64 fp0 = tcg_temp_new_i64();
8667

  
8668
            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8659
            tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
8669 8660
            gen_store_fpr64(ctx, fp0, fd);
8670 8661
            tcg_temp_free_i64(fp0);
8671 8662
        }
......
8677 8668
        {
8678 8669
            TCGv_i64 fp0 = tcg_temp_new_i64();
8679 8670

  
8680
            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8671
            tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
8681 8672
            gen_store_fpr64(ctx, fp0, fd);
8682 8673
            tcg_temp_free_i64(fp0);
8683 8674
        }
......
8687 8678
        check_cop1x(ctx);
8688 8679
        {
8689 8680
            TCGv_i32 fp0 = tcg_temp_new_i32();
8690
            TCGv t1 = tcg_temp_new();
8691

  
8692 8681
            gen_load_fpr32(fp0, fs);
8693
            tcg_gen_extu_i32_tl(t1, fp0);
8694
            tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
8682
            tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
8695 8683
            tcg_temp_free_i32(fp0);
8696
            tcg_temp_free(t1);
8697 8684
        }
8698 8685
        opn = "swxc1";
8699 8686
        store = 1;
......
8703 8690
        check_cp1_registers(ctx, fs);
8704 8691
        {
8705 8692
            TCGv_i64 fp0 = tcg_temp_new_i64();
8706

  
8707 8693
            gen_load_fpr64(ctx, fp0, fs);
8708
            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8694
            tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
8709 8695
            tcg_temp_free_i64(fp0);
8710 8696
        }
8711 8697
        opn = "sdxc1";
......
8716 8702
        tcg_gen_andi_tl(t0, t0, ~0x7);
8717 8703
        {
8718 8704
            TCGv_i64 fp0 = tcg_temp_new_i64();
8719

  
8720 8705
            gen_load_fpr64(ctx, fp0, fs);
8721
            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8706
            tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
8722 8707
            tcg_temp_free_i64(fp0);
8723 8708
        }
8724 8709
        opn = "suxc1";
......
9286 9271
    case 4:
9287 9272
        gen_base_offset_addr(ctx, t0, 29, 12);
9288 9273
        gen_load_gpr(t1, 7);
9289
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9274
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
9290 9275
        /* Fall through */
9291 9276
    case 3:
9292 9277
        gen_base_offset_addr(ctx, t0, 29, 8);
9293 9278
        gen_load_gpr(t1, 6);
9294
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9279
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
9295 9280
        /* Fall through */
9296 9281
    case 2:
9297 9282
        gen_base_offset_addr(ctx, t0, 29, 4);
9298 9283
        gen_load_gpr(t1, 5);
9299
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9284
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
9300 9285
        /* Fall through */
9301 9286
    case 1:
9302 9287
        gen_base_offset_addr(ctx, t0, 29, 0);
9303 9288
        gen_load_gpr(t1, 4);
9304
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9289
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
9305 9290
    }
9306 9291

  
9307 9292
    gen_load_gpr(t0, 29);
9308 9293

  
9309
#define DECR_AND_STORE(reg) do {                \
9310
        tcg_gen_subi_tl(t0, t0, 4);             \
9311
        gen_load_gpr(t1, reg);                  \
9312
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);                  \
9294
#define DECR_AND_STORE(reg) do {                                 \
9295
        tcg_gen_subi_tl(t0, t0, 4);                              \
9296
        gen_load_gpr(t1, reg);                                   \
9297
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
9313 9298
    } while (0)
9314 9299

  
9315 9300
    if (do_ra) {
......
9407 9392

  
9408 9393
    tcg_gen_addi_tl(t0, cpu_gpr[29], framesize);
9409 9394

  
9410
#define DECR_AND_LOAD(reg) do {                   \
9411
        tcg_gen_subi_tl(t0, t0, 4);               \
9412
        tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx); \
9413
        gen_store_gpr(t1, reg);                   \
9395
#define DECR_AND_LOAD(reg) do {                            \
9396
        tcg_gen_subi_tl(t0, t0, 4);                        \
9397
        tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
9398
        gen_store_gpr(t1, reg);                            \
9414 9399
    } while (0)
9415 9400

  
9416 9401
    if (do_ra) {
......
10935 10920
        gen_op_addr_add(ctx, t0, t1, t0);
10936 10921
    }
10937 10922

  
10938
    tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx);
10923
    tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
10939 10924
    gen_store_gpr(t1, rd);
10940 10925

  
10941 10926
    tcg_temp_free(t0);
......
10964 10949
            generate_exception(ctx, EXCP_RI);
10965 10950
            return;
10966 10951
        }
10967
        tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx);
10952
        tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
10968 10953
        gen_store_gpr(t1, rd);
10969 10954
        tcg_gen_movi_tl(t1, 4);
10970 10955
        gen_op_addr_add(ctx, t0, t0, t1);
10971
        tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx);
10956
        tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
10972 10957
        gen_store_gpr(t1, rd+1);
10973 10958
        opn = "lwp";
10974 10959
        break;
10975 10960
    case SWP:
10976 10961
        gen_load_gpr(t1, rd);
10977
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
10962
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
10978 10963
        tcg_gen_movi_tl(t1, 4);
10979 10964
        gen_op_addr_add(ctx, t0, t0, t1);
10980 10965
        gen_load_gpr(t1, rd+1);
10981
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
10966
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
10982 10967
        opn = "swp";
10983 10968
        break;
10984 10969
#ifdef TARGET_MIPS64
......
10987 10972
            generate_exception(ctx, EXCP_RI);
10988 10973
            return;
10989 10974
        }
10990
        tcg_gen_qemu_ld64(t1, t0, ctx->mem_idx);
10975
        tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
10991 10976
        gen_store_gpr(t1, rd);
10992 10977
        tcg_gen_movi_tl(t1, 8);
10993 10978
        gen_op_addr_add(ctx, t0, t0, t1);
10994
        tcg_gen_qemu_ld64(t1, t0, ctx->mem_idx);
10979
        tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
10995 10980
        gen_store_gpr(t1, rd+1);
10996 10981
        opn = "ldp";
10997 10982
        break;
10998 10983
    case SDP:
10999 10984
        gen_load_gpr(t1, rd);
11000
        tcg_gen_qemu_st64(t1, t0, ctx->mem_idx);
10985
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
11001 10986
        tcg_gen_movi_tl(t1, 8);
11002 10987
        gen_op_addr_add(ctx, t0, t0, t1);
11003 10988
        gen_load_gpr(t1, rd+1);
11004
        tcg_gen_qemu_st64(t1, t0, ctx->mem_idx);
10989
        tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
11005 10990
        opn = "sdp";
11006 10991
        break;
11007 10992
#endif
......
12672 12657

  
12673 12658
    switch (opc) {
12674 12659
    case OPC_LBUX:
12675
        tcg_gen_qemu_ld8u(t0, t0, ctx->mem_idx);
12660
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
12676 12661
        gen_store_gpr(t0, rd);
12677 12662
        opn = "lbux";
12678 12663
        break;
12679 12664
    case OPC_LHX:
12680
        tcg_gen_qemu_ld16s(t0, t0, ctx->mem_idx);
12665
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
12681 12666
        gen_store_gpr(t0, rd);
12682 12667
        opn = "lhx";
12683 12668
        break;
12684 12669
    case OPC_LWX:
12685
        tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
12670
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
12686 12671
        gen_store_gpr(t0, rd);
12687 12672
        opn = "lwx";
12688 12673
        break;
12689 12674
#if defined(TARGET_MIPS64)
12690 12675
    case OPC_LDX:
12691
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
12676
        tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
12692 12677
        gen_store_gpr(t0, rd);
12693 12678
        opn = "ldx";
12694 12679
        break;

Also available in: Unified diff