xref: /openbmc/qemu/tcg/mips/tcg-target-has.h (revision 32a97c5d05c5deb54a42315d48cecf86cbeadaf4)
1f975a313SRichard Henderson /* SPDX-License-Identifier: MIT */
2f975a313SRichard Henderson /*
3f975a313SRichard Henderson  * Define target-specific opcode support
4f975a313SRichard Henderson  * Copyright (c) 2008-2009 Arnaud Patard <arnaud.patard@rtp-net.org>
5f975a313SRichard Henderson  * Copyright (c) 2009 Aurelien Jarno <aurelien@aurel32.net>
6f975a313SRichard Henderson  */
7f975a313SRichard Henderson 
8f975a313SRichard Henderson #ifndef TCG_TARGET_HAS_H
9f975a313SRichard Henderson #define TCG_TARGET_HAS_H
10f975a313SRichard Henderson 
11f975a313SRichard Henderson /* MOVN/MOVZ instructions detection */
12f975a313SRichard Henderson #if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
13f975a313SRichard Henderson     defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
14f975a313SRichard Henderson     defined(_MIPS_ARCH_MIPS4)
15f975a313SRichard Henderson #define use_movnz_instructions  1
16f975a313SRichard Henderson #else
17f975a313SRichard Henderson extern bool use_movnz_instructions;
18f975a313SRichard Henderson #endif
19f975a313SRichard Henderson 
20f975a313SRichard Henderson /* MIPS32 instruction set detection */
21f975a313SRichard Henderson #if defined(__mips_isa_rev) && (__mips_isa_rev >= 1)
22f975a313SRichard Henderson #define use_mips32_instructions  1
23f975a313SRichard Henderson #else
24f975a313SRichard Henderson extern bool use_mips32_instructions;
25f975a313SRichard Henderson #endif
26f975a313SRichard Henderson 
27f975a313SRichard Henderson /* MIPS32R2 instruction set detection */
28f975a313SRichard Henderson #if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
29f975a313SRichard Henderson #define use_mips32r2_instructions  1
30f975a313SRichard Henderson #else
31f975a313SRichard Henderson extern bool use_mips32r2_instructions;
32f975a313SRichard Henderson #endif
33f975a313SRichard Henderson 
34f975a313SRichard Henderson /* MIPS32R6 instruction set detection */
35f975a313SRichard Henderson #if defined(__mips_isa_rev) && (__mips_isa_rev >= 6)
36f975a313SRichard Henderson #define use_mips32r6_instructions  1
37f975a313SRichard Henderson #else
38f975a313SRichard Henderson #define use_mips32r6_instructions  0
39f975a313SRichard Henderson #endif
40f975a313SRichard Henderson 
41f975a313SRichard Henderson /* optional instructions */
42f975a313SRichard Henderson #define TCG_TARGET_HAS_div_i32          1
43f975a313SRichard Henderson #define TCG_TARGET_HAS_rem_i32          1
44f975a313SRichard Henderson #define TCG_TARGET_HAS_not_i32          1
45f975a313SRichard Henderson #define TCG_TARGET_HAS_nor_i32          1
46f975a313SRichard Henderson #define TCG_TARGET_HAS_andc_i32         0
47f975a313SRichard Henderson #define TCG_TARGET_HAS_orc_i32          0
48f975a313SRichard Henderson #define TCG_TARGET_HAS_eqv_i32          0
49f975a313SRichard Henderson #define TCG_TARGET_HAS_nand_i32         0
50f975a313SRichard Henderson #define TCG_TARGET_HAS_mulu2_i32        (!use_mips32r6_instructions)
51f975a313SRichard Henderson #define TCG_TARGET_HAS_muls2_i32        (!use_mips32r6_instructions)
52f975a313SRichard Henderson #define TCG_TARGET_HAS_muluh_i32        1
53f975a313SRichard Henderson #define TCG_TARGET_HAS_mulsh_i32        1
5472912ac7SRichard Henderson #define TCG_TARGET_HAS_bswap16_i32      1
55f975a313SRichard Henderson #define TCG_TARGET_HAS_bswap32_i32      1
56f975a313SRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32   0
57f975a313SRichard Henderson 
58f975a313SRichard Henderson #if TCG_TARGET_REG_BITS == 64
59f975a313SRichard Henderson #define TCG_TARGET_HAS_add2_i32         0
60f975a313SRichard Henderson #define TCG_TARGET_HAS_sub2_i32         0
61f975a313SRichard Henderson #define TCG_TARGET_HAS_extr_i64_i32     1
62f975a313SRichard Henderson #define TCG_TARGET_HAS_div_i64          1
63f975a313SRichard Henderson #define TCG_TARGET_HAS_rem_i64          1
64f975a313SRichard Henderson #define TCG_TARGET_HAS_not_i64          1
65f975a313SRichard Henderson #define TCG_TARGET_HAS_nor_i64          1
66f975a313SRichard Henderson #define TCG_TARGET_HAS_andc_i64         0
67f975a313SRichard Henderson #define TCG_TARGET_HAS_orc_i64          0
68f975a313SRichard Henderson #define TCG_TARGET_HAS_eqv_i64          0
69f975a313SRichard Henderson #define TCG_TARGET_HAS_nand_i64         0
70f975a313SRichard Henderson #define TCG_TARGET_HAS_add2_i64         0
71f975a313SRichard Henderson #define TCG_TARGET_HAS_sub2_i64         0
72f975a313SRichard Henderson #define TCG_TARGET_HAS_mulu2_i64        (!use_mips32r6_instructions)
73f975a313SRichard Henderson #define TCG_TARGET_HAS_muls2_i64        (!use_mips32r6_instructions)
74f975a313SRichard Henderson #define TCG_TARGET_HAS_muluh_i64        1
75f975a313SRichard Henderson #define TCG_TARGET_HAS_mulsh_i64        1
76f975a313SRichard Henderson #define TCG_TARGET_HAS_ext32s_i64       1
77f975a313SRichard Henderson #define TCG_TARGET_HAS_ext32u_i64       1
78f975a313SRichard Henderson #define TCG_TARGET_HAS_negsetcond_i64   0
79f975a313SRichard Henderson #endif
80f975a313SRichard Henderson 
81f975a313SRichard Henderson /* optional instructions detected at runtime */
82f975a313SRichard Henderson #define TCG_TARGET_HAS_extract2_i32     0
83f975a313SRichard Henderson #define TCG_TARGET_HAS_ext8s_i32        use_mips32r2_instructions
84f975a313SRichard Henderson #define TCG_TARGET_HAS_ext16s_i32       use_mips32r2_instructions
85f975a313SRichard Henderson #define TCG_TARGET_HAS_rot_i32          use_mips32r2_instructions
86f975a313SRichard Henderson #define TCG_TARGET_HAS_clz_i32          use_mips32r2_instructions
87f975a313SRichard Henderson #define TCG_TARGET_HAS_ctz_i32          0
88f975a313SRichard Henderson #define TCG_TARGET_HAS_ctpop_i32        0
89f975a313SRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32     0
90f975a313SRichard Henderson 
91f975a313SRichard Henderson #if TCG_TARGET_REG_BITS == 64
9272912ac7SRichard Henderson #define TCG_TARGET_HAS_bswap16_i64      1
9372912ac7SRichard Henderson #define TCG_TARGET_HAS_bswap32_i64      1
9472912ac7SRichard Henderson #define TCG_TARGET_HAS_bswap64_i64      1
95f975a313SRichard Henderson #define TCG_TARGET_HAS_extract2_i64     0
96f975a313SRichard Henderson #define TCG_TARGET_HAS_ext8s_i64        use_mips32r2_instructions
97f975a313SRichard Henderson #define TCG_TARGET_HAS_ext16s_i64       use_mips32r2_instructions
98f975a313SRichard Henderson #define TCG_TARGET_HAS_rot_i64          use_mips32r2_instructions
99f975a313SRichard Henderson #define TCG_TARGET_HAS_clz_i64          use_mips32r2_instructions
100f975a313SRichard Henderson #define TCG_TARGET_HAS_ctz_i64          0
101f975a313SRichard Henderson #define TCG_TARGET_HAS_ctpop_i64        0
102f975a313SRichard Henderson #endif
103f975a313SRichard Henderson 
104f975a313SRichard Henderson /* optional instructions automatically implemented */
105f975a313SRichard Henderson #define TCG_TARGET_HAS_ext8u_i32        0 /* andi rt, rs, 0xff   */
106f975a313SRichard Henderson #define TCG_TARGET_HAS_ext16u_i32       0 /* andi rt, rs, 0xffff */
107f975a313SRichard Henderson 
108f975a313SRichard Henderson #if TCG_TARGET_REG_BITS == 64
109f975a313SRichard Henderson #define TCG_TARGET_HAS_ext8u_i64        0 /* andi rt, rs, 0xff   */
110f975a313SRichard Henderson #define TCG_TARGET_HAS_ext16u_i64       0 /* andi rt, rs, 0xffff */
111f975a313SRichard Henderson #endif
112f975a313SRichard Henderson 
113f975a313SRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128   0
114f975a313SRichard Henderson #define TCG_TARGET_HAS_tst              0
115f975a313SRichard Henderson 
116791d0304SRichard Henderson #define TCG_TARGET_extract_valid(type, ofs, len)  use_mips32r2_instructions
117*6482e9d2SRichard Henderson #define TCG_TARGET_deposit_valid(type, ofs, len)  use_mips32r2_instructions
118791d0304SRichard Henderson 
119791d0304SRichard Henderson static inline bool
tcg_target_sextract_valid(TCGType type,unsigned ofs,unsigned len)120791d0304SRichard Henderson tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
121791d0304SRichard Henderson {
122791d0304SRichard Henderson     if (ofs == 0) {
123791d0304SRichard Henderson         switch (len) {
124791d0304SRichard Henderson         case 8:
125791d0304SRichard Henderson         case 16:
126791d0304SRichard Henderson             return use_mips32r2_instructions;
127791d0304SRichard Henderson         case 32:
128791d0304SRichard Henderson             return type == TCG_TYPE_I64;
129791d0304SRichard Henderson         }
130791d0304SRichard Henderson     }
131791d0304SRichard Henderson     return false;
132791d0304SRichard Henderson }
133791d0304SRichard Henderson #define TCG_TARGET_sextract_valid  tcg_target_sextract_valid
134791d0304SRichard Henderson 
135f975a313SRichard Henderson #endif
136