Revision 08307563 target-arm/translate.c

b/target-arm/translate.c
843 843
    }
844 844
}
845 845

  
846
/* Abstractions of "generate code to do a guest load/store for
847
 * AArch32", where a vaddr is always 32 bits (and is zero
848
 * extended if we're a 64 bit core) and  data is also
849
 * 32 bits unless specifically doing a 64 bit access.
850
 * These functions work like tcg_gen_qemu_{ld,st}* except
851
 * that their arguments are TCGv_i32 rather than TCGv.
852
 */
853
#if TARGET_LONG_BITS == 32
854

  
855
#define DO_GEN_LD(OP)                                                    \
856
static inline void gen_aa32_##OP(TCGv_i32 val, TCGv_i32 addr, int index) \
857
{                                                                        \
858
    tcg_gen_qemu_##OP(val, addr, index);                                 \
859
}
860

  
861
#define DO_GEN_ST(OP)                                                    \
862
static inline void gen_aa32_##OP(TCGv_i32 val, TCGv_i32 addr, int index) \
863
{                                                                        \
864
    tcg_gen_qemu_##OP(val, addr, index);                                 \
865
}
866

  
867
static inline void gen_aa32_ld64(TCGv_i64 val, TCGv_i32 addr, int index)
868
{
869
    tcg_gen_qemu_ld64(val, addr, index);
870
}
871

  
872
static inline void gen_aa32_st64(TCGv_i64 val, TCGv_i32 addr, int index)
873
{
874
    tcg_gen_qemu_st64(val, addr, index);
875
}
876

  
877
#else
878

  
879
#define DO_GEN_LD(OP)                                                    \
880
static inline void gen_aa32_##OP(TCGv_i32 val, TCGv_i32 addr, int index) \
881
{                                                                        \
882
    TCGv addr64 = tcg_temp_new();                                        \
883
    TCGv val64 = tcg_temp_new();                                         \
884
    tcg_gen_extu_i32_i64(addr64, addr);                                  \
885
    tcg_gen_qemu_##OP(val64, addr64, index);                             \
886
    tcg_temp_free(addr64);                                               \
887
    tcg_gen_trunc_i64_i32(val, val64);                                   \
888
    tcg_temp_free(val64);                                                \
889
}
890

  
891
#define DO_GEN_ST(OP)                                                    \
892
static inline void gen_aa32_##OP(TCGv_i32 val, TCGv_i32 addr, int index) \
893
{                                                                        \
894
    TCGv addr64 = tcg_temp_new();                                        \
895
    TCGv val64 = tcg_temp_new();                                         \
896
    tcg_gen_extu_i32_i64(addr64, addr);                                  \
897
    tcg_gen_extu_i32_i64(val64, val);                                    \
898
    tcg_gen_qemu_##OP(val64, addr64, index);                             \
899
    tcg_temp_free(addr64);                                               \
900
    tcg_temp_free(val64);                                                \
901
}
902

  
903
static inline void gen_aa32_ld64(TCGv_i64 val, TCGv_i32 addr, int index)
904
{
905
    TCGv addr64 = tcg_temp_new();
906
    tcg_gen_extu_i32_i64(addr64, addr);
907
    tcg_gen_qemu_ld64(val, addr64, index);
908
    tcg_temp_free(addr64);
909
}
910

  
911
static inline void gen_aa32_st64(TCGv_i64 val, TCGv_i32 addr, int index)
912
{
913
    TCGv addr64 = tcg_temp_new();
914
    tcg_gen_extu_i32_i64(addr64, addr);
915
    tcg_gen_qemu_st64(val, addr64, index);
916
    tcg_temp_free(addr64);
917
}
918

  
919
#endif
920

  
921
DO_GEN_LD(ld8s)
922
DO_GEN_LD(ld8u)
923
DO_GEN_LD(ld16s)
924
DO_GEN_LD(ld16u)
925
DO_GEN_LD(ld32u)
926
DO_GEN_ST(st8)
927
DO_GEN_ST(st16)
928
DO_GEN_ST(st32)
929

  
846 930
static inline void gen_set_pc_im(uint32_t val)
847 931
{
848 932
    tcg_gen_movi_i32(cpu_R[15], val);
......
1072 1156

  
1073 1157
static inline void gen_vfp_ld(DisasContext *s, int dp, TCGv_i32 addr)
1074 1158
{
1075
    if (dp)
1076
        tcg_gen_qemu_ld64(cpu_F0d, addr, IS_USER(s));
1077
    else
1078
        tcg_gen_qemu_ld32u(cpu_F0s, addr, IS_USER(s));
1159
    if (dp) {
1160
        gen_aa32_ld64(cpu_F0d, addr, IS_USER(s));
1161
    } else {
1162
        gen_aa32_ld32u(cpu_F0s, addr, IS_USER(s));
1163
    }
1079 1164
}
1080 1165

  
1081 1166
static inline void gen_vfp_st(DisasContext *s, int dp, TCGv_i32 addr)
1082 1167
{
1083
    if (dp)
1084
        tcg_gen_qemu_st64(cpu_F0d, addr, IS_USER(s));
1085
    else
1086
        tcg_gen_qemu_st32(cpu_F0s, addr, IS_USER(s));
1168
    if (dp) {
1169
        gen_aa32_st64(cpu_F0d, addr, IS_USER(s));
1170
    } else {
1171
        gen_aa32_st32(cpu_F0s, addr, IS_USER(s));
1172
    }
1087 1173
}
1088 1174

  
1089 1175
static inline long
......
1420 1506
        if (insn & ARM_CP_RW_BIT) {
1421 1507
            if ((insn >> 28) == 0xf) {			/* WLDRW wCx */
1422 1508
                tmp = tcg_temp_new_i32();
1423
                tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
1509
                gen_aa32_ld32u(tmp, addr, IS_USER(s));
1424 1510
                iwmmxt_store_creg(wrd, tmp);
1425 1511
            } else {
1426 1512
                i = 1;
1427 1513
                if (insn & (1 << 8)) {
1428 1514
                    if (insn & (1 << 22)) {		/* WLDRD */
1429
                        tcg_gen_qemu_ld64(cpu_M0, addr, IS_USER(s));
1515
                        gen_aa32_ld64(cpu_M0, addr, IS_USER(s));
1430 1516
                        i = 0;
1431 1517
                    } else {				/* WLDRW wRd */
1432 1518
                        tmp = tcg_temp_new_i32();
1433
                        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
1519
                        gen_aa32_ld32u(tmp, addr, IS_USER(s));
1434 1520
                    }
1435 1521
                } else {
1436 1522
                    tmp = tcg_temp_new_i32();
1437 1523
                    if (insn & (1 << 22)) {		/* WLDRH */
1438
                        tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
1524
                        gen_aa32_ld16u(tmp, addr, IS_USER(s));
1439 1525
                    } else {				/* WLDRB */
1440
                        tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
1526
                        gen_aa32_ld8u(tmp, addr, IS_USER(s));
1441 1527
                    }
1442 1528
                }
1443 1529
                if (i) {
......
1449 1535
        } else {
1450 1536
            if ((insn >> 28) == 0xf) {			/* WSTRW wCx */
1451 1537
                tmp = iwmmxt_load_creg(wrd);
1452
                tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
1538
                gen_aa32_st32(tmp, addr, IS_USER(s));
1453 1539
            } else {
1454 1540
                gen_op_iwmmxt_movq_M0_wRn(wrd);
1455 1541
                tmp = tcg_temp_new_i32();
1456 1542
                if (insn & (1 << 8)) {
1457 1543
                    if (insn & (1 << 22)) {		/* WSTRD */
1458
                        tcg_gen_qemu_st64(cpu_M0, addr, IS_USER(s));
1544
                        gen_aa32_st64(cpu_M0, addr, IS_USER(s));
1459 1545
                    } else {				/* WSTRW wRd */
1460 1546
                        tcg_gen_trunc_i64_i32(tmp, cpu_M0);
1461
                        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
1547
                        gen_aa32_st32(tmp, addr, IS_USER(s));
1462 1548
                    }
1463 1549
                } else {
1464 1550
                    if (insn & (1 << 22)) {		/* WSTRH */
1465 1551
                        tcg_gen_trunc_i64_i32(tmp, cpu_M0);
1466
                        tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
1552
                        gen_aa32_st16(tmp, addr, IS_USER(s));
1467 1553
                    } else {				/* WSTRB */
1468 1554
                        tcg_gen_trunc_i64_i32(tmp, cpu_M0);
1469
                        tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
1555
                        gen_aa32_st8(tmp, addr, IS_USER(s));
1470 1556
                    }
1471 1557
                }
1472 1558
            }
......
2531 2617
    TCGv_i32 tmp = tcg_temp_new_i32();
2532 2618
    switch (size) {
2533 2619
    case 0:
2534
        tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
2620
        gen_aa32_ld8u(tmp, addr, IS_USER(s));
2535 2621
        gen_neon_dup_u8(tmp, 0);
2536 2622
        break;
2537 2623
    case 1:
2538
        tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
2624
        gen_aa32_ld16u(tmp, addr, IS_USER(s));
2539 2625
        gen_neon_dup_low16(tmp);
2540 2626
        break;
2541 2627
    case 2:
2542
        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
2628
        gen_aa32_ld32u(tmp, addr, IS_USER(s));
2543 2629
        break;
2544 2630
    default: /* Avoid compiler warnings.  */
2545 2631
        abort();
......
3817 3903
            if (size == 3) {
3818 3904
                tmp64 = tcg_temp_new_i64();
3819 3905
                if (load) {
3820
                    tcg_gen_qemu_ld64(tmp64, addr, IS_USER(s));
3906
                    gen_aa32_ld64(tmp64, addr, IS_USER(s));
3821 3907
                    neon_store_reg64(tmp64, rd);
3822 3908
                } else {
3823 3909
                    neon_load_reg64(tmp64, rd);
3824
                    tcg_gen_qemu_st64(tmp64, addr, IS_USER(s));
3910
                    gen_aa32_st64(tmp64, addr, IS_USER(s));
3825 3911
                }
3826 3912
                tcg_temp_free_i64(tmp64);
3827 3913
                tcg_gen_addi_i32(addr, addr, stride);
......
3830 3916
                    if (size == 2) {
3831 3917
                        if (load) {
3832 3918
                            tmp = tcg_temp_new_i32();
3833
                            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
3919
                            gen_aa32_ld32u(tmp, addr, IS_USER(s));
3834 3920
                            neon_store_reg(rd, pass, tmp);
3835 3921
                        } else {
3836 3922
                            tmp = neon_load_reg(rd, pass);
3837
                            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
3923
                            gen_aa32_st32(tmp, addr, IS_USER(s));
3838 3924
                            tcg_temp_free_i32(tmp);
3839 3925
                        }
3840 3926
                        tcg_gen_addi_i32(addr, addr, stride);
3841 3927
                    } else if (size == 1) {
3842 3928
                        if (load) {
3843 3929
                            tmp = tcg_temp_new_i32();
3844
                            tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
3930
                            gen_aa32_ld16u(tmp, addr, IS_USER(s));
3845 3931
                            tcg_gen_addi_i32(addr, addr, stride);
3846 3932
                            tmp2 = tcg_temp_new_i32();
3847
                            tcg_gen_qemu_ld16u(tmp2, addr, IS_USER(s));
3933
                            gen_aa32_ld16u(tmp2, addr, IS_USER(s));
3848 3934
                            tcg_gen_addi_i32(addr, addr, stride);
3849 3935
                            tcg_gen_shli_i32(tmp2, tmp2, 16);
3850 3936
                            tcg_gen_or_i32(tmp, tmp, tmp2);
......
3854 3940
                            tmp = neon_load_reg(rd, pass);
3855 3941
                            tmp2 = tcg_temp_new_i32();
3856 3942
                            tcg_gen_shri_i32(tmp2, tmp, 16);
3857
                            tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
3943
                            gen_aa32_st16(tmp, addr, IS_USER(s));
3858 3944
                            tcg_temp_free_i32(tmp);
3859 3945
                            tcg_gen_addi_i32(addr, addr, stride);
3860
                            tcg_gen_qemu_st16(tmp2, addr, IS_USER(s));
3946
                            gen_aa32_st16(tmp2, addr, IS_USER(s));
3861 3947
                            tcg_temp_free_i32(tmp2);
3862 3948
                            tcg_gen_addi_i32(addr, addr, stride);
3863 3949
                        }
......
3866 3952
                            TCGV_UNUSED_I32(tmp2);
3867 3953
                            for (n = 0; n < 4; n++) {
3868 3954
                                tmp = tcg_temp_new_i32();
3869
                                tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
3955
                                gen_aa32_ld8u(tmp, addr, IS_USER(s));
3870 3956
                                tcg_gen_addi_i32(addr, addr, stride);
3871 3957
                                if (n == 0) {
3872 3958
                                    tmp2 = tmp;
......
3886 3972
                                } else {
3887 3973
                                    tcg_gen_shri_i32(tmp, tmp2, n * 8);
3888 3974
                                }
3889
                                tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
3975
                                gen_aa32_st8(tmp, addr, IS_USER(s));
3890 3976
                                tcg_temp_free_i32(tmp);
3891 3977
                                tcg_gen_addi_i32(addr, addr, stride);
3892 3978
                            }
......
4010 4096
                    tmp = tcg_temp_new_i32();
4011 4097
                    switch (size) {
4012 4098
                    case 0:
4013
                        tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
4099
                        gen_aa32_ld8u(tmp, addr, IS_USER(s));
4014 4100
                        break;
4015 4101
                    case 1:
4016
                        tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
4102
                        gen_aa32_ld16u(tmp, addr, IS_USER(s));
4017 4103
                        break;
4018 4104
                    case 2:
4019
                        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
4105
                        gen_aa32_ld32u(tmp, addr, IS_USER(s));
4020 4106
                        break;
4021 4107
                    default: /* Avoid compiler warnings.  */
4022 4108
                        abort();
......
4034 4120
                        tcg_gen_shri_i32(tmp, tmp, shift);
4035 4121
                    switch (size) {
4036 4122
                    case 0:
4037
                        tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
4123
                        gen_aa32_st8(tmp, addr, IS_USER(s));
4038 4124
                        break;
4039 4125
                    case 1:
4040
                        tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
4126
                        gen_aa32_st16(tmp, addr, IS_USER(s));
4041 4127
                        break;
4042 4128
                    case 2:
4043
                        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
4129
                        gen_aa32_st32(tmp, addr, IS_USER(s));
4044 4130
                        break;
4045 4131
                    }
4046 4132
                    tcg_temp_free_i32(tmp);
......
6464 6550

  
6465 6551
    switch (size) {
6466 6552
    case 0:
6467
        tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
6553
        gen_aa32_ld8u(tmp, addr, IS_USER(s));
6468 6554
        break;
6469 6555
    case 1:
6470
        tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
6556
        gen_aa32_ld16u(tmp, addr, IS_USER(s));
6471 6557
        break;
6472 6558
    case 2:
6473 6559
    case 3:
6474
        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
6560
        gen_aa32_ld32u(tmp, addr, IS_USER(s));
6475 6561
        break;
6476 6562
    default:
6477 6563
        abort();
......
6482 6568
        TCGv_i32 tmp2 = tcg_temp_new_i32();
6483 6569
        tcg_gen_addi_i32(tmp2, addr, 4);
6484 6570
        tmp = tcg_temp_new_i32();
6485
        tcg_gen_qemu_ld32u(tmp, tmp2, IS_USER(s));
6571
        gen_aa32_ld32u(tmp, tmp2, IS_USER(s));
6486 6572
        tcg_temp_free_i32(tmp2);
6487 6573
        tcg_gen_mov_i32(cpu_exclusive_high, tmp);
6488 6574
        store_reg(s, rt2, tmp);
......
6524 6610
    tmp = tcg_temp_new_i32();
6525 6611
    switch (size) {
6526 6612
    case 0:
6527
        tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
6613
        gen_aa32_ld8u(tmp, addr, IS_USER(s));
6528 6614
        break;
6529 6615
    case 1:
6530
        tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
6616
        gen_aa32_ld16u(tmp, addr, IS_USER(s));
6531 6617
        break;
6532 6618
    case 2:
6533 6619
    case 3:
6534
        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
6620
        gen_aa32_ld32u(tmp, addr, IS_USER(s));
6535 6621
        break;
6536 6622
    default:
6537 6623
        abort();
......
6542 6628
        TCGv_i32 tmp2 = tcg_temp_new_i32();
6543 6629
        tcg_gen_addi_i32(tmp2, addr, 4);
6544 6630
        tmp = tcg_temp_new_i32();
6545
        tcg_gen_qemu_ld32u(tmp, tmp2, IS_USER(s));
6631
        gen_aa32_ld32u(tmp, tmp2, IS_USER(s));
6546 6632
        tcg_temp_free_i32(tmp2);
6547 6633
        tcg_gen_brcond_i32(TCG_COND_NE, tmp, cpu_exclusive_high, fail_label);
6548 6634
        tcg_temp_free_i32(tmp);
......
6550 6636
    tmp = load_reg(s, rt);
6551 6637
    switch (size) {
6552 6638
    case 0:
6553
        tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
6639
        gen_aa32_st8(tmp, addr, IS_USER(s));
6554 6640
        break;
6555 6641
    case 1:
6556
        tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
6642
        gen_aa32_st16(tmp, addr, IS_USER(s));
6557 6643
        break;
6558 6644
    case 2:
6559 6645
    case 3:
6560
        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
6646
        gen_aa32_st32(tmp, addr, IS_USER(s));
6561 6647
        break;
6562 6648
    default:
6563 6649
        abort();
......
6566 6652
    if (size == 3) {
6567 6653
        tcg_gen_addi_i32(addr, addr, 4);
6568 6654
        tmp = load_reg(s, rt2);
6569
        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
6655
        gen_aa32_st32(tmp, addr, IS_USER(s));
6570 6656
        tcg_temp_free_i32(tmp);
6571 6657
    }
6572 6658
    tcg_gen_movi_i32(cpu_R[rd], 0);
......
6613 6699
    }
6614 6700
    tcg_gen_addi_i32(addr, addr, offset);
6615 6701
    tmp = load_reg(s, 14);
6616
    tcg_gen_qemu_st32(tmp, addr, 0);
6702
    gen_aa32_st32(tmp, addr, 0);
6617 6703
    tcg_temp_free_i32(tmp);
6618 6704
    tmp = load_cpu_field(spsr);
6619 6705
    tcg_gen_addi_i32(addr, addr, 4);
6620
    tcg_gen_qemu_st32(tmp, addr, 0);
6706
    gen_aa32_st32(tmp, addr, 0);
6621 6707
    tcg_temp_free_i32(tmp);
6622 6708
    if (writeback) {
6623 6709
        switch (amode) {
......
6763 6849
                tcg_gen_addi_i32(addr, addr, offset);
6764 6850
            /* Load PC into tmp and CPSR into tmp2.  */
6765 6851
            tmp = tcg_temp_new_i32();
6766
            tcg_gen_qemu_ld32u(tmp, addr, 0);
6852
            gen_aa32_ld32u(tmp, addr, 0);
6767 6853
            tcg_gen_addi_i32(addr, addr, 4);
6768 6854
            tmp2 = tcg_temp_new_i32();
6769
            tcg_gen_qemu_ld32u(tmp2, addr, 0);
6855
            gen_aa32_ld32u(tmp2, addr, 0);
6770 6856
            if (insn & (1 << 21)) {
6771 6857
                /* Base writeback.  */
6772 6858
                switch (i) {
......
7322 7408
                                tmp = tcg_temp_new_i32();
7323 7409
                                switch (op1) {
7324 7410
                                case 0: /* lda */
7325
                                    tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
7411
                                    gen_aa32_ld32u(tmp, addr, IS_USER(s));
7326 7412
                                    break;
7327 7413
                                case 2: /* ldab */
7328
                                    tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
7414
                                    gen_aa32_ld8u(tmp, addr, IS_USER(s));
7329 7415
                                    break;
7330 7416
                                case 3: /* ldah */
7331
                                    tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
7417
                                    gen_aa32_ld16u(tmp, addr, IS_USER(s));
7332 7418
                                    break;
7333 7419
                                default:
7334 7420
                                    abort();
......
7339 7425
                                tmp = load_reg(s, rm);
7340 7426
                                switch (op1) {
7341 7427
                                case 0: /* stl */
7342
                                    tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
7428
                                    gen_aa32_st32(tmp, addr, IS_USER(s));
7343 7429
                                    break;
7344 7430
                                case 2: /* stlb */
7345
                                    tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
7431
                                    gen_aa32_st8(tmp, addr, IS_USER(s));
7346 7432
                                    break;
7347 7433
                                case 3: /* stlh */
7348
                                    tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
7434
                                    gen_aa32_st16(tmp, addr, IS_USER(s));
7349 7435
                                    break;
7350 7436
                                default:
7351 7437
                                    abort();
......
7400 7486
                        tmp = load_reg(s, rm);
7401 7487
                        tmp2 = tcg_temp_new_i32();
7402 7488
                        if (insn & (1 << 22)) {
7403
                            tcg_gen_qemu_ld8u(tmp2, addr, IS_USER(s));
7404
                            tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
7489
                            gen_aa32_ld8u(tmp2, addr, IS_USER(s));
7490
                            gen_aa32_st8(tmp, addr, IS_USER(s));
7405 7491
                        } else {
7406
                            tcg_gen_qemu_ld32u(tmp2, addr, IS_USER(s));
7407
                            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
7492
                            gen_aa32_ld32u(tmp2, addr, IS_USER(s));
7493
                            gen_aa32_st32(tmp, addr, IS_USER(s));
7408 7494
                        }
7409 7495
                        tcg_temp_free_i32(tmp);
7410 7496
                        tcg_temp_free_i32(addr);
......
7426 7512
                    tmp = tcg_temp_new_i32();
7427 7513
                    switch(sh) {
7428 7514
                    case 1:
7429
                        tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
7515
                        gen_aa32_ld16u(tmp, addr, IS_USER(s));
7430 7516
                        break;
7431 7517
                    case 2:
7432
                        tcg_gen_qemu_ld8s(tmp, addr, IS_USER(s));
7518
                        gen_aa32_ld8s(tmp, addr, IS_USER(s));
7433 7519
                        break;
7434 7520
                    default:
7435 7521
                    case 3:
7436
                        tcg_gen_qemu_ld16s(tmp, addr, IS_USER(s));
7522
                        gen_aa32_ld16s(tmp, addr, IS_USER(s));
7437 7523
                        break;
7438 7524
                    }
7439 7525
                    load = 1;
......
7443 7529
                    if (sh & 1) {
7444 7530
                        /* store */
7445 7531
                        tmp = load_reg(s, rd);
7446
                        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
7532
                        gen_aa32_st32(tmp, addr, IS_USER(s));
7447 7533
                        tcg_temp_free_i32(tmp);
7448 7534
                        tcg_gen_addi_i32(addr, addr, 4);
7449 7535
                        tmp = load_reg(s, rd + 1);
7450
                        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
7536
                        gen_aa32_st32(tmp, addr, IS_USER(s));
7451 7537
                        tcg_temp_free_i32(tmp);
7452 7538
                        load = 0;
7453 7539
                    } else {
7454 7540
                        /* load */
7455 7541
                        tmp = tcg_temp_new_i32();
7456
                        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
7542
                        gen_aa32_ld32u(tmp, addr, IS_USER(s));
7457 7543
                        store_reg(s, rd, tmp);
7458 7544
                        tcg_gen_addi_i32(addr, addr, 4);
7459 7545
                        tmp = tcg_temp_new_i32();
7460
                        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
7546
                        gen_aa32_ld32u(tmp, addr, IS_USER(s));
7461 7547
                        rd++;
7462 7548
                        load = 1;
7463 7549
                    }
......
7465 7551
                } else {
7466 7552
                    /* store */
7467 7553
                    tmp = load_reg(s, rd);
7468
                    tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
7554
                    gen_aa32_st16(tmp, addr, IS_USER(s));
7469 7555
                    tcg_temp_free_i32(tmp);
7470 7556
                    load = 0;
7471 7557
                }
......
7798 7884
                /* load */
7799 7885
                tmp = tcg_temp_new_i32();
7800 7886
                if (insn & (1 << 22)) {
7801
                    tcg_gen_qemu_ld8u(tmp, tmp2, i);
7887
                    gen_aa32_ld8u(tmp, tmp2, i);
7802 7888
                } else {
7803
                    tcg_gen_qemu_ld32u(tmp, tmp2, i);
7889
                    gen_aa32_ld32u(tmp, tmp2, i);
7804 7890
                }
7805 7891
            } else {
7806 7892
                /* store */
7807 7893
                tmp = load_reg(s, rd);
7808 7894
                if (insn & (1 << 22)) {
7809
                    tcg_gen_qemu_st8(tmp, tmp2, i);
7895
                    gen_aa32_st8(tmp, tmp2, i);
7810 7896
                } else {
7811
                    tcg_gen_qemu_st32(tmp, tmp2, i);
7897
                    gen_aa32_st32(tmp, tmp2, i);
7812 7898
                }
7813 7899
                tcg_temp_free_i32(tmp);
7814 7900
            }
......
7875 7961
                        if (insn & (1 << 20)) {
7876 7962
                            /* load */
7877 7963
                            tmp = tcg_temp_new_i32();
7878
                            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
7964
                            gen_aa32_ld32u(tmp, addr, IS_USER(s));
7879 7965
                            if (user) {
7880 7966
                                tmp2 = tcg_const_i32(i);
7881 7967
                                gen_helper_set_user_reg(cpu_env, tmp2, tmp);
......
7902 7988
                            } else {
7903 7989
                                tmp = load_reg(s, i);
7904 7990
                            }
7905
                            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
7991
                            gen_aa32_st32(tmp, addr, IS_USER(s));
7906 7992
                            tcg_temp_free_i32(tmp);
7907 7993
                        }
7908 7994
                        j++;
......
8161 8247
                if (insn & (1 << 20)) {
8162 8248
                    /* ldrd */
8163 8249
                    tmp = tcg_temp_new_i32();
8164
                    tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
8250
                    gen_aa32_ld32u(tmp, addr, IS_USER(s));
8165 8251
                    store_reg(s, rs, tmp);
8166 8252
                    tcg_gen_addi_i32(addr, addr, 4);
8167 8253
                    tmp = tcg_temp_new_i32();
8168
                    tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
8254
                    gen_aa32_ld32u(tmp, addr, IS_USER(s));
8169 8255
                    store_reg(s, rd, tmp);
8170 8256
                } else {
8171 8257
                    /* strd */
8172 8258
                    tmp = load_reg(s, rs);
8173
                    tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
8259
                    gen_aa32_st32(tmp, addr, IS_USER(s));
8174 8260
                    tcg_temp_free_i32(tmp);
8175 8261
                    tcg_gen_addi_i32(addr, addr, 4);
8176 8262
                    tmp = load_reg(s, rd);
8177
                    tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
8263
                    gen_aa32_st32(tmp, addr, IS_USER(s));
8178 8264
                    tcg_temp_free_i32(tmp);
8179 8265
                }
8180 8266
                if (insn & (1 << 21)) {
......
8212 8298
                    tcg_gen_add_i32(addr, addr, tmp);
8213 8299
                    tcg_temp_free_i32(tmp);
8214 8300
                    tmp = tcg_temp_new_i32();
8215
                    tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
8301
                    gen_aa32_ld16u(tmp, addr, IS_USER(s));
8216 8302
                } else { /* tbb */
8217 8303
                    tcg_temp_free_i32(tmp);
8218 8304
                    tmp = tcg_temp_new_i32();
8219
                    tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
8305
                    gen_aa32_ld8u(tmp, addr, IS_USER(s));
8220 8306
                }
8221 8307
                tcg_temp_free_i32(addr);
8222 8308
                tcg_gen_shli_i32(tmp, tmp, 1);
......
8253 8339
                        tmp = tcg_temp_new_i32();
8254 8340
                        switch (op) {
8255 8341
                        case 0: /* ldab */
8256
                            tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
8342
                            gen_aa32_ld8u(tmp, addr, IS_USER(s));
8257 8343
                            break;
8258 8344
                        case 1: /* ldah */
8259
                            tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
8345
                            gen_aa32_ld16u(tmp, addr, IS_USER(s));
8260 8346
                            break;
8261 8347
                        case 2: /* lda */
8262
                            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
8348
                            gen_aa32_ld32u(tmp, addr, IS_USER(s));
8263 8349
                            break;
8264 8350
                        default:
8265 8351
                            abort();
......
8269 8355
                        tmp = load_reg(s, rs);
8270 8356
                        switch (op) {
8271 8357
                        case 0: /* stlb */
8272
                            tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
8358
                            gen_aa32_st8(tmp, addr, IS_USER(s));
8273 8359
                            break;
8274 8360
                        case 1: /* stlh */
8275
                            tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
8361
                            gen_aa32_st16(tmp, addr, IS_USER(s));
8276 8362
                            break;
8277 8363
                        case 2: /* stl */
8278
                            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
8364
                            gen_aa32_st32(tmp, addr, IS_USER(s));
8279 8365
                            break;
8280 8366
                        default:
8281 8367
                            abort();
......
8303 8389
                        tcg_gen_addi_i32(addr, addr, -8);
8304 8390
                    /* Load PC into tmp and CPSR into tmp2.  */
8305 8391
                    tmp = tcg_temp_new_i32();
8306
                    tcg_gen_qemu_ld32u(tmp, addr, 0);
8392
                    gen_aa32_ld32u(tmp, addr, 0);
8307 8393
                    tcg_gen_addi_i32(addr, addr, 4);
8308 8394
                    tmp2 = tcg_temp_new_i32();
8309
                    tcg_gen_qemu_ld32u(tmp2, addr, 0);
8395
                    gen_aa32_ld32u(tmp2, addr, 0);
8310 8396
                    if (insn & (1 << 21)) {
8311 8397
                        /* Base writeback.  */
8312 8398
                        if (insn & (1 << 24)) {
......
8345 8431
                    if (insn & (1 << 20)) {
8346 8432
                        /* Load.  */
8347 8433
                        tmp = tcg_temp_new_i32();
8348
                        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
8434
                        gen_aa32_ld32u(tmp, addr, IS_USER(s));
8349 8435
                        if (i == 15) {
8350 8436
                            gen_bx(s, tmp);
8351 8437
                        } else if (i == rn) {
......
8357 8443
                    } else {
8358 8444
                        /* Store.  */
8359 8445
                        tmp = load_reg(s, i);
8360
                        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
8446
                        gen_aa32_st32(tmp, addr, IS_USER(s));
8361 8447
                        tcg_temp_free_i32(tmp);
8362 8448
                    }
8363 8449
                    tcg_gen_addi_i32(addr, addr, 4);
......
9135 9221
            tmp = tcg_temp_new_i32();
9136 9222
            switch (op) {
9137 9223
            case 0:
9138
                tcg_gen_qemu_ld8u(tmp, addr, user);
9224
                gen_aa32_ld8u(tmp, addr, user);
9139 9225
                break;
9140 9226
            case 4:
9141
                tcg_gen_qemu_ld8s(tmp, addr, user);
9227
                gen_aa32_ld8s(tmp, addr, user);
9142 9228
                break;
9143 9229
            case 1:
9144
                tcg_gen_qemu_ld16u(tmp, addr, user);
9230
                gen_aa32_ld16u(tmp, addr, user);
9145 9231
                break;
9146 9232
            case 5:
9147
                tcg_gen_qemu_ld16s(tmp, addr, user);
9233
                gen_aa32_ld16s(tmp, addr, user);
9148 9234
                break;
9149 9235
            case 2:
9150
                tcg_gen_qemu_ld32u(tmp, addr, user);
9236
                gen_aa32_ld32u(tmp, addr, user);
9151 9237
                break;
9152 9238
            default:
9153 9239
                tcg_temp_free_i32(tmp);
......
9164 9250
            tmp = load_reg(s, rs);
9165 9251
            switch (op) {
9166 9252
            case 0:
9167
                tcg_gen_qemu_st8(tmp, addr, user);
9253
                gen_aa32_st8(tmp, addr, user);
9168 9254
                break;
9169 9255
            case 1:
9170
                tcg_gen_qemu_st16(tmp, addr, user);
9256
                gen_aa32_st16(tmp, addr, user);
9171 9257
                break;
9172 9258
            case 2:
9173
                tcg_gen_qemu_st32(tmp, addr, user);
9259
                gen_aa32_st32(tmp, addr, user);
9174 9260
                break;
9175 9261
            default:
9176 9262
                tcg_temp_free_i32(tmp);
......
9307 9393
            addr = tcg_temp_new_i32();
9308 9394
            tcg_gen_movi_i32(addr, val);
9309 9395
            tmp = tcg_temp_new_i32();
9310
            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9396
            gen_aa32_ld32u(tmp, addr, IS_USER(s));
9311 9397
            tcg_temp_free_i32(addr);
9312 9398
            store_reg(s, rd, tmp);
9313 9399
            break;
......
9510 9596

  
9511 9597
        switch (op) {
9512 9598
        case 0: /* str */
9513
            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
9599
            gen_aa32_st32(tmp, addr, IS_USER(s));
9514 9600
            break;
9515 9601
        case 1: /* strh */
9516
            tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
9602
            gen_aa32_st16(tmp, addr, IS_USER(s));
9517 9603
            break;
9518 9604
        case 2: /* strb */
9519
            tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
9605
            gen_aa32_st8(tmp, addr, IS_USER(s));
9520 9606
            break;
9521 9607
        case 3: /* ldrsb */
9522
            tcg_gen_qemu_ld8s(tmp, addr, IS_USER(s));
9608
            gen_aa32_ld8s(tmp, addr, IS_USER(s));
9523 9609
            break;
9524 9610
        case 4: /* ldr */
9525
            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9611
            gen_aa32_ld32u(tmp, addr, IS_USER(s));
9526 9612
            break;
9527 9613
        case 5: /* ldrh */
9528
            tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
9614
            gen_aa32_ld16u(tmp, addr, IS_USER(s));
9529 9615
            break;
9530 9616
        case 6: /* ldrb */
9531
            tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
9617
            gen_aa32_ld8u(tmp, addr, IS_USER(s));
9532 9618
            break;
9533 9619
        case 7: /* ldrsh */
9534
            tcg_gen_qemu_ld16s(tmp, addr, IS_USER(s));
9620
            gen_aa32_ld16s(tmp, addr, IS_USER(s));
9535 9621
            break;
9536 9622
        }
9537 9623
        if (op >= 3) { /* load */
......
9553 9639
        if (insn & (1 << 11)) {
9554 9640
            /* load */
9555 9641
            tmp = tcg_temp_new_i32();
9556
            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9642
            gen_aa32_ld32u(tmp, addr, IS_USER(s));
9557 9643
            store_reg(s, rd, tmp);
9558 9644
        } else {
9559 9645
            /* store */
9560 9646
            tmp = load_reg(s, rd);
9561
            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
9647
            gen_aa32_st32(tmp, addr, IS_USER(s));
9562 9648
            tcg_temp_free_i32(tmp);
9563 9649
        }
9564 9650
        tcg_temp_free_i32(addr);
......
9575 9661
        if (insn & (1 << 11)) {
9576 9662
            /* load */
9577 9663
            tmp = tcg_temp_new_i32();
9578
            tcg_gen_qemu_ld8u(tmp, addr, IS_USER(s));
9664
            gen_aa32_ld8u(tmp, addr, IS_USER(s));
9579 9665
            store_reg(s, rd, tmp);
9580 9666
        } else {
9581 9667
            /* store */
9582 9668
            tmp = load_reg(s, rd);
9583
            tcg_gen_qemu_st8(tmp, addr, IS_USER(s));
9669
            gen_aa32_st8(tmp, addr, IS_USER(s));
9584 9670
            tcg_temp_free_i32(tmp);
9585 9671
        }
9586 9672
        tcg_temp_free_i32(addr);
......
9597 9683
        if (insn & (1 << 11)) {
9598 9684
            /* load */
9599 9685
            tmp = tcg_temp_new_i32();
9600
            tcg_gen_qemu_ld16u(tmp, addr, IS_USER(s));
9686
            gen_aa32_ld16u(tmp, addr, IS_USER(s));
9601 9687
            store_reg(s, rd, tmp);
9602 9688
        } else {
9603 9689
            /* store */
9604 9690
            tmp = load_reg(s, rd);
9605
            tcg_gen_qemu_st16(tmp, addr, IS_USER(s));
9691
            gen_aa32_st16(tmp, addr, IS_USER(s));
9606 9692
            tcg_temp_free_i32(tmp);
9607 9693
        }
9608 9694
        tcg_temp_free_i32(addr);
......
9618 9704
        if (insn & (1 << 11)) {
9619 9705
            /* load */
9620 9706
            tmp = tcg_temp_new_i32();
9621
            tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9707
            gen_aa32_ld32u(tmp, addr, IS_USER(s));
9622 9708
            store_reg(s, rd, tmp);
9623 9709
        } else {
9624 9710
            /* store */
9625 9711
            tmp = load_reg(s, rd);
9626
            tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
9712
            gen_aa32_st32(tmp, addr, IS_USER(s));
9627 9713
            tcg_temp_free_i32(tmp);
9628 9714
        }
9629 9715
        tcg_temp_free_i32(addr);
......
9691 9777
                    if (insn & (1 << 11)) {
9692 9778
                        /* pop */
9693 9779
                        tmp = tcg_temp_new_i32();
9694
                        tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9780
                        gen_aa32_ld32u(tmp, addr, IS_USER(s));
9695 9781
                        store_reg(s, i, tmp);
9696 9782
                    } else {
9697 9783
                        /* push */
9698 9784
                        tmp = load_reg(s, i);
9699
                        tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
9785
                        gen_aa32_st32(tmp, addr, IS_USER(s));
9700 9786
                        tcg_temp_free_i32(tmp);
9701 9787
                    }
9702 9788
                    /* advance to the next address.  */
......
9708 9794
                if (insn & (1 << 11)) {
9709 9795
                    /* pop pc */
9710 9796
                    tmp = tcg_temp_new_i32();
9711
                    tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9797
                    gen_aa32_ld32u(tmp, addr, IS_USER(s));
9712 9798
                    /* don't set the pc until the rest of the instruction
9713 9799
                       has completed */
9714 9800
                } else {
9715 9801
                    /* push lr */
9716 9802
                    tmp = load_reg(s, 14);
9717
                    tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
9803
                    gen_aa32_st32(tmp, addr, IS_USER(s));
9718 9804
                    tcg_temp_free_i32(tmp);
9719 9805
                }
9720 9806
                tcg_gen_addi_i32(addr, addr, 4);
......
9840 9926
                if (insn & (1 << 11)) {
9841 9927
                    /* load */
9842 9928
                    tmp = tcg_temp_new_i32();
9843
                    tcg_gen_qemu_ld32u(tmp, addr, IS_USER(s));
9929
                    gen_aa32_ld32u(tmp, addr, IS_USER(s));
9844 9930
                    if (i == rn) {
9845 9931
                        loaded_var = tmp;
9846 9932
                    } else {
......
9849 9935
                } else {
9850 9936
                    /* store */
9851 9937
                    tmp = load_reg(s, i);
9852
                    tcg_gen_qemu_st32(tmp, addr, IS_USER(s));
9938
                    gen_aa32_st32(tmp, addr, IS_USER(s));
9853 9939
                    tcg_temp_free_i32(tmp);
9854 9940
                }
9855 9941
                /* advance to the next address */

Also available in: Unified diff