1d3f4d0dcSRichard Henderson /* SPDX-License-Identifier: MIT */ 2d3f4d0dcSRichard Henderson /* 3d3f4d0dcSRichard Henderson * Define target-specific opcode support 4d3f4d0dcSRichard Henderson * Copyright (c) 2008 Fabrice Bellard 5d3f4d0dcSRichard Henderson * Copyright (c) 2008 Andrzej Zaborowski 6d3f4d0dcSRichard Henderson */ 7d3f4d0dcSRichard Henderson 8d3f4d0dcSRichard Henderson #ifndef TCG_TARGET_HAS_H 9d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_H 10d3f4d0dcSRichard Henderson 11d3f4d0dcSRichard Henderson extern int arm_arch; 12d3f4d0dcSRichard Henderson 13d3f4d0dcSRichard Henderson #define use_armv7_instructions (__ARM_ARCH >= 7 || arm_arch >= 7) 14d3f4d0dcSRichard Henderson 15d3f4d0dcSRichard Henderson #ifdef __ARM_ARCH_EXT_IDIV__ 16d3f4d0dcSRichard Henderson #define use_idiv_instructions 1 17d3f4d0dcSRichard Henderson #else 18d3f4d0dcSRichard Henderson extern bool use_idiv_instructions; 19d3f4d0dcSRichard Henderson #endif 20d3f4d0dcSRichard Henderson #ifdef __ARM_NEON__ 21d3f4d0dcSRichard Henderson #define use_neon_instructions 1 22d3f4d0dcSRichard Henderson #else 23d3f4d0dcSRichard Henderson extern bool use_neon_instructions; 24d3f4d0dcSRichard Henderson #endif 25d3f4d0dcSRichard Henderson 26d3f4d0dcSRichard Henderson /* optional instructions */ 27d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 0 28d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_tst 1 29d3f4d0dcSRichard Henderson 30d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v64 use_neon_instructions 31d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v128 use_neon_instructions 32d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v256 0 33d3f4d0dcSRichard Henderson 34d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_andc_vec 1 35d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_orc_vec 1 36d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nand_vec 0 37d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nor_vec 0 38d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_eqv_vec 0 39d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_not_vec 1 40d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_neg_vec 1 41d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_abs_vec 1 42d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_roti_vec 0 43d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rots_vec 0 44d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rotv_vec 0 45d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shi_vec 1 46d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shs_vec 0 47d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shv_vec 0 48d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mul_vec 1 49d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_sat_vec 1 50d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_minmax_vec 1 51d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_bitsel_vec 1 52d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_cmpsel_vec 0 53d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_tst_vec 1 54d3f4d0dcSRichard Henderson 55802ef65bSRichard Henderson static inline bool tcg_target_extract_valid(TCGType type,unsigned ofs,unsigned len)56802ef65bSRichard Hendersontcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len) 57802ef65bSRichard Henderson { 58802ef65bSRichard Henderson if (use_armv7_instructions) { 59802ef65bSRichard Henderson return true; /* SBFX or UBFX */ 60802ef65bSRichard Henderson } 61802ef65bSRichard Henderson switch (len) { 62802ef65bSRichard Henderson case 8: /* SXTB or UXTB */ 63802ef65bSRichard Henderson case 16: /* SXTH or UXTH */ 64802ef65bSRichard Henderson return (ofs % 8) == 0; 65802ef65bSRichard Henderson } 66802ef65bSRichard Henderson return false; 67802ef65bSRichard Henderson } 68802ef65bSRichard Henderson 69802ef65bSRichard Henderson #define TCG_TARGET_extract_valid tcg_target_extract_valid 70802ef65bSRichard Henderson #define TCG_TARGET_sextract_valid tcg_target_extract_valid 71*6482e9d2SRichard Henderson #define TCG_TARGET_deposit_valid(type, ofs, len) use_armv7_instructions 72802ef65bSRichard Henderson 73d3f4d0dcSRichard Henderson #endif 74