mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
tcg/aarch64: Detect have_lse, have_lse2 for linux
Notice when the host has additional atomic instructions. The new variables will also be used in generated code. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
6d3f2e3c64
commit
b764941955
2 changed files with 15 additions and 0 deletions
|
@ -13,6 +13,9 @@
|
||||||
#include "../tcg-ldst.c.inc"
|
#include "../tcg-ldst.c.inc"
|
||||||
#include "../tcg-pool.c.inc"
|
#include "../tcg-pool.c.inc"
|
||||||
#include "qemu/bitops.h"
|
#include "qemu/bitops.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <asm/hwcap.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We're going to re-use TCGType in setting of the SF bit, which controls
|
/* We're going to re-use TCGType in setting of the SF bit, which controls
|
||||||
the size of the operation performed. If we know the values match, it
|
the size of the operation performed. If we know the values match, it
|
||||||
|
@ -71,6 +74,9 @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
|
||||||
return TCG_REG_X0 + slot;
|
return TCG_REG_X0 + slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool have_lse;
|
||||||
|
bool have_lse2;
|
||||||
|
|
||||||
#define TCG_REG_TMP TCG_REG_X30
|
#define TCG_REG_TMP TCG_REG_X30
|
||||||
#define TCG_VEC_TMP TCG_REG_V31
|
#define TCG_VEC_TMP TCG_REG_V31
|
||||||
|
|
||||||
|
@ -2899,6 +2905,12 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
|
||||||
|
|
||||||
static void tcg_target_init(TCGContext *s)
|
static void tcg_target_init(TCGContext *s)
|
||||||
{
|
{
|
||||||
|
#ifdef __linux__
|
||||||
|
unsigned long hwcap = qemu_getauxval(AT_HWCAP);
|
||||||
|
have_lse = hwcap & HWCAP_ATOMICS;
|
||||||
|
have_lse2 = hwcap & HWCAP_USCAT;
|
||||||
|
#endif
|
||||||
|
|
||||||
tcg_target_available_regs[TCG_TYPE_I32] = 0xffffffffu;
|
tcg_target_available_regs[TCG_TYPE_I32] = 0xffffffffu;
|
||||||
tcg_target_available_regs[TCG_TYPE_I64] = 0xffffffffu;
|
tcg_target_available_regs[TCG_TYPE_I64] = 0xffffffffu;
|
||||||
tcg_target_available_regs[TCG_TYPE_V64] = 0xffffffff00000000ull;
|
tcg_target_available_regs[TCG_TYPE_V64] = 0xffffffff00000000ull;
|
||||||
|
|
|
@ -57,6 +57,9 @@ typedef enum {
|
||||||
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||||
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
|
extern bool have_lse;
|
||||||
|
extern bool have_lse2;
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_div_i32 1
|
#define TCG_TARGET_HAS_div_i32 1
|
||||||
#define TCG_TARGET_HAS_rem_i32 1
|
#define TCG_TARGET_HAS_rem_i32 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue