tcg: Add atomic128 helpers

Force the use of cmpxchg16b on x86_64.

Wikipedia suggests that only very old AMD64 (circa 2004) did not have
this instruction. Further, it's required by Windows 8 so no new cpus
will ever omit it.

If we truely care about these, then we could check this at startup time
and then avoid executing paths that use it.

Backports commit 7ebee43ee3e2fcd7b5063058b7ef74bc43216733 from qemu
This commit is contained in:
Richard Henderson 2018-02-27 21:20:25 -05:00 committed by Lioncash
parent 5c0ce1b99c
commit da01e53757
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
20 changed files with 287 additions and 2 deletions

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_aarch64
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_aarch64
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_aarch64
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_aarch64
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_aarch64
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_aarch64
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_aarch64
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_aarch64
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_aarch64
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_aarch64
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_aarch64
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_aarch64
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_aarch64
#define helper_atomic_ldo_be helper_atomic_ldo_be_aarch64
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_aarch64
#define helper_atomic_ldo_le helper_atomic_ldo_le_aarch64
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_aarch64
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_aarch64
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_aarch64
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_aarch64
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_aarch64
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_aarch64
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_aarch64
#define helper_atomic_sto_be helper_atomic_sto_be_aarch64
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_aarch64
#define helper_atomic_sto_le helper_atomic_sto_le_aarch64
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_aarch64
#define helper_atomic_xchgb helper_atomic_xchgb_aarch64
#define helper_atomic_xchgb helper_atomic_xchgb_aarch64
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_aarch64

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_aarch64eb
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_aarch64eb
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_aarch64eb
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_aarch64eb
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_aarch64eb
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_aarch64eb
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_aarch64eb
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_aarch64eb
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_aarch64eb
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_aarch64eb
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_aarch64eb
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_aarch64eb
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_aarch64eb
#define helper_atomic_ldo_be helper_atomic_ldo_be_aarch64eb
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_aarch64eb
#define helper_atomic_ldo_le helper_atomic_ldo_le_aarch64eb
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_aarch64eb
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_aarch64eb
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_aarch64eb
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_aarch64eb
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_aarch64eb
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_aarch64eb
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_aarch64eb
#define helper_atomic_sto_be helper_atomic_sto_be_aarch64eb
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_aarch64eb
#define helper_atomic_sto_le helper_atomic_sto_le_aarch64eb
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_aarch64eb
#define helper_atomic_xchgb helper_atomic_xchgb_aarch64eb
#define helper_atomic_xchgb helper_atomic_xchgb_aarch64eb
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_aarch64eb

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_arm
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_arm
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_arm
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_arm
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_arm
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_arm
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_arm
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_arm
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_arm
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_arm
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_arm
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_arm
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_arm
#define helper_atomic_ldo_be helper_atomic_ldo_be_arm
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_arm
#define helper_atomic_ldo_le helper_atomic_ldo_le_arm
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_arm
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_arm
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_arm
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_arm
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_arm
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_arm
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_arm
#define helper_atomic_sto_be helper_atomic_sto_be_arm
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_arm
#define helper_atomic_sto_le helper_atomic_sto_le_arm
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_arm
#define helper_atomic_xchgb helper_atomic_xchgb_arm
#define helper_atomic_xchgb helper_atomic_xchgb_arm
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_arm

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_armeb
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_armeb
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_armeb
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_armeb
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_armeb
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_armeb
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_armeb
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_armeb
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_armeb
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_armeb
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_armeb
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_armeb
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_armeb
#define helper_atomic_ldo_be helper_atomic_ldo_be_armeb
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_armeb
#define helper_atomic_ldo_le helper_atomic_ldo_le_armeb
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_armeb
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_armeb
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_armeb
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_armeb
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_armeb
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_armeb
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_armeb
#define helper_atomic_sto_be helper_atomic_sto_be_armeb
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_armeb
#define helper_atomic_sto_le helper_atomic_sto_le_armeb
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_armeb
#define helper_atomic_xchgb helper_atomic_xchgb_armeb
#define helper_atomic_xchgb helper_atomic_xchgb_armeb
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_armeb

