Statistics
| Branch: | Revision:

root / tcg / ia64 / tcg-target.c @ 06ea77bc

History | View | Annotate | Download (83.6 kB)

1 477ba620 Aurelien Jarno
/*
2 477ba620 Aurelien Jarno
 * Tiny Code Generator for QEMU
3 477ba620 Aurelien Jarno
 *
4 477ba620 Aurelien Jarno
 * Copyright (c) 2009-2010 Aurelien Jarno <aurelien@aurel32.net>
5 477ba620 Aurelien Jarno
 * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard
6 477ba620 Aurelien Jarno
 *
7 477ba620 Aurelien Jarno
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 477ba620 Aurelien Jarno
 * of this software and associated documentation files (the "Software"), to deal
9 477ba620 Aurelien Jarno
 * in the Software without restriction, including without limitation the rights
10 477ba620 Aurelien Jarno
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 477ba620 Aurelien Jarno
 * copies of the Software, and to permit persons to whom the Software is
12 477ba620 Aurelien Jarno
 * furnished to do so, subject to the following conditions:
13 477ba620 Aurelien Jarno
 *
14 477ba620 Aurelien Jarno
 * The above copyright notice and this permission notice shall be included in
15 477ba620 Aurelien Jarno
 * all copies or substantial portions of the Software.
16 477ba620 Aurelien Jarno
 *
17 477ba620 Aurelien Jarno
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 477ba620 Aurelien Jarno
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 477ba620 Aurelien Jarno
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 477ba620 Aurelien Jarno
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 477ba620 Aurelien Jarno
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 477ba620 Aurelien Jarno
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 477ba620 Aurelien Jarno
 * THE SOFTWARE.
24 477ba620 Aurelien Jarno
 */
25 477ba620 Aurelien Jarno
26 477ba620 Aurelien Jarno
/*
27 477ba620 Aurelien Jarno
 * Register definitions
28 477ba620 Aurelien Jarno
 */
29 477ba620 Aurelien Jarno
30 477ba620 Aurelien Jarno
#ifndef NDEBUG
31 477ba620 Aurelien Jarno
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
32 477ba620 Aurelien Jarno
     "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
33 477ba620 Aurelien Jarno
     "r8",  "r9", "r10", "r11", "r12", "r13", "r14", "r15",
34 477ba620 Aurelien Jarno
    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
35 477ba620 Aurelien Jarno
    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
36 477ba620 Aurelien Jarno
    "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
37 477ba620 Aurelien Jarno
    "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
38 477ba620 Aurelien Jarno
    "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
39 477ba620 Aurelien Jarno
    "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
40 477ba620 Aurelien Jarno
};
41 477ba620 Aurelien Jarno
#endif
42 477ba620 Aurelien Jarno
43 6781d08d Richard Henderson
#ifdef CONFIG_USE_GUEST_BASE
44 6781d08d Richard Henderson
#define TCG_GUEST_BASE_REG TCG_REG_R55
45 6781d08d Richard Henderson
#else
46 6781d08d Richard Henderson
#define TCG_GUEST_BASE_REG TCG_REG_R0
47 6781d08d Richard Henderson
#endif
48 255108c0 Richard Henderson
#ifndef GUEST_BASE
49 255108c0 Richard Henderson
#define GUEST_BASE 0
50 255108c0 Richard Henderson
#endif
51 6781d08d Richard Henderson
52 477ba620 Aurelien Jarno
/* Branch registers */
53 477ba620 Aurelien Jarno
enum {
54 477ba620 Aurelien Jarno
    TCG_REG_B0 = 0,
55 477ba620 Aurelien Jarno
    TCG_REG_B1,
56 477ba620 Aurelien Jarno
    TCG_REG_B2,
57 477ba620 Aurelien Jarno
    TCG_REG_B3,
58 477ba620 Aurelien Jarno
    TCG_REG_B4,
59 477ba620 Aurelien Jarno
    TCG_REG_B5,
60 477ba620 Aurelien Jarno
    TCG_REG_B6,
61 477ba620 Aurelien Jarno
    TCG_REG_B7,
62 477ba620 Aurelien Jarno
};
63 477ba620 Aurelien Jarno
64 477ba620 Aurelien Jarno
/* Floating point registers */
65 477ba620 Aurelien Jarno
enum {
66 477ba620 Aurelien Jarno
    TCG_REG_F0 = 0,
67 477ba620 Aurelien Jarno
    TCG_REG_F1,
68 477ba620 Aurelien Jarno
    TCG_REG_F2,
69 477ba620 Aurelien Jarno
    TCG_REG_F3,
70 477ba620 Aurelien Jarno
    TCG_REG_F4,
71 477ba620 Aurelien Jarno
    TCG_REG_F5,
72 477ba620 Aurelien Jarno
    TCG_REG_F6,
73 477ba620 Aurelien Jarno
    TCG_REG_F7,
74 477ba620 Aurelien Jarno
    TCG_REG_F8,
75 477ba620 Aurelien Jarno
    TCG_REG_F9,
76 477ba620 Aurelien Jarno
    TCG_REG_F10,
77 477ba620 Aurelien Jarno
    TCG_REG_F11,
78 477ba620 Aurelien Jarno
    TCG_REG_F12,
79 477ba620 Aurelien Jarno
    TCG_REG_F13,
80 477ba620 Aurelien Jarno
    TCG_REG_F14,
81 477ba620 Aurelien Jarno
    TCG_REG_F15,
82 477ba620 Aurelien Jarno
};
83 477ba620 Aurelien Jarno
84 477ba620 Aurelien Jarno
/* Predicate registers */
85 477ba620 Aurelien Jarno
enum {
86 477ba620 Aurelien Jarno
    TCG_REG_P0 = 0,
87 477ba620 Aurelien Jarno
    TCG_REG_P1,
88 477ba620 Aurelien Jarno
    TCG_REG_P2,
89 477ba620 Aurelien Jarno
    TCG_REG_P3,
90 477ba620 Aurelien Jarno
    TCG_REG_P4,
91 477ba620 Aurelien Jarno
    TCG_REG_P5,
92 477ba620 Aurelien Jarno
    TCG_REG_P6,
93 477ba620 Aurelien Jarno
    TCG_REG_P7,
94 477ba620 Aurelien Jarno
    TCG_REG_P8,
95 477ba620 Aurelien Jarno
    TCG_REG_P9,
96 477ba620 Aurelien Jarno
    TCG_REG_P10,
97 477ba620 Aurelien Jarno
    TCG_REG_P11,
98 477ba620 Aurelien Jarno
    TCG_REG_P12,
99 477ba620 Aurelien Jarno
    TCG_REG_P13,
100 477ba620 Aurelien Jarno
    TCG_REG_P14,
101 477ba620 Aurelien Jarno
    TCG_REG_P15,
102 477ba620 Aurelien Jarno
};
103 477ba620 Aurelien Jarno
104 477ba620 Aurelien Jarno
/* Application registers */
105 477ba620 Aurelien Jarno
enum {
106 477ba620 Aurelien Jarno
    TCG_REG_PFS = 64,
107 477ba620 Aurelien Jarno
};
108 477ba620 Aurelien Jarno
109 477ba620 Aurelien Jarno
static const int tcg_target_reg_alloc_order[] = {
110 477ba620 Aurelien Jarno
    TCG_REG_R34,
111 477ba620 Aurelien Jarno
    TCG_REG_R35,
112 477ba620 Aurelien Jarno
    TCG_REG_R36,
113 477ba620 Aurelien Jarno
    TCG_REG_R37,
114 477ba620 Aurelien Jarno
    TCG_REG_R38,
115 477ba620 Aurelien Jarno
    TCG_REG_R39,
116 477ba620 Aurelien Jarno
    TCG_REG_R40,
117 477ba620 Aurelien Jarno
    TCG_REG_R41,
118 477ba620 Aurelien Jarno
    TCG_REG_R42,
119 477ba620 Aurelien Jarno
    TCG_REG_R43,
120 477ba620 Aurelien Jarno
    TCG_REG_R44,
121 477ba620 Aurelien Jarno
    TCG_REG_R45,
122 477ba620 Aurelien Jarno
    TCG_REG_R46,
123 477ba620 Aurelien Jarno
    TCG_REG_R47,
124 477ba620 Aurelien Jarno
    TCG_REG_R48,
125 477ba620 Aurelien Jarno
    TCG_REG_R49,
126 477ba620 Aurelien Jarno
    TCG_REG_R50,
127 477ba620 Aurelien Jarno
    TCG_REG_R51,
128 477ba620 Aurelien Jarno
    TCG_REG_R52,
129 477ba620 Aurelien Jarno
    TCG_REG_R53,
130 477ba620 Aurelien Jarno
    TCG_REG_R54,
131 477ba620 Aurelien Jarno
    TCG_REG_R55,
132 477ba620 Aurelien Jarno
    TCG_REG_R14,
133 477ba620 Aurelien Jarno
    TCG_REG_R15,
134 477ba620 Aurelien Jarno
    TCG_REG_R16,
135 477ba620 Aurelien Jarno
    TCG_REG_R17,
136 477ba620 Aurelien Jarno
    TCG_REG_R18,
137 477ba620 Aurelien Jarno
    TCG_REG_R19,
138 477ba620 Aurelien Jarno
    TCG_REG_R20,
139 477ba620 Aurelien Jarno
    TCG_REG_R21,
140 477ba620 Aurelien Jarno
    TCG_REG_R22,
141 477ba620 Aurelien Jarno
    TCG_REG_R23,
142 477ba620 Aurelien Jarno
    TCG_REG_R24,
143 477ba620 Aurelien Jarno
    TCG_REG_R25,
144 477ba620 Aurelien Jarno
    TCG_REG_R26,
145 477ba620 Aurelien Jarno
    TCG_REG_R27,
146 477ba620 Aurelien Jarno
    TCG_REG_R28,
147 477ba620 Aurelien Jarno
    TCG_REG_R29,
148 477ba620 Aurelien Jarno
    TCG_REG_R30,
149 477ba620 Aurelien Jarno
    TCG_REG_R31,
150 477ba620 Aurelien Jarno
    TCG_REG_R56,
151 477ba620 Aurelien Jarno
    TCG_REG_R57,
152 477ba620 Aurelien Jarno
    TCG_REG_R58,
153 477ba620 Aurelien Jarno
    TCG_REG_R59,
154 477ba620 Aurelien Jarno
    TCG_REG_R60,
155 477ba620 Aurelien Jarno
    TCG_REG_R61,
156 477ba620 Aurelien Jarno
    TCG_REG_R62,
157 477ba620 Aurelien Jarno
    TCG_REG_R63,
158 477ba620 Aurelien Jarno
    TCG_REG_R8,
159 477ba620 Aurelien Jarno
    TCG_REG_R9,
160 477ba620 Aurelien Jarno
    TCG_REG_R10,
161 477ba620 Aurelien Jarno
    TCG_REG_R11
162 477ba620 Aurelien Jarno
};
163 477ba620 Aurelien Jarno
164 477ba620 Aurelien Jarno
static const int tcg_target_call_iarg_regs[8] = {
165 477ba620 Aurelien Jarno
    TCG_REG_R56,
166 477ba620 Aurelien Jarno
    TCG_REG_R57,
167 477ba620 Aurelien Jarno
    TCG_REG_R58,
168 477ba620 Aurelien Jarno
    TCG_REG_R59,
169 477ba620 Aurelien Jarno
    TCG_REG_R60,
170 477ba620 Aurelien Jarno
    TCG_REG_R61,
171 477ba620 Aurelien Jarno
    TCG_REG_R62,
172 477ba620 Aurelien Jarno
    TCG_REG_R63,
173 477ba620 Aurelien Jarno
};
174 477ba620 Aurelien Jarno
175 477ba620 Aurelien Jarno
static const int tcg_target_call_oarg_regs[2] = {
176 477ba620 Aurelien Jarno
    TCG_REG_R8,
177 477ba620 Aurelien Jarno
    TCG_REG_R9
178 477ba620 Aurelien Jarno
};
179 477ba620 Aurelien Jarno
180 477ba620 Aurelien Jarno
/* maximum number of register used for input function arguments */
181 477ba620 Aurelien Jarno
static inline int tcg_target_get_call_iarg_regs_count(int flags)
182 477ba620 Aurelien Jarno
{
183 477ba620 Aurelien Jarno
    return 8;
184 477ba620 Aurelien Jarno
}
185 477ba620 Aurelien Jarno
186 477ba620 Aurelien Jarno
/*
187 477ba620 Aurelien Jarno
 * opcode formation
188 477ba620 Aurelien Jarno
 */
189 477ba620 Aurelien Jarno
190 477ba620 Aurelien Jarno
/* bundle templates: stops (double bar in the IA64 manual) are marked with
191 477ba620 Aurelien Jarno
   an uppercase letter. */
192 477ba620 Aurelien Jarno
enum {
193 477ba620 Aurelien Jarno
    mii = 0x00,
194 477ba620 Aurelien Jarno
    miI = 0x01,
195 477ba620 Aurelien Jarno
    mIi = 0x02,
196 477ba620 Aurelien Jarno
    mII = 0x03,
197 477ba620 Aurelien Jarno
    mlx = 0x04,
198 477ba620 Aurelien Jarno
    mLX = 0x05,
199 477ba620 Aurelien Jarno
    mmi = 0x08,
200 477ba620 Aurelien Jarno
    mmI = 0x09,
201 477ba620 Aurelien Jarno
    Mmi = 0x0a,
202 477ba620 Aurelien Jarno
    MmI = 0x0b,
203 477ba620 Aurelien Jarno
    mfi = 0x0c,
204 477ba620 Aurelien Jarno
    mfI = 0x0d,
205 477ba620 Aurelien Jarno
    mmf = 0x0e,
206 477ba620 Aurelien Jarno
    mmF = 0x0f,
207 477ba620 Aurelien Jarno
    mib = 0x10,
208 477ba620 Aurelien Jarno
    miB = 0x11,
209 477ba620 Aurelien Jarno
    mbb = 0x12,
210 477ba620 Aurelien Jarno
    mbB = 0x13,
211 477ba620 Aurelien Jarno
    bbb = 0x16,
212 477ba620 Aurelien Jarno
    bbB = 0x17,
213 477ba620 Aurelien Jarno
    mmb = 0x18,
214 477ba620 Aurelien Jarno
    mmB = 0x19,
215 477ba620 Aurelien Jarno
    mfb = 0x1c,
216 477ba620 Aurelien Jarno
    mfB = 0x1d,
217 477ba620 Aurelien Jarno
};
218 477ba620 Aurelien Jarno
219 477ba620 Aurelien Jarno
enum {
220 477ba620 Aurelien Jarno
    OPC_ADD_A1                = 0x10000000000ull,
221 477ba620 Aurelien Jarno
    OPC_AND_A1                = 0x10060000000ull,
222 477ba620 Aurelien Jarno
    OPC_AND_A3                = 0x10160000000ull,
223 477ba620 Aurelien Jarno
    OPC_ANDCM_A1              = 0x10068000000ull,
224 477ba620 Aurelien Jarno
    OPC_ANDCM_A3              = 0x10168000000ull,
225 477ba620 Aurelien Jarno
    OPC_ADDS_A4               = 0x10800000000ull,
226 477ba620 Aurelien Jarno
    OPC_ADDL_A5               = 0x12000000000ull,
227 477ba620 Aurelien Jarno
    OPC_ALLOC_M34             = 0x02c00000000ull,
228 477ba620 Aurelien Jarno
    OPC_BR_DPTK_FEW_B1        = 0x08400000000ull,
229 477ba620 Aurelien Jarno
    OPC_BR_SPTK_MANY_B1       = 0x08000001000ull,
230 477ba620 Aurelien Jarno
    OPC_BR_SPTK_MANY_B4       = 0x00100001000ull,
231 477ba620 Aurelien Jarno
    OPC_BR_CALL_SPTK_MANY_B5  = 0x02100001000ull,
232 477ba620 Aurelien Jarno
    OPC_BR_RET_SPTK_MANY_B4   = 0x00108001100ull,
233 477ba620 Aurelien Jarno
    OPC_BRL_SPTK_MANY_X3      = 0x18000001000ull,
234 477ba620 Aurelien Jarno
    OPC_CMP_LT_A6             = 0x18000000000ull,
235 477ba620 Aurelien Jarno
    OPC_CMP_LTU_A6            = 0x1a000000000ull,
236 477ba620 Aurelien Jarno
    OPC_CMP_EQ_A6             = 0x1c000000000ull,
237 477ba620 Aurelien Jarno
    OPC_CMP4_LT_A6            = 0x18400000000ull,
238 477ba620 Aurelien Jarno
    OPC_CMP4_LTU_A6           = 0x1a400000000ull,
239 477ba620 Aurelien Jarno
    OPC_CMP4_EQ_A6            = 0x1c400000000ull,
240 477ba620 Aurelien Jarno
    OPC_DEP_Z_I12             = 0x0a600000000ull,
241 477ba620 Aurelien Jarno
    OPC_EXTR_I11              = 0x0a400002000ull,
242 477ba620 Aurelien Jarno
    OPC_EXTR_U_I11            = 0x0a400000000ull,
243 477ba620 Aurelien Jarno
    OPC_FCVT_FX_TRUNC_S1_F10  = 0x004d0000000ull,
244 477ba620 Aurelien Jarno
    OPC_FCVT_FXU_TRUNC_S1_F10 = 0x004d8000000ull,
245 477ba620 Aurelien Jarno
    OPC_FCVT_XF_F11           = 0x000e0000000ull,
246 477ba620 Aurelien Jarno
    OPC_FMA_S1_F1             = 0x10400000000ull,
247 477ba620 Aurelien Jarno
    OPC_FNMA_S1_F1            = 0x18400000000ull,
248 477ba620 Aurelien Jarno
    OPC_FRCPA_S1_F6           = 0x00600000000ull,
249 477ba620 Aurelien Jarno
    OPC_GETF_SIG_M19          = 0x08708000000ull,
250 477ba620 Aurelien Jarno
    OPC_LD1_M1                = 0x08000000000ull,
251 477ba620 Aurelien Jarno
    OPC_LD1_M3                = 0x0a000000000ull,
252 477ba620 Aurelien Jarno
    OPC_LD2_M1                = 0x08040000000ull,
253 477ba620 Aurelien Jarno
    OPC_LD2_M3                = 0x0a040000000ull,
254 477ba620 Aurelien Jarno
    OPC_LD4_M1                = 0x08080000000ull,
255 477ba620 Aurelien Jarno
    OPC_LD4_M3                = 0x0a080000000ull,
256 477ba620 Aurelien Jarno
    OPC_LD8_M1                = 0x080c0000000ull,
257 477ba620 Aurelien Jarno
    OPC_LD8_M3                = 0x0a0c0000000ull,
258 477ba620 Aurelien Jarno
    OPC_MUX1_I3               = 0x0eca0000000ull,
259 477ba620 Aurelien Jarno
    OPC_NOP_B9                = 0x04008000000ull,
260 477ba620 Aurelien Jarno
    OPC_NOP_F16               = 0x00008000000ull,
261 477ba620 Aurelien Jarno
    OPC_NOP_I18               = 0x00008000000ull,
262 477ba620 Aurelien Jarno
    OPC_NOP_M48               = 0x00008000000ull,
263 477ba620 Aurelien Jarno
    OPC_MOV_I21               = 0x00e00100000ull,
264 477ba620 Aurelien Jarno
    OPC_MOV_RET_I21           = 0x00e00500000ull,
265 477ba620 Aurelien Jarno
    OPC_MOV_I22               = 0x00188000000ull,
266 477ba620 Aurelien Jarno
    OPC_MOV_I_I26             = 0x00150000000ull,
267 477ba620 Aurelien Jarno
    OPC_MOVL_X2               = 0x0c000000000ull,
268 477ba620 Aurelien Jarno
    OPC_OR_A1                 = 0x10070000000ull,
269 477ba620 Aurelien Jarno
    OPC_SETF_EXP_M18          = 0x0c748000000ull,
270 477ba620 Aurelien Jarno
    OPC_SETF_SIG_M18          = 0x0c708000000ull,
271 477ba620 Aurelien Jarno
    OPC_SHL_I7                = 0x0f240000000ull,
272 477ba620 Aurelien Jarno
    OPC_SHR_I5                = 0x0f220000000ull,
273 477ba620 Aurelien Jarno
    OPC_SHR_U_I5              = 0x0f200000000ull,
274 477ba620 Aurelien Jarno
    OPC_SHRP_I10              = 0x0ac00000000ull,
275 477ba620 Aurelien Jarno
    OPC_SXT1_I29              = 0x000a0000000ull,
276 477ba620 Aurelien Jarno
    OPC_SXT2_I29              = 0x000a8000000ull,
277 477ba620 Aurelien Jarno
    OPC_SXT4_I29              = 0x000b0000000ull,
278 477ba620 Aurelien Jarno
    OPC_ST1_M4                = 0x08c00000000ull,
279 477ba620 Aurelien Jarno
    OPC_ST2_M4                = 0x08c40000000ull,
280 477ba620 Aurelien Jarno
    OPC_ST4_M4                = 0x08c80000000ull,
281 477ba620 Aurelien Jarno
    OPC_ST8_M4                = 0x08cc0000000ull,
282 477ba620 Aurelien Jarno
    OPC_SUB_A1                = 0x10028000000ull,
283 477ba620 Aurelien Jarno
    OPC_SUB_A3                = 0x10128000000ull,
284 477ba620 Aurelien Jarno
    OPC_UNPACK4_L_I2          = 0x0f860000000ull,
285 477ba620 Aurelien Jarno
    OPC_XMA_L_F2              = 0x1d000000000ull,
286 477ba620 Aurelien Jarno
    OPC_XOR_A1                = 0x10078000000ull,
287 477ba620 Aurelien Jarno
    OPC_ZXT1_I29              = 0x00080000000ull,
288 477ba620 Aurelien Jarno
    OPC_ZXT2_I29              = 0x00088000000ull,
289 477ba620 Aurelien Jarno
    OPC_ZXT4_I29              = 0x00090000000ull,
290 477ba620 Aurelien Jarno
};
291 477ba620 Aurelien Jarno
292 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_a1(int qp, uint64_t opc, int r1,
293 477ba620 Aurelien Jarno
                                  int r2, int r3)
