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_ext8s_i32 1 28d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_ext16s_i32 1 29d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_ext8u_i32 0 /* and r0, r1, #0xff */ 30d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_ext16u_i32 1 31d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_bswap16_i32 1 32d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_bswap32_i32 1 33d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_not_i32 1 34d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rot_i32 1 35d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_andc_i32 1 36d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_orc_i32 0 37d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_eqv_i32 0 38d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nand_i32 0 39d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nor_i32 0 40d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_clz_i32 1 41d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions 42d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_ctpop_i32 0 43d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_extract2_i32 1 44d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32 1 45d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mulu2_i32 1 46d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_muls2_i32 1 47d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_muluh_i32 0 48d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mulsh_i32 0 49d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_div_i32 use_idiv_instructions 50d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rem_i32 0 51d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32 0 52d3f4d0dcSRichard Henderson 53d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 0 54d3f4d0dcSRichard Henderson 55d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_tst 1 56d3f4d0dcSRichard Henderson 57d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v64 use_neon_instructions 58d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v128 use_neon_instructions 59d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v256 0 60d3f4d0dcSRichard Henderson 61d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_andc_vec 1 62d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_orc_vec 1 63d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nand_vec 0 64d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nor_vec 0 65d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_eqv_vec 0 66d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_not_vec 1 67d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_neg_vec 1 68d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_abs_vec 1 69d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_roti_vec 0 70d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rots_vec 0 71d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rotv_vec 0 72d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shi_vec 1 73d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shs_vec 0 74d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shv_vec 0 75d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mul_vec 1 76d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_sat_vec 1 77d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_minmax_vec 1 78d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_bitsel_vec 1 79d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_cmpsel_vec 0 80d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_tst_vec 1 81d3f4d0dcSRichard Henderson 82802ef65bSRichard Henderson static inline bool tcg_target_extract_valid(TCGType type,unsigned ofs,unsigned len)83802ef65bSRichard Hendersontcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len) 84802ef65bSRichard Henderson { 85802ef65bSRichard Henderson if (use_armv7_instructions) { 86802ef65bSRichard Henderson return true; /* SBFX or UBFX */ 87802ef65bSRichard Henderson } 88802ef65bSRichard Henderson switch (len) { 89802ef65bSRichard Henderson case 8: /* SXTB or UXTB */ 90802ef65bSRichard Henderson case 16: /* SXTH or UXTH */ 91802ef65bSRichard Henderson return (ofs % 8) == 0; 92802ef65bSRichard Henderson } 93802ef65bSRichard Henderson return false; 94802ef65bSRichard Henderson } 95802ef65bSRichard Henderson 96802ef65bSRichard Henderson #define TCG_TARGET_extract_valid tcg_target_extract_valid 97802ef65bSRichard Henderson #define TCG_TARGET_sextract_valid tcg_target_extract_valid 98*6482e9d2SRichard Henderson #define TCG_TARGET_deposit_valid(type, ofs, len) use_armv7_instructions 99802ef65bSRichard Henderson 100d3f4d0dcSRichard Henderson #endif 101