View file

@ -18,7 +18,11 @@
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#if DATA_SIZE == 8
#if DATA_SIZE == 16
# define SUFFIX o
# define DATA_TYPE Int128
# define BSWAP bswap128
#elif DATA_SIZE == 8
# define SUFFIX q
# define DATA_TYPE uint64_t
# define BSWAP bswap64
@ -61,6 +65,21 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr,
return atomic_cmpxchg__nocheck(haddr, cmpv, newv);
}
#if DATA_SIZE >= 16
ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr EXTRA_ARGS)
{
DATA_TYPE val, *haddr = ATOMIC_MMU_LOOKUP;
__atomic_load(haddr, &val, __ATOMIC_RELAXED);
return val;
}
void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr,
ABI_TYPE val EXTRA_ARGS)
{
DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP;
__atomic_store(haddr, &val, __ATOMIC_RELAXED);
}
#else
ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr,
ABI_TYPE val EXTRA_ARGS)
{
@ -86,6 +105,8 @@ GEN_ATOMIC_HELPER(or_fetch)
GEN_ATOMIC_HELPER(xor_fetch)
#undef GEN_ATOMIC_HELPER
#endif /* DATA SIZE >= 16 */
#undef END
#if DATA_SIZE > 1
@ -105,6 +126,22 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr,
return BSWAP(atomic_cmpxchg__nocheck(haddr, BSWAP(cmpv), BSWAP(newv)));
}
#if DATA_SIZE >= 16
ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr EXTRA_ARGS)
{
DATA_TYPE val, *haddr = ATOMIC_MMU_LOOKUP;
__atomic_load(haddr, &val, __ATOMIC_RELAXED);
return BSWAP(val);
}
void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr,
ABI_TYPE val EXTRA_ARGS)
{
DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP;
val = BSWAP(val);
__atomic_store(haddr, &val, __ATOMIC_RELAXED);
}
#else
ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr,
ABI_TYPE val EXTRA_ARGS)
{
@ -166,6 +203,7 @@ ABI_TYPE ATOMIC_NAME(add_fetch)(CPUArchState *env, target_ulong addr,
ldo = ldn;
}
}
#endif /* DATA_SIZE >= 16 */
#undef END
#endif /* DATA_SIZE > 1 */

29
qemu/configure vendored
View file

@ -602,7 +602,10 @@ case "$cpu" in
cc_i386='$(CC) -m32'
;;
x86_64)
CPU_CFLAGS="-m64"
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
# If we truly care, we should simply detect this case at
# runtime and generate the fallback to serial emulation.
CPU_CFLAGS="-m64 -mcx16"
LDFLAGS="-m64 $LDFLAGS"
cc_i386='$(CC) -m32'
;;
@ -1068,6 +1071,26 @@ if compile_prog "" "" ; then
int128=yes
fi
#########################################
# See if 128-bit atomic operations are supported.
atomic128=no
if test "$int128" = "yes"; then
cat > $TMPC << EOF
int main(void)
{
unsigned __int128 x = 0, y = 0;
y = __atomic_load_16(&x, 0);
__atomic_store_16(&x, y, 0);
__atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
return 0;
}
EOF
if compile_prog "" "" ; then
atomic128=yes
fi
fi
# Now we've finished running tests it's OK to add -Werror to the compiler flags
if test "$werror" = "yes"; then
QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
@ -1189,6 +1212,10 @@ if test "$int128" = "yes" ; then
echo "CONFIG_INT128=y" >> $config_host_mak
fi
if test "$atomic128" = "yes" ; then
echo "CONFIG_ATOMIC128=y" >> $config_host_mak
fi
if test "$tcg_interpreter" = "yes"; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
elif test "$ARCH" = "sparc64" ; then

View file

@ -679,6 +679,11 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
#define DATA_SIZE 8
#include "atomic_template.h"
#ifdef CONFIG_ATOMIC128
#define DATA_SIZE 16
#include "atomic_template.h"
#endif
/* Second set of helpers are directly callable from TCG as helpers. */
#undef EXTRA_ARGS

