xref: /openbmc/qemu/tcg/s390x/tcg-target.h (revision 3704993f545efbe7b5a9ede83525f0d9c07cb31f)
1*3704993fSRichard Henderson /*
2*3704993fSRichard Henderson  * Tiny Code Generator for QEMU
3*3704993fSRichard Henderson  *
4*3704993fSRichard Henderson  * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
5*3704993fSRichard Henderson  *
6*3704993fSRichard Henderson  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*3704993fSRichard Henderson  * of this software and associated documentation files (the "Software"), to deal
8*3704993fSRichard Henderson  * in the Software without restriction, including without limitation the rights
9*3704993fSRichard Henderson  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10*3704993fSRichard Henderson  * copies of the Software, and to permit persons to whom the Software is
11*3704993fSRichard Henderson  * furnished to do so, subject to the following conditions:
12*3704993fSRichard Henderson  *
13*3704993fSRichard Henderson  * The above copyright notice and this permission notice shall be included in
14*3704993fSRichard Henderson  * all copies or substantial portions of the Software.
15*3704993fSRichard Henderson  *
16*3704993fSRichard Henderson  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*3704993fSRichard Henderson  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*3704993fSRichard Henderson  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*3704993fSRichard Henderson  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*3704993fSRichard Henderson  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*3704993fSRichard Henderson  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22*3704993fSRichard Henderson  * THE SOFTWARE.
23*3704993fSRichard Henderson  */
24*3704993fSRichard Henderson 
25*3704993fSRichard Henderson #ifndef S390_TCG_TARGET_H
26*3704993fSRichard Henderson #define S390_TCG_TARGET_H
27*3704993fSRichard Henderson 
28*3704993fSRichard Henderson #define TCG_TARGET_INSN_UNIT_SIZE 2
29*3704993fSRichard Henderson #define TCG_TARGET_TLB_DISPLACEMENT_BITS 19
30*3704993fSRichard Henderson 
31*3704993fSRichard Henderson /* We have a +- 4GB range on the branches; leave some slop.  */
32*3704993fSRichard Henderson #define MAX_CODE_GEN_BUFFER_SIZE  (3 * GiB)
33*3704993fSRichard Henderson 
34*3704993fSRichard Henderson typedef enum TCGReg {
35*3704993fSRichard Henderson     TCG_REG_R0 = 0,
36*3704993fSRichard Henderson     TCG_REG_R1,
37*3704993fSRichard Henderson     TCG_REG_R2,
38*3704993fSRichard Henderson     TCG_REG_R3,
39*3704993fSRichard Henderson     TCG_REG_R4,
40*3704993fSRichard Henderson     TCG_REG_R5,
41*3704993fSRichard Henderson     TCG_REG_R6,
42*3704993fSRichard Henderson     TCG_REG_R7,
43*3704993fSRichard Henderson     TCG_REG_R8,
44*3704993fSRichard Henderson     TCG_REG_R9,
45*3704993fSRichard Henderson     TCG_REG_R10,
46*3704993fSRichard Henderson     TCG_REG_R11,
47*3704993fSRichard Henderson     TCG_REG_R12,
48*3704993fSRichard Henderson     TCG_REG_R13,
49*3704993fSRichard Henderson     TCG_REG_R14,
50*3704993fSRichard Henderson     TCG_REG_R15
51*3704993fSRichard Henderson } TCGReg;
52*3704993fSRichard Henderson 
53*3704993fSRichard Henderson #define TCG_TARGET_NB_REGS 16
54*3704993fSRichard Henderson 
55*3704993fSRichard Henderson /* A list of relevant facilities used by this translator.  Some of these
56*3704993fSRichard Henderson    are required for proper operation, and these are checked at startup.  */
57*3704993fSRichard Henderson 
58*3704993fSRichard Henderson #define FACILITY_ZARCH_ACTIVE         (1ULL << (63 - 2))
59*3704993fSRichard Henderson #define FACILITY_LONG_DISP            (1ULL << (63 - 18))
60*3704993fSRichard Henderson #define FACILITY_EXT_IMM              (1ULL << (63 - 21))
61*3704993fSRichard Henderson #define FACILITY_GEN_INST_EXT         (1ULL << (63 - 34))
62*3704993fSRichard Henderson #define FACILITY_LOAD_ON_COND         (1ULL << (63 - 45))
63*3704993fSRichard Henderson #define FACILITY_FAST_BCR_SER         FACILITY_LOAD_ON_COND
64*3704993fSRichard Henderson #define FACILITY_DISTINCT_OPS         FACILITY_LOAD_ON_COND
65*3704993fSRichard Henderson #define FACILITY_LOAD_ON_COND2        (1ULL << (63 - 53))
66*3704993fSRichard Henderson 
67*3704993fSRichard Henderson extern uint64_t s390_facilities;
68*3704993fSRichard Henderson 
69*3704993fSRichard Henderson /* optional instructions */
70*3704993fSRichard Henderson #define TCG_TARGET_HAS_div2_i32       1
71*3704993fSRichard Henderson #define TCG_TARGET_HAS_rot_i32        1
72*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext8s_i32      1
73*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext16s_i32     1
74*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext8u_i32      1
75*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext16u_i32     1
76*3704993fSRichard Henderson #define TCG_TARGET_HAS_bswap16_i32    1
77*3704993fSRichard Henderson #define TCG_TARGET_HAS_bswap32_i32    1
78*3704993fSRichard Henderson #define TCG_TARGET_HAS_not_i32        0
79*3704993fSRichard Henderson #define TCG_TARGET_HAS_neg_i32        1
80*3704993fSRichard Henderson #define TCG_TARGET_HAS_andc_i32       0
81*3704993fSRichard Henderson #define TCG_TARGET_HAS_orc_i32        0
82*3704993fSRichard Henderson #define TCG_TARGET_HAS_eqv_i32        0
83*3704993fSRichard Henderson #define TCG_TARGET_HAS_nand_i32       0
84*3704993fSRichard Henderson #define TCG_TARGET_HAS_nor_i32        0
85*3704993fSRichard Henderson #define TCG_TARGET_HAS_clz_i32        0
86*3704993fSRichard Henderson #define TCG_TARGET_HAS_ctz_i32        0
87*3704993fSRichard Henderson #define TCG_TARGET_HAS_ctpop_i32      0
88*3704993fSRichard Henderson #define TCG_TARGET_HAS_deposit_i32    (s390_facilities & FACILITY_GEN_INST_EXT)
89*3704993fSRichard Henderson #define TCG_TARGET_HAS_extract_i32    (s390_facilities & FACILITY_GEN_INST_EXT)
90*3704993fSRichard Henderson #define TCG_TARGET_HAS_sextract_i32   0
91*3704993fSRichard Henderson #define TCG_TARGET_HAS_extract2_i32   0
92*3704993fSRichard Henderson #define TCG_TARGET_HAS_movcond_i32    1
93*3704993fSRichard Henderson #define TCG_TARGET_HAS_add2_i32       1
94*3704993fSRichard Henderson #define TCG_TARGET_HAS_sub2_i32       1
95*3704993fSRichard Henderson #define TCG_TARGET_HAS_mulu2_i32      0
96*3704993fSRichard Henderson #define TCG_TARGET_HAS_muls2_i32      0
97*3704993fSRichard Henderson #define TCG_TARGET_HAS_muluh_i32      0
98*3704993fSRichard Henderson #define TCG_TARGET_HAS_mulsh_i32      0
99*3704993fSRichard Henderson #define TCG_TARGET_HAS_extrl_i64_i32  0
100*3704993fSRichard Henderson #define TCG_TARGET_HAS_extrh_i64_i32  0
101*3704993fSRichard Henderson #define TCG_TARGET_HAS_direct_jump    (s390_facilities & FACILITY_GEN_INST_EXT)
102*3704993fSRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32   0
103*3704993fSRichard Henderson 
104*3704993fSRichard Henderson #define TCG_TARGET_HAS_div2_i64       1
105*3704993fSRichard Henderson #define TCG_TARGET_HAS_rot_i64        1
106*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext8s_i64      1
107*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext16s_i64     1
108*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext32s_i64     1
109*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext8u_i64      1
110*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext16u_i64     1
111*3704993fSRichard Henderson #define TCG_TARGET_HAS_ext32u_i64     1
112*3704993fSRichard Henderson #define TCG_TARGET_HAS_bswap16_i64    1
113*3704993fSRichard Henderson #define TCG_TARGET_HAS_bswap32_i64    1
114*3704993fSRichard Henderson #define TCG_TARGET_HAS_bswap64_i64    1
115*3704993fSRichard Henderson #define TCG_TARGET_HAS_not_i64        0
116*3704993fSRichard Henderson #define TCG_TARGET_HAS_neg_i64        1
117*3704993fSRichard Henderson #define TCG_TARGET_HAS_andc_i64       0
118*3704993fSRichard Henderson #define TCG_TARGET_HAS_orc_i64        0
119*3704993fSRichard Henderson #define TCG_TARGET_HAS_eqv_i64        0
120*3704993fSRichard Henderson #define TCG_TARGET_HAS_nand_i64       0
121*3704993fSRichard Henderson #define TCG_TARGET_HAS_nor_i64        0
122*3704993fSRichard Henderson #define TCG_TARGET_HAS_clz_i64        (s390_facilities & FACILITY_EXT_IMM)
123*3704993fSRichard Henderson #define TCG_TARGET_HAS_ctz_i64        0
124*3704993fSRichard Henderson #define TCG_TARGET_HAS_ctpop_i64      0
125*3704993fSRichard Henderson #define TCG_TARGET_HAS_deposit_i64    (s390_facilities & FACILITY_GEN_INST_EXT)
126*3704993fSRichard Henderson #define TCG_TARGET_HAS_extract_i64    (s390_facilities & FACILITY_GEN_INST_EXT)
127*3704993fSRichard Henderson #define TCG_TARGET_HAS_sextract_i64   0
128*3704993fSRichard Henderson #define TCG_TARGET_HAS_extract2_i64   0
129*3704993fSRichard Henderson #define TCG_TARGET_HAS_movcond_i64    1
130*3704993fSRichard Henderson #define TCG_TARGET_HAS_add2_i64       1
131*3704993fSRichard Henderson #define TCG_TARGET_HAS_sub2_i64       1
132*3704993fSRichard Henderson #define TCG_TARGET_HAS_mulu2_i64      1
133*3704993fSRichard Henderson #define TCG_TARGET_HAS_muls2_i64      0
134*3704993fSRichard Henderson #define TCG_TARGET_HAS_muluh_i64      0
135*3704993fSRichard Henderson #define TCG_TARGET_HAS_mulsh_i64      0
136*3704993fSRichard Henderson 
137*3704993fSRichard Henderson /* used for function call generation */
138*3704993fSRichard Henderson #define TCG_REG_CALL_STACK		TCG_REG_R15
139*3704993fSRichard Henderson #define TCG_TARGET_STACK_ALIGN		8
140*3704993fSRichard Henderson #define TCG_TARGET_CALL_STACK_OFFSET	160
141*3704993fSRichard Henderson 
142*3704993fSRichard Henderson #define TCG_TARGET_EXTEND_ARGS 1
143*3704993fSRichard Henderson #define TCG_TARGET_HAS_MEMORY_BSWAP   1
144*3704993fSRichard Henderson 
145*3704993fSRichard Henderson #define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
146*3704993fSRichard Henderson 
147*3704993fSRichard Henderson enum {
148*3704993fSRichard Henderson     TCG_AREG0 = TCG_REG_R10,
149*3704993fSRichard Henderson };
150*3704993fSRichard Henderson 
151*3704993fSRichard Henderson static inline void tb_target_set_jmp_target(uintptr_t tc_ptr, uintptr_t jmp_rx,
152*3704993fSRichard Henderson                                             uintptr_t jmp_rw, uintptr_t addr)
153*3704993fSRichard Henderson {
154*3704993fSRichard Henderson     /* patch the branch destination */
155*3704993fSRichard Henderson     intptr_t disp = addr - (jmp_rx - 2);
156*3704993fSRichard Henderson     qatomic_set((int32_t *)jmp_rw, disp / 2);
157*3704993fSRichard Henderson     /* no need to flush icache explicitly */
158*3704993fSRichard Henderson }
159*3704993fSRichard Henderson 
160*3704993fSRichard Henderson #ifdef CONFIG_SOFTMMU
161*3704993fSRichard Henderson #define TCG_TARGET_NEED_LDST_LABELS
162*3704993fSRichard Henderson #endif
163*3704993fSRichard Henderson #define TCG_TARGET_NEED_POOL_LABELS
164*3704993fSRichard Henderson 
165*3704993fSRichard Henderson #endif
166