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