View file

@ -1414,6 +1414,10 @@ symbols = (
'helper_atomic_cmpxchgl_be_mmu',
'helper_atomic_cmpxchgl_le',
'helper_atomic_cmpxchgl_le_mmu',
'helper_atomic_cmpxchgo_be',
'helper_atomic_cmpxchgo_be_mmu',
'helper_atomic_cmpxchgo_le',
'helper_atomic_cmpxchgo_le_mmu',
'helper_atomic_cmpxchgq_be',
'helper_atomic_cmpxchgq_be_mmu',
'helper_atomic_cmpxchgq_le',
@ -1478,6 +1482,10 @@ symbols = (
'helper_atomic_fetch_xorw_be_mmu',
'helper_atomic_fetch_xorw_le',
'helper_atomic_fetch_xorw_le_mmu',
'helper_atomic_ldo_be',
'helper_atomic_ldo_be_mmu',
'helper_atomic_ldo_le',
'helper_atomic_ldo_le_mmu',
'helper_atomic_or_fetchb',
'helper_atomic_or_fetchb_mmu',
'helper_atomic_or_fetchl_be',
@ -1492,6 +1500,10 @@ symbols = (
'helper_atomic_or_fetchw_be_mmu',
'helper_atomic_or_fetchw_le',
'helper_atomic_or_fetchw_le_mmu',
'helper_atomic_sto_be',
'helper_atomic_sto_be_mmu',
'helper_atomic_sto_le',
'helper_atomic_sto_le_mmu',
'helper_atomic_xchgb',
'helper_atomic_xchgb',
'helper_atomic_xchgb_mmu',

View file

@ -4,6 +4,7 @@
#include "unicorn/platform.h"
#ifdef CONFIG_INT128
#include "qemu/bswap.h"
typedef __int128_t Int128;
@ -139,6 +140,11 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
*a -= b;
}
static inline Int128 bswap128(Int128 a)
{
return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
}
#else /* !CONFIG_INT128 */
typedef struct Int128 Int128;

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_m68k
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_m68k
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_m68k
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_m68k
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_m68k
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_m68k
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_m68k
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_m68k
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_m68k
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_m68k
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_m68k
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_m68k
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_m68k
#define helper_atomic_ldo_be helper_atomic_ldo_be_m68k
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_m68k
#define helper_atomic_ldo_le helper_atomic_ldo_le_m68k
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_m68k
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_m68k
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_m68k
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_m68k
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_m68k
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_m68k
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_m68k
#define helper_atomic_sto_be helper_atomic_sto_be_m68k
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_m68k
#define helper_atomic_sto_le helper_atomic_sto_le_m68k
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_m68k
#define helper_atomic_xchgb helper_atomic_xchgb_m68k
#define helper_atomic_xchgb helper_atomic_xchgb_m68k
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_m68k

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mips
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mips
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mips
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mips
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mips
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mips
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mips
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mips
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mips
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mips
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mips
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mips
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mips
#define helper_atomic_ldo_be helper_atomic_ldo_be_mips
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mips
#define helper_atomic_ldo_le helper_atomic_ldo_le_mips
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mips
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_mips
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mips
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mips
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mips
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mips
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mips
#define helper_atomic_sto_be helper_atomic_sto_be_mips
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mips
#define helper_atomic_sto_le helper_atomic_sto_le_mips
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mips
#define helper_atomic_xchgb helper_atomic_xchgb_mips
#define helper_atomic_xchgb helper_atomic_xchgb_mips
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mips

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mips64
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mips64
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mips64
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mips64
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mips64
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mips64
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mips64
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mips64
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mips64
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mips64
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mips64
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mips64
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mips64
#define helper_atomic_ldo_be helper_atomic_ldo_be_mips64
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mips64
#define helper_atomic_ldo_le helper_atomic_ldo_le_mips64
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mips64
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_mips64
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mips64
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mips64
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mips64
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mips64
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mips64
#define helper_atomic_sto_be helper_atomic_sto_be_mips64
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mips64
#define helper_atomic_sto_le helper_atomic_sto_le_mips64
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mips64
#define helper_atomic_xchgb helper_atomic_xchgb_mips64
#define helper_atomic_xchgb helper_atomic_xchgb_mips64
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mips64

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mips64el
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mips64el
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mips64el
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mips64el
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mips64el
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mips64el
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mips64el
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mips64el
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mips64el
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mips64el
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mips64el
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mips64el
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mips64el
#define helper_atomic_ldo_be helper_atomic_ldo_be_mips64el
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mips64el
#define helper_atomic_ldo_le helper_atomic_ldo_le_mips64el
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mips64el
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_mips64el
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mips64el
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mips64el
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mips64el
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mips64el
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mips64el
#define helper_atomic_sto_be helper_atomic_sto_be_mips64el
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mips64el
#define helper_atomic_sto_le helper_atomic_sto_le_mips64el
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mips64el
#define helper_atomic_xchgb helper_atomic_xchgb_mips64el
#define helper_atomic_xchgb helper_atomic_xchgb_mips64el
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mips64el

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mipsel
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mipsel
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mipsel
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mipsel
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mipsel
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mipsel
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mipsel
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mipsel
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mipsel
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mipsel
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mipsel
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mipsel
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mipsel
#define helper_atomic_ldo_be helper_atomic_ldo_be_mipsel
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mipsel
#define helper_atomic_ldo_le helper_atomic_ldo_le_mipsel
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mipsel
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_mipsel
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mipsel
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mipsel
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mipsel
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mipsel
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mipsel
#define helper_atomic_sto_be helper_atomic_sto_be_mipsel
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mipsel
#define helper_atomic_sto_le helper_atomic_sto_le_mipsel
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mipsel
#define helper_atomic_xchgb helper_atomic_xchgb_mipsel
#define helper_atomic_xchgb helper_atomic_xchgb_mipsel
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mipsel

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_powerpc
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_powerpc
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_powerpc
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_powerpc
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_powerpc
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_powerpc
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_powerpc
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_powerpc
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_powerpc
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_powerpc
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_powerpc
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_powerpc
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_powerpc
#define helper_atomic_ldo_be helper_atomic_ldo_be_powerpc
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_powerpc
#define helper_atomic_ldo_le helper_atomic_ldo_le_powerpc
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_powerpc
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_powerpc
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_powerpc
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_powerpc
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_powerpc
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_powerpc
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_powerpc
#define helper_atomic_sto_be helper_atomic_sto_be_powerpc
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_powerpc
#define helper_atomic_sto_le helper_atomic_sto_le_powerpc
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_powerpc
#define helper_atomic_xchgb helper_atomic_xchgb_powerpc
#define helper_atomic_xchgb helper_atomic_xchgb_powerpc
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_powerpc

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_sparc
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_sparc
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_sparc
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_sparc
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_sparc
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_sparc
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_sparc
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_sparc
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_sparc
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_sparc
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_sparc
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_sparc
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_sparc
#define helper_atomic_ldo_be helper_atomic_ldo_be_sparc
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_sparc
#define helper_atomic_ldo_le helper_atomic_ldo_le_sparc
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_sparc
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_sparc
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_sparc
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_sparc
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_sparc
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_sparc
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_sparc
#define helper_atomic_sto_be helper_atomic_sto_be_sparc
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_sparc
#define helper_atomic_sto_le helper_atomic_sto_le_sparc
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_sparc
#define helper_atomic_xchgb helper_atomic_xchgb_sparc
#define helper_atomic_xchgb helper_atomic_xchgb_sparc
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_sparc

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_sparc64
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_sparc64
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_sparc64
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_sparc64
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_sparc64
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_sparc64
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_sparc64
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_sparc64
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_sparc64
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_sparc64
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_sparc64
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_sparc64
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_sparc64
#define helper_atomic_ldo_be helper_atomic_ldo_be_sparc64
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_sparc64
#define helper_atomic_ldo_le helper_atomic_ldo_le_sparc64
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_sparc64
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_sparc64
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_sparc64
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_sparc64
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_sparc64
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_sparc64
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_sparc64
#define helper_atomic_sto_be helper_atomic_sto_be_sparc64
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_sparc64
#define helper_atomic_sto_le helper_atomic_sto_le_sparc64
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_sparc64
#define helper_atomic_xchgb helper_atomic_xchgb_sparc64
#define helper_atomic_xchgb helper_atomic_xchgb_sparc64
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_sparc64

View file

@ -134,5 +134,23 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
#define DATA_SIZE 8
#include "atomic_template.h"
/* The following is only callable from other helpers, and matches up
with the softmmu version. */
#ifdef CONFIG_ATOMIC128
#undef EXTRA_ARGS
#undef ATOMIC_NAME
#undef ATOMIC_MMU_LOOKUP
#define EXTRA_ARGS , TCGMemOpIdx oi, uintptr_t retaddr
#define ATOMIC_NAME(X) \
HELPER(glue(glue(glue(atomic_ ## X, SUFFIX), END), _mmu))
#define ATOMIC_MMU_LOOKUP atomic_mmu_lookup(env, addr, DATA_SIZE, retaddr)
#define DATA_SIZE 16
#include "atomic_template.h"
#endif /* CONFIG_ATOMIC128 */
#endif /* !CONFIG_SOFTMMU */

View file

@ -1365,4 +1365,27 @@ GEN_ATOMIC_HELPER_ALL(xchg)
#endif /* CONFIG_SOFTMMU */
#ifdef CONFIG_ATOMIC128
#include "qemu/int128.h"
/* These aren't really a "proper" helpers because TCG cannot manage Int128.
However, use the same format as the others, for use by the backends. */
Int128 helper_atomic_cmpxchgo_le_mmu(CPUArchState *env, target_ulong addr,
Int128 cmpv, Int128 newv,
TCGMemOpIdx oi, uintptr_t retaddr);
Int128 helper_atomic_cmpxchgo_be_mmu(CPUArchState *env, target_ulong addr,
Int128 cmpv, Int128 newv,
TCGMemOpIdx oi, uintptr_t retaddr);
Int128 helper_atomic_ldo_le_mmu(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr);
Int128 helper_atomic_ldo_be_mmu(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr);
void helper_atomic_sto_le_mmu(CPUArchState *env, target_ulong addr, Int128 val,
TCGMemOpIdx oi, uintptr_t retaddr);
void helper_atomic_sto_be_mmu(CPUArchState *env, target_ulong addr, Int128 val,
TCGMemOpIdx oi, uintptr_t retaddr);
#endif /* CONFIG_ATOMIC128 */
#endif /* TCG_H */

View file

@ -1408,6 +1408,10 @@
#define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_x86_64
#define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_x86_64
#define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_x86_64
#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_x86_64
#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_x86_64
#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_x86_64
#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_x86_64
#define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_x86_64
#define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_x86_64
#define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_x86_64
@ -1472,6 +1476,10 @@
#define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_x86_64
#define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_x86_64
#define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_x86_64
#define helper_atomic_ldo_be helper_atomic_ldo_be_x86_64
#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_x86_64
#define helper_atomic_ldo_le helper_atomic_ldo_le_x86_64
#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_x86_64
#define helper_atomic_or_fetchb helper_atomic_or_fetchb_x86_64
#define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_x86_64
#define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_x86_64
@ -1486,6 +1494,10 @@
#define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_x86_64
#define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_x86_64
#define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_x86_64
#define helper_atomic_sto_be helper_atomic_sto_be_x86_64
#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_x86_64
#define helper_atomic_sto_le helper_atomic_sto_le_x86_64
#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_x86_64
#define helper_atomic_xchgb helper_atomic_xchgb_x86_64
#define helper_atomic_xchgb helper_atomic_xchgb_x86_64
#define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_x86_64