294 477ba620 Aurelien Jarno
{
295 477ba620 Aurelien Jarno
    return opc
296 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
297 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
298 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
299 477ba620 Aurelien Jarno
           | (qp & 0x3f);
300 477ba620 Aurelien Jarno
}
301 477ba620 Aurelien Jarno
302 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_a3(int qp, uint64_t opc, int r1,
303 477ba620 Aurelien Jarno
                                  uint64_t imm, int r3)
304 477ba620 Aurelien Jarno
{
305 477ba620 Aurelien Jarno
    return opc
306 477ba620 Aurelien Jarno
           | ((imm & 0x80) << 29) /* s */
307 477ba620 Aurelien Jarno
           | ((imm & 0x7f) << 13) /* imm7b */
308 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
309 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
310 477ba620 Aurelien Jarno
           | (qp & 0x3f);
311 477ba620 Aurelien Jarno
}
312 477ba620 Aurelien Jarno
313 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_a4(int qp, uint64_t opc, int r1,
314 477ba620 Aurelien Jarno
                                  uint64_t imm, int r3)
315 477ba620 Aurelien Jarno
{
316 477ba620 Aurelien Jarno
    return opc
317 477ba620 Aurelien Jarno
           | ((imm & 0x2000) << 23) /* s */
318 477ba620 Aurelien Jarno
           | ((imm & 0x1f80) << 20) /* imm6d */
319 477ba620 Aurelien Jarno
           | ((imm & 0x007f) << 13) /* imm7b */
320 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
321 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
322 477ba620 Aurelien Jarno
           | (qp & 0x3f);
323 477ba620 Aurelien Jarno
}
324 477ba620 Aurelien Jarno
325 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_a5(int qp, uint64_t opc, int r1,
326 477ba620 Aurelien Jarno
                                  uint64_t imm, int r3)
327 477ba620 Aurelien Jarno
{
328 477ba620 Aurelien Jarno
    return opc
329 477ba620 Aurelien Jarno
           | ((imm & 0x200000) << 15) /* s */
330 477ba620 Aurelien Jarno
           | ((imm & 0x1f0000) <<  6) /* imm5c */
331 477ba620 Aurelien Jarno
           | ((imm & 0x00ff80) << 20) /* imm9d */
332 477ba620 Aurelien Jarno
           | ((imm & 0x00007f) << 13) /* imm7b */
333 477ba620 Aurelien Jarno
           | ((r3 & 0x03) << 20)
334 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
335 477ba620 Aurelien Jarno
           | (qp & 0x3f);
336 477ba620 Aurelien Jarno
}
337 477ba620 Aurelien Jarno
338 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_a6(int qp, uint64_t opc, int p1,
339 477ba620 Aurelien Jarno
                                  int p2, int r2, int r3)
340 477ba620 Aurelien Jarno
{
341 477ba620 Aurelien Jarno
    return opc
342 477ba620 Aurelien Jarno
           | ((p2 & 0x3f) << 27)
343 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
344 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
345 477ba620 Aurelien Jarno
           | ((p1 & 0x3f) << 6)
346 477ba620 Aurelien Jarno
           | (qp & 0x3f);
347 477ba620 Aurelien Jarno
}
348 477ba620 Aurelien Jarno
349 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_b1(int qp, uint64_t opc, uint64_t imm)
350 477ba620 Aurelien Jarno
{
351 477ba620 Aurelien Jarno
    return opc
352 477ba620 Aurelien Jarno
           | ((imm & 0x100000) << 16) /* s */
353 477ba620 Aurelien Jarno
           | ((imm & 0x0fffff) << 13) /* imm20b */
354 477ba620 Aurelien Jarno
           | (qp & 0x3f);
355 477ba620 Aurelien Jarno
}
356 477ba620 Aurelien Jarno
357 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_b4(int qp, uint64_t opc, int b2)
358 477ba620 Aurelien Jarno
{
359 477ba620 Aurelien Jarno
    return opc
360 477ba620 Aurelien Jarno
           | ((b2 & 0x7) << 13)
361 477ba620 Aurelien Jarno
           | (qp & 0x3f);
362 477ba620 Aurelien Jarno
}
363 477ba620 Aurelien Jarno
364 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_b5(int qp, uint64_t opc, int b1, int b2)
365 477ba620 Aurelien Jarno
{
366 477ba620 Aurelien Jarno
    return opc
367 477ba620 Aurelien Jarno
           | ((b2 & 0x7) << 13)
368 477ba620 Aurelien Jarno
           | ((b1 & 0x7) << 6)
369 477ba620 Aurelien Jarno
           | (qp & 0x3f);
370 477ba620 Aurelien Jarno
}
371 477ba620 Aurelien Jarno
372 477ba620 Aurelien Jarno
373 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_b9(int qp, uint64_t opc, uint64_t imm)
374 477ba620 Aurelien Jarno
{
375 477ba620 Aurelien Jarno
    return opc
376 477ba620 Aurelien Jarno
           | ((imm & 0x100000) << 16) /* i */
377 477ba620 Aurelien Jarno
           | ((imm & 0x0fffff) << 6)  /* imm20a */
378 477ba620 Aurelien Jarno
           | (qp & 0x3f);
379 477ba620 Aurelien Jarno
}
380 477ba620 Aurelien Jarno
381 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_f1(int qp, uint64_t opc, int f1,
382 477ba620 Aurelien Jarno
                                  int f3, int f4, int f2)
383 477ba620 Aurelien Jarno
{
384 477ba620 Aurelien Jarno
    return opc
385 477ba620 Aurelien Jarno
           | ((f4 & 0x7f) << 27)
386 477ba620 Aurelien Jarno
           | ((f3 & 0x7f) << 20)
387 477ba620 Aurelien Jarno
           | ((f2 & 0x7f) << 13)
388 477ba620 Aurelien Jarno
           | ((f1 & 0x7f) << 6)
389 477ba620 Aurelien Jarno
           | (qp & 0x3f);
390 477ba620 Aurelien Jarno
}
391 477ba620 Aurelien Jarno
392 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_f2(int qp, uint64_t opc, int f1,
393 477ba620 Aurelien Jarno
                                  int f3, int f4, int f2)
394 477ba620 Aurelien Jarno
{
395 477ba620 Aurelien Jarno
    return opc
396 477ba620 Aurelien Jarno
           | ((f4 & 0x7f) << 27)
397 477ba620 Aurelien Jarno
           | ((f3 & 0x7f) << 20)
398 477ba620 Aurelien Jarno
           | ((f2 & 0x7f) << 13)
399 477ba620 Aurelien Jarno
           | ((f1 & 0x7f) << 6)
400 477ba620 Aurelien Jarno
           | (qp & 0x3f);
401 477ba620 Aurelien Jarno
}
402 477ba620 Aurelien Jarno
403 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_f6(int qp, uint64_t opc, int f1,
404 477ba620 Aurelien Jarno
                                  int p2, int f2, int f3)
405 477ba620 Aurelien Jarno
{
406 477ba620 Aurelien Jarno
    return opc
407 477ba620 Aurelien Jarno
           | ((p2 & 0x3f) << 27)
408 477ba620 Aurelien Jarno
           | ((f3 & 0x7f) << 20)
409 477ba620 Aurelien Jarno
           | ((f2 & 0x7f) << 13)
410 477ba620 Aurelien Jarno
           | ((f1 & 0x7f) << 6)
411 477ba620 Aurelien Jarno
           | (qp & 0x3f);
412 477ba620 Aurelien Jarno
}
413 477ba620 Aurelien Jarno
414 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_f10(int qp, uint64_t opc, int f1, int f2)
415 477ba620 Aurelien Jarno
{
416 477ba620 Aurelien Jarno
    return opc
417 477ba620 Aurelien Jarno
           | ((f2 & 0x7f) << 13)
418 477ba620 Aurelien Jarno
           | ((f1 & 0x7f) << 6)
419 477ba620 Aurelien Jarno
           | (qp & 0x3f);
420 477ba620 Aurelien Jarno
}
421 477ba620 Aurelien Jarno
422 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_f11(int qp, uint64_t opc, int f1, int f2)
423 477ba620 Aurelien Jarno
{
424 477ba620 Aurelien Jarno
    return opc
425 477ba620 Aurelien Jarno
           | ((f2 & 0x7f) << 13)
426 477ba620 Aurelien Jarno
           | ((f1 & 0x7f) << 6)
427 477ba620 Aurelien Jarno
           | (qp & 0x3f);
428 477ba620 Aurelien Jarno
}
429 477ba620 Aurelien Jarno
430 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_f16(int qp, uint64_t opc, uint64_t imm)
431 477ba620 Aurelien Jarno
{
432 477ba620 Aurelien Jarno
    return opc
433 477ba620 Aurelien Jarno
           | ((imm & 0x100000) << 16) /* i */
434 477ba620 Aurelien Jarno
           | ((imm & 0x0fffff) << 6)  /* imm20a */
435 477ba620 Aurelien Jarno
           | (qp & 0x3f);
436 477ba620 Aurelien Jarno
}
437 477ba620 Aurelien Jarno
438 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i2(int qp, uint64_t opc, int r1,
439 477ba620 Aurelien Jarno
                                  int r2, int r3)
440 477ba620 Aurelien Jarno
{
441 477ba620 Aurelien Jarno
    return opc
442 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
443 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
444 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
445 477ba620 Aurelien Jarno
           | (qp & 0x3f);
446 477ba620 Aurelien Jarno
}
447 477ba620 Aurelien Jarno
448 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i3(int qp, uint64_t opc, int r1,
449 477ba620 Aurelien Jarno
                                  int r2, int mbtype)
450 477ba620 Aurelien Jarno
{
451 477ba620 Aurelien Jarno
    return opc
452 477ba620 Aurelien Jarno
           | ((mbtype & 0x0f) << 20)
453 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
454 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
455 477ba620 Aurelien Jarno
           | (qp & 0x3f);
456 477ba620 Aurelien Jarno
}
457 477ba620 Aurelien Jarno
458 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i5(int qp, uint64_t opc, int r1,
459 477ba620 Aurelien Jarno
                                  int r3, int r2)
460 477ba620 Aurelien Jarno
{
461 477ba620 Aurelien Jarno
    return opc
462 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
463 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
464 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
465 477ba620 Aurelien Jarno
           | (qp & 0x3f);
466 477ba620 Aurelien Jarno
}
467 477ba620 Aurelien Jarno
468 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i7(int qp, uint64_t opc, int r1,
469 477ba620 Aurelien Jarno
                                  int r2, int r3)
470 477ba620 Aurelien Jarno
{
471 477ba620 Aurelien Jarno
    return opc
472 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
473 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
474 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
475 477ba620 Aurelien Jarno
           | (qp & 0x3f);
476 477ba620 Aurelien Jarno
}
477 477ba620 Aurelien Jarno
478 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i10(int qp, uint64_t opc, int r1,
479 477ba620 Aurelien Jarno
                                   int r2, int r3, uint64_t count)
480 477ba620 Aurelien Jarno
{
481 477ba620 Aurelien Jarno
    return opc
482 477ba620 Aurelien Jarno
           | ((count & 0x3f) << 27)
483 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
484 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
485 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
486 477ba620 Aurelien Jarno
           | (qp & 0x3f);
487 477ba620 Aurelien Jarno
}
488 477ba620 Aurelien Jarno
489 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i11(int qp, uint64_t opc, int r1,
490 477ba620 Aurelien Jarno
                                   int r3, uint64_t pos, uint64_t len)
491 477ba620 Aurelien Jarno
{
492 477ba620 Aurelien Jarno
    return opc
493 477ba620 Aurelien Jarno
           | ((len & 0x3f) << 27)
494 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
495 477ba620 Aurelien Jarno
           | ((pos & 0x3f) << 14)
496 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
497 477ba620 Aurelien Jarno
           | (qp & 0x3f);
498 477ba620 Aurelien Jarno
}
499 477ba620 Aurelien Jarno
500 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i12(int qp, uint64_t opc, int r1,
501 477ba620 Aurelien Jarno
                                   int r2, uint64_t pos, uint64_t len)
502 477ba620 Aurelien Jarno
{
503 477ba620 Aurelien Jarno
    return opc
504 477ba620 Aurelien Jarno
           | ((len & 0x3f) << 27)
505 477ba620 Aurelien Jarno
           | ((pos & 0x3f) << 20)
506 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
507 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
508 477ba620 Aurelien Jarno
           | (qp & 0x3f);
509 477ba620 Aurelien Jarno
}
510 477ba620 Aurelien Jarno
511 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i18(int qp, uint64_t opc, uint64_t imm)
512 477ba620 Aurelien Jarno
{
513 477ba620 Aurelien Jarno
    return opc
514 477ba620 Aurelien Jarno
           | ((imm & 0x100000) << 16) /* i */
515 477ba620 Aurelien Jarno
           | ((imm & 0x0fffff) << 6)  /* imm20a */
516 477ba620 Aurelien Jarno
           | (qp & 0x3f);
517 477ba620 Aurelien Jarno
}
518 477ba620 Aurelien Jarno
519 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i21(int qp, uint64_t opc, int b1,
520 477ba620 Aurelien Jarno
                                   int r2, uint64_t imm)
521 477ba620 Aurelien Jarno
{
522 477ba620 Aurelien Jarno
    return opc
523 477ba620 Aurelien Jarno
           | ((imm & 0x1ff) << 24)
524 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
525 477ba620 Aurelien Jarno
           | ((b1 & 0x7) << 6)
526 477ba620 Aurelien Jarno
           | (qp & 0x3f);
527 477ba620 Aurelien Jarno
}
528 477ba620 Aurelien Jarno
529 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i22(int qp, uint64_t opc, int r1, int b2)
530 477ba620 Aurelien Jarno
{
531 477ba620 Aurelien Jarno
    return opc
532 477ba620 Aurelien Jarno
           | ((b2 & 0x7) << 13)
533 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
534 477ba620 Aurelien Jarno
           | (qp & 0x3f);
535 477ba620 Aurelien Jarno
}
536 477ba620 Aurelien Jarno
537 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i26(int qp, uint64_t opc, int ar3, int r2)
538 477ba620 Aurelien Jarno
{
539 477ba620 Aurelien Jarno
    return opc
540 477ba620 Aurelien Jarno
           | ((ar3 & 0x7f) << 20)
541 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
542 477ba620 Aurelien Jarno
           | (qp & 0x3f);
543 477ba620 Aurelien Jarno
}
544 477ba620 Aurelien Jarno
545 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_i29(int qp, uint64_t opc, int r1, int r3)
546 477ba620 Aurelien Jarno
{
547 477ba620 Aurelien Jarno
    return opc
548 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
549 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
550 477ba620 Aurelien Jarno
           | (qp & 0x3f);
551 477ba620 Aurelien Jarno
}
552 477ba620 Aurelien Jarno
553 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_l2(uint64_t imm)
554 477ba620 Aurelien Jarno
{
555 477ba620 Aurelien Jarno
    return (imm & 0x7fffffffffc00000ull) >> 22;
556 477ba620 Aurelien Jarno
}
557 477ba620 Aurelien Jarno
558 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_l3(uint64_t imm)
559 477ba620 Aurelien Jarno
{
560 477ba620 Aurelien Jarno
    return (imm & 0x07fffffffff00000ull) >> 18;
561 477ba620 Aurelien Jarno
}
562 477ba620 Aurelien Jarno
563 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m1(int qp, uint64_t opc, int r1, int r3)
564 477ba620 Aurelien Jarno
{
565 477ba620 Aurelien Jarno
    return opc
566 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
567 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
568 477ba620 Aurelien Jarno
           | (qp & 0x3f);
569 477ba620 Aurelien Jarno
}
570 477ba620 Aurelien Jarno
571 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m3(int qp, uint64_t opc, int r1,
572 477ba620 Aurelien Jarno
                                  int r3, uint64_t imm)
573 477ba620 Aurelien Jarno
{
574 477ba620 Aurelien Jarno
    return opc
575 477ba620 Aurelien Jarno
           | ((imm & 0x100) << 28) /* s */
576 477ba620 Aurelien Jarno
           | ((imm & 0x080) << 20) /* i */
577 477ba620 Aurelien Jarno
           | ((imm & 0x07f) << 13) /* imm7b */
578 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
579 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
580 477ba620 Aurelien Jarno
           | (qp & 0x3f);
581 477ba620 Aurelien Jarno
}
582 477ba620 Aurelien Jarno
583 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m4(int qp, uint64_t opc, int r2, int r3)
584 477ba620 Aurelien Jarno
{
585 477ba620 Aurelien Jarno
    return opc
586 477ba620 Aurelien Jarno
           | ((r3 & 0x7f) << 20)
587 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
588 477ba620 Aurelien Jarno
           | (qp & 0x3f);
589 477ba620 Aurelien Jarno
}
590 477ba620 Aurelien Jarno
591 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m18(int qp, uint64_t opc, int f1, int r2)
592 477ba620 Aurelien Jarno
{
593 477ba620 Aurelien Jarno
    return opc
594 477ba620 Aurelien Jarno
           | ((r2 & 0x7f) << 13)
595 477ba620 Aurelien Jarno
           | ((f1 & 0x7f) << 6)
596 477ba620 Aurelien Jarno
           | (qp & 0x3f);
597 477ba620 Aurelien Jarno
}
598 477ba620 Aurelien Jarno
599 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m19(int qp, uint64_t opc, int r1, int f2)
600 477ba620 Aurelien Jarno
{
601 477ba620 Aurelien Jarno
    return opc
602 477ba620 Aurelien Jarno
           | ((f2 & 0x7f) << 13)
603 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
604 477ba620 Aurelien Jarno
           | (qp & 0x3f);
605 477ba620 Aurelien Jarno
}
606 477ba620 Aurelien Jarno
607 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m34(int qp, uint64_t opc, int r1,
608 477ba620 Aurelien Jarno
                                   int sof, int sol, int sor)
