mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
tcg/mips: detect available host instructions at runtime
Now that TCG supports enabling and disabling ops at runtime, it's possible to detect the available host instructions at runtime, and enable the corresponding ops accordingly. Unfortunately it's not easy to probe for available instructions on MIPS, the information is partially available in /proc/cpuinfo, and not available in AUXV. This patch therefore probes for the instructions by trying to execute them and by catching a possible SIGILL signal. Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
4ff78e0dbc
commit
988902fc3b
2 changed files with 174 additions and 95 deletions
|
@ -77,6 +77,29 @@ typedef enum {
|
|||
#define TCG_TARGET_CALL_STACK_OFFSET 16
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
|
||||
/* MOVN/MOVZ instructions detection */
|
||||
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
||||
defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
|
||||
defined(_MIPS_ARCH_MIPS4)
|
||||
#define use_movnz_instructions 1
|
||||
#else
|
||||
extern bool use_movnz_instructions;
|
||||
#endif
|
||||
|
||||
/* MIPS32 instruction set detection */
|
||||
#if defined(__mips_isa_rev) && (__mips_isa_rev >= 1)
|
||||
#define use_mips32_instructions 1
|
||||
#else
|
||||
extern bool use_mips32_instructions;
|
||||
#endif
|
||||
|
||||
/* MIPS32R2 instruction set detection */
|
||||
#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
|
||||
#define use_mips32r2_instructions 1
|
||||
#else
|
||||
extern bool use_mips32r2_instructions;
|
||||
#endif
|
||||
|
||||
/* optional instructions */
|
||||
#define TCG_TARGET_HAS_div_i32 1
|
||||
#define TCG_TARGET_HAS_rem_i32 1
|
||||
|
@ -90,27 +113,12 @@ typedef enum {
|
|||
#define TCG_TARGET_HAS_nand_i32 0
|
||||
#define TCG_TARGET_HAS_muls2_i32 1
|
||||
|
||||
/* optional instructions only implemented on MIPS4, MIPS32 and Loongson 2 */
|
||||
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
||||
defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
|
||||
defined(_MIPS_ARCH_MIPS4)
|
||||
#define TCG_TARGET_HAS_movcond_i32 1
|
||||
#else
|
||||
#define TCG_TARGET_HAS_movcond_i32 0
|
||||
#endif
|
||||
|
||||
/* optional instructions only implemented on MIPS32R2 */
|
||||
#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
|
||||
#define TCG_TARGET_HAS_bswap16_i32 1
|
||||
#define TCG_TARGET_HAS_bswap32_i32 1
|
||||
#define TCG_TARGET_HAS_rot_i32 1
|
||||
#define TCG_TARGET_HAS_deposit_i32 1
|
||||
#else
|
||||
#define TCG_TARGET_HAS_bswap16_i32 0
|
||||
#define TCG_TARGET_HAS_bswap32_i32 0
|
||||
#define TCG_TARGET_HAS_rot_i32 0
|
||||
#define TCG_TARGET_HAS_deposit_i32 0
|
||||
#endif
|
||||
/* optional instructions detected at runtime */
|
||||
#define TCG_TARGET_HAS_movcond_i32 use_movnz_instructions
|
||||
#define TCG_TARGET_HAS_bswap16_i32 use_mips32r2_instructions
|
||||
#define TCG_TARGET_HAS_bswap32_i32 use_mips32r2_instructions
|
||||
#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
|
||||
#define TCG_TARGET_HAS_rot_i32 use_mips32r2_instructions
|
||||
|
||||
/* optional instructions automatically implemented */
|
||||
#define TCG_TARGET_HAS_neg_i32 0 /* sub rd, zero, rt */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue