xref: /openbmc/qemu/tcg/s390x/tcg-target-has.h (revision 32a97c5d05c5deb54a42315d48cecf86cbeadaf4)
144c9e94bSRichard Henderson /* SPDX-License-Identifier: MIT */
244c9e94bSRichard Henderson /*
344c9e94bSRichard Henderson  * Define target-specific opcode support
444c9e94bSRichard Henderson  * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
544c9e94bSRichard Henderson  */
644c9e94bSRichard Henderson 
744c9e94bSRichard Henderson #ifndef TCG_TARGET_HAS_H
844c9e94bSRichard Henderson #define TCG_TARGET_HAS_H
944c9e94bSRichard Henderson 
1044c9e94bSRichard Henderson /* Facilities required for proper operation; checked at startup. */
1144c9e94bSRichard Henderson 
1244c9e94bSRichard Henderson #define FACILITY_ZARCH_ACTIVE         2
1344c9e94bSRichard Henderson #define FACILITY_LONG_DISP            18
1444c9e94bSRichard Henderson #define FACILITY_EXT_IMM              21
1544c9e94bSRichard Henderson #define FACILITY_GEN_INST_EXT         34
1644c9e94bSRichard Henderson #define FACILITY_45                   45
1744c9e94bSRichard Henderson 
1844c9e94bSRichard Henderson /* Facilities that are checked at runtime. */
1944c9e94bSRichard Henderson 
2044c9e94bSRichard Henderson #define FACILITY_LOAD_ON_COND2        53
2144c9e94bSRichard Henderson #define FACILITY_MISC_INSN_EXT2       58
2244c9e94bSRichard Henderson #define FACILITY_MISC_INSN_EXT3       61
2344c9e94bSRichard Henderson #define FACILITY_VECTOR               129
2444c9e94bSRichard Henderson #define FACILITY_VECTOR_ENH1          135
2544c9e94bSRichard Henderson 
2644c9e94bSRichard Henderson extern uint64_t s390_facilities[3];
2744c9e94bSRichard Henderson 
2844c9e94bSRichard Henderson #define HAVE_FACILITY(X) \
2944c9e94bSRichard Henderson     ((s390_facilities[FACILITY_##X / 64] >> (63 - FACILITY_##X % 64)) & 1)
3044c9e94bSRichard Henderson 
3144c9e94bSRichard Henderson /* optional instructions */
3244c9e94bSRichard Henderson #define TCG_TARGET_HAS_div2_i32       1
3344c9e94bSRichard Henderson #define TCG_TARGET_HAS_rot_i32        1
3444c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext8s_i32      1
3544c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext16s_i32     1
3644c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext8u_i32      1
3744c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext16u_i32     1
3844c9e94bSRichard Henderson #define TCG_TARGET_HAS_bswap16_i32    1
3944c9e94bSRichard Henderson #define TCG_TARGET_HAS_bswap32_i32    1
4044c9e94bSRichard Henderson #define TCG_TARGET_HAS_not_i32        HAVE_FACILITY(MISC_INSN_EXT3)
4144c9e94bSRichard Henderson #define TCG_TARGET_HAS_andc_i32       HAVE_FACILITY(MISC_INSN_EXT3)
4244c9e94bSRichard Henderson #define TCG_TARGET_HAS_orc_i32        HAVE_FACILITY(MISC_INSN_EXT3)
4344c9e94bSRichard Henderson #define TCG_TARGET_HAS_eqv_i32        HAVE_FACILITY(MISC_INSN_EXT3)
4444c9e94bSRichard Henderson #define TCG_TARGET_HAS_nand_i32       HAVE_FACILITY(MISC_INSN_EXT3)
4544c9e94bSRichard Henderson #define TCG_TARGET_HAS_nor_i32        HAVE_FACILITY(MISC_INSN_EXT3)
4644c9e94bSRichard Henderson #define TCG_TARGET_HAS_clz_i32        0
4744c9e94bSRichard Henderson #define TCG_TARGET_HAS_ctz_i32        0
4844c9e94bSRichard Henderson #define TCG_TARGET_HAS_ctpop_i32      1
4944c9e94bSRichard Henderson #define TCG_TARGET_HAS_extract2_i32   0
5044c9e94bSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32 1
5144c9e94bSRichard Henderson #define TCG_TARGET_HAS_add2_i32       1
5244c9e94bSRichard Henderson #define TCG_TARGET_HAS_sub2_i32       1
5344c9e94bSRichard Henderson #define TCG_TARGET_HAS_mulu2_i32      0
5444c9e94bSRichard Henderson #define TCG_TARGET_HAS_muls2_i32      0
5544c9e94bSRichard Henderson #define TCG_TARGET_HAS_muluh_i32      0
5644c9e94bSRichard Henderson #define TCG_TARGET_HAS_mulsh_i32      0
5744c9e94bSRichard Henderson #define TCG_TARGET_HAS_extr_i64_i32   0
5844c9e94bSRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32   0
5944c9e94bSRichard Henderson 
6044c9e94bSRichard Henderson #define TCG_TARGET_HAS_div2_i64       1
6144c9e94bSRichard Henderson #define TCG_TARGET_HAS_rot_i64        1
6244c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext8s_i64      1
6344c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext16s_i64     1
6444c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext32s_i64     1
6544c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext8u_i64      1
6644c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext16u_i64     1
6744c9e94bSRichard Henderson #define TCG_TARGET_HAS_ext32u_i64     1
6844c9e94bSRichard Henderson #define TCG_TARGET_HAS_bswap16_i64    1
6944c9e94bSRichard Henderson #define TCG_TARGET_HAS_bswap32_i64    1
7044c9e94bSRichard Henderson #define TCG_TARGET_HAS_bswap64_i64    1
7144c9e94bSRichard Henderson #define TCG_TARGET_HAS_not_i64        HAVE_FACILITY(MISC_INSN_EXT3)
7244c9e94bSRichard Henderson #define TCG_TARGET_HAS_andc_i64       HAVE_FACILITY(MISC_INSN_EXT3)
7344c9e94bSRichard Henderson #define TCG_TARGET_HAS_orc_i64        HAVE_FACILITY(MISC_INSN_EXT3)
7444c9e94bSRichard Henderson #define TCG_TARGET_HAS_eqv_i64        HAVE_FACILITY(MISC_INSN_EXT3)
7544c9e94bSRichard Henderson #define TCG_TARGET_HAS_nand_i64       HAVE_FACILITY(MISC_INSN_EXT3)
7644c9e94bSRichard Henderson #define TCG_TARGET_HAS_nor_i64        HAVE_FACILITY(MISC_INSN_EXT3)
7744c9e94bSRichard Henderson #define TCG_TARGET_HAS_clz_i64        1
7844c9e94bSRichard Henderson #define TCG_TARGET_HAS_ctz_i64        0
7944c9e94bSRichard Henderson #define TCG_TARGET_HAS_ctpop_i64      1
8044c9e94bSRichard Henderson #define TCG_TARGET_HAS_extract2_i64   0
8144c9e94bSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i64 1
8244c9e94bSRichard Henderson #define TCG_TARGET_HAS_add2_i64       1
8344c9e94bSRichard Henderson #define TCG_TARGET_HAS_sub2_i64       1
8444c9e94bSRichard Henderson #define TCG_TARGET_HAS_mulu2_i64      1
8544c9e94bSRichard Henderson #define TCG_TARGET_HAS_muls2_i64      HAVE_FACILITY(MISC_INSN_EXT2)
8644c9e94bSRichard Henderson #define TCG_TARGET_HAS_muluh_i64      0
8744c9e94bSRichard Henderson #define TCG_TARGET_HAS_mulsh_i64      0
8844c9e94bSRichard Henderson 
8944c9e94bSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 1
9044c9e94bSRichard Henderson 
9144c9e94bSRichard Henderson #define TCG_TARGET_HAS_tst            1
9244c9e94bSRichard Henderson 
9344c9e94bSRichard Henderson #define TCG_TARGET_HAS_v64            HAVE_FACILITY(VECTOR)
9444c9e94bSRichard Henderson #define TCG_TARGET_HAS_v128           HAVE_FACILITY(VECTOR)
9544c9e94bSRichard Henderson #define TCG_TARGET_HAS_v256           0
9644c9e94bSRichard Henderson 
9744c9e94bSRichard Henderson #define TCG_TARGET_HAS_andc_vec       1
9844c9e94bSRichard Henderson #define TCG_TARGET_HAS_orc_vec        HAVE_FACILITY(VECTOR_ENH1)
9944c9e94bSRichard Henderson #define TCG_TARGET_HAS_nand_vec       HAVE_FACILITY(VECTOR_ENH1)
10044c9e94bSRichard Henderson #define TCG_TARGET_HAS_nor_vec        1
10144c9e94bSRichard Henderson #define TCG_TARGET_HAS_eqv_vec        HAVE_FACILITY(VECTOR_ENH1)
10244c9e94bSRichard Henderson #define TCG_TARGET_HAS_not_vec        1
10344c9e94bSRichard Henderson #define TCG_TARGET_HAS_neg_vec        1
10444c9e94bSRichard Henderson #define TCG_TARGET_HAS_abs_vec        1
10544c9e94bSRichard Henderson #define TCG_TARGET_HAS_roti_vec       1
10644c9e94bSRichard Henderson #define TCG_TARGET_HAS_rots_vec       1
10744c9e94bSRichard Henderson #define TCG_TARGET_HAS_rotv_vec       1
10844c9e94bSRichard Henderson #define TCG_TARGET_HAS_shi_vec        1
10944c9e94bSRichard Henderson #define TCG_TARGET_HAS_shs_vec        1
11044c9e94bSRichard Henderson #define TCG_TARGET_HAS_shv_vec        1
11144c9e94bSRichard Henderson #define TCG_TARGET_HAS_mul_vec        1
11244c9e94bSRichard Henderson #define TCG_TARGET_HAS_sat_vec        0
11344c9e94bSRichard Henderson #define TCG_TARGET_HAS_minmax_vec     1
11444c9e94bSRichard Henderson #define TCG_TARGET_HAS_bitsel_vec     1
11544c9e94bSRichard Henderson #define TCG_TARGET_HAS_cmpsel_vec     1
11644c9e94bSRichard Henderson #define TCG_TARGET_HAS_tst_vec        0
11744c9e94bSRichard Henderson 
11842103c4cSRichard Henderson #define TCG_TARGET_extract_valid(type, ofs, len)   1
119*6482e9d2SRichard Henderson #define TCG_TARGET_deposit_valid(type, ofs, len)   1
12042103c4cSRichard Henderson 
12142103c4cSRichard Henderson static inline bool
tcg_target_sextract_valid(TCGType type,unsigned ofs,unsigned len)12242103c4cSRichard Henderson tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
12342103c4cSRichard Henderson {
12442103c4cSRichard Henderson     if (ofs == 0) {
12542103c4cSRichard Henderson         switch (len) {
12642103c4cSRichard Henderson         case 8:
12742103c4cSRichard Henderson         case 16:
12842103c4cSRichard Henderson             return true;
12942103c4cSRichard Henderson         case 32:
13042103c4cSRichard Henderson             return type == TCG_TYPE_I64;
13142103c4cSRichard Henderson         }
13242103c4cSRichard Henderson     }
13342103c4cSRichard Henderson     return false;
13442103c4cSRichard Henderson }
13542103c4cSRichard Henderson #define TCG_TARGET_sextract_valid  tcg_target_sextract_valid
13642103c4cSRichard Henderson 
13744c9e94bSRichard Henderson #endif
138