609 477ba620 Aurelien Jarno
{
610 477ba620 Aurelien Jarno
    return opc
611 477ba620 Aurelien Jarno
           | ((sor & 0x0f) << 27)
612 477ba620 Aurelien Jarno
           | ((sol & 0x7f) << 20)
613 477ba620 Aurelien Jarno
           | ((sof & 0x7f) << 13)
614 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
615 477ba620 Aurelien Jarno
           | (qp & 0x3f);
616 477ba620 Aurelien Jarno
}
617 477ba620 Aurelien Jarno
618 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_m48(int qp, uint64_t opc, uint64_t imm)
619 477ba620 Aurelien Jarno
{
620 477ba620 Aurelien Jarno
    return opc
621 477ba620 Aurelien Jarno
           | ((imm & 0x100000) << 16) /* i */
622 477ba620 Aurelien Jarno
           | ((imm & 0x0fffff) << 6)  /* imm20a */
623 477ba620 Aurelien Jarno
           | (qp & 0x3f);
624 477ba620 Aurelien Jarno
}
625 477ba620 Aurelien Jarno
626 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_x2(int qp, uint64_t opc,
627 477ba620 Aurelien Jarno
                                  int r1, uint64_t imm)
628 477ba620 Aurelien Jarno
{
629 477ba620 Aurelien Jarno
    return opc
630 477ba620 Aurelien Jarno
           | ((imm & 0x8000000000000000ull) >> 27) /* i */
631 477ba620 Aurelien Jarno
           |  (imm & 0x0000000000200000ull)        /* ic */
632 477ba620 Aurelien Jarno
           | ((imm & 0x00000000001f0000ull) << 6)  /* imm5c */
633 477ba620 Aurelien Jarno
           | ((imm & 0x000000000000ff80ull) << 20) /* imm9d */
634 477ba620 Aurelien Jarno
           | ((imm & 0x000000000000007full) << 13) /* imm7b */
635 477ba620 Aurelien Jarno
           | ((r1 & 0x7f) << 6)
636 477ba620 Aurelien Jarno
           | (qp & 0x3f);
637 477ba620 Aurelien Jarno
}
638 477ba620 Aurelien Jarno
639 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_x3(int qp, uint64_t opc, uint64_t imm)
640 477ba620 Aurelien Jarno
{
641 477ba620 Aurelien Jarno
    return opc
642 477ba620 Aurelien Jarno
           | ((imm & 0x0800000000000000ull) >> 23) /* i */
643 477ba620 Aurelien Jarno
           | ((imm & 0x00000000000fffffull) << 13) /* imm20b */
644 477ba620 Aurelien Jarno
           | (qp & 0x3f);
645 477ba620 Aurelien Jarno
}
646 477ba620 Aurelien Jarno
647 477ba620 Aurelien Jarno
648 477ba620 Aurelien Jarno
/*
649 477ba620 Aurelien Jarno
 * Relocations
650 477ba620 Aurelien Jarno
 */
651 477ba620 Aurelien Jarno
652 477ba620 Aurelien Jarno
static inline void reloc_pcrel21b (void *pc, tcg_target_long target)
653 477ba620 Aurelien Jarno
{
654 477ba620 Aurelien Jarno
    uint64_t imm;
655 477ba620 Aurelien Jarno
    int64_t disp;
656 477ba620 Aurelien Jarno
    int slot;
657 477ba620 Aurelien Jarno
658 477ba620 Aurelien Jarno
    slot = (tcg_target_long) pc & 3;
659 477ba620 Aurelien Jarno
    pc = (void *)((tcg_target_long) pc & ~3);
660 477ba620 Aurelien Jarno
661 477ba620 Aurelien Jarno
    disp = target - (tcg_target_long) pc;
662 477ba620 Aurelien Jarno
    imm = (uint64_t) disp >> 4;
663 477ba620 Aurelien Jarno
664 477ba620 Aurelien Jarno
    switch(slot) {
665 477ba620 Aurelien Jarno
    case 0:
666 477ba620 Aurelien Jarno
        *(uint64_t *)(pc + 0) = (*(uint64_t *)(pc + 8) & 0xfffffdc00003ffffull)
667 477ba620 Aurelien Jarno
                                | ((imm & 0x100000) << 21)  /* s */
668 477ba620 Aurelien Jarno
                                | ((imm & 0x0fffff) << 18); /* imm20b */
669 477ba620 Aurelien Jarno
        break;
670 477ba620 Aurelien Jarno
    case 1:
671 477ba620 Aurelien Jarno
        *(uint64_t *)(pc + 8) = (*(uint64_t *)(pc + 8) & 0xfffffffffffb8000ull)
672 477ba620 Aurelien Jarno
                                | ((imm & 0x100000) >> 2)   /* s */
673 477ba620 Aurelien Jarno
                                | ((imm & 0x0fffe0) >> 5);  /* imm20b */
674 477ba620 Aurelien Jarno
        *(uint64_t *)(pc + 0) = (*(uint64_t *)(pc + 0) & 0x07ffffffffffffffull)
675 477ba620 Aurelien Jarno
                                | ((imm & 0x00001f) << 59); /* imm20b */
676 477ba620 Aurelien Jarno
        break;
677 477ba620 Aurelien Jarno
    case 2:
678 477ba620 Aurelien Jarno
        *(uint64_t *)(pc + 8) = (*(uint64_t *)(pc + 8) & 0xf700000fffffffffull)
679 477ba620 Aurelien Jarno
                                | ((imm & 0x100000) << 39)  /* s */
680 477ba620 Aurelien Jarno
                                | ((imm & 0x0fffff) << 36); /* imm20b */
681 477ba620 Aurelien Jarno
        break;
682 477ba620 Aurelien Jarno
    }
683 477ba620 Aurelien Jarno
}
684 477ba620 Aurelien Jarno
685 477ba620 Aurelien Jarno
static inline uint64_t get_reloc_pcrel21b (void *pc)
686 477ba620 Aurelien Jarno
{
687 477ba620 Aurelien Jarno
    int64_t low, high;
688 477ba620 Aurelien Jarno
    int slot;
689 477ba620 Aurelien Jarno
690 477ba620 Aurelien Jarno
    slot = (tcg_target_long) pc & 3;
691 477ba620 Aurelien Jarno
    pc = (void *)((tcg_target_long) pc & ~3);
692 477ba620 Aurelien Jarno
693 477ba620 Aurelien Jarno
    low  = (*(uint64_t *)(pc + 0));
694 477ba620 Aurelien Jarno
    high = (*(uint64_t *)(pc + 8));
695 477ba620 Aurelien Jarno
696 477ba620 Aurelien Jarno
    switch(slot) {
697 477ba620 Aurelien Jarno
    case 0:
698 477ba620 Aurelien Jarno
        return ((low >> 21) & 0x100000) + /* s */
699 477ba620 Aurelien Jarno
               ((low >> 18) & 0x0fffff);  /* imm20b */
700 477ba620 Aurelien Jarno
    case 1:
701 477ba620 Aurelien Jarno
        return ((high << 2) & 0x100000) + /* s */
702 477ba620 Aurelien Jarno
               ((high << 5) & 0x0fffe0) + /* imm20b */
703 477ba620 Aurelien Jarno
               ((low >> 59) & 0x00001f);  /* imm20b */
704 477ba620 Aurelien Jarno
    case 2:
705 477ba620 Aurelien Jarno
        return ((high >> 39) & 0x100000) + /* s */
706 477ba620 Aurelien Jarno
               ((high >> 36) & 0x0fffff);  /* imm20b */
707 477ba620 Aurelien Jarno
    default:
708 477ba620 Aurelien Jarno
        tcg_abort();
709 477ba620 Aurelien Jarno
    }
710 477ba620 Aurelien Jarno
}
711 477ba620 Aurelien Jarno
712 477ba620 Aurelien Jarno
static inline void reloc_pcrel60b (void *pc, tcg_target_long target)
713 477ba620 Aurelien Jarno
{
714 477ba620 Aurelien Jarno
    int64_t disp;
715 477ba620 Aurelien Jarno
    uint64_t imm;
716 477ba620 Aurelien Jarno
717 477ba620 Aurelien Jarno
    disp = target - (tcg_target_long) pc;
718 477ba620 Aurelien Jarno
    imm = (uint64_t) disp >> 4;
719 477ba620 Aurelien Jarno
720 477ba620 Aurelien Jarno
    *(uint64_t *)(pc + 8) = (*(uint64_t *)(pc + 8) & 0xf700000fff800000ull)
721 477ba620 Aurelien Jarno
                             |  (imm & 0x0800000000000000ull)         /* s */
722 477ba620 Aurelien Jarno
                             | ((imm & 0x07fffff000000000ull) >> 36)  /* imm39 */
723 477ba620 Aurelien Jarno
                             | ((imm & 0x00000000000fffffull) << 36); /* imm20b */
724 477ba620 Aurelien Jarno
    *(uint64_t *)(pc + 0) = (*(uint64_t *)(pc + 0) & 0x00003fffffffffffull)
725 477ba620 Aurelien Jarno
                             | ((imm & 0x0000000ffff00000ull) << 28); /* imm39 */
726 477ba620 Aurelien Jarno
}
727 477ba620 Aurelien Jarno
728 477ba620 Aurelien Jarno
static inline uint64_t get_reloc_pcrel60b (void *pc)
729 477ba620 Aurelien Jarno
{
730 477ba620 Aurelien Jarno
    int64_t low, high;
731 477ba620 Aurelien Jarno
732 477ba620 Aurelien Jarno
    low  = (*(uint64_t *)(pc + 0));
733 477ba620 Aurelien Jarno
    high = (*(uint64_t *)(pc + 8));
734 477ba620 Aurelien Jarno
735 477ba620 Aurelien Jarno
    return ((high)       & 0x0800000000000000ull) + /* s */
736 477ba620 Aurelien Jarno
           ((high >> 36) & 0x00000000000fffffull) + /* imm20b */
737 477ba620 Aurelien Jarno
           ((high << 36) & 0x07fffff000000000ull) + /* imm39 */
738 477ba620 Aurelien Jarno
           ((low >> 28)  & 0x0000000ffff00000ull);  /* imm39 */
739 477ba620 Aurelien Jarno
}
740 477ba620 Aurelien Jarno
741 477ba620 Aurelien Jarno
742 477ba620 Aurelien Jarno
static void patch_reloc(uint8_t *code_ptr, int type,
743 477ba620 Aurelien Jarno
                        tcg_target_long value, tcg_target_long addend)
744 477ba620 Aurelien Jarno
{
745 477ba620 Aurelien Jarno
    value += addend;
746 477ba620 Aurelien Jarno
    switch (type) {
747 477ba620 Aurelien Jarno
    case R_IA64_PCREL21B:
748 477ba620 Aurelien Jarno
        reloc_pcrel21b(code_ptr, value);
749 477ba620 Aurelien Jarno
        break;
750 477ba620 Aurelien Jarno
    case R_IA64_PCREL60B:
751 477ba620 Aurelien Jarno
        reloc_pcrel60b(code_ptr, value);
752 477ba620 Aurelien Jarno
    default:
753 477ba620 Aurelien Jarno
        tcg_abort();
754 477ba620 Aurelien Jarno
    }
755 477ba620 Aurelien Jarno
}
756 477ba620 Aurelien Jarno
757 477ba620 Aurelien Jarno
/*
758 477ba620 Aurelien Jarno
 * Constraints
759 477ba620 Aurelien Jarno
 */
760 477ba620 Aurelien Jarno
761 477ba620 Aurelien Jarno
/* parse target specific constraints */
762 477ba620 Aurelien Jarno
static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
763 477ba620 Aurelien Jarno
{
764 477ba620 Aurelien Jarno
    const char *ct_str;
765 477ba620 Aurelien Jarno
766 477ba620 Aurelien Jarno
    ct_str = *pct_str;
767 477ba620 Aurelien Jarno
    switch(ct_str[0]) {
768 477ba620 Aurelien Jarno
    case 'r':
769 477ba620 Aurelien Jarno
        ct->ct |= TCG_CT_REG;
770 477ba620 Aurelien Jarno
        tcg_regset_set(ct->u.regs, 0xffffffffffffffffull);
771 477ba620 Aurelien Jarno
        break;
772 477ba620 Aurelien Jarno
    case 'I':
773 477ba620 Aurelien Jarno
        ct->ct |= TCG_CT_CONST_S22;
774 477ba620 Aurelien Jarno
        break;
775 477ba620 Aurelien Jarno
    case 'S':
776 477ba620 Aurelien Jarno
        ct->ct |= TCG_CT_REG;
777 477ba620 Aurelien Jarno
        tcg_regset_set(ct->u.regs, 0xffffffffffffffffull);
778 477ba620 Aurelien Jarno
#if defined(CONFIG_SOFTMMU)
779 477ba620 Aurelien Jarno
        tcg_regset_reset_reg(ct->u.regs, TCG_REG_R56);
780 477ba620 Aurelien Jarno
        tcg_regset_reset_reg(ct->u.regs, TCG_REG_R57);
781 477ba620 Aurelien Jarno
#endif
782 477ba620 Aurelien Jarno
        break;
783 477ba620 Aurelien Jarno
    case 'Z':
784 477ba620 Aurelien Jarno
        /* We are cheating a bit here, using the fact that the register
785 477ba620 Aurelien Jarno
           r0 is also the register number 0. Hence there is no need
786 477ba620 Aurelien Jarno
           to check for const_args in each instruction. */
787 477ba620 Aurelien Jarno
        ct->ct |= TCG_CT_CONST_ZERO;
788 477ba620 Aurelien Jarno
        break;
789 477ba620 Aurelien Jarno
    default:
790 477ba620 Aurelien Jarno
        return -1;
791 477ba620 Aurelien Jarno
    }
792 477ba620 Aurelien Jarno
    ct_str++;
793 477ba620 Aurelien Jarno
    *pct_str = ct_str;
794 477ba620 Aurelien Jarno
    return 0;
795 477ba620 Aurelien Jarno
}
796 477ba620 Aurelien Jarno
797 477ba620 Aurelien Jarno
/* test if a constant matches the constraint */
798 477ba620 Aurelien Jarno
static inline int tcg_target_const_match(tcg_target_long val,
799 477ba620 Aurelien Jarno
                                         const TCGArgConstraint *arg_ct)
800 477ba620 Aurelien Jarno
{
801 477ba620 Aurelien Jarno
    int ct;
802 477ba620 Aurelien Jarno
    ct = arg_ct->ct;
803 477ba620 Aurelien Jarno
    if (ct & TCG_CT_CONST)
804 477ba620 Aurelien Jarno
        return 1;
805 477ba620 Aurelien Jarno
    else if ((ct & TCG_CT_CONST_ZERO) && val == 0)
806 477ba620 Aurelien Jarno
        return 1;
807 477ba620 Aurelien Jarno
    else if ((ct & TCG_CT_CONST_S22) && val == ((int32_t)val << 10) >> 10)
808 477ba620 Aurelien Jarno
        return 1;
809 477ba620 Aurelien Jarno
    else
810 477ba620 Aurelien Jarno
        return 0;
811 477ba620 Aurelien Jarno
}
812 477ba620 Aurelien Jarno
813 477ba620 Aurelien Jarno
/*
814 477ba620 Aurelien Jarno
 * Code generation
815 477ba620 Aurelien Jarno
 */
816 477ba620 Aurelien Jarno
817 477ba620 Aurelien Jarno
static uint8_t *tb_ret_addr;
818 477ba620 Aurelien Jarno
819 477ba620 Aurelien Jarno
static inline void tcg_out_bundle(TCGContext *s, int template,
820 477ba620 Aurelien Jarno
                                  uint64_t slot0, uint64_t slot1,
821 477ba620 Aurelien Jarno
                                  uint64_t slot2)
822 477ba620 Aurelien Jarno
{
823 477ba620 Aurelien Jarno
    template &= 0x1f;          /* 5 bits */
824 477ba620 Aurelien Jarno
    slot0 &= 0x1ffffffffffull; /* 41 bits */
825 477ba620 Aurelien Jarno
    slot1 &= 0x1ffffffffffull; /* 41 bits */
826 477ba620 Aurelien Jarno
    slot2 &= 0x1ffffffffffull; /* 41 bits */
827 477ba620 Aurelien Jarno
828 477ba620 Aurelien Jarno
    *(uint64_t *)(s->code_ptr + 0) = (slot1 << 46) | (slot0 << 5) | template;
829 477ba620 Aurelien Jarno
    *(uint64_t *)(s->code_ptr + 8) = (slot2 << 23) | (slot1 >> 18);
830 477ba620 Aurelien Jarno
    s->code_ptr += 16;
831 477ba620 Aurelien Jarno
}
832 477ba620 Aurelien Jarno
833 3b6dac34 Richard Henderson
static inline void tcg_out_mov(TCGContext *s, TCGType type,
834 3b6dac34 Richard Henderson
                               TCGArg ret, TCGArg arg)
835 477ba620 Aurelien Jarno
{
836 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmI,
837 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
838 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
839 477ba620 Aurelien Jarno
                   tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, ret, 0, arg));
840 477ba620 Aurelien Jarno
}
841 477ba620 Aurelien Jarno
842 477ba620 Aurelien Jarno
static inline void tcg_out_movi(TCGContext *s, TCGType type,
843 477ba620 Aurelien Jarno
                                TCGArg reg, tcg_target_long arg)
844 477ba620 Aurelien Jarno
{
845 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mLX,
846 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
847 477ba620 Aurelien Jarno
                   tcg_opc_l2 (arg),
848 477ba620 Aurelien Jarno
                   tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, reg, arg));
849 477ba620 Aurelien Jarno
}
850 477ba620 Aurelien Jarno
851 477ba620 Aurelien Jarno
static inline void tcg_out_addi(TCGContext *s, TCGArg reg, tcg_target_long val)
852 477ba620 Aurelien Jarno
{
853 477ba620 Aurelien Jarno
    if (val == ((int32_t)val << 10) >> 10) {
854 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
855 477ba620 Aurelien Jarno
                       tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5,
856 477ba620 Aurelien Jarno
                                  TCG_REG_R2, val, TCG_REG_R0),
857 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
858 477ba620 Aurelien Jarno
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, reg,
859 477ba620 Aurelien Jarno
                                   reg, TCG_REG_R2));
860 477ba620 Aurelien Jarno
    } else {
861 477ba620 Aurelien Jarno
        tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, val);
862 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mmI,
863 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
864 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
865 477ba620 Aurelien Jarno
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, reg,
866 477ba620 Aurelien Jarno
                                   reg, TCG_REG_R2));
867 477ba620 Aurelien Jarno
    }
868 477ba620 Aurelien Jarno
}
869 477ba620 Aurelien Jarno
870 477ba620 Aurelien Jarno
static void tcg_out_br(TCGContext *s, int label_index)
871 477ba620 Aurelien Jarno
{
872 477ba620 Aurelien Jarno
    TCGLabel *l = &s->labels[label_index];
873 477ba620 Aurelien Jarno
874 56779034 Aurelien Jarno
    /* We pay attention here to not modify the branch target by reading
875 56779034 Aurelien Jarno
       the existing value and using it again. This ensure that caches and
876 56779034 Aurelien Jarno
       memory are kept coherent during retranslation. */
877 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmB,
878 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
879 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
880 477ba620 Aurelien Jarno
                   tcg_opc_b1 (TCG_REG_P0, OPC_BR_SPTK_MANY_B1,
881 477ba620 Aurelien Jarno
                               get_reloc_pcrel21b(s->code_ptr + 2)));
882 477ba620 Aurelien Jarno
883 477ba620 Aurelien Jarno
    if (l->has_value) {
884 477ba620 Aurelien Jarno
        reloc_pcrel21b((s->code_ptr - 16) + 2, l->u.value);
885 477ba620 Aurelien Jarno
    } else {
886 477ba620 Aurelien Jarno
        tcg_out_reloc(s, (s->code_ptr - 16) + 2,
887 477ba620 Aurelien Jarno
                      R_IA64_PCREL21B, label_index, 0);
888 477ba620 Aurelien Jarno
    }
889 477ba620 Aurelien Jarno
}
890 477ba620 Aurelien Jarno
891 477ba620 Aurelien Jarno
static inline void tcg_out_call(TCGContext *s, TCGArg addr)
892 477ba620 Aurelien Jarno
{
893 477ba620 Aurelien Jarno
    tcg_out_bundle(s, MmI,
894 477ba620 Aurelien Jarno
                   tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1, TCG_REG_R2, addr),
895 477ba620 Aurelien Jarno
                   tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4, TCG_REG_R3, 8, addr),
896 477ba620 Aurelien Jarno
                   tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21,
897 477ba620 Aurelien Jarno
                               TCG_REG_B6, TCG_REG_R2, 0));
898 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmB,
899 477ba620 Aurelien Jarno
                   tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R3),
900 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
901 477ba620 Aurelien Jarno
                   tcg_opc_b5 (TCG_REG_P0, OPC_BR_CALL_SPTK_MANY_B5,
902 477ba620 Aurelien Jarno
                               TCG_REG_B0, TCG_REG_B6));
903 477ba620 Aurelien Jarno
}
904 477ba620 Aurelien Jarno
905 477ba620 Aurelien Jarno
static void tcg_out_exit_tb(TCGContext *s, tcg_target_long arg)
906 477ba620 Aurelien Jarno
{
907 477ba620 Aurelien Jarno
    int64_t disp;
908 477ba620 Aurelien Jarno
    uint64_t imm;
909 477ba620 Aurelien Jarno
910 477ba620 Aurelien Jarno
    tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R8, arg);
911 477ba620 Aurelien Jarno
912 477ba620 Aurelien Jarno
    disp = tb_ret_addr - s->code_ptr;
913 477ba620 Aurelien Jarno
    imm = (uint64_t)disp >> 4;
914 477ba620 Aurelien Jarno
915 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mLX,
916 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
917 477ba620 Aurelien Jarno
                   tcg_opc_l3 (imm),
918 477ba620 Aurelien Jarno
                   tcg_opc_x3 (TCG_REG_P0, OPC_BRL_SPTK_MANY_X3, imm));
919 477ba620 Aurelien Jarno
}
920 477ba620 Aurelien Jarno
921 477ba620 Aurelien Jarno
static inline void tcg_out_goto_tb(TCGContext *s, TCGArg arg)
922 477ba620 Aurelien Jarno
{
923 477ba620 Aurelien Jarno
    if (s->tb_jmp_offset) {
924 477ba620 Aurelien Jarno
        /* direct jump method */
925 477ba620 Aurelien Jarno
        tcg_abort();
926 477ba620 Aurelien Jarno
    } else {
927 477ba620 Aurelien Jarno
        /* indirect jump method */
928 477ba620 Aurelien Jarno
        tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2,
929 477ba620 Aurelien Jarno
                     (tcg_target_long)(s->tb_next + arg));
930 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
931 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1,
932 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R2),
933 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
934 477ba620 Aurelien Jarno
                       tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, TCG_REG_B6,
935 477ba620 Aurelien Jarno
                                   TCG_REG_R2, 0));
936 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mmB,
937 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
938 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
939 477ba620 Aurelien Jarno
                       tcg_opc_b4 (TCG_REG_P0, OPC_BR_SPTK_MANY_B4,
940 477ba620 Aurelien Jarno
                                   TCG_REG_B6));
941 477ba620 Aurelien Jarno
    }
942 477ba620 Aurelien Jarno
    s->tb_next_offset[arg] = s->code_ptr - s->code_buf;
943 477ba620 Aurelien Jarno
}
944 477ba620 Aurelien Jarno
945 477ba620 Aurelien Jarno
static inline void tcg_out_jmp(TCGContext *s, TCGArg addr)
946 477ba620 Aurelien Jarno
{
947 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmI,
948 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
949 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
950 477ba620 Aurelien Jarno
                   tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, TCG_REG_B6, addr, 0));
951 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmB,
952 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
953 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
954 477ba620 Aurelien Jarno
                   tcg_opc_b4(TCG_REG_P0, OPC_BR_SPTK_MANY_B4, TCG_REG_B6));
955 477ba620 Aurelien Jarno
}
956 477ba620 Aurelien Jarno
957 477ba620 Aurelien Jarno
static inline void tcg_out_ld_rel(TCGContext *s, uint64_t opc_m4, TCGArg arg,
958 477ba620 Aurelien Jarno
                                  TCGArg arg1, tcg_target_long arg2)
959 477ba620 Aurelien Jarno
{
960 477ba620 Aurelien Jarno
    if (arg2 == ((int16_t)arg2 >> 2) << 2) {
961 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
962 477ba620 Aurelien Jarno
                       tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4,
963 477ba620 Aurelien Jarno
                                  TCG_REG_R2, arg2, arg1),
964 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
965 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
966 477ba620 Aurelien Jarno
    } else {
967 477ba620 Aurelien Jarno
        tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, arg2);
968 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
969 477ba620 Aurelien Jarno
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1,
970 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R2, arg1),
971 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
972 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
973 477ba620 Aurelien Jarno
    }
974 477ba620 Aurelien Jarno
}
975 477ba620 Aurelien Jarno
976 477ba620 Aurelien Jarno
static inline void tcg_out_st_rel(TCGContext *s, uint64_t opc_m4, TCGArg arg,
977 477ba620 Aurelien Jarno
                                  TCGArg arg1, tcg_target_long arg2)
978 477ba620 Aurelien Jarno
{
979 477ba620 Aurelien Jarno
    if (arg2 == ((int16_t)arg2 >> 2) << 2) {
980 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
981 477ba620 Aurelien Jarno
                       tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4,
982 477ba620 Aurelien Jarno
                                  TCG_REG_R2, arg2, arg1),
983 477ba620 Aurelien Jarno
                       tcg_opc_m4 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
984 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
985 477ba620 Aurelien Jarno
    } else {
986 477ba620 Aurelien Jarno
        tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, arg2);
987 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
988 477ba620 Aurelien Jarno
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1,
989 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R2, arg1),
990 477ba620 Aurelien Jarno
                       tcg_opc_m4 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
991 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
992 477ba620 Aurelien Jarno
    }
993 477ba620 Aurelien Jarno
}
994 477ba620 Aurelien Jarno
995 477ba620 Aurelien Jarno
static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGArg arg,
996 477ba620 Aurelien Jarno
                              TCGArg arg1, tcg_target_long arg2)
997 477ba620 Aurelien Jarno
{
998 477ba620 Aurelien Jarno
    if (type == TCG_TYPE_I32) {
999 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD4_M1, arg, arg1, arg2);
1000 477ba620 Aurelien Jarno
    } else {
1001 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD8_M1, arg, arg1, arg2);
1002 477ba620 Aurelien Jarno
    }
1003 477ba620 Aurelien Jarno
}
1004 477ba620 Aurelien Jarno
1005 477ba620 Aurelien Jarno
static inline void tcg_out_st(TCGContext *s, TCGType type, TCGArg arg,
1006 477ba620 Aurelien Jarno
                              TCGArg arg1, tcg_target_long arg2)
1007 477ba620 Aurelien Jarno
{
1008 477ba620 Aurelien Jarno
    if (type == TCG_TYPE_I32) {
1009 477ba620 Aurelien Jarno
        tcg_out_st_rel(s, OPC_ST4_M4, arg, arg1, arg2);
1010 477ba620 Aurelien Jarno
    } else {
1011 477ba620 Aurelien Jarno
        tcg_out_st_rel(s, OPC_ST8_M4, arg, arg1, arg2);
1012 477ba620 Aurelien Jarno
    }
1013 477ba620 Aurelien Jarno
}
1014 477ba620 Aurelien Jarno
1015 477ba620 Aurelien Jarno
static inline void tcg_out_alu(TCGContext *s, uint64_t opc_a1, TCGArg ret,
1016 477ba620 Aurelien Jarno
                               TCGArg arg1, int const_arg1,
1017 477ba620 Aurelien Jarno
                               TCGArg arg2, int const_arg2)
1018 477ba620 Aurelien Jarno
{
1019 477ba620 Aurelien Jarno
    uint64_t opc1, opc2;
1020 477ba620 Aurelien Jarno
1021 477ba620 Aurelien Jarno
    if (const_arg1 && arg1 != 0) {
1022 477ba620 Aurelien Jarno
        opc1 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5,
1023 477ba620 Aurelien Jarno
                          TCG_REG_R2, arg1, TCG_REG_R0);
1024 477ba620 Aurelien Jarno
        arg1 = TCG_REG_R2;
1025 477ba620 Aurelien Jarno
    } else {
1026 477ba620 Aurelien Jarno
        opc1 = tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0);
1027 477ba620 Aurelien Jarno
    }
1028 477ba620 Aurelien Jarno
1029 477ba620 Aurelien Jarno
    if (const_arg2 && arg2 != 0) {
1030 477ba620 Aurelien Jarno
        opc2 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5,
1031 477ba620 Aurelien Jarno
                          TCG_REG_R3, arg2, TCG_REG_R0);
1032 477ba620 Aurelien Jarno
        arg2 = TCG_REG_R3;
1033 477ba620 Aurelien Jarno
    } else {
1034 477ba620 Aurelien Jarno
        opc2 = tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0);
1035 477ba620 Aurelien Jarno
    }
1036 477ba620 Aurelien Jarno
1037 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1038 477ba620 Aurelien Jarno
                   opc1,
1039 477ba620 Aurelien Jarno
                   opc2,
1040 477ba620 Aurelien Jarno
                   tcg_opc_a1(TCG_REG_P0, opc_a1, ret, arg1, arg2));
1041 477ba620 Aurelien Jarno
}
1042 477ba620 Aurelien Jarno
1043 477ba620 Aurelien Jarno
static inline void tcg_out_eqv(TCGContext *s, TCGArg ret,
1044 477ba620 Aurelien Jarno
                               TCGArg arg1, int const_arg1,
1045 477ba620 Aurelien Jarno
                               TCGArg arg2, int const_arg2)
1046 477ba620 Aurelien Jarno
{
1047 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1048 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1049 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P0, OPC_XOR_A1, ret, arg1, arg2),
1050 477ba620 Aurelien Jarno
                   tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret));
1051 477ba620 Aurelien Jarno
}
1052 477ba620 Aurelien Jarno
1053 477ba620 Aurelien Jarno
static inline void tcg_out_nand(TCGContext *s, TCGArg ret,
1054 477ba620 Aurelien Jarno
                                TCGArg arg1, int const_arg1,
1055 477ba620 Aurelien Jarno
                                TCGArg arg2, int const_arg2)
1056 477ba620 Aurelien Jarno
{
1057 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1058 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1059 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P0, OPC_AND_A1, ret, arg1, arg2),
1060 477ba620 Aurelien Jarno
                   tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret));
1061 477ba620 Aurelien Jarno
}
1062 477ba620 Aurelien Jarno
1063 477ba620 Aurelien Jarno
static inline void tcg_out_nor(TCGContext *s, TCGArg ret,
1064 477ba620 Aurelien Jarno
                               TCGArg arg1, int const_arg1,
1065 477ba620 Aurelien Jarno
                               TCGArg arg2, int const_arg2)
1066 477ba620 Aurelien Jarno
{
1067 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1068 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1069 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, arg1, arg2),
1070 477ba620 Aurelien Jarno
                   tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret));
1071 477ba620 Aurelien Jarno
}
1072 477ba620 Aurelien Jarno
1073 477ba620 Aurelien Jarno
static inline void tcg_out_orc(TCGContext *s, TCGArg ret,
1074 477ba620 Aurelien Jarno
                               TCGArg arg1, int const_arg1,
1075 477ba620 Aurelien Jarno
                               TCGArg arg2, int const_arg2)
1076 477ba620 Aurelien Jarno
{
1077 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1078 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1079 477ba620 Aurelien Jarno
                   tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, TCG_REG_R2, -1, arg2),
1080 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, arg1, TCG_REG_R2));
1081 477ba620 Aurelien Jarno
}
1082 477ba620 Aurelien Jarno
1083 477ba620 Aurelien Jarno
static inline void tcg_out_mul(TCGContext *s, TCGArg ret,
1084 477ba620 Aurelien Jarno
                               TCGArg arg1, TCGArg arg2)
1085 477ba620 Aurelien Jarno
{
1086 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmI,
1087 477ba620 Aurelien Jarno
                   tcg_opc_m18(TCG_REG_P0, OPC_SETF_SIG_M18, TCG_REG_F6, arg1),
1088 477ba620 Aurelien Jarno
                   tcg_opc_m18(TCG_REG_P0, OPC_SETF_SIG_M18, TCG_REG_F7, arg2),
1089 477ba620 Aurelien Jarno
                   tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1090 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmF,
1091 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1092 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1093 477ba620 Aurelien Jarno
                   tcg_opc_f2 (TCG_REG_P0, OPC_XMA_L_F2, TCG_REG_F6, TCG_REG_F6,
1094 477ba620 Aurelien Jarno
                               TCG_REG_F7, TCG_REG_F0));
1095 477ba620 Aurelien Jarno
    tcg_out_bundle(s, miI,
1096 477ba620 Aurelien Jarno
                   tcg_opc_m19(TCG_REG_P0, OPC_GETF_SIG_M19, ret, TCG_REG_F6),
1097 477ba620 Aurelien Jarno
                   tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1098 477ba620 Aurelien Jarno
                   tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1099 477ba620 Aurelien Jarno
}
1100 477ba620 Aurelien Jarno
1101 477ba620 Aurelien Jarno
static inline void tcg_out_sar_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
1102 477ba620 Aurelien Jarno
                                   TCGArg arg2, int const_arg2)
1103 477ba620 Aurelien Jarno
{
1104 477ba620 Aurelien Jarno
    if (const_arg2) {
1105 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1106 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1107 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1108 477ba620 Aurelien Jarno
                       tcg_opc_i11(TCG_REG_P0, OPC_EXTR_I11,
1109 477ba620 Aurelien Jarno
                                   ret, arg1, arg2, 31 - arg2));
1110 477ba620 Aurelien Jarno
    } else {
1111 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1112 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3,
1113 477ba620 Aurelien Jarno
                                   TCG_REG_R3, 0x1f, arg2),
1114 477ba620 Aurelien Jarno
                       tcg_opc_i29(TCG_REG_P0, OPC_SXT4_I29, TCG_REG_R2, arg1),
1115 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_I5, ret,
1116 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R3));
1117 477ba620 Aurelien Jarno
    }
1118 477ba620 Aurelien Jarno
}
1119 477ba620 Aurelien Jarno
1120 477ba620 Aurelien Jarno
static inline void tcg_out_sar_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
1121 477ba620 Aurelien Jarno
                                   TCGArg arg2, int const_arg2)
1122 477ba620 Aurelien Jarno
{
1123 477ba620 Aurelien Jarno
    if (const_arg2) {
1124 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1125 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1126 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1127 477ba620 Aurelien Jarno
                       tcg_opc_i11(TCG_REG_P0, OPC_EXTR_I11,
1128 477ba620 Aurelien Jarno
                                   ret, arg1, arg2, 63 - arg2));
1129 477ba620 Aurelien Jarno
    } else {
1130 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1131 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1132 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1133 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_I5, ret, arg1, arg2));
1134 477ba620 Aurelien Jarno
    }
1135 477ba620 Aurelien Jarno
}
1136 477ba620 Aurelien Jarno
1137 477ba620 Aurelien Jarno
static inline void tcg_out_shl_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
1138 477ba620 Aurelien Jarno
                                   TCGArg arg2, int const_arg2)
1139 477ba620 Aurelien Jarno
{
1140 477ba620 Aurelien Jarno
    if (const_arg2) {
1141 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1142 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1143 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1144 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret,
1145 477ba620 Aurelien Jarno
                                   arg1, 63 - arg2, 31 - arg2));
1146 477ba620 Aurelien Jarno
    } else {
1147 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1148 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1149 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R2,
1150 477ba620 Aurelien Jarno
                                   0x1f, arg2),
1151 477ba620 Aurelien Jarno
                       tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, ret,
1152 477ba620 Aurelien Jarno
                                   arg1, TCG_REG_R2));
1153 477ba620 Aurelien Jarno
    }
1154 477ba620 Aurelien Jarno
}
1155 477ba620 Aurelien Jarno
1156 477ba620 Aurelien Jarno
static inline void tcg_out_shl_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
1157 477ba620 Aurelien Jarno
                                   TCGArg arg2, int const_arg2)
1158 477ba620 Aurelien Jarno
{
1159 477ba620 Aurelien Jarno
    if (const_arg2) {
1160 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1161 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1162 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1163 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret,
1164 477ba620 Aurelien Jarno
                                   arg1, 63 - arg2, 63 - arg2));
1165 477ba620 Aurelien Jarno
    } else {
1166 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1167 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1168 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1169 477ba620 Aurelien Jarno
                       tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, ret,
1170 477ba620 Aurelien Jarno
                                   arg1, arg2));
1171 477ba620 Aurelien Jarno
    }
1172 477ba620 Aurelien Jarno
}
1173 477ba620 Aurelien Jarno
1174 477ba620 Aurelien Jarno
static inline void tcg_out_shr_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
1175 477ba620 Aurelien Jarno
                                   TCGArg arg2, int const_arg2)
1176 477ba620 Aurelien Jarno
{
1177 477ba620 Aurelien Jarno
    if (const_arg2) {
1178 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1179 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1180 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1181 477ba620 Aurelien Jarno
                       tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
1182 477ba620 Aurelien Jarno
                                   arg1, arg2, 31 - arg2));
1183 477ba620 Aurelien Jarno
    } else {
1184 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1185 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3,
1186 477ba620 Aurelien Jarno
                                   0x1f, arg2),
1187 477ba620 Aurelien Jarno
                       tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, TCG_REG_R2, arg1),
1188 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
1189 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R3));
1190 477ba620 Aurelien Jarno
    }
1191 477ba620 Aurelien Jarno
}
1192 477ba620 Aurelien Jarno
1193 477ba620 Aurelien Jarno
static inline void tcg_out_shr_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
1194 477ba620 Aurelien Jarno
                                   TCGArg arg2, int const_arg2)
1195 477ba620 Aurelien Jarno
{
1196 477ba620 Aurelien Jarno
    if (const_arg2) {
1197 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1198 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1199 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1200 477ba620 Aurelien Jarno
                       tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
1201 477ba620 Aurelien Jarno
                                   arg1, arg2, 63 - arg2));
1202 477ba620 Aurelien Jarno
    } else {
1203 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1204 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1205 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1206 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
1207 477ba620 Aurelien Jarno
                                   arg1, arg2));
1208 477ba620 Aurelien Jarno
    }
1209 477ba620 Aurelien Jarno
}
1210 477ba620 Aurelien Jarno
1211 477ba620 Aurelien Jarno
static inline void tcg_out_rotl_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
1212 477ba620 Aurelien Jarno
                                    TCGArg arg2, int const_arg2)
1213 477ba620 Aurelien Jarno
{
1214 477ba620 Aurelien Jarno
    if (const_arg2) {
1215 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1216 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1217 477ba620 Aurelien Jarno
                       tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
1218 477ba620 Aurelien Jarno
                                   TCG_REG_R2, arg1, arg1),
1219 477ba620 Aurelien Jarno
                       tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
1220 477ba620 Aurelien Jarno
                                   TCG_REG_R2, 32 - arg2, 31));
1221 477ba620 Aurelien Jarno
    } else {
1222 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1223 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1224 477ba620 Aurelien Jarno
                       tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
1225 477ba620 Aurelien Jarno
                                   TCG_REG_R2, arg1, arg1),
1226 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3,
1227 477ba620 Aurelien Jarno
                                   0x1f, arg2));
1228 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1229 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1230 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R3,
1231 477ba620 Aurelien Jarno
                                   0x20, TCG_REG_R3),
1232 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
1233 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R3));
1234 477ba620 Aurelien Jarno
    }
1235 477ba620 Aurelien Jarno
}
1236 477ba620 Aurelien Jarno
1237 477ba620 Aurelien Jarno
static inline void tcg_out_rotl_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
1238 477ba620 Aurelien Jarno
                                    TCGArg arg2, int const_arg2)
