xref: /openbmc/qemu/tcg/ppc/tcg-target-has.h (revision 32a97c5d05c5deb54a42315d48cecf86cbeadaf4)
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 Henderson tcg_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