tcg-op.c (59c58f96b270f5edd4ad10954c3a96556cb3a728) tcg-op.c (14776ab5a12972ea439c7fb2203a4c15a09094b4)
1/*
2 * Tiny Code Generator for QEMU
3 *
4 * Copyright (c) 2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 2700 unchanged lines hidden (view full) ---

2709 gen_helper_lookup_tb_ptr(ptr, cpu_env);
2710 tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr));
2711 tcg_temp_free_ptr(ptr);
2712 } else {
2713 tcg_gen_exit_tb(NULL, 0);
2714 }
2715}
2716
1/*
2 * Tiny Code Generator for QEMU
3 *
4 * Copyright (c) 2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 2700 unchanged lines hidden (view full) ---

2709 gen_helper_lookup_tb_ptr(ptr, cpu_env);
2710 tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr));
2711 tcg_temp_free_ptr(ptr);
2712 } else {
2713 tcg_gen_exit_tb(NULL, 0);
2714 }
2715}
2716
2717static inline TCGMemOp tcg_canonicalize_memop(TCGMemOp op, bool is64, bool st)
2717static inline MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
2718{
2719 /* Trigger the asserts within as early as possible. */
2720 (void)get_alignment_bits(op);
2721
2722 switch (op & MO_SIZE) {
2723 case MO_8:
2724 op &= ~MO_BSWAP;
2725 break;

--- 12 unchanged lines hidden (view full) ---

2738 }
2739 if (st) {
2740 op &= ~MO_SIGN;
2741 }
2742 return op;
2743}
2744
2745static void gen_ldst_i32(TCGOpcode opc, TCGv_i32 val, TCGv addr,
2718{
2719 /* Trigger the asserts within as early as possible. */
2720 (void)get_alignment_bits(op);
2721
2722 switch (op & MO_SIZE) {
2723 case MO_8:
2724 op &= ~MO_BSWAP;
2725 break;

--- 12 unchanged lines hidden (view full) ---

2738 }
2739 if (st) {
2740 op &= ~MO_SIGN;
2741 }
2742 return op;
2743}
2744
2745static void gen_ldst_i32(TCGOpcode opc, TCGv_i32 val, TCGv addr,
2746 TCGMemOp memop, TCGArg idx)
2746 MemOp memop, TCGArg idx)
2747{
2748 TCGMemOpIdx oi = make_memop_idx(memop, idx);
2749#if TARGET_LONG_BITS == 32
2750 tcg_gen_op3i_i32(opc, val, addr, oi);
2751#else
2752 if (TCG_TARGET_REG_BITS == 32) {
2753 tcg_gen_op4i_i32(opc, val, TCGV_LOW(addr), TCGV_HIGH(addr), oi);
2754 } else {
2755 tcg_gen_op3(opc, tcgv_i32_arg(val), tcgv_i64_arg(addr), oi);
2756 }
2757#endif
2758}
2759
2760static void gen_ldst_i64(TCGOpcode opc, TCGv_i64 val, TCGv addr,
2747{
2748 TCGMemOpIdx oi = make_memop_idx(memop, idx);
2749#if TARGET_LONG_BITS == 32
2750 tcg_gen_op3i_i32(opc, val, addr, oi);
2751#else
2752 if (TCG_TARGET_REG_BITS == 32) {
2753 tcg_gen_op4i_i32(opc, val, TCGV_LOW(addr), TCGV_HIGH(addr), oi);
2754 } else {
2755 tcg_gen_op3(opc, tcgv_i32_arg(val), tcgv_i64_arg(addr), oi);
2756 }
2757#endif
2758}
2759
2760static void gen_ldst_i64(TCGOpcode opc, TCGv_i64 val, TCGv addr,
2761 TCGMemOp memop, TCGArg idx)
2761 MemOp memop, TCGArg idx)
2762{
2763 TCGMemOpIdx oi = make_memop_idx(memop, idx);
2764#if TARGET_LONG_BITS == 32
2765 if (TCG_TARGET_REG_BITS == 32) {
2766 tcg_gen_op4i_i32(opc, TCGV_LOW(val), TCGV_HIGH(val), addr, oi);
2767 } else {
2768 tcg_gen_op3(opc, tcgv_i64_arg(val), tcgv_i32_arg(addr), oi);
2769 }

--- 13 unchanged lines hidden (view full) ---

2783 type &= TCG_GUEST_DEFAULT_MO;
2784#endif
2785 type &= ~TCG_TARGET_DEFAULT_MO;
2786 if (type) {
2787 tcg_gen_mb(type | TCG_BAR_SC);
2788 }
2789}
2790
2762{
2763 TCGMemOpIdx oi = make_memop_idx(memop, idx);
2764#if TARGET_LONG_BITS == 32
2765 if (TCG_TARGET_REG_BITS == 32) {
2766 tcg_gen_op4i_i32(opc, TCGV_LOW(val), TCGV_HIGH(val), addr, oi);
2767 } else {
2768 tcg_gen_op3(opc, tcgv_i64_arg(val), tcgv_i32_arg(addr), oi);
2769 }

--- 13 unchanged lines hidden (view full) ---

2783 type &= TCG_GUEST_DEFAULT_MO;
2784#endif
2785 type &= ~TCG_TARGET_DEFAULT_MO;
2786 if (type) {
2787 tcg_gen_mb(type | TCG_BAR_SC);
2788 }
2789}
2790
2791void tcg_gen_qemu_ld_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop)
2791void tcg_gen_qemu_ld_i32(TCGv_i32 val, TCGv addr, TCGArg idx, MemOp memop)
2792{
2792{
2793 TCGMemOp orig_memop;
2793 MemOp orig_memop;
2794
2795 tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
2796 memop = tcg_canonicalize_memop(memop, 0, 0);
2797 trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env,
2798 addr, trace_mem_get_info(memop, 0));
2799
2800 orig_memop = memop;
2801 if (!TCG_TARGET_HAS_MEMORY_BSWAP && (memop & MO_BSWAP)) {

--- 18 unchanged lines hidden (view full) ---

2820 tcg_gen_bswap32_i32(val, val);
2821 break;
2822 default:
2823 g_assert_not_reached();
2824 }
2825 }
2826}
2827
2794
2795 tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
2796 memop = tcg_canonicalize_memop(memop, 0, 0);
2797 trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env,
2798 addr, trace_mem_get_info(memop, 0));
2799
2800 orig_memop = memop;
2801 if (!TCG_TARGET_HAS_MEMORY_BSWAP && (memop & MO_BSWAP)) {

--- 18 unchanged lines hidden (view full) ---

2820 tcg_gen_bswap32_i32(val, val);
2821 break;
2822 default:
2823 g_assert_not_reached();
2824 }
2825 }
2826}
2827
2828void tcg_gen_qemu_st_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop)
2828void tcg_gen_qemu_st_i32(TCGv_i32 val, TCGv addr, TCGArg idx, MemOp memop)
2829{
2830 TCGv_i32 swap = NULL;
2831
2832 tcg_gen_req_mo(TCG_MO_LD_ST | TCG_MO_ST_ST);
2833 memop = tcg_canonicalize_memop(memop, 0, 1);
2834 trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env,
2835 addr, trace_mem_get_info(memop, 1));
2836