1239 477ba620 Aurelien Jarno
{
1240 477ba620 Aurelien Jarno
    if (const_arg2) {
1241 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1242 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1243 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1244 477ba620 Aurelien Jarno
                       tcg_opc_i10(TCG_REG_P0, OPC_SHRP_I10, ret, arg1,
1245 477ba620 Aurelien Jarno
                                   arg1, 0x40 - arg2));
1246 477ba620 Aurelien Jarno
    } else {
1247 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1248 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R2,
1249 477ba620 Aurelien Jarno
                                   0x40, arg2),
1250 477ba620 Aurelien Jarno
                       tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, TCG_REG_R3,
1251 477ba620 Aurelien Jarno
                                   arg1, arg2),
1252 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, TCG_REG_R2,
1253 477ba620 Aurelien Jarno
                                   arg1, TCG_REG_R2));
1254 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1255 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1256 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1257 477ba620 Aurelien Jarno
                       tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret,
1258 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R3));
1259 477ba620 Aurelien Jarno
    }
1260 477ba620 Aurelien Jarno
}
1261 477ba620 Aurelien Jarno
1262 477ba620 Aurelien Jarno
static inline void tcg_out_rotr_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
1263 477ba620 Aurelien Jarno
                                    TCGArg arg2, int const_arg2)
1264 477ba620 Aurelien Jarno
{
1265 477ba620 Aurelien Jarno
    if (const_arg2) {
1266 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1267 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1268 477ba620 Aurelien Jarno
                       tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
1269 477ba620 Aurelien Jarno
                                   TCG_REG_R2, arg1, arg1),
1270 477ba620 Aurelien Jarno
                       tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
1271 477ba620 Aurelien Jarno
                                   TCG_REG_R2, arg2, 31));
1272 477ba620 Aurelien Jarno
    } else {
1273 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1274 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3,
1275 477ba620 Aurelien Jarno
                                   0x1f, arg2),
1276 477ba620 Aurelien Jarno
                       tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
1277 477ba620 Aurelien Jarno
                                   TCG_REG_R2, arg1, arg1),
1278 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
1279 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R3));
1280 477ba620 Aurelien Jarno
    }
1281 477ba620 Aurelien Jarno
}
1282 477ba620 Aurelien Jarno
1283 477ba620 Aurelien Jarno
static inline void tcg_out_rotr_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
1284 477ba620 Aurelien Jarno
                                    TCGArg arg2, int const_arg2)
1285 477ba620 Aurelien Jarno
{
1286 477ba620 Aurelien Jarno
    if (const_arg2) {
1287 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1288 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1289 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1290 477ba620 Aurelien Jarno
                       tcg_opc_i10(TCG_REG_P0, OPC_SHRP_I10, ret, arg1,
1291 477ba620 Aurelien Jarno
                                   arg1, arg2));
1292 477ba620 Aurelien Jarno
    } else {
1293 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1294 477ba620 Aurelien Jarno
                       tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R2,
1295 477ba620 Aurelien Jarno
                                   0x40, arg2),
1296 477ba620 Aurelien Jarno
                       tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, TCG_REG_R3,
1297 477ba620 Aurelien Jarno
                                   arg1, arg2),
1298 477ba620 Aurelien Jarno
                       tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, TCG_REG_R2,
1299 477ba620 Aurelien Jarno
                                   arg1, TCG_REG_R2));
1300 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1301 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1302 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1303 477ba620 Aurelien Jarno
                       tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret,
1304 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R3));
1305 477ba620 Aurelien Jarno
    }
1306 477ba620 Aurelien Jarno
}
1307 477ba620 Aurelien Jarno
1308 477ba620 Aurelien Jarno
static inline void tcg_out_ext(TCGContext *s, uint64_t opc_i29,
1309 477ba620 Aurelien Jarno
                               TCGArg ret, TCGArg arg)
1310 477ba620 Aurelien Jarno
{
1311 477ba620 Aurelien Jarno
    tcg_out_bundle(s, miI,
1312 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1313 477ba620 Aurelien Jarno
                   tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1314 477ba620 Aurelien Jarno
                   tcg_opc_i29(TCG_REG_P0, opc_i29, ret, arg));
1315 477ba620 Aurelien Jarno
}
1316 477ba620 Aurelien Jarno
1317 477ba620 Aurelien Jarno
static inline void tcg_out_bswap16(TCGContext *s, TCGArg ret, TCGArg arg)
1318 477ba620 Aurelien Jarno
{
1319 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1320 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1321 477ba620 Aurelien Jarno
                   tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, arg, 15, 15),
1322 477ba620 Aurelien Jarno
                   tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3, ret, ret, 0xb));
1323 477ba620 Aurelien Jarno
}
1324 477ba620 Aurelien Jarno
1325 477ba620 Aurelien Jarno
static inline void tcg_out_bswap32(TCGContext *s, TCGArg ret, TCGArg arg)
1326 477ba620 Aurelien Jarno
{
1327 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1328 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1329 477ba620 Aurelien Jarno
                   tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, arg, 31, 31),
1330 477ba620 Aurelien Jarno
                   tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3, ret, ret, 0xb));
1331 477ba620 Aurelien Jarno
}
1332 477ba620 Aurelien Jarno
1333 477ba620 Aurelien Jarno
static inline void tcg_out_bswap64(TCGContext *s, TCGArg ret, TCGArg arg)
1334 477ba620 Aurelien Jarno
{
1335 a3e28aa5 Aurelien Jarno
    tcg_out_bundle(s, miI,
1336 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1337 477ba620 Aurelien Jarno
                   tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1338 477ba620 Aurelien Jarno
                   tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3, ret, arg, 0xb));
1339 477ba620 Aurelien Jarno
}
1340 477ba620 Aurelien Jarno
1341 477ba620 Aurelien Jarno
static inline uint64_t tcg_opc_cmp_a(int qp, TCGCond cond, TCGArg arg1,
1342 477ba620 Aurelien Jarno
                                     TCGArg arg2, int cmp4)
1343 477ba620 Aurelien Jarno
{
1344 477ba620 Aurelien Jarno
    uint64_t opc_eq_a6, opc_lt_a6, opc_ltu_a6;
1345 477ba620 Aurelien Jarno
1346 477ba620 Aurelien Jarno
    if (cmp4) {
1347 477ba620 Aurelien Jarno
        opc_eq_a6 = OPC_CMP4_EQ_A6;
1348 477ba620 Aurelien Jarno
        opc_lt_a6 = OPC_CMP4_LT_A6;
1349 477ba620 Aurelien Jarno
        opc_ltu_a6 = OPC_CMP4_LTU_A6;
1350 477ba620 Aurelien Jarno
    } else {
1351 477ba620 Aurelien Jarno
        opc_eq_a6 = OPC_CMP_EQ_A6;
1352 477ba620 Aurelien Jarno
        opc_lt_a6 = OPC_CMP_LT_A6;
1353 477ba620 Aurelien Jarno
        opc_ltu_a6 = OPC_CMP_LTU_A6;
1354 477ba620 Aurelien Jarno
    }
1355 477ba620 Aurelien Jarno
1356 477ba620 Aurelien Jarno
    switch (cond) {
1357 477ba620 Aurelien Jarno
    case TCG_COND_EQ:
1358 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_eq_a6,  TCG_REG_P6, TCG_REG_P7, arg1, arg2);
1359 477ba620 Aurelien Jarno
    case TCG_COND_NE:
1360 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_eq_a6,  TCG_REG_P7, TCG_REG_P6, arg1, arg2);
1361 477ba620 Aurelien Jarno
    case TCG_COND_LT:
1362 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P6, TCG_REG_P7, arg1, arg2);
1363 477ba620 Aurelien Jarno
    case TCG_COND_LTU:
1364 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P6, TCG_REG_P7, arg1, arg2);
1365 477ba620 Aurelien Jarno
    case TCG_COND_GE:
1366 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P7, TCG_REG_P6, arg1, arg2);
1367 477ba620 Aurelien Jarno
    case TCG_COND_GEU:
1368 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P7, TCG_REG_P6, arg1, arg2);
1369 477ba620 Aurelien Jarno
    case TCG_COND_LE:
1370 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P7, TCG_REG_P6, arg2, arg1);
1371 477ba620 Aurelien Jarno
    case TCG_COND_LEU:
1372 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P7, TCG_REG_P6, arg2, arg1);
1373 477ba620 Aurelien Jarno
    case TCG_COND_GT:
1374 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P6, TCG_REG_P7, arg2, arg1);
1375 477ba620 Aurelien Jarno
    case TCG_COND_GTU:
1376 477ba620 Aurelien Jarno
        return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P6, TCG_REG_P7, arg2, arg1);
1377 477ba620 Aurelien Jarno
    default:
1378 477ba620 Aurelien Jarno
        tcg_abort();
1379 477ba620 Aurelien Jarno
        break;
1380 477ba620 Aurelien Jarno
    }
1381 477ba620 Aurelien Jarno
}
1382 477ba620 Aurelien Jarno
1383 477ba620 Aurelien Jarno
static inline void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGArg arg1,
1384 477ba620 Aurelien Jarno
                                  int const_arg1, TCGArg arg2, int const_arg2,
1385 477ba620 Aurelien Jarno
                                  int label_index, int cmp4)
1386 477ba620 Aurelien Jarno
{
1387 477ba620 Aurelien Jarno
    TCGLabel *l = &s->labels[label_index];
1388 477ba620 Aurelien Jarno
    uint64_t opc1, opc2;
1389 477ba620 Aurelien Jarno
1390 477ba620 Aurelien Jarno
    if (const_arg1 && arg1 != 0) {
1391 477ba620 Aurelien Jarno
        opc1 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R2,
1392 477ba620 Aurelien Jarno
                          arg1, TCG_REG_R0);
1393 477ba620 Aurelien Jarno
        arg1 = TCG_REG_R2;
1394 477ba620 Aurelien Jarno
    } else {
1395 477ba620 Aurelien Jarno
        opc1 = tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0);
1396 477ba620 Aurelien Jarno
    }
1397 477ba620 Aurelien Jarno
1398 477ba620 Aurelien Jarno
    if (const_arg2 && arg2 != 0) {
1399 477ba620 Aurelien Jarno
        opc2 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R3,
1400 477ba620 Aurelien Jarno
                          arg2, TCG_REG_R0);
1401 477ba620 Aurelien Jarno
        arg2 = TCG_REG_R3;
1402 477ba620 Aurelien Jarno
    } else {
1403 477ba620 Aurelien Jarno
        opc2 = tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0);
1404 477ba620 Aurelien Jarno
    }
1405 477ba620 Aurelien Jarno
1406 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1407 477ba620 Aurelien Jarno
                   opc1,
1408 477ba620 Aurelien Jarno
                   opc2,
1409 477ba620 Aurelien Jarno
                   tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4));
1410 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmB,
1411 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1412 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1413 477ba620 Aurelien Jarno
                   tcg_opc_b1 (TCG_REG_P6, OPC_BR_DPTK_FEW_B1,
1414 477ba620 Aurelien Jarno
                               get_reloc_pcrel21b(s->code_ptr + 2)));
1415 477ba620 Aurelien Jarno
1416 477ba620 Aurelien Jarno
    if (l->has_value) {
1417 477ba620 Aurelien Jarno
        reloc_pcrel21b((s->code_ptr - 16) + 2, l->u.value);
1418 477ba620 Aurelien Jarno
    } else {
1419 477ba620 Aurelien Jarno
        tcg_out_reloc(s, (s->code_ptr - 16) + 2,
1420 477ba620 Aurelien Jarno
                      R_IA64_PCREL21B, label_index, 0);
1421 477ba620 Aurelien Jarno
    }
1422 477ba620 Aurelien Jarno
}
1423 477ba620 Aurelien Jarno
1424 477ba620 Aurelien Jarno
static inline void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGArg ret,
1425 477ba620 Aurelien Jarno
                                   TCGArg arg1, TCGArg arg2, int cmp4)
1426 477ba620 Aurelien Jarno
{
1427 477ba620 Aurelien Jarno
    tcg_out_bundle(s, MmI,
1428 477ba620 Aurelien Jarno
                   tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4),
1429 477ba620 Aurelien Jarno
                   tcg_opc_a5(TCG_REG_P6, OPC_ADDL_A5, ret, 1, TCG_REG_R0),
1430 477ba620 Aurelien Jarno
                   tcg_opc_a5(TCG_REG_P7, OPC_ADDL_A5, ret, 0, TCG_REG_R0));
1431 477ba620 Aurelien Jarno
}
1432 477ba620 Aurelien Jarno
1433 477ba620 Aurelien Jarno
#if defined(CONFIG_SOFTMMU)
1434 477ba620 Aurelien Jarno
1435 477ba620 Aurelien Jarno
#include "../../softmmu_defs.h"
1436 477ba620 Aurelien Jarno
1437 477ba620 Aurelien Jarno
/* Load and compare a TLB entry, and return the result in (p6, p7).
1438 477ba620 Aurelien Jarno
   R2 is loaded with the address of the addend TLB entry.
1439 477ba620 Aurelien Jarno
   R56 is loaded with the address, zero extented on 32-bit targets. */
1440 477ba620 Aurelien Jarno
static inline void tcg_out_qemu_tlb(TCGContext *s, TCGArg addr_reg,
1441 477ba620 Aurelien Jarno
                                    int s_bits, uint64_t offset_rw,
1442 477ba620 Aurelien Jarno
                                    uint64_t offset_addend)
1443 477ba620 Aurelien Jarno
{
1444 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1445 477ba620 Aurelien Jarno
                   tcg_opc_a5 (TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R3,
1446 477ba620 Aurelien Jarno
                               TARGET_PAGE_MASK | ((1 << s_bits) - 1),
1447 477ba620 Aurelien Jarno
                               TCG_REG_R0),
1448 477ba620 Aurelien Jarno
                   tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, TCG_REG_R2,
1449 477ba620 Aurelien Jarno
                               addr_reg, TARGET_PAGE_BITS, CPU_TLB_BITS - 1),
1450 477ba620 Aurelien Jarno
                   tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, TCG_REG_R2,
1451 477ba620 Aurelien Jarno
                               TCG_REG_R2, 63 - CPU_TLB_ENTRY_BITS,
1452 477ba620 Aurelien Jarno
                               63 - CPU_TLB_ENTRY_BITS));
1453 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1454 477ba620 Aurelien Jarno
                   tcg_opc_a5 (TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R2,
1455 477ba620 Aurelien Jarno
                               offset_rw, TCG_REG_R2),
1456 477ba620 Aurelien Jarno
#if TARGET_LONG_BITS == 32
1457 477ba620 Aurelien Jarno
                   tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, TCG_REG_R56, addr_reg),
1458 477ba620 Aurelien Jarno
#else
1459 477ba620 Aurelien Jarno
                   tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, TCG_REG_R56,
1460 477ba620 Aurelien Jarno
                              0, addr_reg),
1461 477ba620 Aurelien Jarno
#endif
1462 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
1463 477ba620 Aurelien Jarno
                               TCG_REG_R2, TCG_AREG0));
1464 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
1465 650a217a Richard Henderson
                   tcg_opc_m3 (TCG_REG_P0,
1466 650a217a Richard Henderson
                               (TARGET_LONG_BITS == 32
1467 650a217a Richard Henderson
                                ? OPC_LD4_M3 : OPC_LD8_M3), TCG_REG_R57,
1468 477ba620 Aurelien Jarno
                               TCG_REG_R2, offset_addend - offset_rw),
1469 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P0, OPC_AND_A1, TCG_REG_R3,
1470 477ba620 Aurelien Jarno
                               TCG_REG_R3, TCG_REG_R56),
1471 477ba620 Aurelien Jarno
                   tcg_opc_a6 (TCG_REG_P0, OPC_CMP_EQ_A6, TCG_REG_P6,
1472 477ba620 Aurelien Jarno
                               TCG_REG_P7, TCG_REG_R3, TCG_REG_R57));
1473 477ba620 Aurelien Jarno
}
1474 477ba620 Aurelien Jarno
1475 477ba620 Aurelien Jarno
static void *qemu_ld_helpers[4] = {
1476 477ba620 Aurelien Jarno
    __ldb_mmu,
1477 477ba620 Aurelien Jarno
    __ldw_mmu,
1478 477ba620 Aurelien Jarno
    __ldl_mmu,
1479 477ba620 Aurelien Jarno
    __ldq_mmu,
1480 477ba620 Aurelien Jarno
};
1481 477ba620 Aurelien Jarno
1482 477ba620 Aurelien Jarno
static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
1483 477ba620 Aurelien Jarno
{
1484 477ba620 Aurelien Jarno
    int addr_reg, data_reg, mem_index, s_bits, bswap;
1485 477ba620 Aurelien Jarno
    uint64_t opc_ld_m1[4] = { OPC_LD1_M1, OPC_LD2_M1, OPC_LD4_M1, OPC_LD8_M1 };
1486 477ba620 Aurelien Jarno
    uint64_t opc_ext_i29[8] = { OPC_ZXT1_I29, OPC_ZXT2_I29, OPC_ZXT4_I29, 0,
1487 477ba620 Aurelien Jarno
                                OPC_SXT1_I29, OPC_SXT2_I29, OPC_SXT4_I29, 0 };
1488 477ba620 Aurelien Jarno
1489 477ba620 Aurelien Jarno
    data_reg = *args++;
1490 477ba620 Aurelien Jarno
    addr_reg = *args++;
1491 477ba620 Aurelien Jarno
    mem_index = *args;
1492 477ba620 Aurelien Jarno
    s_bits = opc & 3;
1493 477ba620 Aurelien Jarno
1494 477ba620 Aurelien Jarno
#ifdef TARGET_WORDS_BIGENDIAN
1495 477ba620 Aurelien Jarno
    bswap = 1;
1496 477ba620 Aurelien Jarno
#else
1497 477ba620 Aurelien Jarno
    bswap = 0;
1498 477ba620 Aurelien Jarno
#endif
1499 477ba620 Aurelien Jarno
1500 477ba620 Aurelien Jarno
    /* Read the TLB entry */
1501 477ba620 Aurelien Jarno
    tcg_out_qemu_tlb(s, addr_reg, s_bits,
1502 477ba620 Aurelien Jarno
                     offsetof(CPUState, tlb_table[mem_index][0].addr_read),
1503 477ba620 Aurelien Jarno
                     offsetof(CPUState, tlb_table[mem_index][0].addend));
1504 477ba620 Aurelien Jarno
1505 477ba620 Aurelien Jarno
    /* P6 is the fast path, and P7 the slow path */
1506 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mLX,
1507 477ba620 Aurelien Jarno
                   tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R57,
1508 477ba620 Aurelien Jarno
                               mem_index, TCG_REG_R0),
1509 477ba620 Aurelien Jarno
                   tcg_opc_l2 ((tcg_target_long) qemu_ld_helpers[s_bits]),
1510 477ba620 Aurelien Jarno
                   tcg_opc_x2 (TCG_REG_P7, OPC_MOVL_X2, TCG_REG_R2,
1511 477ba620 Aurelien Jarno
                               (tcg_target_long) qemu_ld_helpers[s_bits]));
1512 477ba620 Aurelien Jarno
    tcg_out_bundle(s, MmI,
1513 477ba620 Aurelien Jarno
                   tcg_opc_m3 (TCG_REG_P0, OPC_LD8_M3, TCG_REG_R3,
1514 477ba620 Aurelien Jarno
                               TCG_REG_R2, 8),
1515 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P6, OPC_ADD_A1, TCG_REG_R3,
1516 477ba620 Aurelien Jarno
                               TCG_REG_R3, TCG_REG_R56),
1517 477ba620 Aurelien Jarno
                   tcg_opc_i21(TCG_REG_P7, OPC_MOV_I21, TCG_REG_B6,
1518 477ba620 Aurelien Jarno
                               TCG_REG_R3, 0));
1519 477ba620 Aurelien Jarno
    if (bswap && s_bits == 1) {
1520 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
1521 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits],
1522 477ba620 Aurelien Jarno
                                   TCG_REG_R8, TCG_REG_R3),
1523 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2),
1524 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
1525 477ba620 Aurelien Jarno
                                   TCG_REG_R8, TCG_REG_R8, 15, 15));
1526 477ba620 Aurelien Jarno
    } else if (bswap && s_bits == 2) {
1527 477ba620 Aurelien Jarno
        tcg_out_bundle(s, MmI,
1528 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits],
1529 477ba620 Aurelien Jarno
                                   TCG_REG_R8, TCG_REG_R3),
