xref: /qemu/include/tcg/tcg-op-common.h (revision ad3d0e4d)
1*ad3d0e4dSRichard Henderson /* SPDX-License-Identifier: MIT */
2*ad3d0e4dSRichard Henderson /*
3*ad3d0e4dSRichard Henderson  * Target independent opcode generation functions.
4*ad3d0e4dSRichard Henderson  *
5*ad3d0e4dSRichard Henderson  * Copyright (c) 2008 Fabrice Bellard
6*ad3d0e4dSRichard Henderson  */
7*ad3d0e4dSRichard Henderson 
8*ad3d0e4dSRichard Henderson #ifndef TCG_TCG_OP_COMMON_H
9*ad3d0e4dSRichard Henderson #define TCG_TCG_OP_COMMON_H
10*ad3d0e4dSRichard Henderson 
11*ad3d0e4dSRichard Henderson #include "tcg/tcg.h"
12*ad3d0e4dSRichard Henderson #include "exec/helper-proto.h"
13*ad3d0e4dSRichard Henderson #include "exec/helper-gen.h"
14*ad3d0e4dSRichard Henderson 
15*ad3d0e4dSRichard Henderson /* Basic output routines.  Not for general consumption.  */
16*ad3d0e4dSRichard Henderson 
17*ad3d0e4dSRichard Henderson void tcg_gen_op1(TCGOpcode, TCGArg);
18*ad3d0e4dSRichard Henderson void tcg_gen_op2(TCGOpcode, TCGArg, TCGArg);
19*ad3d0e4dSRichard Henderson void tcg_gen_op3(TCGOpcode, TCGArg, TCGArg, TCGArg);
20*ad3d0e4dSRichard Henderson void tcg_gen_op4(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg);
21*ad3d0e4dSRichard Henderson void tcg_gen_op5(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
22*ad3d0e4dSRichard Henderson void tcg_gen_op6(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
23*ad3d0e4dSRichard Henderson 
24*ad3d0e4dSRichard Henderson void vec_gen_2(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg);
25*ad3d0e4dSRichard Henderson void vec_gen_3(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg);
26*ad3d0e4dSRichard Henderson void vec_gen_4(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg, TCGArg);
27*ad3d0e4dSRichard Henderson 
28*ad3d0e4dSRichard Henderson static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 a1)
29*ad3d0e4dSRichard Henderson {
30*ad3d0e4dSRichard Henderson     tcg_gen_op1(opc, tcgv_i32_arg(a1));
31*ad3d0e4dSRichard Henderson }
32*ad3d0e4dSRichard Henderson 
33*ad3d0e4dSRichard Henderson static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 a1)
34*ad3d0e4dSRichard Henderson {
35*ad3d0e4dSRichard Henderson     tcg_gen_op1(opc, tcgv_i64_arg(a1));
36*ad3d0e4dSRichard Henderson }
37*ad3d0e4dSRichard Henderson 
38*ad3d0e4dSRichard Henderson static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg a1)
39*ad3d0e4dSRichard Henderson {
40*ad3d0e4dSRichard Henderson     tcg_gen_op1(opc, a1);
41*ad3d0e4dSRichard Henderson }
42*ad3d0e4dSRichard Henderson 
43*ad3d0e4dSRichard Henderson static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2)
44*ad3d0e4dSRichard Henderson {
45*ad3d0e4dSRichard Henderson     tcg_gen_op2(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2));
46*ad3d0e4dSRichard Henderson }
47*ad3d0e4dSRichard Henderson 
48*ad3d0e4dSRichard Henderson static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2)
49*ad3d0e4dSRichard Henderson {
50*ad3d0e4dSRichard Henderson     tcg_gen_op2(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2));
51*ad3d0e4dSRichard Henderson }
52*ad3d0e4dSRichard Henderson 
53*ad3d0e4dSRichard Henderson static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 a1, TCGArg a2)
54*ad3d0e4dSRichard Henderson {
55*ad3d0e4dSRichard Henderson     tcg_gen_op2(opc, tcgv_i32_arg(a1), a2);
56*ad3d0e4dSRichard Henderson }
57*ad3d0e4dSRichard Henderson 
58*ad3d0e4dSRichard Henderson static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 a1, TCGArg a2)
59*ad3d0e4dSRichard Henderson {
60*ad3d0e4dSRichard Henderson     tcg_gen_op2(opc, tcgv_i64_arg(a1), a2);
61*ad3d0e4dSRichard Henderson }
62*ad3d0e4dSRichard Henderson 
63*ad3d0e4dSRichard Henderson static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg a1, TCGArg a2)
64*ad3d0e4dSRichard Henderson {
65*ad3d0e4dSRichard Henderson     tcg_gen_op2(opc, a1, a2);
66*ad3d0e4dSRichard Henderson }
67*ad3d0e4dSRichard Henderson 
68*ad3d0e4dSRichard Henderson static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 a1,
69*ad3d0e4dSRichard Henderson                                    TCGv_i32 a2, TCGv_i32 a3)
70*ad3d0e4dSRichard Henderson {
71*ad3d0e4dSRichard Henderson     tcg_gen_op3(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), tcgv_i32_arg(a3));
72*ad3d0e4dSRichard Henderson }
73*ad3d0e4dSRichard Henderson 
74*ad3d0e4dSRichard Henderson static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 a1,
75*ad3d0e4dSRichard Henderson                                    TCGv_i64 a2, TCGv_i64 a3)
76*ad3d0e4dSRichard Henderson {
77*ad3d0e4dSRichard Henderson     tcg_gen_op3(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), tcgv_i64_arg(a3));
78*ad3d0e4dSRichard Henderson }
79*ad3d0e4dSRichard Henderson 
80*ad3d0e4dSRichard Henderson static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 a1,
81*ad3d0e4dSRichard Henderson                                     TCGv_i32 a2, TCGArg a3)
82*ad3d0e4dSRichard Henderson {
83*ad3d0e4dSRichard Henderson     tcg_gen_op3(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3);
84*ad3d0e4dSRichard Henderson }
85*ad3d0e4dSRichard Henderson 
86*ad3d0e4dSRichard Henderson static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 a1,
87*ad3d0e4dSRichard Henderson                                     TCGv_i64 a2, TCGArg a3)
88*ad3d0e4dSRichard Henderson {
89*ad3d0e4dSRichard Henderson     tcg_gen_op3(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3);
90*ad3d0e4dSRichard Henderson }
91*ad3d0e4dSRichard Henderson 
92*ad3d0e4dSRichard Henderson static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
93*ad3d0e4dSRichard Henderson                                        TCGv_ptr base, TCGArg offset)
94*ad3d0e4dSRichard Henderson {
95*ad3d0e4dSRichard Henderson     tcg_gen_op3(opc, tcgv_i32_arg(val), tcgv_ptr_arg(base), offset);
96*ad3d0e4dSRichard Henderson }
97*ad3d0e4dSRichard Henderson 
98*ad3d0e4dSRichard Henderson static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
99*ad3d0e4dSRichard Henderson                                        TCGv_ptr base, TCGArg offset)
100*ad3d0e4dSRichard Henderson {
101*ad3d0e4dSRichard Henderson     tcg_gen_op3(opc, tcgv_i64_arg(val), tcgv_ptr_arg(base), offset);
102*ad3d0e4dSRichard Henderson }
103*ad3d0e4dSRichard Henderson 
104*ad3d0e4dSRichard Henderson static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
105*ad3d0e4dSRichard Henderson                                    TCGv_i32 a3, TCGv_i32 a4)
106*ad3d0e4dSRichard Henderson {
107*ad3d0e4dSRichard Henderson     tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
108*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), tcgv_i32_arg(a4));
109*ad3d0e4dSRichard Henderson }
110*ad3d0e4dSRichard Henderson 
111*ad3d0e4dSRichard Henderson static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
112*ad3d0e4dSRichard Henderson                                    TCGv_i64 a3, TCGv_i64 a4)
113*ad3d0e4dSRichard Henderson {
114*ad3d0e4dSRichard Henderson     tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
115*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), tcgv_i64_arg(a4));
116*ad3d0e4dSRichard Henderson }
117*ad3d0e4dSRichard Henderson 
118*ad3d0e4dSRichard Henderson static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
119*ad3d0e4dSRichard Henderson                                     TCGv_i32 a3, TCGArg a4)
120*ad3d0e4dSRichard Henderson {
121*ad3d0e4dSRichard Henderson     tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
122*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), a4);
123*ad3d0e4dSRichard Henderson }
124*ad3d0e4dSRichard Henderson 
125*ad3d0e4dSRichard Henderson static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
126*ad3d0e4dSRichard Henderson                                     TCGv_i64 a3, TCGArg a4)
127*ad3d0e4dSRichard Henderson {
128*ad3d0e4dSRichard Henderson     tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
129*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), a4);
130*ad3d0e4dSRichard Henderson }
131*ad3d0e4dSRichard Henderson 
132*ad3d0e4dSRichard Henderson static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
133*ad3d0e4dSRichard Henderson                                      TCGArg a3, TCGArg a4)
134*ad3d0e4dSRichard Henderson {
135*ad3d0e4dSRichard Henderson     tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3, a4);
136*ad3d0e4dSRichard Henderson }
137*ad3d0e4dSRichard Henderson 
138*ad3d0e4dSRichard Henderson static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
139*ad3d0e4dSRichard Henderson                                      TCGArg a3, TCGArg a4)
140*ad3d0e4dSRichard Henderson {
141*ad3d0e4dSRichard Henderson     tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3, a4);
142*ad3d0e4dSRichard Henderson }
143*ad3d0e4dSRichard Henderson 
144*ad3d0e4dSRichard Henderson static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
145*ad3d0e4dSRichard Henderson                                    TCGv_i32 a3, TCGv_i32 a4, TCGv_i32 a5)
146*ad3d0e4dSRichard Henderson {
147*ad3d0e4dSRichard Henderson     tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
148*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5));
149*ad3d0e4dSRichard Henderson }
150*ad3d0e4dSRichard Henderson 
151*ad3d0e4dSRichard Henderson static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
152*ad3d0e4dSRichard Henderson                                    TCGv_i64 a3, TCGv_i64 a4, TCGv_i64 a5)
153*ad3d0e4dSRichard Henderson {
154*ad3d0e4dSRichard Henderson     tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
155*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5));
156*ad3d0e4dSRichard Henderson }
157*ad3d0e4dSRichard Henderson 
158*ad3d0e4dSRichard Henderson static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
159*ad3d0e4dSRichard Henderson                                     TCGv_i32 a3, TCGv_i32 a4, TCGArg a5)
160*ad3d0e4dSRichard Henderson {
161*ad3d0e4dSRichard Henderson     tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
162*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), tcgv_i32_arg(a4), a5);
163*ad3d0e4dSRichard Henderson }
164*ad3d0e4dSRichard Henderson 
165*ad3d0e4dSRichard Henderson static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
166*ad3d0e4dSRichard Henderson                                     TCGv_i64 a3, TCGv_i64 a4, TCGArg a5)
167*ad3d0e4dSRichard Henderson {
168*ad3d0e4dSRichard Henderson     tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
169*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), tcgv_i64_arg(a4), a5);
170*ad3d0e4dSRichard Henderson }
171*ad3d0e4dSRichard Henderson 
172*ad3d0e4dSRichard Henderson static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
173*ad3d0e4dSRichard Henderson                                      TCGv_i32 a3, TCGArg a4, TCGArg a5)
174*ad3d0e4dSRichard Henderson {
175*ad3d0e4dSRichard Henderson     tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
176*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), a4, a5);
177*ad3d0e4dSRichard Henderson }
178*ad3d0e4dSRichard Henderson 
179*ad3d0e4dSRichard Henderson static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
180*ad3d0e4dSRichard Henderson                                      TCGv_i64 a3, TCGArg a4, TCGArg a5)
181*ad3d0e4dSRichard Henderson {
182*ad3d0e4dSRichard Henderson     tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
183*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), a4, a5);
184*ad3d0e4dSRichard Henderson }
185*ad3d0e4dSRichard Henderson 
186*ad3d0e4dSRichard Henderson static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
187*ad3d0e4dSRichard Henderson                                    TCGv_i32 a3, TCGv_i32 a4,
188*ad3d0e4dSRichard Henderson                                    TCGv_i32 a5, TCGv_i32 a6)
189*ad3d0e4dSRichard Henderson {
190*ad3d0e4dSRichard Henderson     tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
191*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5),
192*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a6));
193*ad3d0e4dSRichard Henderson }
194*ad3d0e4dSRichard Henderson 
195*ad3d0e4dSRichard Henderson static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
196*ad3d0e4dSRichard Henderson                                    TCGv_i64 a3, TCGv_i64 a4,
197*ad3d0e4dSRichard Henderson                                    TCGv_i64 a5, TCGv_i64 a6)
198*ad3d0e4dSRichard Henderson {
199*ad3d0e4dSRichard Henderson     tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
200*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5),
201*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a6));
202*ad3d0e4dSRichard Henderson }
203*ad3d0e4dSRichard Henderson 
204*ad3d0e4dSRichard Henderson static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
205*ad3d0e4dSRichard Henderson                                     TCGv_i32 a3, TCGv_i32 a4,
206*ad3d0e4dSRichard Henderson                                     TCGv_i32 a5, TCGArg a6)
207*ad3d0e4dSRichard Henderson {
208*ad3d0e4dSRichard Henderson     tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
209*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5), a6);
210*ad3d0e4dSRichard Henderson }
211*ad3d0e4dSRichard Henderson 
212*ad3d0e4dSRichard Henderson static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
213*ad3d0e4dSRichard Henderson                                     TCGv_i64 a3, TCGv_i64 a4,
214*ad3d0e4dSRichard Henderson                                     TCGv_i64 a5, TCGArg a6)
215*ad3d0e4dSRichard Henderson {
216*ad3d0e4dSRichard Henderson     tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
217*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5), a6);
218*ad3d0e4dSRichard Henderson }
219*ad3d0e4dSRichard Henderson 
220*ad3d0e4dSRichard Henderson static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
221*ad3d0e4dSRichard Henderson                                      TCGv_i32 a3, TCGv_i32 a4,
222*ad3d0e4dSRichard Henderson                                      TCGArg a5, TCGArg a6)
223*ad3d0e4dSRichard Henderson {
224*ad3d0e4dSRichard Henderson     tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
225*ad3d0e4dSRichard Henderson                 tcgv_i32_arg(a3), tcgv_i32_arg(a4), a5, a6);
226*ad3d0e4dSRichard Henderson }
227*ad3d0e4dSRichard Henderson 
228*ad3d0e4dSRichard Henderson static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
229*ad3d0e4dSRichard Henderson                                      TCGv_i64 a3, TCGv_i64 a4,
230*ad3d0e4dSRichard Henderson                                      TCGArg a5, TCGArg a6)
231*ad3d0e4dSRichard Henderson {
232*ad3d0e4dSRichard Henderson     tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
233*ad3d0e4dSRichard Henderson                 tcgv_i64_arg(a3), tcgv_i64_arg(a4), a5, a6);
234*ad3d0e4dSRichard Henderson }
235*ad3d0e4dSRichard Henderson 
236*ad3d0e4dSRichard Henderson 
237*ad3d0e4dSRichard Henderson /* Generic ops.  */
238*ad3d0e4dSRichard Henderson 
239*ad3d0e4dSRichard Henderson static inline void gen_set_label(TCGLabel *l)
240*ad3d0e4dSRichard Henderson {
241*ad3d0e4dSRichard Henderson     l->present = 1;
242*ad3d0e4dSRichard Henderson     tcg_gen_op1(INDEX_op_set_label, label_arg(l));
243*ad3d0e4dSRichard Henderson }
244*ad3d0e4dSRichard Henderson 
245*ad3d0e4dSRichard Henderson void tcg_gen_br(TCGLabel *l);
246*ad3d0e4dSRichard Henderson void tcg_gen_mb(TCGBar);
247*ad3d0e4dSRichard Henderson 
248*ad3d0e4dSRichard Henderson /**
249*ad3d0e4dSRichard Henderson  * tcg_gen_exit_tb() - output exit_tb TCG operation
250*ad3d0e4dSRichard Henderson  * @tb: The TranslationBlock from which we are exiting
251*ad3d0e4dSRichard Henderson  * @idx: Direct jump slot index, or exit request
252*ad3d0e4dSRichard Henderson  *
253*ad3d0e4dSRichard Henderson  * See tcg/README for more info about this TCG operation.
254*ad3d0e4dSRichard Henderson  * See also tcg.h and the block comment above TB_EXIT_MASK.
255*ad3d0e4dSRichard Henderson  *
256*ad3d0e4dSRichard Henderson  * For a normal exit from the TB, back to the main loop, @tb should
257*ad3d0e4dSRichard Henderson  * be NULL and @idx should be 0.  Otherwise, @tb should be valid and
258*ad3d0e4dSRichard Henderson  * @idx should be one of the TB_EXIT_ values.
259*ad3d0e4dSRichard Henderson  */
260*ad3d0e4dSRichard Henderson void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx);
261*ad3d0e4dSRichard Henderson 
262*ad3d0e4dSRichard Henderson /**
263*ad3d0e4dSRichard Henderson  * tcg_gen_goto_tb() - output goto_tb TCG operation
264*ad3d0e4dSRichard Henderson  * @idx: Direct jump slot index (0 or 1)
265*ad3d0e4dSRichard Henderson  *
266*ad3d0e4dSRichard Henderson  * See tcg/README for more info about this TCG operation.
267*ad3d0e4dSRichard Henderson  *
268*ad3d0e4dSRichard Henderson  * NOTE: In softmmu emulation, direct jumps with goto_tb are only safe within
269*ad3d0e4dSRichard Henderson  * the pages this TB resides in because we don't take care of direct jumps when
270*ad3d0e4dSRichard Henderson  * address mapping changes, e.g. in tlb_flush(). In user mode, there's only a
271*ad3d0e4dSRichard Henderson  * static address translation, so the destination address is always valid, TBs
272*ad3d0e4dSRichard Henderson  * are always invalidated properly, and direct jumps are reset when mapping
273*ad3d0e4dSRichard Henderson  * changes.
274*ad3d0e4dSRichard Henderson  */
275*ad3d0e4dSRichard Henderson void tcg_gen_goto_tb(unsigned idx);
276*ad3d0e4dSRichard Henderson 
277*ad3d0e4dSRichard Henderson /**
278*ad3d0e4dSRichard Henderson  * tcg_gen_lookup_and_goto_ptr() - look up the current TB, jump to it if valid
279*ad3d0e4dSRichard Henderson  * @addr: Guest address of the target TB
280*ad3d0e4dSRichard Henderson  *
281*ad3d0e4dSRichard Henderson  * If the TB is not valid, jump to the epilogue.
282*ad3d0e4dSRichard Henderson  *
283*ad3d0e4dSRichard Henderson  * This operation is optional. If the TCG backend does not implement goto_ptr,
284*ad3d0e4dSRichard Henderson  * this op is equivalent to calling tcg_gen_exit_tb() with 0 as the argument.
285*ad3d0e4dSRichard Henderson  */
286*ad3d0e4dSRichard Henderson void tcg_gen_lookup_and_goto_ptr(void);
287*ad3d0e4dSRichard Henderson 
288*ad3d0e4dSRichard Henderson static inline void tcg_gen_plugin_cb_start(unsigned from, unsigned type,
289*ad3d0e4dSRichard Henderson                                            unsigned wr)
290*ad3d0e4dSRichard Henderson {
291*ad3d0e4dSRichard Henderson     tcg_gen_op3(INDEX_op_plugin_cb_start, from, type, wr);
292*ad3d0e4dSRichard Henderson }
293*ad3d0e4dSRichard Henderson 
294*ad3d0e4dSRichard Henderson static inline void tcg_gen_plugin_cb_end(void)
295*ad3d0e4dSRichard Henderson {
296*ad3d0e4dSRichard Henderson     tcg_emit_op(INDEX_op_plugin_cb_end, 0);
297*ad3d0e4dSRichard Henderson }
298*ad3d0e4dSRichard Henderson 
299*ad3d0e4dSRichard Henderson /* 32 bit ops */
300*ad3d0e4dSRichard Henderson 
301*ad3d0e4dSRichard Henderson void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg);
302*ad3d0e4dSRichard Henderson void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
303*ad3d0e4dSRichard Henderson void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2);
304*ad3d0e4dSRichard Henderson void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
305*ad3d0e4dSRichard Henderson void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
306*ad3d0e4dSRichard Henderson void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
307*ad3d0e4dSRichard Henderson void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
308*ad3d0e4dSRichard Henderson void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
309*ad3d0e4dSRichard Henderson void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
310*ad3d0e4dSRichard Henderson void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
311*ad3d0e4dSRichard Henderson void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
312*ad3d0e4dSRichard Henderson void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
313*ad3d0e4dSRichard Henderson void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
314*ad3d0e4dSRichard Henderson void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
315*ad3d0e4dSRichard Henderson void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
316*ad3d0e4dSRichard Henderson void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
317*ad3d0e4dSRichard Henderson void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
318*ad3d0e4dSRichard Henderson void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
319*ad3d0e4dSRichard Henderson void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
320*ad3d0e4dSRichard Henderson void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
321*ad3d0e4dSRichard Henderson void tcg_gen_clz_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
322*ad3d0e4dSRichard Henderson void tcg_gen_ctz_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
323*ad3d0e4dSRichard Henderson void tcg_gen_clzi_i32(TCGv_i32 ret, TCGv_i32 arg1, uint32_t arg2);
324*ad3d0e4dSRichard Henderson void tcg_gen_ctzi_i32(TCGv_i32 ret, TCGv_i32 arg1, uint32_t arg2);
325*ad3d0e4dSRichard Henderson void tcg_gen_clrsb_i32(TCGv_i32 ret, TCGv_i32 arg);
326*ad3d0e4dSRichard Henderson void tcg_gen_ctpop_i32(TCGv_i32 a1, TCGv_i32 a2);
327*ad3d0e4dSRichard Henderson void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
328*ad3d0e4dSRichard Henderson void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
329*ad3d0e4dSRichard Henderson void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2);
330*ad3d0e4dSRichard Henderson void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2);
331*ad3d0e4dSRichard Henderson void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2,
332*ad3d0e4dSRichard Henderson                          unsigned int ofs, unsigned int len);
333*ad3d0e4dSRichard Henderson void tcg_gen_deposit_z_i32(TCGv_i32 ret, TCGv_i32 arg,
334*ad3d0e4dSRichard Henderson                            unsigned int ofs, unsigned int len);
335*ad3d0e4dSRichard Henderson void tcg_gen_extract_i32(TCGv_i32 ret, TCGv_i32 arg,
336*ad3d0e4dSRichard Henderson                          unsigned int ofs, unsigned int len);
337*ad3d0e4dSRichard Henderson void tcg_gen_sextract_i32(TCGv_i32 ret, TCGv_i32 arg,
338*ad3d0e4dSRichard Henderson                           unsigned int ofs, unsigned int len);
339*ad3d0e4dSRichard Henderson void tcg_gen_extract2_i32(TCGv_i32 ret, TCGv_i32 al, TCGv_i32 ah,
340*ad3d0e4dSRichard Henderson                           unsigned int ofs);
341*ad3d0e4dSRichard Henderson void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1, TCGv_i32 arg2, TCGLabel *);
342*ad3d0e4dSRichard Henderson void tcg_gen_brcondi_i32(TCGCond cond, TCGv_i32 arg1, int32_t arg2, TCGLabel *);
343*ad3d0e4dSRichard Henderson void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret,
344*ad3d0e4dSRichard Henderson                          TCGv_i32 arg1, TCGv_i32 arg2);
345*ad3d0e4dSRichard Henderson void tcg_gen_setcondi_i32(TCGCond cond, TCGv_i32 ret,
346*ad3d0e4dSRichard Henderson                           TCGv_i32 arg1, int32_t arg2);
347*ad3d0e4dSRichard Henderson void tcg_gen_movcond_i32(TCGCond cond, TCGv_i32 ret, TCGv_i32 c1,
348*ad3d0e4dSRichard Henderson                          TCGv_i32 c2, TCGv_i32 v1, TCGv_i32 v2);
349*ad3d0e4dSRichard Henderson void tcg_gen_add2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al,
350*ad3d0e4dSRichard Henderson                       TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh);
351*ad3d0e4dSRichard Henderson void tcg_gen_sub2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al,
352*ad3d0e4dSRichard Henderson                       TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh);
353*ad3d0e4dSRichard Henderson void tcg_gen_mulu2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 arg2);
354*ad3d0e4dSRichard Henderson void tcg_gen_muls2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 arg2);
355*ad3d0e4dSRichard Henderson void tcg_gen_mulsu2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 arg2);
356*ad3d0e4dSRichard Henderson void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg);
357*ad3d0e4dSRichard Henderson void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg);
358*ad3d0e4dSRichard Henderson void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg);
359*ad3d0e4dSRichard Henderson void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg);
360*ad3d0e4dSRichard Henderson void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg, int flags);
361*ad3d0e4dSRichard Henderson void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg);
362*ad3d0e4dSRichard Henderson void tcg_gen_hswap_i32(TCGv_i32 ret, TCGv_i32 arg);
363*ad3d0e4dSRichard Henderson void tcg_gen_smin_i32(TCGv_i32, TCGv_i32 arg1, TCGv_i32 arg2);
364*ad3d0e4dSRichard Henderson void tcg_gen_smax_i32(TCGv_i32, TCGv_i32 arg1, TCGv_i32 arg2);
365*ad3d0e4dSRichard Henderson void tcg_gen_umin_i32(TCGv_i32, TCGv_i32 arg1, TCGv_i32 arg2);
366*ad3d0e4dSRichard Henderson void tcg_gen_umax_i32(TCGv_i32, TCGv_i32 arg1, TCGv_i32 arg2);
367*ad3d0e4dSRichard Henderson void tcg_gen_abs_i32(TCGv_i32, TCGv_i32);
368*ad3d0e4dSRichard Henderson 
369*ad3d0e4dSRichard Henderson /* Replicate a value of size @vece from @in to all the lanes in @out */
370*ad3d0e4dSRichard Henderson void tcg_gen_dup_i32(unsigned vece, TCGv_i32 out, TCGv_i32 in);
371*ad3d0e4dSRichard Henderson 
372*ad3d0e4dSRichard Henderson static inline void tcg_gen_discard_i32(TCGv_i32 arg)
373*ad3d0e4dSRichard Henderson {
374*ad3d0e4dSRichard Henderson     tcg_gen_op1_i32(INDEX_op_discard, arg);
375*ad3d0e4dSRichard Henderson }
376*ad3d0e4dSRichard Henderson 
377*ad3d0e4dSRichard Henderson static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
378*ad3d0e4dSRichard Henderson {
379*ad3d0e4dSRichard Henderson     if (ret != arg) {
380*ad3d0e4dSRichard Henderson         tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
381*ad3d0e4dSRichard Henderson     }
382*ad3d0e4dSRichard Henderson }
383*ad3d0e4dSRichard Henderson 
384*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2,
385*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
386*ad3d0e4dSRichard Henderson {
387*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
388*ad3d0e4dSRichard Henderson }
389*ad3d0e4dSRichard Henderson 
390*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2,
391*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
392*ad3d0e4dSRichard Henderson {
393*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
394*ad3d0e4dSRichard Henderson }
395*ad3d0e4dSRichard Henderson 
396*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2,
397*ad3d0e4dSRichard Henderson                                      tcg_target_long offset)
398*ad3d0e4dSRichard Henderson {
399*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
400*ad3d0e4dSRichard Henderson }
401*ad3d0e4dSRichard Henderson 
402*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2,
403*ad3d0e4dSRichard Henderson                                      tcg_target_long offset)
404*ad3d0e4dSRichard Henderson {
405*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
406*ad3d0e4dSRichard Henderson }
407*ad3d0e4dSRichard Henderson 
408*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2,
409*ad3d0e4dSRichard Henderson                                   tcg_target_long offset)
410*ad3d0e4dSRichard Henderson {
411*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
412*ad3d0e4dSRichard Henderson }
413*ad3d0e4dSRichard Henderson 
414*ad3d0e4dSRichard Henderson static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2,
415*ad3d0e4dSRichard Henderson                                    tcg_target_long offset)
416*ad3d0e4dSRichard Henderson {
417*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
418*ad3d0e4dSRichard Henderson }
419*ad3d0e4dSRichard Henderson 
420*ad3d0e4dSRichard Henderson static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2,
421*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
422*ad3d0e4dSRichard Henderson {
423*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
424*ad3d0e4dSRichard Henderson }
425*ad3d0e4dSRichard Henderson 
426*ad3d0e4dSRichard Henderson static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2,
427*ad3d0e4dSRichard Henderson                                   tcg_target_long offset)
428*ad3d0e4dSRichard Henderson {
429*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
430*ad3d0e4dSRichard Henderson }
431*ad3d0e4dSRichard Henderson 
432*ad3d0e4dSRichard Henderson static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
433*ad3d0e4dSRichard Henderson {
434*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
435*ad3d0e4dSRichard Henderson }
436*ad3d0e4dSRichard Henderson 
437*ad3d0e4dSRichard Henderson static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
438*ad3d0e4dSRichard Henderson {
439*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
440*ad3d0e4dSRichard Henderson }
441*ad3d0e4dSRichard Henderson 
442*ad3d0e4dSRichard Henderson static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
443*ad3d0e4dSRichard Henderson {
444*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
445*ad3d0e4dSRichard Henderson }
446*ad3d0e4dSRichard Henderson 
447*ad3d0e4dSRichard Henderson static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
448*ad3d0e4dSRichard Henderson {
449*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
450*ad3d0e4dSRichard Henderson }
451*ad3d0e4dSRichard Henderson 
452*ad3d0e4dSRichard Henderson static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
453*ad3d0e4dSRichard Henderson {
454*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
455*ad3d0e4dSRichard Henderson }
456*ad3d0e4dSRichard Henderson 
457*ad3d0e4dSRichard Henderson static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
458*ad3d0e4dSRichard Henderson {
459*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
460*ad3d0e4dSRichard Henderson }
461*ad3d0e4dSRichard Henderson 
462*ad3d0e4dSRichard Henderson static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
463*ad3d0e4dSRichard Henderson {
464*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
465*ad3d0e4dSRichard Henderson }
466*ad3d0e4dSRichard Henderson 
467*ad3d0e4dSRichard Henderson static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
468*ad3d0e4dSRichard Henderson {
469*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
470*ad3d0e4dSRichard Henderson }
471*ad3d0e4dSRichard Henderson 
472*ad3d0e4dSRichard Henderson static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
473*ad3d0e4dSRichard Henderson {
474*ad3d0e4dSRichard Henderson     tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
475*ad3d0e4dSRichard Henderson }
476*ad3d0e4dSRichard Henderson 
477*ad3d0e4dSRichard Henderson static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
478*ad3d0e4dSRichard Henderson {
479*ad3d0e4dSRichard Henderson     if (TCG_TARGET_HAS_neg_i32) {
480*ad3d0e4dSRichard Henderson         tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
481*ad3d0e4dSRichard Henderson     } else {
482*ad3d0e4dSRichard Henderson         tcg_gen_subfi_i32(ret, 0, arg);
483*ad3d0e4dSRichard Henderson     }
484*ad3d0e4dSRichard Henderson }
485*ad3d0e4dSRichard Henderson 
486*ad3d0e4dSRichard Henderson static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
487*ad3d0e4dSRichard Henderson {
488*ad3d0e4dSRichard Henderson     if (TCG_TARGET_HAS_not_i32) {
489*ad3d0e4dSRichard Henderson         tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
490*ad3d0e4dSRichard Henderson     } else {
491*ad3d0e4dSRichard Henderson         tcg_gen_xori_i32(ret, arg, -1);
492*ad3d0e4dSRichard Henderson     }
493*ad3d0e4dSRichard Henderson }
494*ad3d0e4dSRichard Henderson 
495*ad3d0e4dSRichard Henderson /* 64 bit ops */
496*ad3d0e4dSRichard Henderson 
497*ad3d0e4dSRichard Henderson void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg);
498*ad3d0e4dSRichard Henderson void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
499*ad3d0e4dSRichard Henderson void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2);
500*ad3d0e4dSRichard Henderson void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
501*ad3d0e4dSRichard Henderson void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
502*ad3d0e4dSRichard Henderson void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
503*ad3d0e4dSRichard Henderson void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
504*ad3d0e4dSRichard Henderson void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
505*ad3d0e4dSRichard Henderson void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
506*ad3d0e4dSRichard Henderson void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
507*ad3d0e4dSRichard Henderson void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
508*ad3d0e4dSRichard Henderson void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
509*ad3d0e4dSRichard Henderson void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
510*ad3d0e4dSRichard Henderson void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
511*ad3d0e4dSRichard Henderson void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
512*ad3d0e4dSRichard Henderson void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
513*ad3d0e4dSRichard Henderson void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
514*ad3d0e4dSRichard Henderson void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
515*ad3d0e4dSRichard Henderson void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
516*ad3d0e4dSRichard Henderson void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
517*ad3d0e4dSRichard Henderson void tcg_gen_clz_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
518*ad3d0e4dSRichard Henderson void tcg_gen_ctz_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
519*ad3d0e4dSRichard Henderson void tcg_gen_clzi_i64(TCGv_i64 ret, TCGv_i64 arg1, uint64_t arg2);
520*ad3d0e4dSRichard Henderson void tcg_gen_ctzi_i64(TCGv_i64 ret, TCGv_i64 arg1, uint64_t arg2);
521*ad3d0e4dSRichard Henderson void tcg_gen_clrsb_i64(TCGv_i64 ret, TCGv_i64 arg);
522*ad3d0e4dSRichard Henderson void tcg_gen_ctpop_i64(TCGv_i64 a1, TCGv_i64 a2);
523*ad3d0e4dSRichard Henderson void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
524*ad3d0e4dSRichard Henderson void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
525*ad3d0e4dSRichard Henderson void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
526*ad3d0e4dSRichard Henderson void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2);
527*ad3d0e4dSRichard Henderson void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2,
528*ad3d0e4dSRichard Henderson                          unsigned int ofs, unsigned int len);
529*ad3d0e4dSRichard Henderson void tcg_gen_deposit_z_i64(TCGv_i64 ret, TCGv_i64 arg,
530*ad3d0e4dSRichard Henderson                            unsigned int ofs, unsigned int len);
531*ad3d0e4dSRichard Henderson void tcg_gen_extract_i64(TCGv_i64 ret, TCGv_i64 arg,
532*ad3d0e4dSRichard Henderson                          unsigned int ofs, unsigned int len);
533*ad3d0e4dSRichard Henderson void tcg_gen_sextract_i64(TCGv_i64 ret, TCGv_i64 arg,
534*ad3d0e4dSRichard Henderson                           unsigned int ofs, unsigned int len);
535*ad3d0e4dSRichard Henderson void tcg_gen_extract2_i64(TCGv_i64 ret, TCGv_i64 al, TCGv_i64 ah,
536*ad3d0e4dSRichard Henderson                           unsigned int ofs);
537*ad3d0e4dSRichard Henderson void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, TCGv_i64 arg2, TCGLabel *);
538*ad3d0e4dSRichard Henderson void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1, int64_t arg2, TCGLabel *);
539*ad3d0e4dSRichard Henderson void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
540*ad3d0e4dSRichard Henderson                          TCGv_i64 arg1, TCGv_i64 arg2);
541*ad3d0e4dSRichard Henderson void tcg_gen_setcondi_i64(TCGCond cond, TCGv_i64 ret,
542*ad3d0e4dSRichard Henderson                           TCGv_i64 arg1, int64_t arg2);
543*ad3d0e4dSRichard Henderson void tcg_gen_movcond_i64(TCGCond cond, TCGv_i64 ret, TCGv_i64 c1,
544*ad3d0e4dSRichard Henderson                          TCGv_i64 c2, TCGv_i64 v1, TCGv_i64 v2);
545*ad3d0e4dSRichard Henderson void tcg_gen_add2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al,
546*ad3d0e4dSRichard Henderson                       TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh);
547*ad3d0e4dSRichard Henderson void tcg_gen_sub2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al,
548*ad3d0e4dSRichard Henderson                       TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh);
549*ad3d0e4dSRichard Henderson void tcg_gen_mulu2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 arg1, TCGv_i64 arg2);
550*ad3d0e4dSRichard Henderson void tcg_gen_muls2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 arg1, TCGv_i64 arg2);
551*ad3d0e4dSRichard Henderson void tcg_gen_mulsu2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 arg1, TCGv_i64 arg2);
552*ad3d0e4dSRichard Henderson void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg);
553*ad3d0e4dSRichard Henderson void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg);
554*ad3d0e4dSRichard Henderson void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg);
555*ad3d0e4dSRichard Henderson void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg);
556*ad3d0e4dSRichard Henderson void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg);
557*ad3d0e4dSRichard Henderson void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg);
558*ad3d0e4dSRichard Henderson void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg);
559*ad3d0e4dSRichard Henderson void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg, int flags);
560*ad3d0e4dSRichard Henderson void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg, int flags);
561*ad3d0e4dSRichard Henderson void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg);
562*ad3d0e4dSRichard Henderson void tcg_gen_hswap_i64(TCGv_i64 ret, TCGv_i64 arg);
563*ad3d0e4dSRichard Henderson void tcg_gen_wswap_i64(TCGv_i64 ret, TCGv_i64 arg);
564*ad3d0e4dSRichard Henderson void tcg_gen_smin_i64(TCGv_i64, TCGv_i64 arg1, TCGv_i64 arg2);
565*ad3d0e4dSRichard Henderson void tcg_gen_smax_i64(TCGv_i64, TCGv_i64 arg1, TCGv_i64 arg2);
566*ad3d0e4dSRichard Henderson void tcg_gen_umin_i64(TCGv_i64, TCGv_i64 arg1, TCGv_i64 arg2);
567*ad3d0e4dSRichard Henderson void tcg_gen_umax_i64(TCGv_i64, TCGv_i64 arg1, TCGv_i64 arg2);
568*ad3d0e4dSRichard Henderson void tcg_gen_abs_i64(TCGv_i64, TCGv_i64);
569*ad3d0e4dSRichard Henderson 
570*ad3d0e4dSRichard Henderson /* Replicate a value of size @vece from @in to all the lanes in @out */
571*ad3d0e4dSRichard Henderson void tcg_gen_dup_i64(unsigned vece, TCGv_i64 out, TCGv_i64 in);
572*ad3d0e4dSRichard Henderson 
573*ad3d0e4dSRichard Henderson #if TCG_TARGET_REG_BITS == 64
574*ad3d0e4dSRichard Henderson static inline void tcg_gen_discard_i64(TCGv_i64 arg)
575*ad3d0e4dSRichard Henderson {
576*ad3d0e4dSRichard Henderson     tcg_gen_op1_i64(INDEX_op_discard, arg);
577*ad3d0e4dSRichard Henderson }
578*ad3d0e4dSRichard Henderson 
579*ad3d0e4dSRichard Henderson static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
580*ad3d0e4dSRichard Henderson {
581*ad3d0e4dSRichard Henderson     if (ret != arg) {
582*ad3d0e4dSRichard Henderson         tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
583*ad3d0e4dSRichard Henderson     }
584*ad3d0e4dSRichard Henderson }
585*ad3d0e4dSRichard Henderson 
586*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
587*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
588*ad3d0e4dSRichard Henderson {
589*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
590*ad3d0e4dSRichard Henderson }
591*ad3d0e4dSRichard Henderson 
592*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
593*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
594*ad3d0e4dSRichard Henderson {
595*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
596*ad3d0e4dSRichard Henderson }
597*ad3d0e4dSRichard Henderson 
598*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
599*ad3d0e4dSRichard Henderson                                      tcg_target_long offset)
600*ad3d0e4dSRichard Henderson {
601*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
602*ad3d0e4dSRichard Henderson }
603*ad3d0e4dSRichard Henderson 
604*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
605*ad3d0e4dSRichard Henderson                                      tcg_target_long offset)
606*ad3d0e4dSRichard Henderson {
607*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
608*ad3d0e4dSRichard Henderson }
609*ad3d0e4dSRichard Henderson 
610*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
611*ad3d0e4dSRichard Henderson                                      tcg_target_long offset)
612*ad3d0e4dSRichard Henderson {
613*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
614*ad3d0e4dSRichard Henderson }
615*ad3d0e4dSRichard Henderson 
616*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
617*ad3d0e4dSRichard Henderson                                      tcg_target_long offset)
618*ad3d0e4dSRichard Henderson {
619*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
620*ad3d0e4dSRichard Henderson }
621*ad3d0e4dSRichard Henderson 
622*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
623*ad3d0e4dSRichard Henderson                                   tcg_target_long offset)
624*ad3d0e4dSRichard Henderson {
625*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
626*ad3d0e4dSRichard Henderson }
627*ad3d0e4dSRichard Henderson 
628*ad3d0e4dSRichard Henderson static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
629*ad3d0e4dSRichard Henderson                                    tcg_target_long offset)
630*ad3d0e4dSRichard Henderson {
631*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
632*ad3d0e4dSRichard Henderson }
633*ad3d0e4dSRichard Henderson 
634*ad3d0e4dSRichard Henderson static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
635*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
636*ad3d0e4dSRichard Henderson {
637*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
638*ad3d0e4dSRichard Henderson }
639*ad3d0e4dSRichard Henderson 
640*ad3d0e4dSRichard Henderson static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
641*ad3d0e4dSRichard Henderson                                     tcg_target_long offset)
642*ad3d0e4dSRichard Henderson {
643*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
644*ad3d0e4dSRichard Henderson }
645*ad3d0e4dSRichard Henderson 
646*ad3d0e4dSRichard Henderson static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
647*ad3d0e4dSRichard Henderson                                   tcg_target_long offset)
648*ad3d0e4dSRichard Henderson {
649*ad3d0e4dSRichard Henderson     tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
650*ad3d0e4dSRichard Henderson }
651*ad3d0e4dSRichard Henderson 
652*ad3d0e4dSRichard Henderson static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
653*ad3d0e4dSRichard Henderson {
654*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
655*ad3d0e4dSRichard Henderson }
656*ad3d0e4dSRichard Henderson 
657*ad3d0e4dSRichard Henderson static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
658*ad3d0e4dSRichard Henderson {
659*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
660*ad3d0e4dSRichard Henderson }
661*ad3d0e4dSRichard Henderson 
662*ad3d0e4dSRichard Henderson static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
663*ad3d0e4dSRichard Henderson {
664*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
665*ad3d0e4dSRichard Henderson }
666*ad3d0e4dSRichard Henderson 
667*ad3d0e4dSRichard Henderson static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
668*ad3d0e4dSRichard Henderson {
669*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
670*ad3d0e4dSRichard Henderson }
671*ad3d0e4dSRichard Henderson 
672*ad3d0e4dSRichard Henderson static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
673*ad3d0e4dSRichard Henderson {
674*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
675*ad3d0e4dSRichard Henderson }
676*ad3d0e4dSRichard Henderson 
677*ad3d0e4dSRichard Henderson static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
678*ad3d0e4dSRichard Henderson {
679*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
680*ad3d0e4dSRichard Henderson }
681*ad3d0e4dSRichard Henderson 
682*ad3d0e4dSRichard Henderson static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
683*ad3d0e4dSRichard Henderson {
684*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
685*ad3d0e4dSRichard Henderson }
686*ad3d0e4dSRichard Henderson 
687*ad3d0e4dSRichard Henderson static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
688*ad3d0e4dSRichard Henderson {
689*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
690*ad3d0e4dSRichard Henderson }
691*ad3d0e4dSRichard Henderson 
692*ad3d0e4dSRichard Henderson static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
693*ad3d0e4dSRichard Henderson {
694*ad3d0e4dSRichard Henderson     tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
695*ad3d0e4dSRichard Henderson }
696*ad3d0e4dSRichard Henderson #else /* TCG_TARGET_REG_BITS == 32 */
697*ad3d0e4dSRichard Henderson void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset);
698*ad3d0e4dSRichard Henderson void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset);
699*ad3d0e4dSRichard Henderson void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset);
700*ad3d0e4dSRichard Henderson 
701*ad3d0e4dSRichard Henderson void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
702*ad3d0e4dSRichard Henderson void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
703*ad3d0e4dSRichard Henderson 
704*ad3d0e4dSRichard Henderson void tcg_gen_discard_i64(TCGv_i64 arg);
705*ad3d0e4dSRichard Henderson void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg);
706*ad3d0e4dSRichard Henderson void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
707*ad3d0e4dSRichard Henderson void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
708*ad3d0e4dSRichard Henderson void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
709*ad3d0e4dSRichard Henderson void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
710*ad3d0e4dSRichard Henderson void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
711*ad3d0e4dSRichard Henderson void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
712*ad3d0e4dSRichard Henderson void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset);
713*ad3d0e4dSRichard Henderson void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset);
714*ad3d0e4dSRichard Henderson void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
715*ad3d0e4dSRichard Henderson void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
716*ad3d0e4dSRichard Henderson void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
717*ad3d0e4dSRichard Henderson void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
718*ad3d0e4dSRichard Henderson void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
719*ad3d0e4dSRichard Henderson void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
720*ad3d0e4dSRichard Henderson void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2);
721*ad3d0e4dSRichard Henderson #endif /* TCG_TARGET_REG_BITS */
722*ad3d0e4dSRichard Henderson 
723*ad3d0e4dSRichard Henderson static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
724*ad3d0e4dSRichard Henderson {
725*ad3d0e4dSRichard Henderson     if (TCG_TARGET_HAS_neg_i64) {
726*ad3d0e4dSRichard Henderson         tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
727*ad3d0e4dSRichard Henderson     } else {
728*ad3d0e4dSRichard Henderson         tcg_gen_subfi_i64(ret, 0, arg);
729*ad3d0e4dSRichard Henderson     }
730*ad3d0e4dSRichard Henderson }
731*ad3d0e4dSRichard Henderson 
732*ad3d0e4dSRichard Henderson /* Size changing operations.  */
733*ad3d0e4dSRichard Henderson 
734*ad3d0e4dSRichard Henderson void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg);
735*ad3d0e4dSRichard Henderson void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg);
736*ad3d0e4dSRichard Henderson void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high);
737*ad3d0e4dSRichard Henderson void tcg_gen_extrl_i64_i32(TCGv_i32 ret, TCGv_i64 arg);
738*ad3d0e4dSRichard Henderson void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg);
739*ad3d0e4dSRichard Henderson void tcg_gen_extr_i64_i32(TCGv_i32 lo, TCGv_i32 hi, TCGv_i64 arg);
740*ad3d0e4dSRichard Henderson void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg);
741*ad3d0e4dSRichard Henderson 
742*ad3d0e4dSRichard Henderson void tcg_gen_mov_i128(TCGv_i128 dst, TCGv_i128 src);
743*ad3d0e4dSRichard Henderson void tcg_gen_extr_i128_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i128 arg);
744*ad3d0e4dSRichard Henderson void tcg_gen_concat_i64_i128(TCGv_i128 ret, TCGv_i64 lo, TCGv_i64 hi);
745*ad3d0e4dSRichard Henderson 
746*ad3d0e4dSRichard Henderson static inline void tcg_gen_concat32_i64(TCGv_i64 ret, TCGv_i64 lo, TCGv_i64 hi)
747*ad3d0e4dSRichard Henderson {
748*ad3d0e4dSRichard Henderson     tcg_gen_deposit_i64(ret, lo, hi, 32, 32);
749*ad3d0e4dSRichard Henderson }
750*ad3d0e4dSRichard Henderson 
751*ad3d0e4dSRichard Henderson /* Local load/store bit ops */
752*ad3d0e4dSRichard Henderson 
753*ad3d0e4dSRichard Henderson void tcg_gen_qemu_ld_i32_chk(TCGv_i32, TCGTemp *, TCGArg, MemOp, TCGType);
754*ad3d0e4dSRichard Henderson void tcg_gen_qemu_st_i32_chk(TCGv_i32, TCGTemp *, TCGArg, MemOp, TCGType);
755*ad3d0e4dSRichard Henderson void tcg_gen_qemu_ld_i64_chk(TCGv_i64, TCGTemp *, TCGArg, MemOp, TCGType);
756*ad3d0e4dSRichard Henderson void tcg_gen_qemu_st_i64_chk(TCGv_i64, TCGTemp *, TCGArg, MemOp, TCGType);
757*ad3d0e4dSRichard Henderson void tcg_gen_qemu_ld_i128_chk(TCGv_i128, TCGTemp *, TCGArg, MemOp, TCGType);
758*ad3d0e4dSRichard Henderson void tcg_gen_qemu_st_i128_chk(TCGv_i128, TCGTemp *, TCGArg, MemOp, TCGType);
759*ad3d0e4dSRichard Henderson 
760*ad3d0e4dSRichard Henderson /* Atomic ops */
761*ad3d0e4dSRichard Henderson 
762*ad3d0e4dSRichard Henderson void tcg_gen_atomic_cmpxchg_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32, TCGv_i32,
763*ad3d0e4dSRichard Henderson                                     TCGArg, MemOp, TCGType);
764*ad3d0e4dSRichard Henderson void tcg_gen_atomic_cmpxchg_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64, TCGv_i64,
765*ad3d0e4dSRichard Henderson                                     TCGArg, MemOp, TCGType);
766*ad3d0e4dSRichard Henderson void tcg_gen_atomic_cmpxchg_i128_chk(TCGv_i128, TCGTemp *, TCGv_i128,
767*ad3d0e4dSRichard Henderson                                      TCGv_i128, TCGArg, MemOp, TCGType);
768*ad3d0e4dSRichard Henderson 
769*ad3d0e4dSRichard Henderson void tcg_gen_nonatomic_cmpxchg_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32, TCGv_i32,
770*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
771*ad3d0e4dSRichard Henderson void tcg_gen_nonatomic_cmpxchg_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64, TCGv_i64,
772*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
773*ad3d0e4dSRichard Henderson void tcg_gen_nonatomic_cmpxchg_i128_chk(TCGv_i128, TCGTemp *, TCGv_i128,
774*ad3d0e4dSRichard Henderson                                         TCGv_i128, TCGArg, MemOp, TCGType);
775*ad3d0e4dSRichard Henderson 
776*ad3d0e4dSRichard Henderson void tcg_gen_atomic_xchg_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
777*ad3d0e4dSRichard Henderson                                  TCGArg, MemOp, TCGType);
778*ad3d0e4dSRichard Henderson void tcg_gen_atomic_xchg_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
779*ad3d0e4dSRichard Henderson                                  TCGArg, MemOp, TCGType);
780*ad3d0e4dSRichard Henderson 
781*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_add_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
782*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
783*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_add_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
784*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
785*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_and_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
786*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
787*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_and_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
788*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
789*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_or_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
790*ad3d0e4dSRichard Henderson                                      TCGArg, MemOp, TCGType);
791*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_or_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
792*ad3d0e4dSRichard Henderson                                      TCGArg, MemOp, TCGType);
793*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_xor_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
794*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
795*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_xor_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
796*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
797*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_smin_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
798*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
799*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_smin_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
800*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
801*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_umin_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
802*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
803*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_umin_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
804*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
805*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_smax_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
806*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
807*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_smax_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
808*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
809*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_umax_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
810*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
811*ad3d0e4dSRichard Henderson void tcg_gen_atomic_fetch_umax_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
812*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
813*ad3d0e4dSRichard Henderson 
814*ad3d0e4dSRichard Henderson void tcg_gen_atomic_add_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
815*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
816*ad3d0e4dSRichard Henderson void tcg_gen_atomic_add_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
817*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
818*ad3d0e4dSRichard Henderson void tcg_gen_atomic_and_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
819*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
820*ad3d0e4dSRichard Henderson void tcg_gen_atomic_and_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
821*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
822*ad3d0e4dSRichard Henderson void tcg_gen_atomic_or_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
823*ad3d0e4dSRichard Henderson                                      TCGArg, MemOp, TCGType);
824*ad3d0e4dSRichard Henderson void tcg_gen_atomic_or_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
825*ad3d0e4dSRichard Henderson                                      TCGArg, MemOp, TCGType);
826*ad3d0e4dSRichard Henderson void tcg_gen_atomic_xor_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
827*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
828*ad3d0e4dSRichard Henderson void tcg_gen_atomic_xor_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
829*ad3d0e4dSRichard Henderson                                       TCGArg, MemOp, TCGType);
830*ad3d0e4dSRichard Henderson void tcg_gen_atomic_smin_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
831*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
832*ad3d0e4dSRichard Henderson void tcg_gen_atomic_smin_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
833*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
834*ad3d0e4dSRichard Henderson void tcg_gen_atomic_umin_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
835*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
836*ad3d0e4dSRichard Henderson void tcg_gen_atomic_umin_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
837*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
838*ad3d0e4dSRichard Henderson void tcg_gen_atomic_smax_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
839*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
840*ad3d0e4dSRichard Henderson void tcg_gen_atomic_smax_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
841*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
842*ad3d0e4dSRichard Henderson void tcg_gen_atomic_umax_fetch_i32_chk(TCGv_i32, TCGTemp *, TCGv_i32,
843*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
844*ad3d0e4dSRichard Henderson void tcg_gen_atomic_umax_fetch_i64_chk(TCGv_i64, TCGTemp *, TCGv_i64,
845*ad3d0e4dSRichard Henderson                                        TCGArg, MemOp, TCGType);
846*ad3d0e4dSRichard Henderson 
847*ad3d0e4dSRichard Henderson /* Vector ops */
848*ad3d0e4dSRichard Henderson 
849*ad3d0e4dSRichard Henderson void tcg_gen_mov_vec(TCGv_vec, TCGv_vec);
850*ad3d0e4dSRichard Henderson void tcg_gen_dup_i32_vec(unsigned vece, TCGv_vec, TCGv_i32);
851*ad3d0e4dSRichard Henderson void tcg_gen_dup_i64_vec(unsigned vece, TCGv_vec, TCGv_i64);
852*ad3d0e4dSRichard Henderson void tcg_gen_dup_mem_vec(unsigned vece, TCGv_vec, TCGv_ptr, tcg_target_long);
853*ad3d0e4dSRichard Henderson void tcg_gen_dupi_vec(unsigned vece, TCGv_vec, uint64_t);
854*ad3d0e4dSRichard Henderson void tcg_gen_add_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
855*ad3d0e4dSRichard Henderson void tcg_gen_sub_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
856*ad3d0e4dSRichard Henderson void tcg_gen_mul_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
857*ad3d0e4dSRichard Henderson void tcg_gen_and_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
858*ad3d0e4dSRichard Henderson void tcg_gen_or_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
859*ad3d0e4dSRichard Henderson void tcg_gen_xor_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
860*ad3d0e4dSRichard Henderson void tcg_gen_andc_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
861*ad3d0e4dSRichard Henderson void tcg_gen_orc_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
862*ad3d0e4dSRichard Henderson void tcg_gen_nand_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
863*ad3d0e4dSRichard Henderson void tcg_gen_nor_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
864*ad3d0e4dSRichard Henderson void tcg_gen_eqv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
865*ad3d0e4dSRichard Henderson void tcg_gen_not_vec(unsigned vece, TCGv_vec r, TCGv_vec a);
866*ad3d0e4dSRichard Henderson void tcg_gen_neg_vec(unsigned vece, TCGv_vec r, TCGv_vec a);
867*ad3d0e4dSRichard Henderson void tcg_gen_abs_vec(unsigned vece, TCGv_vec r, TCGv_vec a);
868*ad3d0e4dSRichard Henderson void tcg_gen_ssadd_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
869*ad3d0e4dSRichard Henderson void tcg_gen_usadd_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
870*ad3d0e4dSRichard Henderson void tcg_gen_sssub_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
871*ad3d0e4dSRichard Henderson void tcg_gen_ussub_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
872*ad3d0e4dSRichard Henderson void tcg_gen_smin_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
873*ad3d0e4dSRichard Henderson void tcg_gen_umin_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
874*ad3d0e4dSRichard Henderson void tcg_gen_smax_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
875*ad3d0e4dSRichard Henderson void tcg_gen_umax_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b);
876*ad3d0e4dSRichard Henderson 
877*ad3d0e4dSRichard Henderson void tcg_gen_shli_vec(unsigned vece, TCGv_vec r, TCGv_vec a, int64_t i);
878*ad3d0e4dSRichard Henderson void tcg_gen_shri_vec(unsigned vece, TCGv_vec r, TCGv_vec a, int64_t i);
879*ad3d0e4dSRichard Henderson void tcg_gen_sari_vec(unsigned vece, TCGv_vec r, TCGv_vec a, int64_t i);
880*ad3d0e4dSRichard Henderson void tcg_gen_rotli_vec(unsigned vece, TCGv_vec r, TCGv_vec a, int64_t i);
881*ad3d0e4dSRichard Henderson void tcg_gen_rotri_vec(unsigned vece, TCGv_vec r, TCGv_vec a, int64_t i);
882*ad3d0e4dSRichard Henderson 
883*ad3d0e4dSRichard Henderson void tcg_gen_shls_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_i32 s);
884*ad3d0e4dSRichard Henderson void tcg_gen_shrs_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_i32 s);
885*ad3d0e4dSRichard Henderson void tcg_gen_sars_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_i32 s);
886*ad3d0e4dSRichard Henderson void tcg_gen_rotls_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_i32 s);
887*ad3d0e4dSRichard Henderson 
888*ad3d0e4dSRichard Henderson void tcg_gen_shlv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec s);
889*ad3d0e4dSRichard Henderson void tcg_gen_shrv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec s);
890*ad3d0e4dSRichard Henderson void tcg_gen_sarv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec s);
891*ad3d0e4dSRichard Henderson void tcg_gen_rotlv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec s);
892*ad3d0e4dSRichard Henderson void tcg_gen_rotrv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec s);
893*ad3d0e4dSRichard Henderson 
894*ad3d0e4dSRichard Henderson void tcg_gen_cmp_vec(TCGCond cond, unsigned vece, TCGv_vec r,
895*ad3d0e4dSRichard Henderson                      TCGv_vec a, TCGv_vec b);
896*ad3d0e4dSRichard Henderson 
897*ad3d0e4dSRichard Henderson void tcg_gen_bitsel_vec(unsigned vece, TCGv_vec r, TCGv_vec a,
898*ad3d0e4dSRichard Henderson                         TCGv_vec b, TCGv_vec c);
899*ad3d0e4dSRichard Henderson void tcg_gen_cmpsel_vec(TCGCond cond, unsigned vece, TCGv_vec r,
900*ad3d0e4dSRichard Henderson                         TCGv_vec a, TCGv_vec b, TCGv_vec c, TCGv_vec d);
901*ad3d0e4dSRichard Henderson 
902*ad3d0e4dSRichard Henderson void tcg_gen_ld_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset);
903*ad3d0e4dSRichard Henderson void tcg_gen_st_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset);
904*ad3d0e4dSRichard Henderson void tcg_gen_stl_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset, TCGType t);
905*ad3d0e4dSRichard Henderson 
906*ad3d0e4dSRichard Henderson /* Host pointer ops */
907*ad3d0e4dSRichard Henderson 
908*ad3d0e4dSRichard Henderson #if UINTPTR_MAX == UINT32_MAX
909*ad3d0e4dSRichard Henderson # define PTR  i32
910*ad3d0e4dSRichard Henderson # define NAT  TCGv_i32
911*ad3d0e4dSRichard Henderson #else
912*ad3d0e4dSRichard Henderson # define PTR  i64
913*ad3d0e4dSRichard Henderson # define NAT  TCGv_i64
914*ad3d0e4dSRichard Henderson #endif
915*ad3d0e4dSRichard Henderson 
916*ad3d0e4dSRichard Henderson static inline void tcg_gen_ld_ptr(TCGv_ptr r, TCGv_ptr a, intptr_t o)
917*ad3d0e4dSRichard Henderson {
918*ad3d0e4dSRichard Henderson     glue(tcg_gen_ld_,PTR)((NAT)r, a, o);
919*ad3d0e4dSRichard Henderson }
920*ad3d0e4dSRichard Henderson 
921*ad3d0e4dSRichard Henderson static inline void tcg_gen_st_ptr(TCGv_ptr r, TCGv_ptr a, intptr_t o)
922*ad3d0e4dSRichard Henderson {
923*ad3d0e4dSRichard Henderson     glue(tcg_gen_st_, PTR)((NAT)r, a, o);
924*ad3d0e4dSRichard Henderson }
925*ad3d0e4dSRichard Henderson 
926*ad3d0e4dSRichard Henderson static inline void tcg_gen_discard_ptr(TCGv_ptr a)
927*ad3d0e4dSRichard Henderson {
928*ad3d0e4dSRichard Henderson     glue(tcg_gen_discard_,PTR)((NAT)a);
929*ad3d0e4dSRichard Henderson }
930*ad3d0e4dSRichard Henderson 
931*ad3d0e4dSRichard Henderson static inline void tcg_gen_add_ptr(TCGv_ptr r, TCGv_ptr a, TCGv_ptr b)
932*ad3d0e4dSRichard Henderson {
933*ad3d0e4dSRichard Henderson     glue(tcg_gen_add_,PTR)((NAT)r, (NAT)a, (NAT)b);
934*ad3d0e4dSRichard Henderson }
935*ad3d0e4dSRichard Henderson 
936*ad3d0e4dSRichard Henderson static inline void tcg_gen_addi_ptr(TCGv_ptr r, TCGv_ptr a, intptr_t b)
937*ad3d0e4dSRichard Henderson {
938*ad3d0e4dSRichard Henderson     glue(tcg_gen_addi_,PTR)((NAT)r, (NAT)a, b);
939*ad3d0e4dSRichard Henderson }
940*ad3d0e4dSRichard Henderson 
941*ad3d0e4dSRichard Henderson static inline void tcg_gen_mov_ptr(TCGv_ptr d, TCGv_ptr s)
942*ad3d0e4dSRichard Henderson {
943*ad3d0e4dSRichard Henderson     glue(tcg_gen_mov_,PTR)((NAT)d, (NAT)s);
944*ad3d0e4dSRichard Henderson }
945*ad3d0e4dSRichard Henderson 
946*ad3d0e4dSRichard Henderson static inline void tcg_gen_movi_ptr(TCGv_ptr d, intptr_t s)
947*ad3d0e4dSRichard Henderson {
948*ad3d0e4dSRichard Henderson     glue(tcg_gen_movi_,PTR)((NAT)d, s);
949*ad3d0e4dSRichard Henderson }
950*ad3d0e4dSRichard Henderson 
951*ad3d0e4dSRichard Henderson static inline void tcg_gen_brcondi_ptr(TCGCond cond, TCGv_ptr a,
952*ad3d0e4dSRichard Henderson                                        intptr_t b, TCGLabel *label)
953*ad3d0e4dSRichard Henderson {
954*ad3d0e4dSRichard Henderson     glue(tcg_gen_brcondi_,PTR)(cond, (NAT)a, b, label);
955*ad3d0e4dSRichard Henderson }
956*ad3d0e4dSRichard Henderson 
957*ad3d0e4dSRichard Henderson static inline void tcg_gen_ext_i32_ptr(TCGv_ptr r, TCGv_i32 a)
958*ad3d0e4dSRichard Henderson {
959*ad3d0e4dSRichard Henderson #if UINTPTR_MAX == UINT32_MAX
960*ad3d0e4dSRichard Henderson     tcg_gen_mov_i32((NAT)r, a);
961*ad3d0e4dSRichard Henderson #else
962*ad3d0e4dSRichard Henderson     tcg_gen_ext_i32_i64((NAT)r, a);
963*ad3d0e4dSRichard Henderson #endif
964*ad3d0e4dSRichard Henderson }
965*ad3d0e4dSRichard Henderson 
966*ad3d0e4dSRichard Henderson static inline void tcg_gen_trunc_i64_ptr(TCGv_ptr r, TCGv_i64 a)
967*ad3d0e4dSRichard Henderson {
968*ad3d0e4dSRichard Henderson #if UINTPTR_MAX == UINT32_MAX
969*ad3d0e4dSRichard Henderson     tcg_gen_extrl_i64_i32((NAT)r, a);
970*ad3d0e4dSRichard Henderson #else
971*ad3d0e4dSRichard Henderson     tcg_gen_mov_i64((NAT)r, a);
972*ad3d0e4dSRichard Henderson #endif
973*ad3d0e4dSRichard Henderson }
974*ad3d0e4dSRichard Henderson 
975*ad3d0e4dSRichard Henderson static inline void tcg_gen_extu_ptr_i64(TCGv_i64 r, TCGv_ptr a)
976*ad3d0e4dSRichard Henderson {
977*ad3d0e4dSRichard Henderson #if UINTPTR_MAX == UINT32_MAX
978*ad3d0e4dSRichard Henderson     tcg_gen_extu_i32_i64(r, (NAT)a);
979*ad3d0e4dSRichard Henderson #else
980*ad3d0e4dSRichard Henderson     tcg_gen_mov_i64(r, (NAT)a);
981*ad3d0e4dSRichard Henderson #endif
982*ad3d0e4dSRichard Henderson }
983*ad3d0e4dSRichard Henderson 
984*ad3d0e4dSRichard Henderson static inline void tcg_gen_trunc_ptr_i32(TCGv_i32 r, TCGv_ptr a)
985*ad3d0e4dSRichard Henderson {
986*ad3d0e4dSRichard Henderson #if UINTPTR_MAX == UINT32_MAX
987*ad3d0e4dSRichard Henderson     tcg_gen_mov_i32(r, (NAT)a);
988*ad3d0e4dSRichard Henderson #else
989*ad3d0e4dSRichard Henderson     tcg_gen_extrl_i64_i32(r, (NAT)a);
990*ad3d0e4dSRichard Henderson #endif
991*ad3d0e4dSRichard Henderson }
992*ad3d0e4dSRichard Henderson 
993*ad3d0e4dSRichard Henderson #undef PTR
994*ad3d0e4dSRichard Henderson #undef NAT
995*ad3d0e4dSRichard Henderson 
996*ad3d0e4dSRichard Henderson #endif /* TCG_TCG_OP_COMMON_H */
997