--- 16 unchanged lines hidden (view full) ---

2853
2854 gen_ldst_i32(INDEX_op_qemu_st_i32, val, addr, memop, idx);
2855
2856 if (swap) {
2857 tcg_temp_free_i32(swap);
2858 }
2859}
2860
2829{
2830 TCGv_i32 swap = NULL;
2831
2832 tcg_gen_req_mo(TCG_MO_LD_ST | TCG_MO_ST_ST);
2833 memop = tcg_canonicalize_memop(memop, 0, 1);
2834 trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env,
2835 addr, trace_mem_get_info(memop, 1));
2836

--- 16 unchanged lines hidden (view full) ---

2853
2854 gen_ldst_i32(INDEX_op_qemu_st_i32, val, addr, memop, idx);
2855
2856 if (swap) {
2857 tcg_temp_free_i32(swap);
2858 }
2859}
2860
2861void tcg_gen_qemu_ld_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop)
2861void tcg_gen_qemu_ld_i64(TCGv_i64 val, TCGv addr, TCGArg idx, MemOp memop)
2862{
2862{
2863 TCGMemOp orig_memop;
2863 MemOp orig_memop;
2864
2865 if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
2866 tcg_gen_qemu_ld_i32(TCGV_LOW(val), addr, idx, memop);
2867 if (memop & MO_SIGN) {
2868 tcg_gen_sari_i32(TCGV_HIGH(val), TCGV_LOW(val), 31);
2869 } else {
2870 tcg_gen_movi_i32(TCGV_HIGH(val), 0);
2871 }

--- 34 unchanged lines hidden (view full) ---

2906 tcg_gen_bswap64_i64(val, val);
2907 break;
2908 default:
2909 g_assert_not_reached();
2910 }
2911 }
2912}
2913
2864
2865 if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
2866 tcg_gen_qemu_ld_i32(TCGV_LOW(val), addr, idx, memop);
2867 if (memop & MO_SIGN) {
2868 tcg_gen_sari_i32(TCGV_HIGH(val), TCGV_LOW(val), 31);
2869 } else {
2870 tcg_gen_movi_i32(TCGV_HIGH(val), 0);
2871 }