1530 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2),
1531 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
1532 477ba620 Aurelien Jarno
                                   TCG_REG_R8, TCG_REG_R8, 31, 31));
1533 477ba620 Aurelien Jarno
    } else {
1534 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mmI,
1535 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits],
1536 477ba620 Aurelien Jarno
                                   TCG_REG_R8, TCG_REG_R3),
1537 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2),
1538 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1539 477ba620 Aurelien Jarno
    }
1540 477ba620 Aurelien Jarno
    if (!bswap || s_bits == 0) {
1541 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miB,
1542 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1543 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1544 477ba620 Aurelien Jarno
                       tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5,
1545 477ba620 Aurelien Jarno
                                   TCG_REG_B0, TCG_REG_B6));
1546 477ba620 Aurelien Jarno
    } else {
1547 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miB,
1548 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1549 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
1550 477ba620 Aurelien Jarno
                                   TCG_REG_R8, TCG_REG_R8, 0xb),
1551 477ba620 Aurelien Jarno
                       tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5,
1552 477ba620 Aurelien Jarno
                                   TCG_REG_B0, TCG_REG_B6));
1553 477ba620 Aurelien Jarno
    }
1554 477ba620 Aurelien Jarno
1555 477ba620 Aurelien Jarno
    if (opc == 3) {
1556 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1557 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1558 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1559 477ba620 Aurelien Jarno
                       tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4,
1560 477ba620 Aurelien Jarno
                                   data_reg, 0, TCG_REG_R8));
1561 477ba620 Aurelien Jarno
    } else {
1562 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1563 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1564 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1565 477ba620 Aurelien Jarno
                       tcg_opc_i29(TCG_REG_P0, opc_ext_i29[opc],
1566 477ba620 Aurelien Jarno
                                   data_reg, TCG_REG_R8));
1567 477ba620 Aurelien Jarno
    }
1568 477ba620 Aurelien Jarno
}
1569 477ba620 Aurelien Jarno
1570 477ba620 Aurelien Jarno
static void *qemu_st_helpers[4] = {
1571 477ba620 Aurelien Jarno
    __stb_mmu,
1572 477ba620 Aurelien Jarno
    __stw_mmu,
1573 477ba620 Aurelien Jarno
    __stl_mmu,
1574 477ba620 Aurelien Jarno
    __stq_mmu,
1575 477ba620 Aurelien Jarno
};
1576 477ba620 Aurelien Jarno
1577 477ba620 Aurelien Jarno
static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
1578 477ba620 Aurelien Jarno
{
1579 477ba620 Aurelien Jarno
    int addr_reg, data_reg, mem_index, bswap;
1580 477ba620 Aurelien Jarno
    uint64_t opc_st_m4[4] = { OPC_ST1_M4, OPC_ST2_M4, OPC_ST4_M4, OPC_ST8_M4 };
1581 477ba620 Aurelien Jarno
1582 477ba620 Aurelien Jarno
    data_reg = *args++;
1583 477ba620 Aurelien Jarno
    addr_reg = *args++;
1584 477ba620 Aurelien Jarno
    mem_index = *args;
1585 477ba620 Aurelien Jarno
1586 477ba620 Aurelien Jarno
#ifdef TARGET_WORDS_BIGENDIAN
1587 477ba620 Aurelien Jarno
    bswap = 1;
1588 477ba620 Aurelien Jarno
#else
1589 477ba620 Aurelien Jarno
    bswap = 0;
1590 477ba620 Aurelien Jarno
#endif
1591 477ba620 Aurelien Jarno
1592 477ba620 Aurelien Jarno
    tcg_out_qemu_tlb(s, addr_reg, opc,
1593 477ba620 Aurelien Jarno
                     offsetof(CPUState, tlb_table[mem_index][0].addr_write),
1594 477ba620 Aurelien Jarno
                     offsetof(CPUState, tlb_table[mem_index][0].addend));
1595 477ba620 Aurelien Jarno
1596 477ba620 Aurelien Jarno
    /* P6 is the fast path, and P7 the slow path */
1597 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mLX,
1598 477ba620 Aurelien Jarno
                   tcg_opc_a4(TCG_REG_P7, OPC_ADDS_A4, TCG_REG_R57,
1599 477ba620 Aurelien Jarno
                              0, data_reg),
1600 477ba620 Aurelien Jarno
                   tcg_opc_l2 ((tcg_target_long) qemu_st_helpers[opc]),
1601 477ba620 Aurelien Jarno
                   tcg_opc_x2 (TCG_REG_P7, OPC_MOVL_X2, TCG_REG_R2,
1602 477ba620 Aurelien Jarno
                               (tcg_target_long) qemu_st_helpers[opc]));
1603 477ba620 Aurelien Jarno
    tcg_out_bundle(s, MmI,
1604 477ba620 Aurelien Jarno
                   tcg_opc_m3 (TCG_REG_P0, OPC_LD8_M3, TCG_REG_R3,
1605 477ba620 Aurelien Jarno
                               TCG_REG_R2, 8),
1606 477ba620 Aurelien Jarno
                   tcg_opc_a1 (TCG_REG_P6, OPC_ADD_A1, TCG_REG_R3,
1607 477ba620 Aurelien Jarno
                               TCG_REG_R3, TCG_REG_R56),
1608 477ba620 Aurelien Jarno
                   tcg_opc_i21(TCG_REG_P7, OPC_MOV_I21, TCG_REG_B6,
1609 477ba620 Aurelien Jarno
                               TCG_REG_R3, 0));
1610 477ba620 Aurelien Jarno
1611 477ba620 Aurelien Jarno
    if (!bswap || opc == 0) {
1612 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1613 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
1614 477ba620 Aurelien Jarno
                                   TCG_REG_R1, TCG_REG_R2),
1615 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1616 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1617 477ba620 Aurelien Jarno
    } else if (opc == 1) {
1618 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1619 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
1620 477ba620 Aurelien Jarno
                                   TCG_REG_R1, TCG_REG_R2),
1621 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
1622 477ba620 Aurelien Jarno
                                   TCG_REG_R2, data_reg, 15, 15),
1623 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
1624 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R2, 0xb));
1625 477ba620 Aurelien Jarno
        data_reg = TCG_REG_R2;
1626 477ba620 Aurelien Jarno
    } else if (opc == 2) {
1627 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1628 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
1629 477ba620 Aurelien Jarno
                                   TCG_REG_R1, TCG_REG_R2),
1630 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
1631 477ba620 Aurelien Jarno
                                   TCG_REG_R2, data_reg, 31, 31),
1632 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
1633 477ba620 Aurelien Jarno
                                   TCG_REG_R2, TCG_REG_R2, 0xb));
1634 477ba620 Aurelien Jarno
        data_reg = TCG_REG_R2;
1635 477ba620 Aurelien Jarno
    } else if (opc == 3) {
1636 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1637 477ba620 Aurelien Jarno
                       tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
1638 477ba620 Aurelien Jarno
                                   TCG_REG_R1, TCG_REG_R2),
1639 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1640 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
1641 477ba620 Aurelien Jarno
                                   TCG_REG_R2, data_reg, 0xb));
1642 477ba620 Aurelien Jarno
        data_reg = TCG_REG_R2;
1643 477ba620 Aurelien Jarno
    }
1644 477ba620 Aurelien Jarno
1645 477ba620 Aurelien Jarno
    tcg_out_bundle(s, miB,
1646 477ba620 Aurelien Jarno
                   tcg_opc_m4 (TCG_REG_P6, opc_st_m4[opc],
1647 477ba620 Aurelien Jarno
                               data_reg, TCG_REG_R3),
1648 477ba620 Aurelien Jarno
                   tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R58,
1649 477ba620 Aurelien Jarno
                               mem_index, TCG_REG_R0),
1650 477ba620 Aurelien Jarno
                   tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5,
1651 477ba620 Aurelien Jarno
                               TCG_REG_B0, TCG_REG_B6));
1652 477ba620 Aurelien Jarno
}
1653 477ba620 Aurelien Jarno
1654 477ba620 Aurelien Jarno
#else /* !CONFIG_SOFTMMU */
1655 477ba620 Aurelien Jarno
1656 477ba620 Aurelien Jarno
static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
1657 477ba620 Aurelien Jarno
{
1658 6781d08d Richard Henderson
    static uint64_t const opc_ld_m1[4] = {
1659 6781d08d Richard Henderson
        OPC_LD1_M1, OPC_LD2_M1, OPC_LD4_M1, OPC_LD8_M1
1660 6781d08d Richard Henderson
    };
1661 6781d08d Richard Henderson
    static uint64_t const opc_sxt_i29[4] = {
1662 6781d08d Richard Henderson
        OPC_SXT1_I29, OPC_SXT2_I29, OPC_SXT4_I29, 0
1663 6781d08d Richard Henderson
    };
1664 393f398b Richard Henderson
    int addr_reg, data_reg, s_bits, bswap;
1665 477ba620 Aurelien Jarno
1666 477ba620 Aurelien Jarno
    data_reg = *args++;
1667 477ba620 Aurelien Jarno
    addr_reg = *args++;
1668 477ba620 Aurelien Jarno
    s_bits = opc & 3;
1669 477ba620 Aurelien Jarno
1670 477ba620 Aurelien Jarno
#ifdef TARGET_WORDS_BIGENDIAN
1671 477ba620 Aurelien Jarno
    bswap = 1;
1672 477ba620 Aurelien Jarno
#else
1673 477ba620 Aurelien Jarno
    bswap = 0;
1674 477ba620 Aurelien Jarno
#endif
1675 477ba620 Aurelien Jarno
1676 477ba620 Aurelien Jarno
#if TARGET_LONG_BITS == 32
1677 6781d08d Richard Henderson
    if (GUEST_BASE != 0) {
1678 6781d08d Richard Henderson
        tcg_out_bundle(s, mII,
1679 6781d08d Richard Henderson
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1680 6781d08d Richard Henderson
                       tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
1681 6781d08d Richard Henderson
                                   TCG_REG_R3, addr_reg),
1682 6781d08d Richard Henderson
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
1683 6781d08d Richard Henderson
                                   TCG_GUEST_BASE_REG, TCG_REG_R3));
1684 6781d08d Richard Henderson
    } else {
1685 6781d08d Richard Henderson
        tcg_out_bundle(s, miI,
1686 6781d08d Richard Henderson
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1687 6781d08d Richard Henderson
                       tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
1688 6781d08d Richard Henderson
                                   TCG_REG_R2, addr_reg),
1689 6781d08d Richard Henderson
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1690 6781d08d Richard Henderson
    }
1691 477ba620 Aurelien Jarno
1692 477ba620 Aurelien Jarno
    if (!bswap || s_bits == 0) {
1693 477ba620 Aurelien Jarno
        if (s_bits == opc) {
1694 477ba620 Aurelien Jarno
            tcg_out_bundle(s, miI,
1695 477ba620 Aurelien Jarno
                           tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1696 477ba620 Aurelien Jarno
                                       data_reg, TCG_REG_R2),
1697 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1698 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1699 477ba620 Aurelien Jarno
        } else {
1700 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1701 477ba620 Aurelien Jarno
                           tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1702 477ba620 Aurelien Jarno
                                       data_reg, TCG_REG_R2),
1703 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1704 477ba620 Aurelien Jarno
                           tcg_opc_i29(TCG_REG_P0, opc_sxt_i29[s_bits],
1705 477ba620 Aurelien Jarno
                                       data_reg, data_reg));
1706 477ba620 Aurelien Jarno
        }
1707 477ba620 Aurelien Jarno
    } else if (s_bits == 3) {
1708 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1709 477ba620 Aurelien Jarno
                           tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1710 477ba620 Aurelien Jarno
                                       data_reg, TCG_REG_R2),
1711 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1712 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1713 477ba620 Aurelien Jarno
                                       data_reg, data_reg, 0xb));
1714 477ba620 Aurelien Jarno
    } else {
1715 477ba620 Aurelien Jarno
        if (s_bits == 1) {
1716 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1717 477ba620 Aurelien Jarno
                           tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1718 477ba620 Aurelien Jarno
                                       data_reg, TCG_REG_R2),
1719 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1720 477ba620 Aurelien Jarno
                           tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1721 477ba620 Aurelien Jarno
                                      data_reg, data_reg, 15, 15));
1722 477ba620 Aurelien Jarno
        } else {
1723 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1724 477ba620 Aurelien Jarno
                           tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1725 477ba620 Aurelien Jarno
                                       data_reg, TCG_REG_R2),
1726 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1727 477ba620 Aurelien Jarno
                           tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1728 477ba620 Aurelien Jarno
                                      data_reg, data_reg, 31, 31));
1729 477ba620 Aurelien Jarno
        }
1730 477ba620 Aurelien Jarno
        if (opc == s_bits) {
1731 477ba620 Aurelien Jarno
            tcg_out_bundle(s, miI,
1732 477ba620 Aurelien Jarno
                           tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1733 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1734 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1735 477ba620 Aurelien Jarno
                                       data_reg, data_reg, 0xb));
1736 477ba620 Aurelien Jarno
        } else {
1737 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1738 477ba620 Aurelien Jarno
                           tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1739 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1740 477ba620 Aurelien Jarno
                                       data_reg, data_reg, 0xb),
1741 477ba620 Aurelien Jarno
                           tcg_opc_i29(TCG_REG_P0, opc_sxt_i29[s_bits],
1742 477ba620 Aurelien Jarno
                                       data_reg, data_reg));
1743 477ba620 Aurelien Jarno
        }
1744 477ba620 Aurelien Jarno
    }
1745 477ba620 Aurelien Jarno
#else
1746 6781d08d Richard Henderson
    if (GUEST_BASE != 0) {
1747 6781d08d Richard Henderson
        tcg_out_bundle(s, MmI,
1748 6781d08d Richard Henderson
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
1749 6781d08d Richard Henderson
                                   TCG_GUEST_BASE_REG, addr_reg),
1750 6781d08d Richard Henderson
                       tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1751 6781d08d Richard Henderson
                                   data_reg, TCG_REG_R2),
1752 6781d08d Richard Henderson
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1753 6781d08d Richard Henderson
    } else {
1754 6781d08d Richard Henderson
        tcg_out_bundle(s, mmI,
1755 6781d08d Richard Henderson
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1756 6781d08d Richard Henderson
                       tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
1757 6781d08d Richard Henderson
                                   data_reg, addr_reg),
1758 6781d08d Richard Henderson
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1759 6781d08d Richard Henderson
    }
1760 477ba620 Aurelien Jarno
1761 477ba620 Aurelien Jarno
    if (bswap && s_bits == 1) {
1762 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1763 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1764 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1765 477ba620 Aurelien Jarno
                                   data_reg, data_reg, 15, 15),
1766 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1767 477ba620 Aurelien Jarno
                                   data_reg, data_reg, 0xb));
1768 477ba620 Aurelien Jarno
    } else if (bswap && s_bits == 2) {
1769 477ba620 Aurelien Jarno
        tcg_out_bundle(s, mII,
1770 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1771 477ba620 Aurelien Jarno
                       tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1772 477ba620 Aurelien Jarno
                                   data_reg, data_reg, 31, 31),
1773 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1774 477ba620 Aurelien Jarno
                                   data_reg, data_reg, 0xb));
1775 477ba620 Aurelien Jarno
    } else if (bswap && s_bits == 3) {
1776 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1777 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1778 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1779 477ba620 Aurelien Jarno
                       tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1780 477ba620 Aurelien Jarno
                                   data_reg, data_reg, 0xb));
1781 477ba620 Aurelien Jarno
    }
1782 477ba620 Aurelien Jarno
    if (s_bits != opc) {
1783 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1784 477ba620 Aurelien Jarno
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1785 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1786 477ba620 Aurelien Jarno
                       tcg_opc_i29(TCG_REG_P0, opc_sxt_i29[s_bits],
1787 477ba620 Aurelien Jarno
                                   data_reg, data_reg));
1788 477ba620 Aurelien Jarno
    }
1789 477ba620 Aurelien Jarno
#endif
1790 477ba620 Aurelien Jarno
}
1791 477ba620 Aurelien Jarno
1792 477ba620 Aurelien Jarno
static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
1793 477ba620 Aurelien Jarno
{
1794 6781d08d Richard Henderson
    static uint64_t const opc_st_m4[4] = {
1795 6781d08d Richard Henderson
        OPC_ST1_M4, OPC_ST2_M4, OPC_ST4_M4, OPC_ST8_M4
1796 6781d08d Richard Henderson
    };
1797 477ba620 Aurelien Jarno
    int addr_reg, data_reg, bswap;
1798 6781d08d Richard Henderson
#if TARGET_LONG_BITS == 64
1799 6781d08d Richard Henderson
    uint64_t add_guest_base;
1800 6781d08d Richard Henderson
#endif
1801 477ba620 Aurelien Jarno
1802 477ba620 Aurelien Jarno
    data_reg = *args++;
1803 477ba620 Aurelien Jarno
    addr_reg = *args++;
1804 477ba620 Aurelien Jarno
1805 477ba620 Aurelien Jarno
#ifdef TARGET_WORDS_BIGENDIAN
1806 477ba620 Aurelien Jarno
    bswap = 1;
1807 477ba620 Aurelien Jarno
#else
1808 477ba620 Aurelien Jarno
    bswap = 0;
1809 477ba620 Aurelien Jarno
#endif
1810 477ba620 Aurelien Jarno
1811 477ba620 Aurelien Jarno
#if TARGET_LONG_BITS == 32
1812 6781d08d Richard Henderson
    if (GUEST_BASE != 0) {
1813 6781d08d Richard Henderson
        tcg_out_bundle(s, mII,
1814 6781d08d Richard Henderson
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1815 6781d08d Richard Henderson
                       tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
1816 6781d08d Richard Henderson
                                   TCG_REG_R3, addr_reg),
1817 6781d08d Richard Henderson
                       tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
1818 6781d08d Richard Henderson
                                   TCG_GUEST_BASE_REG, TCG_REG_R3));
1819 6781d08d Richard Henderson
    } else {
1820 6781d08d Richard Henderson
        tcg_out_bundle(s, miI,
1821 6781d08d Richard Henderson
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1822 6781d08d Richard Henderson
                       tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
1823 07f59737 Richard Henderson
                                   TCG_REG_R2, addr_reg),
1824 6781d08d Richard Henderson
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1825 6781d08d Richard Henderson
    }
1826 6781d08d Richard Henderson
1827 477ba620 Aurelien Jarno
    if (bswap) {
1828 477ba620 Aurelien Jarno
        if (opc == 1) {
1829 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1830 477ba620 Aurelien Jarno
                           tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1831 477ba620 Aurelien Jarno
                           tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1832 477ba620 Aurelien Jarno
                                       TCG_REG_R3, data_reg, 15, 15),
1833 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1834 477ba620 Aurelien Jarno
                                       TCG_REG_R3, TCG_REG_R3, 0xb));
1835 477ba620 Aurelien Jarno
            data_reg = TCG_REG_R3;
1836 477ba620 Aurelien Jarno
        } else if (opc == 2) {
1837 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1838 477ba620 Aurelien Jarno
                           tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1839 477ba620 Aurelien Jarno
                           tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1840 477ba620 Aurelien Jarno
                                       TCG_REG_R3, data_reg, 31, 31),
1841 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1842 477ba620 Aurelien Jarno
                                       TCG_REG_R3, TCG_REG_R3, 0xb));
1843 477ba620 Aurelien Jarno
            data_reg = TCG_REG_R3;
1844 477ba620 Aurelien Jarno
        } else if (opc == 3) {
1845 477ba620 Aurelien Jarno
            tcg_out_bundle(s, miI,
1846 477ba620 Aurelien Jarno
                           tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1847 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1848 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1849 477ba620 Aurelien Jarno
                                       TCG_REG_R3, data_reg, 0xb));
1850 477ba620 Aurelien Jarno
            data_reg = TCG_REG_R3;
1851 477ba620 Aurelien Jarno
        }
1852 477ba620 Aurelien Jarno
    }
