blob: 7f230ed243b44718b6be35605a3eedd398a0c91e [file] [log] [blame]
Alexander Graf28278222009-12-05 12:44:23 +01001/*
2 * Tiny Code Generator for QEMU
3 *
4 * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
Markus Armbruster14e54f82016-06-29 11:14:47 +020024
25#ifndef S390_TCG_TARGET_H
26#define S390_TCG_TARGET_H
Alexander Graf28278222009-12-05 12:44:23 +010027
Richard Henderson8c081b12014-04-25 10:18:59 -040028#define TCG_TARGET_INSN_UNIT_SIZE 2
Paolo Bonzini006f8632015-05-05 09:18:22 +020029#define TCG_TARGET_TLB_DISPLACEMENT_BITS 19
Richard Henderson8c081b12014-04-25 10:18:59 -040030
Richard Henderson26a75d12021-03-09 23:30:38 -060031/* We have a +- 4GB range on the branches; leave some slop. */
32#define MAX_CODE_GEN_BUFFER_SIZE (3 * GiB)
33
Richard Henderson48bb3752010-06-28 19:15:37 -070034typedef enum TCGReg {
Richard Hendersoneee62512019-04-27 17:09:38 -070035 TCG_REG_R0, TCG_REG_R1, TCG_REG_R2, TCG_REG_R3,
36 TCG_REG_R4, TCG_REG_R5, TCG_REG_R6, TCG_REG_R7,
37 TCG_REG_R8, TCG_REG_R9, TCG_REG_R10, TCG_REG_R11,
38 TCG_REG_R12, TCG_REG_R13, TCG_REG_R14, TCG_REG_R15,
39
Richard Henderson34ef7672020-09-14 16:33:14 -070040 TCG_REG_V0 = 32, TCG_REG_V1, TCG_REG_V2, TCG_REG_V3,
41 TCG_REG_V4, TCG_REG_V5, TCG_REG_V6, TCG_REG_V7,
42 TCG_REG_V8, TCG_REG_V9, TCG_REG_V10, TCG_REG_V11,
43 TCG_REG_V12, TCG_REG_V13, TCG_REG_V14, TCG_REG_V15,
44 TCG_REG_V16, TCG_REG_V17, TCG_REG_V18, TCG_REG_V19,
45 TCG_REG_V20, TCG_REG_V21, TCG_REG_V22, TCG_REG_V23,
46 TCG_REG_V24, TCG_REG_V25, TCG_REG_V26, TCG_REG_V27,
47 TCG_REG_V28, TCG_REG_V29, TCG_REG_V30, TCG_REG_V31,
48
Richard Hendersoneee62512019-04-27 17:09:38 -070049 TCG_AREG0 = TCG_REG_R10,
50 TCG_REG_CALL_STACK = TCG_REG_R15
Richard Henderson48bb3752010-06-28 19:15:37 -070051} TCGReg;
52
Richard Henderson34ef7672020-09-14 16:33:14 -070053#define TCG_TARGET_NB_REGS 64
Alexander Graf28278222009-12-05 12:44:23 +010054
Richard Henderson761ea522022-12-07 16:08:46 +000055/* Facilities required for proper operation; checked at startup. */
Richard Hendersonb2c98d92016-10-17 11:24:38 -040056
Richard Henderson748b7f32019-04-27 16:51:09 -070057#define FACILITY_ZARCH_ACTIVE 2
58#define FACILITY_LONG_DISP 18
Richard Henderson761ea522022-12-07 16:08:46 +000059
60/* Facilities that are checked at runtime. */
61
Richard Henderson748b7f32019-04-27 16:51:09 -070062#define FACILITY_EXT_IMM 21
63#define FACILITY_GEN_INST_EXT 34
64#define FACILITY_LOAD_ON_COND 45
Richard Hendersonb2c98d92016-10-17 11:24:38 -040065#define FACILITY_FAST_BCR_SER FACILITY_LOAD_ON_COND
Richard Hendersonc2097132017-06-16 13:43:17 -070066#define FACILITY_DISTINCT_OPS FACILITY_LOAD_ON_COND
Richard Henderson748b7f32019-04-27 16:51:09 -070067#define FACILITY_LOAD_ON_COND2 53
Richard Henderson34ef7672020-09-14 16:33:14 -070068#define FACILITY_VECTOR 129
Richard Hendersonae77bbe2020-09-14 18:23:16 -070069#define FACILITY_VECTOR_ENH1 135
Richard Hendersonb2c98d92016-10-17 11:24:38 -040070
Richard Henderson34ef7672020-09-14 16:33:14 -070071extern uint64_t s390_facilities[3];
Richard Henderson748b7f32019-04-27 16:51:09 -070072
73#define HAVE_FACILITY(X) \
74 ((s390_facilities[FACILITY_##X / 64] >> (63 - FACILITY_##X % 64)) & 1)
Richard Hendersonb2c98d92016-10-17 11:24:38 -040075
Richard Henderson36828252010-02-18 14:44:39 -080076/* optional instructions */
Richard Hendersonb2c98d92016-10-17 11:24:38 -040077#define TCG_TARGET_HAS_div2_i32 1
78#define TCG_TARGET_HAS_rot_i32 1
79#define TCG_TARGET_HAS_ext8s_i32 1
80#define TCG_TARGET_HAS_ext16s_i32 1
81#define TCG_TARGET_HAS_ext8u_i32 1
82#define TCG_TARGET_HAS_ext16u_i32 1
83#define TCG_TARGET_HAS_bswap16_i32 1
84#define TCG_TARGET_HAS_bswap32_i32 1
85#define TCG_TARGET_HAS_not_i32 0
86#define TCG_TARGET_HAS_neg_i32 1
87#define TCG_TARGET_HAS_andc_i32 0
88#define TCG_TARGET_HAS_orc_i32 0
89#define TCG_TARGET_HAS_eqv_i32 0
90#define TCG_TARGET_HAS_nand_i32 0
91#define TCG_TARGET_HAS_nor_i32 0
Richard Henderson0e28d002016-11-16 09:23:28 +010092#define TCG_TARGET_HAS_clz_i32 0
93#define TCG_TARGET_HAS_ctz_i32 0
Richard Hendersona768e4e2016-11-21 11:13:39 +010094#define TCG_TARGET_HAS_ctpop_i32 0
Richard Henderson748b7f32019-04-27 16:51:09 -070095#define TCG_TARGET_HAS_deposit_i32 HAVE_FACILITY(GEN_INST_EXT)
96#define TCG_TARGET_HAS_extract_i32 HAVE_FACILITY(GEN_INST_EXT)
Richard Hendersonb2c98d92016-10-17 11:24:38 -040097#define TCG_TARGET_HAS_sextract_i32 0
Richard Hendersonfce12962019-02-25 10:29:25 -080098#define TCG_TARGET_HAS_extract2_i32 0
Richard Hendersonb2c98d92016-10-17 11:24:38 -040099#define TCG_TARGET_HAS_movcond_i32 1
100#define TCG_TARGET_HAS_add2_i32 1
101#define TCG_TARGET_HAS_sub2_i32 1
102#define TCG_TARGET_HAS_mulu2_i32 0
103#define TCG_TARGET_HAS_muls2_i32 0
104#define TCG_TARGET_HAS_muluh_i32 0
105#define TCG_TARGET_HAS_mulsh_i32 0
106#define TCG_TARGET_HAS_extrl_i64_i32 0
107#define TCG_TARGET_HAS_extrh_i64_i32 0
Richard Henderson6bd739e2022-12-07 18:47:39 +0000108#define TCG_TARGET_HAS_direct_jump 1
Richard Henderson07ce0b02020-12-09 13:58:39 -0600109#define TCG_TARGET_HAS_qemu_st8_i32 0
Richard Henderson36828252010-02-18 14:44:39 -0800110
Richard Hendersonb2c98d92016-10-17 11:24:38 -0400111#define TCG_TARGET_HAS_div2_i64 1
112#define TCG_TARGET_HAS_rot_i64 1
113#define TCG_TARGET_HAS_ext8s_i64 1
114#define TCG_TARGET_HAS_ext16s_i64 1
115#define TCG_TARGET_HAS_ext32s_i64 1
116#define TCG_TARGET_HAS_ext8u_i64 1
117#define TCG_TARGET_HAS_ext16u_i64 1
118#define TCG_TARGET_HAS_ext32u_i64 1
119#define TCG_TARGET_HAS_bswap16_i64 1
120#define TCG_TARGET_HAS_bswap32_i64 1
121#define TCG_TARGET_HAS_bswap64_i64 1
122#define TCG_TARGET_HAS_not_i64 0
123#define TCG_TARGET_HAS_neg_i64 1
124#define TCG_TARGET_HAS_andc_i64 0
125#define TCG_TARGET_HAS_orc_i64 0
126#define TCG_TARGET_HAS_eqv_i64 0
127#define TCG_TARGET_HAS_nand_i64 0
128#define TCG_TARGET_HAS_nor_i64 0
Richard Henderson748b7f32019-04-27 16:51:09 -0700129#define TCG_TARGET_HAS_clz_i64 HAVE_FACILITY(EXT_IMM)
Richard Henderson0e28d002016-11-16 09:23:28 +0100130#define TCG_TARGET_HAS_ctz_i64 0
Richard Hendersona768e4e2016-11-21 11:13:39 +0100131#define TCG_TARGET_HAS_ctpop_i64 0
Richard Henderson748b7f32019-04-27 16:51:09 -0700132#define TCG_TARGET_HAS_deposit_i64 HAVE_FACILITY(GEN_INST_EXT)
133#define TCG_TARGET_HAS_extract_i64 HAVE_FACILITY(GEN_INST_EXT)
Richard Hendersonb2c98d92016-10-17 11:24:38 -0400134#define TCG_TARGET_HAS_sextract_i64 0
Richard Hendersonfce12962019-02-25 10:29:25 -0800135#define TCG_TARGET_HAS_extract2_i64 0
Richard Hendersonb2c98d92016-10-17 11:24:38 -0400136#define TCG_TARGET_HAS_movcond_i64 1
137#define TCG_TARGET_HAS_add2_i64 1
138#define TCG_TARGET_HAS_sub2_i64 1
139#define TCG_TARGET_HAS_mulu2_i64 1
140#define TCG_TARGET_HAS_muls2_i64 0
141#define TCG_TARGET_HAS_muluh_i64 0
142#define TCG_TARGET_HAS_mulsh_i64 0
Richard Hendersond5690ea2013-03-27 09:30:58 -0400143
Richard Henderson34ef7672020-09-14 16:33:14 -0700144#define TCG_TARGET_HAS_v64 HAVE_FACILITY(VECTOR)
145#define TCG_TARGET_HAS_v128 HAVE_FACILITY(VECTOR)
146#define TCG_TARGET_HAS_v256 0
147
Richard Hendersonae77bbe2020-09-14 18:23:16 -0700148#define TCG_TARGET_HAS_andc_vec 1
149#define TCG_TARGET_HAS_orc_vec HAVE_FACILITY(VECTOR_ENH1)
Richard Henderson21eab5b2021-12-17 18:59:02 -0800150#define TCG_TARGET_HAS_nand_vec HAVE_FACILITY(VECTOR_ENH1)
151#define TCG_TARGET_HAS_nor_vec 1
152#define TCG_TARGET_HAS_eqv_vec HAVE_FACILITY(VECTOR_ENH1)
Richard Hendersonae77bbe2020-09-14 18:23:16 -0700153#define TCG_TARGET_HAS_not_vec 1
154#define TCG_TARGET_HAS_neg_vec 1
155#define TCG_TARGET_HAS_abs_vec 1
Richard Henderson22cb37b2020-09-14 19:00:38 -0700156#define TCG_TARGET_HAS_roti_vec 1
157#define TCG_TARGET_HAS_rots_vec 1
158#define TCG_TARGET_HAS_rotv_vec 1
159#define TCG_TARGET_HAS_shi_vec 1
160#define TCG_TARGET_HAS_shs_vec 1
161#define TCG_TARGET_HAS_shv_vec 1
Richard Henderson479b61c2020-09-14 18:33:47 -0700162#define TCG_TARGET_HAS_mul_vec 1
Richard Henderson34ef7672020-09-14 16:33:14 -0700163#define TCG_TARGET_HAS_sat_vec 0
Richard Henderson220db7a2020-09-14 19:07:16 -0700164#define TCG_TARGET_HAS_minmax_vec 1
Richard Henderson9bca9862020-09-14 20:36:36 -0700165#define TCG_TARGET_HAS_bitsel_vec 1
Richard Henderson34ef7672020-09-14 16:33:14 -0700166#define TCG_TARGET_HAS_cmpsel_vec 0
167
Alexander Graf28278222009-12-05 12:44:23 +0100168/* used for function call generation */
Alexander Graf28278222009-12-05 12:44:23 +0100169#define TCG_TARGET_STACK_ALIGN 8
Richard Hendersona4924e82013-03-25 20:54:30 -0700170#define TCG_TARGET_CALL_STACK_OFFSET 160
Richard Hendersoneb8b0222022-10-16 20:07:48 +1000171#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
Richard Hendersonc8eef962022-10-16 13:48:48 +1100172#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
Alexander Graf28278222009-12-05 12:44:23 +0100173
Richard Hendersone1dcf352018-11-20 08:37:42 +0100174#define TCG_TARGET_HAS_MEMORY_BSWAP 1
Richard Henderson2bece2c2010-06-14 17:35:27 -0700175
Pranith Kumar71650df2017-08-29 02:33:11 -0400176#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
177
Richard Henderson1acbad02020-10-28 23:30:21 -0700178static inline void tb_target_set_jmp_target(uintptr_t tc_ptr, uintptr_t jmp_rx,
179 uintptr_t jmp_rw, uintptr_t addr)
Richard Hendersona8583392017-07-31 22:02:31 -0700180{
181 /* patch the branch destination */
Richard Henderson1acbad02020-10-28 23:30:21 -0700182 intptr_t disp = addr - (jmp_rx - 2);
183 qatomic_set((int32_t *)jmp_rw, disp / 2);
Richard Hendersona8583392017-07-31 22:02:31 -0700184 /* no need to flush icache explicitly */
185}
186
Richard Henderson659ef5c2017-07-30 12:30:41 -0700187#define TCG_TARGET_NEED_LDST_LABELS
Richard Henderson28eef8a2017-07-31 19:16:02 -0700188#define TCG_TARGET_NEED_POOL_LABELS
Richard Henderson659ef5c2017-07-30 12:30:41 -0700189
Paolo Bonzinicb9c3772012-12-06 12:15:58 +0100190#endif