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_deposit_i32 use_armv7_instructions 44*802ef65bSRichard Henderson #define TCG_TARGET_HAS_extract_i32 1 45*802ef65bSRichard Henderson #define TCG_TARGET_HAS_sextract_i32 1 46d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_extract2_i32 1 47d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32 1 48d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mulu2_i32 1 49d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_muls2_i32 1 50d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_muluh_i32 0 51d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mulsh_i32 0 52d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_div_i32 use_idiv_instructions 53d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rem_i32 0 54d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32 0 55d3f4d0dcSRichard Henderson 56d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 0 57d3f4d0dcSRichard Henderson 58d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_tst 1 59d3f4d0dcSRichard Henderson 60d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v64 use_neon_instructions 61d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v128 use_neon_instructions 62d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_v256 0 63d3f4d0dcSRichard Henderson 64d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_andc_vec 1 65d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_orc_vec 1 66d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nand_vec 0 67d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_nor_vec 0 68d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_eqv_vec 0 69d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_not_vec 1 70d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_neg_vec 1 71d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_abs_vec 1 72d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_roti_vec 0 73d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rots_vec 0 74d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_rotv_vec 0 75d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shi_vec 1 76d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shs_vec 0 77d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_shv_vec 0 78d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_mul_vec 1 79d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_sat_vec 1 80d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_minmax_vec 1 81d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_bitsel_vec 1 82d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_cmpsel_vec 0 83d3f4d0dcSRichard Henderson #define TCG_TARGET_HAS_tst_vec 1 84d3f4d0dcSRichard Henderson 85*802ef65bSRichard Henderson static inline bool 86*802ef65bSRichard Henderson tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len) 87*802ef65bSRichard Henderson { 88*802ef65bSRichard Henderson if (use_armv7_instructions) { 89*802ef65bSRichard Henderson return true; /* SBFX or UBFX */ 90*802ef65bSRichard Henderson } 91*802ef65bSRichard Henderson switch (len) { 92*802ef65bSRichard Henderson case 8: /* SXTB or UXTB */ 93*802ef65bSRichard Henderson case 16: /* SXTH or UXTH */ 94*802ef65bSRichard Henderson return (ofs % 8) == 0; 95*802ef65bSRichard Henderson } 96*802ef65bSRichard Henderson return false; 97*802ef65bSRichard Henderson } 98*802ef65bSRichard Henderson 99*802ef65bSRichard Henderson #define TCG_TARGET_extract_valid tcg_target_extract_valid 100*802ef65bSRichard Henderson #define TCG_TARGET_sextract_valid tcg_target_extract_valid 101*802ef65bSRichard Henderson 102d3f4d0dcSRichard Henderson #endif 103