1853 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mmI,
1854 477ba620 Aurelien Jarno
                   tcg_opc_m4 (TCG_REG_P0, opc_st_m4[opc],
1855 477ba620 Aurelien Jarno
                               data_reg, TCG_REG_R2),
1856 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
1857 477ba620 Aurelien Jarno
                   tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1858 477ba620 Aurelien Jarno
#else
1859 6781d08d Richard Henderson
    if (GUEST_BASE != 0) {
1860 6781d08d Richard Henderson
        add_guest_base = tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
1861 6781d08d Richard Henderson
                                     TCG_GUEST_BASE_REG, addr_reg);
1862 6781d08d Richard Henderson
        addr_reg = TCG_REG_R2;
1863 6781d08d Richard Henderson
    } else {
1864 6781d08d Richard Henderson
        add_guest_base = tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0);
1865 6781d08d Richard Henderson
    }
1866 6781d08d Richard Henderson
1867 477ba620 Aurelien Jarno
    if (!bswap || opc == 0) {
1868 6781d08d Richard Henderson
        tcg_out_bundle(s, (GUEST_BASE ? MmI : mmI),
1869 6781d08d Richard Henderson
                       add_guest_base,
1870 477ba620 Aurelien Jarno
                       tcg_opc_m4 (TCG_REG_P0, opc_st_m4[opc],
1871 6781d08d Richard Henderson
                                   data_reg, addr_reg),
1872 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1873 477ba620 Aurelien Jarno
    } else {
1874 477ba620 Aurelien Jarno
        if (opc == 1) {
1875 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1876 6781d08d Richard Henderson
                           add_guest_base,
1877 477ba620 Aurelien Jarno
                           tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1878 477ba620 Aurelien Jarno
                                       TCG_REG_R3, data_reg, 15, 15),
1879 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1880 477ba620 Aurelien Jarno
                                       TCG_REG_R3, TCG_REG_R3, 0xb));
1881 477ba620 Aurelien Jarno
            data_reg = TCG_REG_R3;
1882 477ba620 Aurelien Jarno
        } else if (opc == 2) {
1883 477ba620 Aurelien Jarno
            tcg_out_bundle(s, mII,
1884 6781d08d Richard Henderson
                           add_guest_base,
1885 477ba620 Aurelien Jarno
                           tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
1886 477ba620 Aurelien Jarno
                                       TCG_REG_R3, data_reg, 31, 31),
1887 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1888 477ba620 Aurelien Jarno
                                       TCG_REG_R3, TCG_REG_R3, 0xb));
1889 477ba620 Aurelien Jarno
            data_reg = TCG_REG_R3;
1890 477ba620 Aurelien Jarno
        } else if (opc == 3) {
1891 477ba620 Aurelien Jarno
            tcg_out_bundle(s, miI,
1892 6781d08d Richard Henderson
                           add_guest_base,
1893 477ba620 Aurelien Jarno
                           tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1894 477ba620 Aurelien Jarno
                           tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
1895 477ba620 Aurelien Jarno
                                       TCG_REG_R3, data_reg, 0xb));
1896 477ba620 Aurelien Jarno
            data_reg = TCG_REG_R3;
1897 477ba620 Aurelien Jarno
        }
1898 477ba620 Aurelien Jarno
        tcg_out_bundle(s, miI,
1899 477ba620 Aurelien Jarno
                       tcg_opc_m4 (TCG_REG_P0, opc_st_m4[opc],
1900 6781d08d Richard Henderson
                                   data_reg, addr_reg),
1901 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
1902 477ba620 Aurelien Jarno
                       tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
1903 477ba620 Aurelien Jarno
    }
1904 477ba620 Aurelien Jarno
#endif
1905 477ba620 Aurelien Jarno
}
1906 477ba620 Aurelien Jarno
1907 477ba620 Aurelien Jarno
#endif
1908 477ba620 Aurelien Jarno
1909 477ba620 Aurelien Jarno
static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
1910 477ba620 Aurelien Jarno
                              const TCGArg *args, const int *const_args)
1911 477ba620 Aurelien Jarno
{
1912 477ba620 Aurelien Jarno
    switch(opc) {
1913 477ba620 Aurelien Jarno
    case INDEX_op_exit_tb:
1914 477ba620 Aurelien Jarno
        tcg_out_exit_tb(s, args[0]);
1915 477ba620 Aurelien Jarno
        break;
1916 477ba620 Aurelien Jarno
    case INDEX_op_br:
1917 477ba620 Aurelien Jarno
        tcg_out_br(s, args[0]);
1918 477ba620 Aurelien Jarno
        break;
1919 477ba620 Aurelien Jarno
    case INDEX_op_call:
1920 477ba620 Aurelien Jarno
        tcg_out_call(s, args[0]);
1921 477ba620 Aurelien Jarno
        break;
1922 477ba620 Aurelien Jarno
    case INDEX_op_goto_tb:
1923 477ba620 Aurelien Jarno
        tcg_out_goto_tb(s, args[0]);
1924 477ba620 Aurelien Jarno
        break;
1925 477ba620 Aurelien Jarno
    case INDEX_op_jmp:
1926 477ba620 Aurelien Jarno
        tcg_out_jmp(s, args[0]);
1927 477ba620 Aurelien Jarno
        break;
1928 477ba620 Aurelien Jarno
1929 477ba620 Aurelien Jarno
    case INDEX_op_movi_i32:
1930 477ba620 Aurelien Jarno
        tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
1931 477ba620 Aurelien Jarno
        break;
1932 477ba620 Aurelien Jarno
    case INDEX_op_movi_i64:
1933 477ba620 Aurelien Jarno
        tcg_out_movi(s, TCG_TYPE_I64, args[0], args[1]);
1934 477ba620 Aurelien Jarno
        break;
1935 477ba620 Aurelien Jarno
1936 477ba620 Aurelien Jarno
    case INDEX_op_ld8u_i32:
1937 477ba620 Aurelien Jarno
    case INDEX_op_ld8u_i64:
1938 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD1_M1, args[0], args[1], args[2]);
1939 477ba620 Aurelien Jarno
        break;
1940 477ba620 Aurelien Jarno
    case INDEX_op_ld8s_i32:
1941 477ba620 Aurelien Jarno
    case INDEX_op_ld8s_i64:
1942 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD1_M1, args[0], args[1], args[2]);
1943 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_SXT1_I29, args[0], args[0]);
1944 477ba620 Aurelien Jarno
        break;
1945 477ba620 Aurelien Jarno
    case INDEX_op_ld16u_i32:
1946 477ba620 Aurelien Jarno
    case INDEX_op_ld16u_i64:
1947 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD2_M1, args[0], args[1], args[2]);
1948 477ba620 Aurelien Jarno
        break;
1949 477ba620 Aurelien Jarno
    case INDEX_op_ld16s_i32:
1950 477ba620 Aurelien Jarno
    case INDEX_op_ld16s_i64:
1951 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD2_M1, args[0], args[1], args[2]);
1952 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_SXT2_I29, args[0], args[0]);
1953 477ba620 Aurelien Jarno
        break;
1954 477ba620 Aurelien Jarno
    case INDEX_op_ld_i32:
1955 477ba620 Aurelien Jarno
    case INDEX_op_ld32u_i64:
1956 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD4_M1, args[0], args[1], args[2]);
1957 477ba620 Aurelien Jarno
        break;
1958 477ba620 Aurelien Jarno
    case INDEX_op_ld32s_i64:
1959 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD4_M1, args[0], args[1], args[2]);
1960 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_SXT4_I29, args[0], args[0]);
1961 477ba620 Aurelien Jarno
        break;
1962 477ba620 Aurelien Jarno
    case INDEX_op_ld_i64:
1963 477ba620 Aurelien Jarno
        tcg_out_ld_rel(s, OPC_LD8_M1, args[0], args[1], args[2]);
1964 477ba620 Aurelien Jarno
        break;
1965 477ba620 Aurelien Jarno
    case INDEX_op_st8_i32:
1966 477ba620 Aurelien Jarno
    case INDEX_op_st8_i64:
1967 477ba620 Aurelien Jarno
        tcg_out_st_rel(s, OPC_ST1_M4, args[0], args[1], args[2]);
1968 477ba620 Aurelien Jarno
        break;
1969 477ba620 Aurelien Jarno
    case INDEX_op_st16_i32:
1970 477ba620 Aurelien Jarno
    case INDEX_op_st16_i64:
1971 477ba620 Aurelien Jarno
        tcg_out_st_rel(s, OPC_ST2_M4, args[0], args[1], args[2]);
1972 477ba620 Aurelien Jarno
        break;
1973 477ba620 Aurelien Jarno
    case INDEX_op_st_i32:
1974 477ba620 Aurelien Jarno
    case INDEX_op_st32_i64:
1975 477ba620 Aurelien Jarno
        tcg_out_st_rel(s, OPC_ST4_M4, args[0], args[1], args[2]);
1976 477ba620 Aurelien Jarno
        break;
1977 477ba620 Aurelien Jarno
    case INDEX_op_st_i64:
1978 477ba620 Aurelien Jarno
        tcg_out_st_rel(s, OPC_ST8_M4, args[0], args[1], args[2]);
1979 477ba620 Aurelien Jarno
        break;
1980 477ba620 Aurelien Jarno
1981 477ba620 Aurelien Jarno
    case INDEX_op_add_i32:
1982 477ba620 Aurelien Jarno
    case INDEX_op_add_i64:
1983 477ba620 Aurelien Jarno
        tcg_out_alu(s, OPC_ADD_A1, args[0], args[1], const_args[1],
1984 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
1985 477ba620 Aurelien Jarno
        break;
1986 477ba620 Aurelien Jarno
    case INDEX_op_sub_i32:
1987 477ba620 Aurelien Jarno
    case INDEX_op_sub_i64:
1988 477ba620 Aurelien Jarno
        tcg_out_alu(s, OPC_SUB_A1, args[0], args[1], const_args[1],
1989 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
1990 477ba620 Aurelien Jarno
        break;
1991 477ba620 Aurelien Jarno
1992 477ba620 Aurelien Jarno
    case INDEX_op_and_i32:
1993 477ba620 Aurelien Jarno
    case INDEX_op_and_i64:
1994 477ba620 Aurelien Jarno
        tcg_out_alu(s, OPC_AND_A1, args[0], args[1], const_args[1],
1995 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
1996 477ba620 Aurelien Jarno
        break;
1997 477ba620 Aurelien Jarno
    case INDEX_op_andc_i32:
1998 477ba620 Aurelien Jarno
    case INDEX_op_andc_i64:
1999 477ba620 Aurelien Jarno
        tcg_out_alu(s, OPC_ANDCM_A1, args[0], args[1], const_args[1],
2000 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
2001 477ba620 Aurelien Jarno
        break;
2002 477ba620 Aurelien Jarno
    case INDEX_op_eqv_i32:
2003 477ba620 Aurelien Jarno
    case INDEX_op_eqv_i64:
2004 477ba620 Aurelien Jarno
        tcg_out_eqv(s, args[0], args[1], const_args[1],
2005 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
2006 477ba620 Aurelien Jarno
        break;
2007 477ba620 Aurelien Jarno
    case INDEX_op_nand_i32:
2008 477ba620 Aurelien Jarno
    case INDEX_op_nand_i64:
2009 477ba620 Aurelien Jarno
        tcg_out_nand(s, args[0], args[1], const_args[1],
2010 477ba620 Aurelien Jarno
                     args[2], const_args[2]);
2011 477ba620 Aurelien Jarno
        break;
2012 477ba620 Aurelien Jarno
    case INDEX_op_nor_i32:
2013 477ba620 Aurelien Jarno
    case INDEX_op_nor_i64:
2014 477ba620 Aurelien Jarno
        tcg_out_nor(s, args[0], args[1], const_args[1],
2015 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
2016 477ba620 Aurelien Jarno
        break;
2017 477ba620 Aurelien Jarno
    case INDEX_op_or_i32:
2018 477ba620 Aurelien Jarno
    case INDEX_op_or_i64:
2019 477ba620 Aurelien Jarno
        tcg_out_alu(s, OPC_OR_A1, args[0], args[1], const_args[1],
2020 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
2021 477ba620 Aurelien Jarno
        break;
2022 477ba620 Aurelien Jarno
    case INDEX_op_orc_i32:
2023 477ba620 Aurelien Jarno
    case INDEX_op_orc_i64:
2024 477ba620 Aurelien Jarno
        tcg_out_orc(s, args[0], args[1], const_args[1],
2025 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
2026 477ba620 Aurelien Jarno
        break;
2027 477ba620 Aurelien Jarno
    case INDEX_op_xor_i32:
2028 477ba620 Aurelien Jarno
    case INDEX_op_xor_i64:
2029 477ba620 Aurelien Jarno
        tcg_out_alu(s, OPC_XOR_A1, args[0], args[1], const_args[1],
2030 477ba620 Aurelien Jarno
                    args[2], const_args[2]);
2031 477ba620 Aurelien Jarno
        break;
2032 477ba620 Aurelien Jarno
2033 477ba620 Aurelien Jarno
    case INDEX_op_mul_i32:
2034 477ba620 Aurelien Jarno
    case INDEX_op_mul_i64:
2035 477ba620 Aurelien Jarno
        tcg_out_mul(s, args[0], args[1], args[2]);
2036 477ba620 Aurelien Jarno
        break;
2037 477ba620 Aurelien Jarno
2038 477ba620 Aurelien Jarno
    case INDEX_op_sar_i32:
2039 477ba620 Aurelien Jarno
        tcg_out_sar_i32(s, args[0], args[1], args[2], const_args[2]);
2040 477ba620 Aurelien Jarno
        break;
2041 477ba620 Aurelien Jarno
    case INDEX_op_sar_i64:
2042 477ba620 Aurelien Jarno
        tcg_out_sar_i64(s, args[0], args[1], args[2], const_args[2]);
2043 477ba620 Aurelien Jarno
        break;
2044 477ba620 Aurelien Jarno
    case INDEX_op_shl_i32:
2045 477ba620 Aurelien Jarno
        tcg_out_shl_i32(s, args[0], args[1], args[2], const_args[2]);
2046 477ba620 Aurelien Jarno
        break;
2047 477ba620 Aurelien Jarno
    case INDEX_op_shl_i64:
2048 477ba620 Aurelien Jarno
        tcg_out_shl_i64(s, args[0], args[1], args[2], const_args[2]);
2049 477ba620 Aurelien Jarno
        break;
2050 477ba620 Aurelien Jarno
    case INDEX_op_shr_i32:
2051 477ba620 Aurelien Jarno
        tcg_out_shr_i32(s, args[0], args[1], args[2], const_args[2]);
2052 477ba620 Aurelien Jarno
        break;
2053 477ba620 Aurelien Jarno
    case INDEX_op_shr_i64:
2054 477ba620 Aurelien Jarno
        tcg_out_shr_i64(s, args[0], args[1], args[2], const_args[2]);
2055 477ba620 Aurelien Jarno
        break;
2056 477ba620 Aurelien Jarno
    case INDEX_op_rotl_i32:
2057 477ba620 Aurelien Jarno
        tcg_out_rotl_i32(s, args[0], args[1], args[2], const_args[2]);
2058 477ba620 Aurelien Jarno
        break;
2059 477ba620 Aurelien Jarno
    case INDEX_op_rotl_i64:
2060 477ba620 Aurelien Jarno
        tcg_out_rotl_i64(s, args[0], args[1], args[2], const_args[2]);
2061 477ba620 Aurelien Jarno
        break;
2062 477ba620 Aurelien Jarno
    case INDEX_op_rotr_i32:
2063 477ba620 Aurelien Jarno
        tcg_out_rotr_i32(s, args[0], args[1], args[2], const_args[2]);
2064 477ba620 Aurelien Jarno
        break;
2065 477ba620 Aurelien Jarno
    case INDEX_op_rotr_i64:
2066 477ba620 Aurelien Jarno
        tcg_out_rotr_i64(s, args[0], args[1], args[2], const_args[2]);
2067 477ba620 Aurelien Jarno
        break;
2068 477ba620 Aurelien Jarno
2069 477ba620 Aurelien Jarno
    case INDEX_op_ext8s_i32:
2070 477ba620 Aurelien Jarno
    case INDEX_op_ext8s_i64:
2071 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_SXT1_I29, args[0], args[1]);
2072 477ba620 Aurelien Jarno
        break;
2073 477ba620 Aurelien Jarno
    case INDEX_op_ext8u_i32:
2074 477ba620 Aurelien Jarno
    case INDEX_op_ext8u_i64:
2075 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_ZXT1_I29, args[0], args[1]);
2076 477ba620 Aurelien Jarno
        break;
2077 477ba620 Aurelien Jarno
    case INDEX_op_ext16s_i32:
2078 477ba620 Aurelien Jarno
    case INDEX_op_ext16s_i64:
2079 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_SXT2_I29, args[0], args[1]);
2080 477ba620 Aurelien Jarno
        break;
2081 477ba620 Aurelien Jarno
    case INDEX_op_ext16u_i32:
2082 477ba620 Aurelien Jarno
    case INDEX_op_ext16u_i64:
2083 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_ZXT2_I29, args[0], args[1]);
2084 477ba620 Aurelien Jarno
        break;
2085 477ba620 Aurelien Jarno
    case INDEX_op_ext32s_i64:
2086 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_SXT4_I29, args[0], args[1]);
2087 477ba620 Aurelien Jarno
        break;
2088 477ba620 Aurelien Jarno
    case INDEX_op_ext32u_i64:
2089 477ba620 Aurelien Jarno
        tcg_out_ext(s, OPC_ZXT4_I29, args[0], args[1]);
2090 477ba620 Aurelien Jarno
        break;
2091 477ba620 Aurelien Jarno
2092 477ba620 Aurelien Jarno
    case INDEX_op_bswap16_i32:
2093 477ba620 Aurelien Jarno
    case INDEX_op_bswap16_i64:
2094 477ba620 Aurelien Jarno
        tcg_out_bswap16(s, args[0], args[1]);
2095 477ba620 Aurelien Jarno
        break;
2096 477ba620 Aurelien Jarno
    case INDEX_op_bswap32_i32:
2097 477ba620 Aurelien Jarno
    case INDEX_op_bswap32_i64:
2098 477ba620 Aurelien Jarno
        tcg_out_bswap32(s, args[0], args[1]);
2099 477ba620 Aurelien Jarno
        break;
2100 477ba620 Aurelien Jarno
    case INDEX_op_bswap64_i64:
2101 477ba620 Aurelien Jarno
        tcg_out_bswap64(s, args[0], args[1]);
2102 477ba620 Aurelien Jarno
        break;
2103 477ba620 Aurelien Jarno
2104 477ba620 Aurelien Jarno
    case INDEX_op_brcond_i32:
2105 477ba620 Aurelien Jarno
        tcg_out_brcond(s, args[2], args[0], const_args[0],
2106 477ba620 Aurelien Jarno
                       args[1], const_args[1], args[3], 1);
2107 477ba620 Aurelien Jarno
        break;
2108 477ba620 Aurelien Jarno
    case INDEX_op_brcond_i64:
2109 477ba620 Aurelien Jarno
        tcg_out_brcond(s, args[2], args[0], const_args[0],
2110 477ba620 Aurelien Jarno
                       args[1], const_args[1], args[3], 0);
2111 477ba620 Aurelien Jarno
        break;
2112 477ba620 Aurelien Jarno
    case INDEX_op_setcond_i32:
2113 477ba620 Aurelien Jarno
        tcg_out_setcond(s, args[3], args[0], args[1], args[2], 1);
2114 477ba620 Aurelien Jarno
        break;
2115 477ba620 Aurelien Jarno
    case INDEX_op_setcond_i64:
2116 477ba620 Aurelien Jarno
        tcg_out_setcond(s, args[3], args[0], args[1], args[2], 0);
2117 477ba620 Aurelien Jarno
        break;
2118 477ba620 Aurelien Jarno
2119 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld8u:
2120 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 0);
2121 477ba620 Aurelien Jarno
        break;
2122 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld8s:
2123 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 0 | 4);
2124 477ba620 Aurelien Jarno
        break;
2125 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld16u:
2126 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 1);
2127 477ba620 Aurelien Jarno
        break;
