15f593d5bSRichard Henderson /* SPDX-License-Identifier: MIT */ 25f593d5bSRichard Henderson /* 35f593d5bSRichard Henderson * Define target-specific opcode support 45f593d5bSRichard Henderson * Copyright (c) 2008 Fabrice Bellard 55f593d5bSRichard Henderson */ 65f593d5bSRichard Henderson 75f593d5bSRichard Henderson #ifndef TCG_TARGET_HAS_H 85f593d5bSRichard Henderson #define TCG_TARGET_HAS_H 95f593d5bSRichard Henderson 105f593d5bSRichard Henderson #include "host/cpuinfo.h" 115f593d5bSRichard Henderson 125f593d5bSRichard Henderson #define have_isa_2_06 (cpuinfo & CPUINFO_V2_06) 135f593d5bSRichard Henderson #define have_isa_2_07 (cpuinfo & CPUINFO_V2_07) 145f593d5bSRichard Henderson #define have_isa_3_00 (cpuinfo & CPUINFO_V3_0) 155f593d5bSRichard Henderson #define have_isa_3_10 (cpuinfo & CPUINFO_V3_1) 165f593d5bSRichard Henderson #define have_altivec (cpuinfo & CPUINFO_ALTIVEC) 175f593d5bSRichard Henderson #define have_vsx (cpuinfo & CPUINFO_VSX) 185f593d5bSRichard Henderson 195f593d5bSRichard Henderson /* optional instructions automatically implemented */ 205f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext8u_i32 0 /* andi */ 215f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext16u_i32 0 225f593d5bSRichard Henderson 235f593d5bSRichard Henderson /* optional instructions */ 245f593d5bSRichard Henderson #define TCG_TARGET_HAS_div_i32 1 255f593d5bSRichard Henderson #define TCG_TARGET_HAS_rem_i32 have_isa_3_00 265f593d5bSRichard Henderson #define TCG_TARGET_HAS_rot_i32 1 275f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext8s_i32 1 285f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext16s_i32 1 295f593d5bSRichard Henderson #define TCG_TARGET_HAS_bswap16_i32 1 305f593d5bSRichard Henderson #define TCG_TARGET_HAS_bswap32_i32 1 315f593d5bSRichard Henderson #define TCG_TARGET_HAS_not_i32 1 325f593d5bSRichard Henderson #define TCG_TARGET_HAS_andc_i32 1 335f593d5bSRichard Henderson #define TCG_TARGET_HAS_orc_i32 1 345f593d5bSRichard Henderson #define TCG_TARGET_HAS_eqv_i32 1 355f593d5bSRichard Henderson #define TCG_TARGET_HAS_nand_i32 1 365f593d5bSRichard Henderson #define TCG_TARGET_HAS_nor_i32 1 375f593d5bSRichard Henderson #define TCG_TARGET_HAS_clz_i32 1 385f593d5bSRichard Henderson #define TCG_TARGET_HAS_ctz_i32 have_isa_3_00 395f593d5bSRichard Henderson #define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06 405f593d5bSRichard Henderson #define TCG_TARGET_HAS_extract2_i32 0 415f593d5bSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32 1 425f593d5bSRichard Henderson #define TCG_TARGET_HAS_mulu2_i32 0 435f593d5bSRichard Henderson #define TCG_TARGET_HAS_muls2_i32 0 445f593d5bSRichard Henderson #define TCG_TARGET_HAS_muluh_i32 1 455f593d5bSRichard Henderson #define TCG_TARGET_HAS_mulsh_i32 1 465f593d5bSRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32 0 475f593d5bSRichard Henderson 485f593d5bSRichard Henderson #if TCG_TARGET_REG_BITS == 64 495f593d5bSRichard Henderson #define TCG_TARGET_HAS_add2_i32 0 505f593d5bSRichard Henderson #define TCG_TARGET_HAS_sub2_i32 0 515f593d5bSRichard Henderson #define TCG_TARGET_HAS_extr_i64_i32 0 525f593d5bSRichard Henderson #define TCG_TARGET_HAS_div_i64 1 535f593d5bSRichard Henderson #define TCG_TARGET_HAS_rem_i64 have_isa_3_00 545f593d5bSRichard Henderson #define TCG_TARGET_HAS_rot_i64 1 555f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext8s_i64 1 565f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext16s_i64 1 575f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext32s_i64 1 585f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext8u_i64 0 595f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext16u_i64 0 605f593d5bSRichard Henderson #define TCG_TARGET_HAS_ext32u_i64 0 615f593d5bSRichard Henderson #define TCG_TARGET_HAS_bswap16_i64 1 625f593d5bSRichard Henderson #define TCG_TARGET_HAS_bswap32_i64 1 635f593d5bSRichard Henderson #define TCG_TARGET_HAS_bswap64_i64 1 645f593d5bSRichard Henderson #define TCG_TARGET_HAS_not_i64 1 655f593d5bSRichard Henderson #define TCG_TARGET_HAS_andc_i64 1 665f593d5bSRichard Henderson #define TCG_TARGET_HAS_orc_i64 1 675f593d5bSRichard Henderson #define TCG_TARGET_HAS_eqv_i64 1 685f593d5bSRichard Henderson #define TCG_TARGET_HAS_nand_i64 1 695f593d5bSRichard Henderson #define TCG_TARGET_HAS_nor_i64 1 705f593d5bSRichard Henderson #define TCG_TARGET_HAS_clz_i64 1 715f593d5bSRichard Henderson #define TCG_TARGET_HAS_ctz_i64 have_isa_3_00 725f593d5bSRichard Henderson #define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06 735f593d5bSRichard Henderson #define TCG_TARGET_HAS_extract2_i64 0 745f593d5bSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i64 1 755f593d5bSRichard Henderson #define TCG_TARGET_HAS_add2_i64 1 765f593d5bSRichard Henderson #define TCG_TARGET_HAS_sub2_i64 1 775f593d5bSRichard Henderson #define TCG_TARGET_HAS_mulu2_i64 0 785f593d5bSRichard Henderson #define TCG_TARGET_HAS_muls2_i64 0 795f593d5bSRichard Henderson #define TCG_TARGET_HAS_muluh_i64 1 805f593d5bSRichard Henderson #define TCG_TARGET_HAS_mulsh_i64 1 815f593d5bSRichard Henderson #endif 825f593d5bSRichard Henderson 835f593d5bSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 \ 845f593d5bSRichard Henderson (TCG_TARGET_REG_BITS == 64 && have_isa_2_07) 855f593d5bSRichard Henderson 865f593d5bSRichard Henderson #define TCG_TARGET_HAS_tst 1 875f593d5bSRichard Henderson 885f593d5bSRichard Henderson /* 895f593d5bSRichard Henderson * While technically Altivec could support V64, it has no 64-bit store 905f593d5bSRichard Henderson * instruction and substituting two 32-bit stores makes the generated 915f593d5bSRichard Henderson * code quite large. 925f593d5bSRichard Henderson */ 935f593d5bSRichard Henderson #define TCG_TARGET_HAS_v64 have_vsx 945f593d5bSRichard Henderson #define TCG_TARGET_HAS_v128 have_altivec 955f593d5bSRichard Henderson #define TCG_TARGET_HAS_v256 0 965f593d5bSRichard Henderson 975f593d5bSRichard Henderson #define TCG_TARGET_HAS_andc_vec 1 985f593d5bSRichard Henderson #define TCG_TARGET_HAS_orc_vec have_isa_2_07 995f593d5bSRichard Henderson #define TCG_TARGET_HAS_nand_vec have_isa_2_07 1005f593d5bSRichard Henderson #define TCG_TARGET_HAS_nor_vec 1 1015f593d5bSRichard Henderson #define TCG_TARGET_HAS_eqv_vec have_isa_2_07 1025f593d5bSRichard Henderson #define TCG_TARGET_HAS_not_vec 1 1035f593d5bSRichard Henderson #define TCG_TARGET_HAS_neg_vec have_isa_3_00 1045f593d5bSRichard Henderson #define TCG_TARGET_HAS_abs_vec 0 1055f593d5bSRichard Henderson #define TCG_TARGET_HAS_roti_vec 0 1065f593d5bSRichard Henderson #define TCG_TARGET_HAS_rots_vec 0 1075f593d5bSRichard Henderson #define TCG_TARGET_HAS_rotv_vec 1 1085f593d5bSRichard Henderson #define TCG_TARGET_HAS_shi_vec 0 1095f593d5bSRichard Henderson #define TCG_TARGET_HAS_shs_vec 0 1105f593d5bSRichard Henderson #define TCG_TARGET_HAS_shv_vec 1 1115f593d5bSRichard Henderson #define TCG_TARGET_HAS_mul_vec 1 1125f593d5bSRichard Henderson #define TCG_TARGET_HAS_sat_vec 1 1135f593d5bSRichard Henderson #define TCG_TARGET_HAS_minmax_vec 1 1145f593d5bSRichard Henderson #define TCG_TARGET_HAS_bitsel_vec have_vsx 1155f593d5bSRichard Henderson #define TCG_TARGET_HAS_cmpsel_vec 1 1165f593d5bSRichard Henderson #define TCG_TARGET_HAS_tst_vec 0 1175f593d5bSRichard Henderson 11894d59394SRichard Henderson #define TCG_TARGET_extract_valid(type, ofs, len) 1 119*6482e9d2SRichard Henderson #define TCG_TARGET_deposit_valid(type, ofs, len) 1 12094d59394SRichard Henderson 12194d59394SRichard Henderson static inline bool tcg_target_sextract_valid(TCGType type,unsigned ofs,unsigned len)12294d59394SRichard Hendersontcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len) 12394d59394SRichard Henderson { 12494d59394SRichard Henderson if (type == TCG_TYPE_I64 && ofs + len == 32) { 12594d59394SRichard Henderson return true; 12694d59394SRichard Henderson } 12794d59394SRichard Henderson return ofs == 0 && (len == 8 || len == 16); 12894d59394SRichard Henderson } 12994d59394SRichard Henderson #define TCG_TARGET_sextract_valid tcg_target_sextract_valid 13094d59394SRichard Henderson 1315f593d5bSRichard Henderson #endif 132