--- 34 unchanged lines hidden (view full) ---

2906 tcg_gen_bswap64_i64(val, val);
2907 break;
2908 default:
2909 g_assert_not_reached();
2910 }
2911 }
2912}
2913
2914void tcg_gen_qemu_st_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop)
2914void tcg_gen_qemu_st_i64(TCGv_i64 val, TCGv addr, TCGArg idx, MemOp memop)
2915{
2916 TCGv_i64 swap = NULL;
2917
2918 if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
2919 tcg_gen_qemu_st_i32(TCGV_LOW(val), addr, idx, memop);
2920 return;
2921 }
2922

--- 25 unchanged lines hidden (view full) ---

2948
2949 gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, memop, idx);
2950
2951 if (swap) {
2952 tcg_temp_free_i64(swap);
2953 }
2954}
2955
2915{
2916 TCGv_i64 swap = NULL;
2917
2918 if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
2919 tcg_gen_qemu_st_i32(TCGV_LOW(val), addr, idx, memop);
2920 return;
2921 }
2922

--- 25 unchanged lines hidden (view full) ---

2948
2949 gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, memop, idx);
2950
2951 if (swap) {
2952 tcg_temp_free_i64(swap);
2953 }
2954}
2955
2956static void tcg_gen_ext_i32(TCGv_i32 ret, TCGv_i32 val, TCGMemOp opc)
2956static void tcg_gen_ext_i32(TCGv_i32 ret, TCGv_i32 val, MemOp opc)
2957{
2958 switch (opc & MO_SSIZE) {
2959 case MO_SB:
2960 tcg_gen_ext8s_i32(ret, val);
2961 break;
2962 case MO_UB:
2963 tcg_gen_ext8u_i32(ret, val);
2964 break;

--- 4 unchanged lines hidden (view full) ---

2969 tcg_gen_ext16u_i32(ret, val);
2970 break;
2971 default:
2972 tcg_gen_mov_i32(ret, val);
2973 break;
2974 }
2975}
2976
2957{
2958 switch (opc & MO_SSIZE) {
2959 case MO_SB:
2960 tcg_gen_ext8s_i32(ret, val);
2961 break;
2962 case MO_UB:
2963 tcg_gen_ext8u_i32(ret, val);
2964 break;

--- 4 unchanged lines hidden (view full) ---

2969 tcg_gen_ext16u_i32(ret, val);
2970 break;
2971 default:
2972 tcg_gen_mov_i32(ret, val);
2973 break;
2974 }
2975}
2976
2977static void tcg_gen_ext_i64(TCGv_i64 ret, TCGv_i64 val, TCGMemOp opc)
2977static void tcg_gen_ext_i64(TCGv_i64 ret, TCGv_i64 val, MemOp opc)
2978{
2979 switch (opc & MO_SSIZE) {
2980 case MO_SB:
2981 tcg_gen_ext8s_i64(ret, val);
2982 break;
2983 case MO_UB:
2984 tcg_gen_ext8u_i64(ret, val);
2985 break;

--- 43 unchanged lines hidden (view full) ---

3029 [MO_16 | MO_BE] = gen_helper_atomic_cmpxchgw_be,
3030 [MO_32 | MO_LE] = gen_helper_atomic_cmpxchgl_le,
3031 [MO_32 | MO_BE] = gen_helper_atomic_cmpxchgl_be,
3032 WITH_ATOMIC64([MO_64 | MO_LE] = gen_helper_atomic_cmpxchgq_le)
3033 WITH_ATOMIC64([MO_64 | MO_BE] = gen_helper_atomic_cmpxchgq_be)
3034};
3035
3036void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
2978{
2979 switch (opc & MO_SSIZE) {
2980 case MO_SB:
2981 tcg_gen_ext8s_i64(ret, val);
2982 break;
2983 case MO_UB:
2984 tcg_gen_ext8u_i64(ret, val);
2985 break;

--- 43 unchanged lines hidden (view full) ---

3029 [MO_16 | MO_BE] = gen_helper_atomic_cmpxchgw_be,
3030 [MO_32 | MO_LE] = gen_helper_atomic_cmpxchgl_le,
3031 [MO_32 | MO_BE] = gen_helper_atomic_cmpxchgl_be,
3032 WITH_ATOMIC64([MO_64 | MO_LE] = gen_helper_atomic_cmpxchgq_le)
3033 WITH_ATOMIC64([MO_64 | MO_BE] = gen_helper_atomic_cmpxchgq_be)
3034};
3035
3036void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
3037 TCGv_i32 newv, TCGArg idx, TCGMemOp memop)
3037 TCGv_i32 newv, TCGArg idx, MemOp memop)
3038{
3039 memop = tcg_canonicalize_memop(memop, 0, 0);
3040
3041 if (!(tcg_ctx->tb_cflags & CF_PARALLEL)) {
3042 TCGv_i32 t1 = tcg_temp_new_i32();
3043 TCGv_i32 t2 = tcg_temp_new_i32();
3044
3045 tcg_gen_ext_i32(t2, cmpv, memop & MO_SIZE);

--- 27 unchanged lines hidden (view full) ---

3073
3074 if (memop & MO_SIGN) {
3075 tcg_gen_ext_i32(retv, retv, memop);
3076 }
3077 }
3078}
3079
3080void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
3038{
3039 memop = tcg_canonicalize_memop(memop, 0, 0);
3040
3041 if (!(tcg_ctx->tb_cflags & CF_PARALLEL)) {
3042 TCGv_i32 t1 = tcg_temp_new_i32();
3043 TCGv_i32 t2 = tcg_temp_new_i32();
3044
3045 tcg_gen_ext_i32(t2, cmpv, memop & MO_SIZE);

--- 27 unchanged lines hidden (view full) ---

3073
3074 if (memop & MO_SIGN) {
3075 tcg_gen_ext_i32(retv, retv, memop);
3076 }
3077 }
3078}
3079
3080void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
3081 TCGv_i64 newv, TCGArg idx, TCGMemOp memop)
3081 TCGv_i64 newv, TCGArg idx, MemOp memop)
3082{
3083 memop = tcg_canonicalize_memop(memop, 1, 0);
3084
3085 if (!(tcg_ctx->tb_cflags & CF_PARALLEL)) {
3086 TCGv_i64 t1 = tcg_temp_new_i64();
3087 TCGv_i64 t2 = tcg_temp_new_i64();
3088
3089 tcg_gen_ext_i64(t2, cmpv, memop & MO_SIZE);

--- 47 unchanged lines hidden (view full) ---

3137
3138 if (memop & MO_SIGN) {
3139 tcg_gen_ext_i64(retv, retv, memop);
3140 }
3141 }
3142}
3143
3144static void do_nonatomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val,
3082{
3083 memop = tcg_canonicalize_memop(memop, 1, 0);
3084
3085 if (!(tcg_ctx->tb_cflags & CF_PARALLEL)) {
3086 TCGv_i64 t1 = tcg_temp_new_i64();
3087 TCGv_i64 t2 = tcg_temp_new_i64();
3088
3089 tcg_gen_ext_i64(t2, cmpv, memop & MO_SIZE);

--- 47 unchanged lines hidden (view full) ---

3137
3138 if (memop & MO_SIGN) {
3139 tcg_gen_ext_i64(retv, retv, memop);
3140 }
3141 }
3142}
3143
3144static void do_nonatomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val,
3145 TCGArg idx, TCGMemOp memop, bool new_val,
3145 TCGArg idx, MemOp memop, bool new_val,
3146 void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32))
3147{
3148 TCGv_i32 t1 = tcg_temp_new_i32();
3149 TCGv_i32 t2 = tcg_temp_new_i32();
3150
3151 memop = tcg_canonicalize_memop(memop, 0, 0);
3152
3153 tcg_gen_qemu_ld_i32(t1, addr, idx, memop & ~MO_SIGN);
3154 gen(t2, t1, val);
3155 tcg_gen_qemu_st_i32(t2, addr, idx, memop);
3156
3157 tcg_gen_ext_i32(ret, (new_val ? t2 : t1), memop);
3158 tcg_temp_free_i32(t1);
3159 tcg_temp_free_i32(t2);
3160}
3161
3162static void do_atomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val,
3146 void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32))
3147{
3148 TCGv_i32 t1 = tcg_temp_new_i32();
3149 TCGv_i32 t2 = tcg_temp_new_i32();
3150
3151 memop = tcg_canonicalize_memop(memop, 0, 0);
3152
3153 tcg_gen_qemu_ld_i32(t1, addr, idx, memop & ~MO_SIGN);
3154 gen(t2, t1, val);
3155 tcg_gen_qemu_st_i32(t2, addr, idx, memop);
3156
3157 tcg_gen_ext_i32(ret, (new_val ? t2 : t1), memop);
3158 tcg_temp_free_i32(t1);
3159 tcg_temp_free_i32(t2);
3160}
3161
3162static void do_atomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val,
3163 TCGArg idx, TCGMemOp memop, void * const table[])
3163 TCGArg idx, MemOp memop, void * const table[])
3164{
3165 gen_atomic_op_i32 gen;
3166
3167 memop = tcg_canonicalize_memop(memop, 0, 0);
3168
3169 gen = table[memop & (MO_SIZE | MO_BSWAP)];
3170 tcg_debug_assert(gen != NULL);
3171

--- 8 unchanged lines hidden (view full) ---

3180#endif
3181
3182 if (memop & MO_SIGN) {
3183 tcg_gen_ext_i32(ret, ret, memop);
3184 }
3185}
3186
3187static void do_nonatomic_op_i64(TCGv_i64 ret, TCGv addr, TCGv_i64 val,
3164{
3165 gen_atomic_op_i32 gen;
3166
3167 memop = tcg_canonicalize_memop(memop, 0, 0);
3168
3169 gen = table[memop & (MO_SIZE | MO_BSWAP)];
3170 tcg_debug_assert(gen != NULL);
3171

--- 8 unchanged lines hidden (view full) ---

3180#endif
3181
3182 if (memop & MO_SIGN) {
3183 tcg_gen_ext_i32(ret, ret, memop);
3184 }
3185}
3186
3187static void do_nonatomic_op_i64(TCGv_i64 ret, TCGv addr, TCGv_i64 val,
3188 TCGArg idx, TCGMemOp memop, bool new_val,
3188 TCGArg idx, MemOp memop, bool new_val,
3189 void (*gen)(TCGv_i64, TCGv_i64, TCGv_i64))
3190{
3191 TCGv_i64 t1 = tcg_temp_new_i64();
3192 TCGv_i64 t2 = tcg_temp_new_i64();
3193
3194 memop = tcg_canonicalize_memop(memop, 1, 0);
3195
3196 tcg_gen_qemu_ld_i64(t1, addr, idx, memop & ~MO_SIGN);
3197 gen(t2, t1, val);
3198 tcg_gen_qemu_st_i64(t2, addr, idx, memop);
3199
3200 tcg_gen_ext_i64(ret, (new_val ? t2 : t1), memop);
3201 tcg_temp_free_i64(t1);
3202 tcg_temp_free_i64(t2);
3203}
3204
3205static void do_atomic_op_i64(TCGv_i64 ret, TCGv addr, TCGv_i64 val,
3189 void (*gen)(TCGv_i64, TCGv_i64, TCGv_i64))
3190{
3191 TCGv_i64 t1 = tcg_temp_new_i64();
3192 TCGv_i64 t2 = tcg_temp_new_i64();
3193
3194 memop = tcg_canonicalize_memop(memop, 1, 0);
3195
3196 tcg_gen_qemu_ld_i64(t1, addr, idx, memop & ~MO_SIGN);
3197 gen(t2, t1, val);
3198 tcg_gen_qemu_st_i64(t2, addr, idx, memop);
3199
3200 tcg_gen_ext_i64(ret, (new_val ? t2 : t1), memop);
3201 tcg_temp_free_i64(t1);
3202 tcg_temp_free_i64(t2);
3203}
3204
3205static void do_atomic_op_i64(TCGv_i64 ret, TCGv addr, TCGv_i64 val,
3206 TCGArg idx, TCGMemOp memop, void * const table[])
3206 TCGArg idx, MemOp memop, void * const table[])
3207{
3208 memop = tcg_canonicalize_memop(memop, 1, 0);
3209
3210 if ((memop & MO_SIZE) == MO_64) {
3211#ifdef CONFIG_ATOMIC64
3212 gen_atomic_op_i64 gen;
3213
3214 gen = table[memop & (MO_SIZE | MO_BSWAP)];

--- 37 unchanged lines hidden (view full) ---

3252 [MO_16 | MO_LE] = gen_helper_atomic_##NAME##w_le, \
3253 [MO_16 | MO_BE] = gen_helper_atomic_##NAME##w_be, \
3254 [MO_32 | MO_LE] = gen_helper_atomic_##NAME##l_le, \
3255 [MO_32 | MO_BE] = gen_helper_atomic_##NAME##l_be, \
3256 WITH_ATOMIC64([MO_64 | MO_LE] = gen_helper_atomic_##NAME##q_le) \
3257 WITH_ATOMIC64([MO_64 | MO_BE] = gen_helper_atomic_##NAME##q_be) \
3258}; \
3259void tcg_gen_atomic_##NAME##_i32 \
3207{
3208 memop = tcg_canonicalize_memop(memop, 1, 0);
3209
3210 if ((memop & MO_SIZE) == MO_64) {
3211#ifdef CONFIG_ATOMIC64
3212 gen_atomic_op_i64 gen;
3213
3214 gen = table[memop & (MO_SIZE | MO_BSWAP)];

--- 37 unchanged lines hidden (view full) ---

3252 [MO_16 | MO_LE] = gen_helper_atomic_##NAME##w_le, \
3253 [MO_16 | MO_BE] = gen_helper_atomic_##NAME##w_be, \
3254 [MO_32 | MO_LE] = gen_helper_atomic_##NAME##l_le, \
3255 [MO_32 | MO_BE] = gen_helper_atomic_##NAME##l_be, \
3256 WITH_ATOMIC64([MO_64 | MO_LE] = gen_helper_atomic_##NAME##q_le) \
3257 WITH_ATOMIC64([MO_64 | MO_BE] = gen_helper_atomic_##NAME##q_be) \
3258}; \
3259void tcg_gen_atomic_##NAME##_i32 \
3260 (TCGv_i32 ret, TCGv addr, TCGv_i32 val, TCGArg idx, TCGMemOp memop) \
3260 (TCGv_i32 ret, TCGv addr, TCGv_i32 val, TCGArg idx, MemOp memop) \
3261{ \
3262 if (tcg_ctx->tb_cflags & CF_PARALLEL) { \
3263 do_atomic_op_i32(ret, addr, val, idx, memop, table_##NAME); \
3264 } else { \
3265 do_nonatomic_op_i32(ret, addr, val, idx, memop, NEW, \
3266 tcg_gen_##OP##_i32); \
3267 } \
3268} \
3269void tcg_gen_atomic_##NAME##_i64 \
3261{ \
3262 if (tcg_ctx->tb_cflags & CF_PARALLEL) { \
3263 do_atomic_op_i32(ret, addr, val, idx, memop, table_##NAME); \
3264 } else { \
3265 do_nonatomic_op_i32(ret, addr, val, idx, memop, NEW, \
3266 tcg_gen_##OP##_i32); \
3267 } \
3268} \
3269void tcg_gen_atomic_##NAME##_i64 \
3270 (TCGv_i64 ret, TCGv addr, TCGv_i64 val, TCGArg idx, TCGMemOp memop) \
3270 (TCGv_i64 ret, TCGv addr, TCGv_i64 val, TCGArg idx, MemOp memop) \
3271{ \
3272 if (tcg_ctx->tb_cflags & CF_PARALLEL) { \
3273 do_atomic_op_i64(ret, addr, val, idx, memop, table_##NAME); \
3274 } else { \
3275 do_nonatomic_op_i64(ret, addr, val, idx, memop, NEW, \
3276 tcg_gen_##OP##_i64); \
3277 } \
3278}

--- 32 unchanged lines hidden ---
3271{ \
3272 if (tcg_ctx->tb_cflags & CF_PARALLEL) { \
3273 do_atomic_op_i64(ret, addr, val, idx, memop, table_##NAME); \
3274 } else { \
3275 do_nonatomic_op_i64(ret, addr, val, idx, memop, NEW, \
3276 tcg_gen_##OP##_i64); \
3277 } \
3278}

--- 32 unchanged lines hidden ---