2128 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld16s:
2129 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 1 | 4);
2130 477ba620 Aurelien Jarno
        break;
2131 b3b0091f Richard Henderson
    case INDEX_op_qemu_ld32:
2132 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld32u:
2133 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 2);
2134 477ba620 Aurelien Jarno
        break;
2135 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld32s:
2136 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 2 | 4);
2137 477ba620 Aurelien Jarno
        break;
2138 477ba620 Aurelien Jarno
    case INDEX_op_qemu_ld64:
2139 477ba620 Aurelien Jarno
        tcg_out_qemu_ld(s, args, 3);
2140 477ba620 Aurelien Jarno
        break;
2141 477ba620 Aurelien Jarno
2142 477ba620 Aurelien Jarno
    case INDEX_op_qemu_st8:
2143 477ba620 Aurelien Jarno
        tcg_out_qemu_st(s, args, 0);
2144 477ba620 Aurelien Jarno
        break;
2145 477ba620 Aurelien Jarno
    case INDEX_op_qemu_st16:
2146 477ba620 Aurelien Jarno
        tcg_out_qemu_st(s, args, 1);
2147 477ba620 Aurelien Jarno
        break;
2148 477ba620 Aurelien Jarno
    case INDEX_op_qemu_st32:
2149 477ba620 Aurelien Jarno
        tcg_out_qemu_st(s, args, 2);
2150 477ba620 Aurelien Jarno
        break;
2151 477ba620 Aurelien Jarno
    case INDEX_op_qemu_st64:
2152 477ba620 Aurelien Jarno
        tcg_out_qemu_st(s, args, 3);
2153 477ba620 Aurelien Jarno
        break;
2154 477ba620 Aurelien Jarno
2155 477ba620 Aurelien Jarno
    default:
2156 477ba620 Aurelien Jarno
        tcg_abort();
2157 477ba620 Aurelien Jarno
    }
2158 477ba620 Aurelien Jarno
}
2159 477ba620 Aurelien Jarno
2160 477ba620 Aurelien Jarno
static const TCGTargetOpDef ia64_op_defs[] = {
2161 477ba620 Aurelien Jarno
    { INDEX_op_br, { } },
2162 477ba620 Aurelien Jarno
    { INDEX_op_call, { "r" } },
2163 477ba620 Aurelien Jarno
    { INDEX_op_exit_tb, { } },
2164 477ba620 Aurelien Jarno
    { INDEX_op_goto_tb, { } },
2165 477ba620 Aurelien Jarno
    { INDEX_op_jmp, { "r" } },
2166 477ba620 Aurelien Jarno
2167 477ba620 Aurelien Jarno
    { INDEX_op_mov_i32, { "r", "r" } },
2168 477ba620 Aurelien Jarno
    { INDEX_op_movi_i32, { "r" } },
2169 477ba620 Aurelien Jarno
2170 477ba620 Aurelien Jarno
    { INDEX_op_ld8u_i32, { "r", "r" } },
2171 477ba620 Aurelien Jarno
    { INDEX_op_ld8s_i32, { "r", "r" } },
2172 477ba620 Aurelien Jarno
    { INDEX_op_ld16u_i32, { "r", "r" } },
2173 477ba620 Aurelien Jarno
    { INDEX_op_ld16s_i32, { "r", "r" } },
2174 477ba620 Aurelien Jarno
    { INDEX_op_ld_i32, { "r", "r" } },
2175 477ba620 Aurelien Jarno
    { INDEX_op_st8_i32, { "rZ", "r" } },
2176 477ba620 Aurelien Jarno
    { INDEX_op_st16_i32, { "rZ", "r" } },
2177 477ba620 Aurelien Jarno
    { INDEX_op_st_i32, { "rZ", "r" } },
2178 477ba620 Aurelien Jarno
2179 477ba620 Aurelien Jarno
    { INDEX_op_add_i32, { "r", "rI", "rI" } },
2180 477ba620 Aurelien Jarno
    { INDEX_op_sub_i32, { "r", "rI", "rI" } },
2181 477ba620 Aurelien Jarno
2182 477ba620 Aurelien Jarno
    { INDEX_op_and_i32, { "r", "rI", "rI" } },
2183 477ba620 Aurelien Jarno
    { INDEX_op_andc_i32, { "r", "rI", "rI" } },
2184 477ba620 Aurelien Jarno
    { INDEX_op_eqv_i32, { "r", "rZ", "rZ" } },
2185 477ba620 Aurelien Jarno
    { INDEX_op_nand_i32, { "r", "rZ", "rZ" } },
2186 477ba620 Aurelien Jarno
    { INDEX_op_nor_i32, { "r", "rZ", "rZ" } },
2187 477ba620 Aurelien Jarno
    { INDEX_op_or_i32, { "r", "rI", "rI" } },
2188 477ba620 Aurelien Jarno
    { INDEX_op_orc_i32, { "r", "rZ", "rZ" } },
2189 477ba620 Aurelien Jarno
    { INDEX_op_xor_i32, { "r", "rI", "rI" } },
2190 477ba620 Aurelien Jarno
2191 477ba620 Aurelien Jarno
    { INDEX_op_mul_i32, { "r", "rZ", "rZ" } },
2192 477ba620 Aurelien Jarno
2193 477ba620 Aurelien Jarno
    { INDEX_op_sar_i32, { "r", "rZ", "ri" } },
2194 477ba620 Aurelien Jarno
    { INDEX_op_shl_i32, { "r", "rZ", "ri" } },
2195 477ba620 Aurelien Jarno
    { INDEX_op_shr_i32, { "r", "rZ", "ri" } },
2196 477ba620 Aurelien Jarno
    { INDEX_op_rotl_i32, { "r", "rZ", "ri" } },
2197 477ba620 Aurelien Jarno
    { INDEX_op_rotr_i32, { "r", "rZ", "ri" } },
2198 477ba620 Aurelien Jarno
2199 477ba620 Aurelien Jarno
    { INDEX_op_ext8s_i32, { "r", "rZ"} },
2200 477ba620 Aurelien Jarno
    { INDEX_op_ext8u_i32, { "r", "rZ"} },
2201 477ba620 Aurelien Jarno
    { INDEX_op_ext16s_i32, { "r", "rZ"} },
2202 477ba620 Aurelien Jarno
    { INDEX_op_ext16u_i32, { "r", "rZ"} },
2203 477ba620 Aurelien Jarno
2204 477ba620 Aurelien Jarno
    { INDEX_op_bswap16_i32, { "r", "rZ" } },
2205 477ba620 Aurelien Jarno
    { INDEX_op_bswap32_i32, { "r", "rZ" } },
2206 477ba620 Aurelien Jarno
2207 477ba620 Aurelien Jarno
    { INDEX_op_brcond_i32, { "rI", "rI" } },
2208 477ba620 Aurelien Jarno
    { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } },
2209 477ba620 Aurelien Jarno
2210 477ba620 Aurelien Jarno
    { INDEX_op_mov_i64, { "r", "r" } },
2211 477ba620 Aurelien Jarno
    { INDEX_op_movi_i64, { "r" } },
2212 477ba620 Aurelien Jarno
2213 477ba620 Aurelien Jarno
    { INDEX_op_ld8u_i64, { "r", "r" } },
2214 477ba620 Aurelien Jarno
    { INDEX_op_ld8s_i64, { "r", "r" } },
2215 477ba620 Aurelien Jarno
    { INDEX_op_ld16u_i64, { "r", "r" } },
2216 477ba620 Aurelien Jarno
    { INDEX_op_ld16s_i64, { "r", "r" } },
2217 477ba620 Aurelien Jarno
    { INDEX_op_ld32u_i64, { "r", "r" } },
2218 477ba620 Aurelien Jarno
    { INDEX_op_ld32s_i64, { "r", "r" } },
2219 477ba620 Aurelien Jarno
    { INDEX_op_ld_i64, { "r", "r" } },
2220 477ba620 Aurelien Jarno
    { INDEX_op_st8_i64, { "rZ", "r" } },
2221 477ba620 Aurelien Jarno
    { INDEX_op_st16_i64, { "rZ", "r" } },
2222 477ba620 Aurelien Jarno
    { INDEX_op_st32_i64, { "rZ", "r" } },
2223 477ba620 Aurelien Jarno
    { INDEX_op_st_i64, { "rZ", "r" } },
2224 477ba620 Aurelien Jarno
2225 477ba620 Aurelien Jarno
    { INDEX_op_add_i64, { "r", "rI", "rI" } },
2226 477ba620 Aurelien Jarno
    { INDEX_op_sub_i64, { "r", "rI", "rI" } },
2227 477ba620 Aurelien Jarno
2228 477ba620 Aurelien Jarno
    { INDEX_op_and_i64, { "r", "rI", "rI" } },
2229 477ba620 Aurelien Jarno
    { INDEX_op_andc_i64, { "r", "rI", "rI" } },
2230 477ba620 Aurelien Jarno
    { INDEX_op_eqv_i64, { "r", "rZ", "rZ" } },
2231 477ba620 Aurelien Jarno
    { INDEX_op_nand_i64, { "r", "rZ", "rZ" } },
2232 477ba620 Aurelien Jarno
    { INDEX_op_nor_i64, { "r", "rZ", "rZ" } },
2233 477ba620 Aurelien Jarno
    { INDEX_op_or_i64, { "r", "rI", "rI" } },
2234 477ba620 Aurelien Jarno
    { INDEX_op_orc_i64, { "r", "rZ", "rZ" } },
2235 477ba620 Aurelien Jarno
    { INDEX_op_xor_i64, { "r", "rI", "rI" } },
2236 477ba620 Aurelien Jarno
2237 477ba620 Aurelien Jarno
    { INDEX_op_mul_i64, { "r", "rZ", "rZ" } },
2238 477ba620 Aurelien Jarno
2239 477ba620 Aurelien Jarno
    { INDEX_op_sar_i64, { "r", "rZ", "ri" } },
2240 477ba620 Aurelien Jarno
    { INDEX_op_shl_i64, { "r", "rZ", "ri" } },
2241 477ba620 Aurelien Jarno
    { INDEX_op_shr_i64, { "r", "rZ", "ri" } },
2242 477ba620 Aurelien Jarno
    { INDEX_op_rotl_i64, { "r", "rZ", "ri" } },
2243 477ba620 Aurelien Jarno
    { INDEX_op_rotr_i64, { "r", "rZ", "ri" } },
2244 477ba620 Aurelien Jarno
2245 477ba620 Aurelien Jarno
    { INDEX_op_ext8s_i64, { "r", "rZ"} },
2246 477ba620 Aurelien Jarno
    { INDEX_op_ext8u_i64, { "r", "rZ"} },
2247 477ba620 Aurelien Jarno
    { INDEX_op_ext16s_i64, { "r", "rZ"} },
2248 477ba620 Aurelien Jarno
    { INDEX_op_ext16u_i64, { "r", "rZ"} },
2249 477ba620 Aurelien Jarno
    { INDEX_op_ext32s_i64, { "r", "rZ"} },
2250 477ba620 Aurelien Jarno
    { INDEX_op_ext32u_i64, { "r", "rZ"} },
2251 477ba620 Aurelien Jarno
2252 477ba620 Aurelien Jarno
    { INDEX_op_bswap16_i64, { "r", "rZ" } },
2253 477ba620 Aurelien Jarno
    { INDEX_op_bswap32_i64, { "r", "rZ" } },
2254 477ba620 Aurelien Jarno
    { INDEX_op_bswap64_i64, { "r", "rZ" } },
2255 477ba620 Aurelien Jarno
2256 477ba620 Aurelien Jarno
    { INDEX_op_brcond_i64, { "rI", "rI" } },
2257 477ba620 Aurelien Jarno
    { INDEX_op_setcond_i64, { "r", "rZ", "rZ" } },
2258 477ba620 Aurelien Jarno
2259 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld8u, { "r", "r" } },
2260 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld8s, { "r", "r" } },
2261 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld16u, { "r", "r" } },
2262 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld16s, { "r", "r" } },
2263 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld32, { "r", "r" } },
2264 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld32u, { "r", "r" } },
2265 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld32s, { "r", "r" } },
2266 477ba620 Aurelien Jarno
    { INDEX_op_qemu_ld64, { "r", "r" } },
2267 477ba620 Aurelien Jarno
2268 477ba620 Aurelien Jarno
    { INDEX_op_qemu_st8, { "SZ", "r" } },
2269 477ba620 Aurelien Jarno
    { INDEX_op_qemu_st16, { "SZ", "r" } },
2270 477ba620 Aurelien Jarno
    { INDEX_op_qemu_st32, { "SZ", "r" } },
2271 477ba620 Aurelien Jarno
    { INDEX_op_qemu_st64, { "SZ", "r" } },
2272 477ba620 Aurelien Jarno
2273 477ba620 Aurelien Jarno
    { -1 },
2274 477ba620 Aurelien Jarno
};
2275 477ba620 Aurelien Jarno
2276 477ba620 Aurelien Jarno
/* Generate global QEMU prologue and epilogue code */
2277 e4d58b41 Richard Henderson
static void tcg_target_qemu_prologue(TCGContext *s)
2278 477ba620 Aurelien Jarno
{
2279 477ba620 Aurelien Jarno
    int frame_size;
2280 477ba620 Aurelien Jarno
2281 477ba620 Aurelien Jarno
    /* reserve some stack space */
2282 477ba620 Aurelien Jarno
    frame_size = TCG_STATIC_CALL_ARGS_SIZE;
2283 477ba620 Aurelien Jarno
    frame_size = (frame_size + TCG_TARGET_STACK_ALIGN - 1) &
2284 477ba620 Aurelien Jarno
                 ~(TCG_TARGET_STACK_ALIGN - 1);
2285 477ba620 Aurelien Jarno
2286 477ba620 Aurelien Jarno
    /* First emit adhoc function descriptor */
2287 477ba620 Aurelien Jarno
    *(uint64_t *)(s->code_ptr) = (uint64_t)s->code_ptr + 16; /* entry point */
2288 477ba620 Aurelien Jarno
    s->code_ptr += 16; /* skip GP */
2289 477ba620 Aurelien Jarno
2290 477ba620 Aurelien Jarno
    /* prologue */
2291 477ba620 Aurelien Jarno
    tcg_out_bundle(s, mII,
2292 477ba620 Aurelien Jarno
                   tcg_opc_m34(TCG_REG_P0, OPC_ALLOC_M34,
2293 477ba620 Aurelien Jarno
                               TCG_REG_R33, 32, 24, 0),
2294 477ba620 Aurelien Jarno
                   tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21,
2295 477ba620 Aurelien Jarno
                               TCG_REG_B6, TCG_REG_R32, 0),
2296 477ba620 Aurelien Jarno
                   tcg_opc_i22(TCG_REG_P0, OPC_MOV_I22,
2297 477ba620 Aurelien Jarno
                               TCG_REG_R32, TCG_REG_B0));
2298 6781d08d Richard Henderson
2299 6781d08d Richard Henderson
    /* ??? If GUEST_BASE < 0x200000, we could load the register via
2300 6781d08d Richard Henderson
       an ADDL in the M slot of the next bundle.  */
2301 6781d08d Richard Henderson
    if (GUEST_BASE != 0) {
2302 6781d08d Richard Henderson
        tcg_out_bundle(s, mlx,
2303 6781d08d Richard Henderson
                       tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
2304 6781d08d Richard Henderson
                       tcg_opc_l2 (GUEST_BASE),
2305 6781d08d Richard Henderson
                       tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2,
2306 6781d08d Richard Henderson
                                   TCG_GUEST_BASE_REG, GUEST_BASE));
2307 6781d08d Richard Henderson
        tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
2308 6781d08d Richard Henderson
    }
2309 6781d08d Richard Henderson
2310 477ba620 Aurelien Jarno
    tcg_out_bundle(s, miB,
2311 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
2312 477ba620 Aurelien Jarno
                   tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4,
2313 477ba620 Aurelien Jarno
                               TCG_REG_R12, -frame_size, TCG_REG_R12),
2314 477ba620 Aurelien Jarno
                   tcg_opc_b4 (TCG_REG_P0, OPC_BR_SPTK_MANY_B4, TCG_REG_B6));
2315 477ba620 Aurelien Jarno
2316 477ba620 Aurelien Jarno
    /* epilogue */
2317 477ba620 Aurelien Jarno
    tb_ret_addr = s->code_ptr;
2318 477ba620 Aurelien Jarno
    tcg_out_bundle(s, miI,
2319 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
2320 477ba620 Aurelien Jarno
                   tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21,
2321 477ba620 Aurelien Jarno
                               TCG_REG_B0, TCG_REG_R32, 0),
2322 477ba620 Aurelien Jarno
                   tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4,
2323 477ba620 Aurelien Jarno
                               TCG_REG_R12, frame_size, TCG_REG_R12));
2324 477ba620 Aurelien Jarno
    tcg_out_bundle(s, miB,
2325 477ba620 Aurelien Jarno
                   tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
2326 477ba620 Aurelien Jarno
                   tcg_opc_i26(TCG_REG_P0, OPC_MOV_I_I26,
2327 477ba620 Aurelien Jarno
                               TCG_REG_PFS, TCG_REG_R33),
2328 477ba620 Aurelien Jarno
                   tcg_opc_b4 (TCG_REG_P0, OPC_BR_RET_SPTK_MANY_B4,
2329 477ba620 Aurelien Jarno
                               TCG_REG_B0));
2330 477ba620 Aurelien Jarno
}
2331 477ba620 Aurelien Jarno
2332 e4d58b41 Richard Henderson
static void tcg_target_init(TCGContext *s)
2333 477ba620 Aurelien Jarno
{
2334 477ba620 Aurelien Jarno
    tcg_regset_set(tcg_target_available_regs[TCG_TYPE_I32],
2335 477ba620 Aurelien Jarno
                   0xffffffffffffffffull);
2336 477ba620 Aurelien Jarno
    tcg_regset_set(tcg_target_available_regs[TCG_TYPE_I64],
2337 477ba620 Aurelien Jarno
                   0xffffffffffffffffull);
2338 477ba620 Aurelien Jarno
2339 7221f058 Richard Henderson
    tcg_regset_clear(tcg_target_call_clobber_regs);
2340 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R8);
2341 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R9);
2342 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R10);
2343 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R11);
2344 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R14);
2345 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R15);
2346 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R16);
2347 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R17);
2348 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R18);
2349 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R19);
2350 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R20);
2351 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R21);
2352 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R22);
2353 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R23);
2354 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R24);
2355 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R25);
2356 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R26);
2357 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R27);
2358 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R28);
2359 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R29);
2360 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R30);
2361 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R31);
2362 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R56);
2363 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R57);
2364 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R58);
2365 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R59);
2366 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R60);
2367 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R61);
2368 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R62);
2369 7221f058 Richard Henderson
    tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R63);
2370 7221f058 Richard Henderson
2371 7221f058 Richard Henderson
    tcg_regset_clear(s->reserved_regs);
2372 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R0);   /* zero register */
2373 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R1);   /* global pointer */
2374 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R2);   /* internal use */
2375 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R3);   /* internal use */
2376 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R12);  /* stack pointer */
2377 7221f058 Richard Henderson
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R13);  /* thread pointer */
2378 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R32);  /* return address */
2379 477ba620 Aurelien Jarno
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R33);  /* PFS */
2380 477ba620 Aurelien Jarno
2381 7221f058 Richard Henderson
    /* The following 3 are not in use, are call-saved, but *not* saved
2382 7221f058 Richard Henderson
       by the prologue.  Therefore we cannot use them without modifying
2383 7221f058 Richard Henderson
       the prologue.  There doesn't seem to be any good reason to use
2384 7221f058 Richard Henderson
       these as opposed to the windowed registers.  */
2385 7221f058 Richard Henderson
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R4);
2386 7221f058 Richard Henderson
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R5);
2387 7221f058 Richard Henderson
    tcg_regset_set_reg(s->reserved_regs, TCG_REG_R6);
2388 7221f058 Richard Henderson
2389 477ba620 Aurelien Jarno
    tcg_add_target_add_op_defs(ia64_op_defs);
2390 477ba620 Aurelien Jarno
}