blob: 6ae1760298f2b6a2c2e0b47b243ed645a71a964b [file] [log] [blame]
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001/*
2 * Tiny Code Generator for QEMU
3 *
4 * Copyright (c) 2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#include "tcg.h"
25
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080026int gen_new_label(void);
27
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070028static inline void tcg_gen_op1_i32(int opc, TCGv_i32 arg1)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080029{
30 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070031 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
32}
33
34static inline void tcg_gen_op1_i64(int opc, TCGv_i64 arg1)
35{
36 *gen_opc_ptr++ = opc;
37 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080038}
39
40static inline void tcg_gen_op1i(int opc, TCGArg arg1)
41{
42 *gen_opc_ptr++ = opc;
43 *gen_opparam_ptr++ = arg1;
44}
45
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070046static inline void tcg_gen_op2_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080047{
48 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070049 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
50 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080051}
52
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070053static inline void tcg_gen_op2_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080054{
55 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070056 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
57 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
58}
59
60static inline void tcg_gen_op2i_i32(int opc, TCGv_i32 arg1, TCGArg arg2)
61{
62 *gen_opc_ptr++ = opc;
63 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
64 *gen_opparam_ptr++ = arg2;
65}
66
67static inline void tcg_gen_op2i_i64(int opc, TCGv_i64 arg1, TCGArg arg2)
68{
69 *gen_opc_ptr++ = opc;
70 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080071 *gen_opparam_ptr++ = arg2;
72}
73
74static inline void tcg_gen_op2ii(int opc, TCGArg arg1, TCGArg arg2)
75{
76 *gen_opc_ptr++ = opc;
77 *gen_opparam_ptr++ = arg1;
78 *gen_opparam_ptr++ = arg2;
79}
80
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070081static inline void tcg_gen_op3_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
82 TCGv_i32 arg3)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080083{
84 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070085 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
86 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
87 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080088}
89
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070090static inline void tcg_gen_op3_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
91 TCGv_i64 arg3)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -080092{
93 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -070094 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
95 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
96 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
97}
98
99static inline void tcg_gen_op3i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
100 TCGArg arg3)
101{
102 *gen_opc_ptr++ = opc;
103 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
104 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800105 *gen_opparam_ptr++ = arg3;
106}
107
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700108static inline void tcg_gen_op3i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
109 TCGArg arg3)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800110{
111 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700112 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
113 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
114 *gen_opparam_ptr++ = arg3;
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800115}
116
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700117static inline void tcg_gen_ldst_op_i32(int opc, TCGv_i32 val, TCGv_ptr base,
118 TCGArg offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800119{
120 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700121 *gen_opparam_ptr++ = GET_TCGV_I32(val);
122 *gen_opparam_ptr++ = GET_TCGV_PTR(base);
123 *gen_opparam_ptr++ = offset;
124}
125
126static inline void tcg_gen_ldst_op_i64(int opc, TCGv_i64 val, TCGv_ptr base,
127 TCGArg offset)
128{
129 *gen_opc_ptr++ = opc;
130 *gen_opparam_ptr++ = GET_TCGV_I64(val);
131 *gen_opparam_ptr++ = GET_TCGV_PTR(base);
132 *gen_opparam_ptr++ = offset;
133}
134
135static inline void tcg_gen_qemu_ldst_op_i64_i32(int opc, TCGv_i64 val, TCGv_i32 addr,
136 TCGArg mem_index)
137{
138 *gen_opc_ptr++ = opc;
139 *gen_opparam_ptr++ = GET_TCGV_I64(val);
140 *gen_opparam_ptr++ = GET_TCGV_I32(addr);
141 *gen_opparam_ptr++ = mem_index;
142}
143
144static inline void tcg_gen_qemu_ldst_op_i64_i64(int opc, TCGv_i64 val, TCGv_i64 addr,
145 TCGArg mem_index)
146{
147 *gen_opc_ptr++ = opc;
148 *gen_opparam_ptr++ = GET_TCGV_I64(val);
149 *gen_opparam_ptr++ = GET_TCGV_I64(addr);
150 *gen_opparam_ptr++ = mem_index;
151}
152
153static inline void tcg_gen_op4_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
154 TCGv_i32 arg3, TCGv_i32 arg4)
155{
156 *gen_opc_ptr++ = opc;
157 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
158 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
159 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
160 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
161}
162
163static inline void tcg_gen_op4_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
164 TCGv_i64 arg3, TCGv_i64 arg4)
165{
166 *gen_opc_ptr++ = opc;
167 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
168 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
169 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
170 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
171}
172
173static inline void tcg_gen_op4i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
174 TCGv_i32 arg3, TCGArg arg4)
175{
176 *gen_opc_ptr++ = opc;
177 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
178 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
179 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800180 *gen_opparam_ptr++ = arg4;
181}
182
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700183static inline void tcg_gen_op4i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
184 TCGv_i64 arg3, TCGArg arg4)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800185{
186 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700187 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
188 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
189 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
190 *gen_opparam_ptr++ = arg4;
191}
192
193static inline void tcg_gen_op4ii_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
194 TCGArg arg3, TCGArg arg4)
195{
196 *gen_opc_ptr++ = opc;
197 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
198 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800199 *gen_opparam_ptr++ = arg3;
200 *gen_opparam_ptr++ = arg4;
201}
202
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700203static inline void tcg_gen_op4ii_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
204 TCGArg arg3, TCGArg arg4)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800205{
206 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700207 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
208 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
209 *gen_opparam_ptr++ = arg3;
210 *gen_opparam_ptr++ = arg4;
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800211}
212
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700213static inline void tcg_gen_op5_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
214 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800215{
216 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700217 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
218 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
219 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
220 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
221 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
222}
223
224static inline void tcg_gen_op5_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
225 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
226{
227 *gen_opc_ptr++ = opc;
228 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
229 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
230 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
231 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
232 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
233}
234
235static inline void tcg_gen_op5i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
236 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
237{
238 *gen_opc_ptr++ = opc;
239 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
240 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
241 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
242 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800243 *gen_opparam_ptr++ = arg5;
244}
245
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700246static inline void tcg_gen_op5i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
247 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800248{
249 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700250 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
251 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
252 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
253 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
254 *gen_opparam_ptr++ = arg5;
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800255}
256
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700257static inline void tcg_gen_op6_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
258 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
259 TCGv_i32 arg6)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800260{
261 *gen_opc_ptr++ = opc;
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700262 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
263 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
264 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
265 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
266 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
267 *gen_opparam_ptr++ = GET_TCGV_I32(arg6);
268}
269
270static inline void tcg_gen_op6_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
271 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
272 TCGv_i64 arg6)
273{
274 *gen_opc_ptr++ = opc;
275 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
276 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
277 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
278 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
279 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
280 *gen_opparam_ptr++ = GET_TCGV_I64(arg6);
281}
282
David 'Digit' Turnerb9317722010-05-10 18:53:56 -0700283static inline void tcg_gen_op6i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
284 TCGv_i32 arg3, TCGv_i32 arg4,
285 TCGv_i32 arg5, TCGArg arg6)
286{
287 *gen_opc_ptr++ = opc;
288 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
289 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
290 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
291 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
292 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
293 *gen_opparam_ptr++ = arg6;
294}
295
296static inline void tcg_gen_op6i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
297 TCGv_i64 arg3, TCGv_i64 arg4,
298 TCGv_i64 arg5, TCGArg arg6)
299{
300 *gen_opc_ptr++ = opc;
301 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
302 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
303 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
304 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
305 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
306 *gen_opparam_ptr++ = arg6;
307}
308
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700309static inline void tcg_gen_op6ii_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
310 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5,
311 TCGArg arg6)
312{
313 *gen_opc_ptr++ = opc;
314 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
315 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
316 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
317 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
318 *gen_opparam_ptr++ = arg5;
319 *gen_opparam_ptr++ = arg6;
320}
321
322static inline void tcg_gen_op6ii_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
323 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5,
324 TCGArg arg6)
325{
326 *gen_opc_ptr++ = opc;
327 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
328 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
329 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
330 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800331 *gen_opparam_ptr++ = arg5;
332 *gen_opparam_ptr++ = arg6;
333}
334
335static inline void gen_set_label(int n)
336{
337 tcg_gen_op1i(INDEX_op_set_label, n);
338}
339
340static inline void tcg_gen_br(int label)
341{
342 tcg_gen_op1i(INDEX_op_br, label);
343}
344
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700345static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800346{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700347 if (!TCGV_EQUAL_I32(ret, arg))
348 tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800349}
350
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700351static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800352{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700353 tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800354}
355
356/* helper calls */
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700357static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
358 TCGArg ret, int nargs, TCGArg *args)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800359{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700360 TCGv_ptr fn;
361 fn = tcg_const_ptr((tcg_target_long)func);
362 tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret,
363 nargs, args);
364 tcg_temp_free_ptr(fn);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800365}
366
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700367/* FIXME: Should this be pure? */
368static inline void tcg_gen_helper64(void *func, TCGv_i64 ret,
369 TCGv_i64 a, TCGv_i64 b)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800370{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700371 TCGv_ptr fn;
372 TCGArg args[2];
373 fn = tcg_const_ptr((tcg_target_long)func);
374 args[0] = GET_TCGV_I64(a);
375 args[1] = GET_TCGV_I64(b);
376 tcg_gen_callN(&tcg_ctx, fn, 0, 7, GET_TCGV_I64(ret), 2, args);
377 tcg_temp_free_ptr(fn);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800378}
379
380/* 32 bit ops */
381
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700382static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800383{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700384 tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800385}
386
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700387static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800388{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700389 tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800390}
391
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700392static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800393{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700394 tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800395}
396
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700397static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800398{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700399 tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800400}
401
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700402static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800403{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700404 tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800405}
406
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700407static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800408{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700409 tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800410}
411
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700412static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800413{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700414 tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800415}
416
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700417static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800418{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700419 tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800420}
421
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700422static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800423{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700424 tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800425}
426
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700427static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800428{
429 /* some cases can be optimized here */
430 if (arg2 == 0) {
431 tcg_gen_mov_i32(ret, arg1);
432 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700433 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800434 tcg_gen_add_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700435 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800436 }
437}
438
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700439static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800440{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700441 tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800442}
443
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700444static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2)
445{
446 TCGv_i32 t0 = tcg_const_i32(arg1);
447 tcg_gen_sub_i32(ret, t0, arg2);
448 tcg_temp_free_i32(t0);
449}
450
451static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800452{
453 /* some cases can be optimized here */
454 if (arg2 == 0) {
455 tcg_gen_mov_i32(ret, arg1);
456 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700457 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800458 tcg_gen_sub_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700459 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800460 }
461}
462
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700463static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800464{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700465 if (TCGV_EQUAL_I32(arg1, arg2)) {
466 tcg_gen_mov_i32(ret, arg1);
467 } else {
468 tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
469 }
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800470}
471
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700472static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800473{
474 /* some cases can be optimized here */
475 if (arg2 == 0) {
476 tcg_gen_movi_i32(ret, 0);
477 } else if (arg2 == 0xffffffff) {
478 tcg_gen_mov_i32(ret, arg1);
479 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700480 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800481 tcg_gen_and_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700482 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800483 }
484}
485
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700486static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800487{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700488 if (TCGV_EQUAL_I32(arg1, arg2)) {
489 tcg_gen_mov_i32(ret, arg1);
490 } else {
491 tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
492 }
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800493}
494
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700495static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800496{
497 /* some cases can be optimized here */
498 if (arg2 == 0xffffffff) {
499 tcg_gen_movi_i32(ret, 0xffffffff);
500 } else if (arg2 == 0) {
501 tcg_gen_mov_i32(ret, arg1);
502 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700503 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800504 tcg_gen_or_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700505 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800506 }
507}
508
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700509static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800510{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700511 if (TCGV_EQUAL_I32(arg1, arg2)) {
512 tcg_gen_movi_i32(ret, 0);
513 } else {
514 tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
515 }
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800516}
517
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700518static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800519{
520 /* some cases can be optimized here */
521 if (arg2 == 0) {
522 tcg_gen_mov_i32(ret, arg1);
523 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700524 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800525 tcg_gen_xor_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700526 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800527 }
528}
529
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700530static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800531{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700532 tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800533}
534
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700535static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800536{
537 if (arg2 == 0) {
538 tcg_gen_mov_i32(ret, arg1);
539 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700540 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800541 tcg_gen_shl_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700542 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800543 }
544}
545
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700546static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800547{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700548 tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800549}
550
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700551static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800552{
553 if (arg2 == 0) {
554 tcg_gen_mov_i32(ret, arg1);
555 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700556 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800557 tcg_gen_shr_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700558 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800559 }
560}
561
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700562static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800563{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700564 tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800565}
566
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700567static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800568{
569 if (arg2 == 0) {
570 tcg_gen_mov_i32(ret, arg1);
571 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700572 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800573 tcg_gen_sar_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700574 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800575 }
576}
577
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700578static inline void tcg_gen_brcond_i32(int cond, TCGv_i32 arg1, TCGv_i32 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800579 int label_index)
580{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700581 tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800582}
583
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700584static inline void tcg_gen_brcondi_i32(int cond, TCGv_i32 arg1, int32_t arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800585 int label_index)
586{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700587 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800588 tcg_gen_brcond_i32(cond, arg1, t0, label_index);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700589 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800590}
591
David 'Digit' Turnerb9317722010-05-10 18:53:56 -0700592static inline void tcg_gen_setcond_i32(int cond, TCGv_i32 ret,
593 TCGv_i32 arg1, TCGv_i32 arg2)
594{
595 tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond);
596}
597
598static inline void tcg_gen_setcondi_i32(int cond, TCGv_i32 ret, TCGv_i32 arg1,
599 int32_t arg2)
600{
601 TCGv_i32 t0 = tcg_const_i32(arg2);
602 tcg_gen_setcond_i32(cond, ret, arg1, t0);
603 tcg_temp_free_i32(t0);
604}
605
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700606static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800607{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700608 tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800609}
610
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700611static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800612{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700613 TCGv_i32 t0 = tcg_const_i32(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800614 tcg_gen_mul_i32(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700615 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800616}
617
618#ifdef TCG_TARGET_HAS_div_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700619static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800620{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700621 tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800622}
623
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700624static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800625{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700626 tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800627}
628
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700629static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800630{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700631 tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800632}
633
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700634static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800635{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700636 tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800637}
638#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700639static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800640{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700641 TCGv_i32 t0;
642 t0 = tcg_temp_new_i32();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800643 tcg_gen_sari_i32(t0, arg1, 31);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700644 tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
645 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800646}
647
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700648static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800649{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700650 TCGv_i32 t0;
651 t0 = tcg_temp_new_i32();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800652 tcg_gen_sari_i32(t0, arg1, 31);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700653 tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
654 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800655}
656
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700657static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800658{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700659 TCGv_i32 t0;
660 t0 = tcg_temp_new_i32();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800661 tcg_gen_movi_i32(t0, 0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700662 tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
663 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800664}
665
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700666static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800667{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700668 TCGv_i32 t0;
669 t0 = tcg_temp_new_i32();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800670 tcg_gen_movi_i32(t0, 0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700671 tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
672 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800673}
674#endif
675
676#if TCG_TARGET_REG_BITS == 32
677
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700678static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800679{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700680 if (!TCGV_EQUAL_I64(ret, arg)) {
681 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800682 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
683 }
684}
685
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700686static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800687{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700688 tcg_gen_movi_i32(TCGV_LOW(ret), arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800689 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
690}
691
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700692static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
693 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800694{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700695 tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800696 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
697}
698
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700699static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
700 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800701{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700702 tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
703 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800704}
705
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700706static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
707 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800708{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700709 tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800710 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
711}
712
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700713static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
714 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800715{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700716 tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
717 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800718}
719
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700720static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
721 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800722{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700723 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800724 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
725}
726
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700727static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
728 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800729{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700730 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
731 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800732}
733
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700734static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
735 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800736{
737 /* since arg2 and ret have different types, they cannot be the
738 same temporary */
739#ifdef TCG_TARGET_WORDS_BIGENDIAN
740 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700741 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800742#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700743 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800744 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
745#endif
746}
747
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700748static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
749 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800750{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700751 tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800752}
753
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700754static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
755 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800756{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700757 tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800758}
759
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700760static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
761 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800762{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700763 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800764}
765
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700766static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
767 tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800768{
769#ifdef TCG_TARGET_WORDS_BIGENDIAN
770 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700771 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800772#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700773 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800774 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
775#endif
776}
777
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700778static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800779{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700780 tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
781 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
782 TCGV_HIGH(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800783}
784
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700785static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800786{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700787 tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
788 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
789 TCGV_HIGH(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800790}
791
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700792static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800793{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700794 tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800795 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
796}
797
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700798static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800799{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700800 tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800801 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
802}
803
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700804static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800805{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700806 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800807 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
808}
809
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700810static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800811{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700812 tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800813 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
814}
815
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700816static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800817{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700818 tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800819 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
820}
821
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700822static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800823{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700824 tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800825 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
826}
827
828/* XXX: use generic code when basic block handling is OK or CPU
829 specific code (x86) */
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700830static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800831{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700832 tcg_gen_helper64(tcg_helper_shl_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800833}
834
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700835static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800836{
837 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
838}
839
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700840static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800841{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700842 tcg_gen_helper64(tcg_helper_shr_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800843}
844
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700845static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800846{
847 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
848}
849
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700850static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800851{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700852 tcg_gen_helper64(tcg_helper_sar_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800853}
854
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700855static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800856{
857 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
858}
859
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700860static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800861 int label_index)
862{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700863 tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
864 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
865 TCGV_HIGH(arg2), cond, label_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800866}
867
David 'Digit' Turnerb9317722010-05-10 18:53:56 -0700868static inline void tcg_gen_setcond_i64(int cond, TCGv_i64 ret,
869 TCGv_i64 arg1, TCGv_i64 arg2)
870{
871 tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret),
872 TCGV_LOW(arg1), TCGV_HIGH(arg1),
873 TCGV_LOW(arg2), TCGV_HIGH(arg2), cond);
874 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
875}
876
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700877static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800878{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700879 TCGv_i64 t0;
880 TCGv_i32 t1;
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800881
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700882 t0 = tcg_temp_new_i64();
883 t1 = tcg_temp_new_i32();
884
885 tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
886 TCGV_LOW(arg1), TCGV_LOW(arg2));
887
888 tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800889 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700890 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800891 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700892
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800893 tcg_gen_mov_i64(ret, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700894 tcg_temp_free_i64(t0);
895 tcg_temp_free_i32(t1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800896}
897
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700898static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800899{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700900 tcg_gen_helper64(tcg_helper_div_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800901}
902
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700903static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800904{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700905 tcg_gen_helper64(tcg_helper_rem_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800906}
907
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700908static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800909{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700910 tcg_gen_helper64(tcg_helper_divu_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800911}
912
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700913static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800914{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700915 tcg_gen_helper64(tcg_helper_remu_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800916}
917
918#else
919
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700920static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800921{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700922 if (!TCGV_EQUAL_I64(ret, arg))
923 tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800924}
925
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700926static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800927{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700928 tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800929}
930
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700931static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800932 tcg_target_long offset)
933{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700934 tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800935}
936
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700937static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800938 tcg_target_long offset)
939{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700940 tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800941}
942
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700943static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800944 tcg_target_long offset)
945{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700946 tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800947}
948
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700949static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800950 tcg_target_long offset)
951{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700952 tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800953}
954
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700955static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800956 tcg_target_long offset)
957{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700958 tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800959}
960
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700961static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800962 tcg_target_long offset)
963{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700964 tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800965}
966
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700967static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800968{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700969 tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800970}
971
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700972static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800973 tcg_target_long offset)
974{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700975 tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800976}
977
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700978static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800979 tcg_target_long offset)
980{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700981 tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800982}
983
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700984static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800985 tcg_target_long offset)
986{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700987 tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800988}
989
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700990static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800991{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700992 tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800993}
994
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700995static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800996{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -0700997 tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -0800998}
999
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001000static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001001{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001002 tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001003}
1004
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001005static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001006{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001007 if (TCGV_EQUAL_I64(arg1, arg2)) {
1008 tcg_gen_mov_i64(ret, arg1);
1009 } else {
1010 tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
1011 }
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001012}
1013
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001014static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001015{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001016 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001017 tcg_gen_and_i64(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001018 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001019}
1020
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001021static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001022{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001023 if (TCGV_EQUAL_I64(arg1, arg2)) {
1024 tcg_gen_mov_i64(ret, arg1);
1025 } else {
1026 tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
1027 }
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001028}
1029
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001030static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001031{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001032 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001033 tcg_gen_or_i64(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001034 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001035}
1036
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001037static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001038{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001039 if (TCGV_EQUAL_I64(arg1, arg2)) {
1040 tcg_gen_movi_i64(ret, 0);
1041 } else {
1042 tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
1043 }
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001044}
1045
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001046static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001047{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001048 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001049 tcg_gen_xor_i64(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001050 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001051}
1052
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001053static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001054{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001055 tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001056}
1057
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001058static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001059{
1060 if (arg2 == 0) {
1061 tcg_gen_mov_i64(ret, arg1);
1062 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001063 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001064 tcg_gen_shl_i64(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001065 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001066 }
1067}
1068
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001069static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001070{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001071 tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001072}
1073
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001074static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001075{
1076 if (arg2 == 0) {
1077 tcg_gen_mov_i64(ret, arg1);
1078 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001079 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001080 tcg_gen_shr_i64(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001081 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001082 }
1083}
1084
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001085static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001086{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001087 tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001088}
1089
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001090static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001091{
1092 if (arg2 == 0) {
1093 tcg_gen_mov_i64(ret, arg1);
1094 } else {
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001095 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001096 tcg_gen_sar_i64(ret, arg1, t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001097 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001098 }
1099}
1100
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001101static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001102 int label_index)
1103{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001104 tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001105}
1106
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001107static inline void tcg_gen_setcond_i64(int cond, TCGv_i64 ret,
1108 TCGv_i64 arg1, TCGv_i64 arg2)
1109{
1110 tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond);
1111}
1112
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001113static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001114{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001115 tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001116}
1117
1118#ifdef TCG_TARGET_HAS_div_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001119static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001120{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001121 tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001122}
1123
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001124static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001125{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001126 tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001127}
1128
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001129static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001130{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001131 tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001132}
1133
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001134static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001135{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001136 tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001137}
1138#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001139static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001140{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001141 TCGv_i64 t0;
1142 t0 = tcg_temp_new_i64();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001143 tcg_gen_sari_i64(t0, arg1, 63);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001144 tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1145 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001146}
1147
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001148static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001149{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001150 TCGv_i64 t0;
1151 t0 = tcg_temp_new_i64();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001152 tcg_gen_sari_i64(t0, arg1, 63);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001153 tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1154 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001155}
1156
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001157static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001158{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001159 TCGv_i64 t0;
1160 t0 = tcg_temp_new_i64();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001161 tcg_gen_movi_i64(t0, 0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001162 tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1163 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001164}
1165
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001166static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001167{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001168 TCGv_i64 t0;
1169 t0 = tcg_temp_new_i64();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001170 tcg_gen_movi_i64(t0, 0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001171 tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1172 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001173}
1174#endif
1175
1176#endif
1177
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001178static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1179{
1180 /* some cases can be optimized here */
1181 if (arg2 == 0) {
1182 tcg_gen_mov_i64(ret, arg1);
1183 } else {
1184 TCGv_i64 t0 = tcg_const_i64(arg2);
1185 tcg_gen_add_i64(ret, arg1, t0);
1186 tcg_temp_free_i64(t0);
1187 }
1188}
1189
1190static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1191{
1192 TCGv_i64 t0 = tcg_const_i64(arg1);
1193 tcg_gen_sub_i64(ret, t0, arg2);
1194 tcg_temp_free_i64(t0);
1195}
1196
1197static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1198{
1199 /* some cases can be optimized here */
1200 if (arg2 == 0) {
1201 tcg_gen_mov_i64(ret, arg1);
1202 } else {
1203 TCGv_i64 t0 = tcg_const_i64(arg2);
1204 tcg_gen_sub_i64(ret, arg1, t0);
1205 tcg_temp_free_i64(t0);
1206 }
1207}
1208static inline void tcg_gen_brcondi_i64(int cond, TCGv_i64 arg1, int64_t arg2,
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001209 int label_index)
1210{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001211 TCGv_i64 t0 = tcg_const_i64(arg2);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001212 tcg_gen_brcond_i64(cond, arg1, t0, label_index);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001213 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001214}
1215
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001216static inline void tcg_gen_setcondi_i64(int cond, TCGv_i64 ret, TCGv_i64 arg1,
1217 int64_t arg2)
1218{
1219 TCGv_i64 t0 = tcg_const_i64(arg2);
1220 tcg_gen_setcond_i64(cond, ret, arg1, t0);
1221 tcg_temp_free_i64(t0);
1222}
1223
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001224static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1225{
1226 TCGv_i64 t0 = tcg_const_i64(arg2);
1227 tcg_gen_mul_i64(ret, arg1, t0);
1228 tcg_temp_free_i64(t0);
1229}
1230
1231
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001232/***************************************/
1233/* optional operations */
1234
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001235static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001236{
1237#ifdef TCG_TARGET_HAS_ext8s_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001238 tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001239#else
1240 tcg_gen_shli_i32(ret, arg, 24);
1241 tcg_gen_sari_i32(ret, ret, 24);
1242#endif
1243}
1244
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001245static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001246{
1247#ifdef TCG_TARGET_HAS_ext16s_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001248 tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001249#else
1250 tcg_gen_shli_i32(ret, arg, 16);
1251 tcg_gen_sari_i32(ret, ret, 16);
1252#endif
1253}
1254
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001255static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001256{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001257#ifdef TCG_TARGET_HAS_ext8u_i32
1258 tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg);
1259#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001260 tcg_gen_andi_i32(ret, arg, 0xffu);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001261#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001262}
1263
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001264static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001265{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001266#ifdef TCG_TARGET_HAS_ext16u_i32
1267 tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg);
1268#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001269 tcg_gen_andi_i32(ret, arg, 0xffffu);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001270#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001271}
1272
1273/* Note: we assume the two high bytes are set to zero */
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001274static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001275{
1276#ifdef TCG_TARGET_HAS_bswap16_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001277 tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001278#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001279 TCGv_i32 t0 = tcg_temp_new_i32();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001280
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001281 tcg_gen_ext8u_i32(t0, arg);
1282 tcg_gen_shli_i32(t0, t0, 8);
1283 tcg_gen_shri_i32(ret, arg, 8);
1284 tcg_gen_or_i32(ret, ret, t0);
1285 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001286#endif
1287}
1288
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001289static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001290{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001291#ifdef TCG_TARGET_HAS_bswap32_i32
1292 tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001293#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001294 TCGv_i32 t0, t1;
1295 t0 = tcg_temp_new_i32();
1296 t1 = tcg_temp_new_i32();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001297
1298 tcg_gen_shli_i32(t0, arg, 24);
1299
1300 tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1301 tcg_gen_shli_i32(t1, t1, 8);
1302 tcg_gen_or_i32(t0, t0, t1);
1303
1304 tcg_gen_shri_i32(t1, arg, 8);
1305 tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1306 tcg_gen_or_i32(t0, t0, t1);
1307
1308 tcg_gen_shri_i32(t1, arg, 24);
1309 tcg_gen_or_i32(ret, t0, t1);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001310 tcg_temp_free_i32(t0);
1311 tcg_temp_free_i32(t1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001312#endif
1313}
1314
1315#if TCG_TARGET_REG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001316static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001317{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001318 tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1319 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001320}
1321
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001322static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001323{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001324 tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1325 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001326}
1327
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001328static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001329{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001330 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1331 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001332}
1333
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001334static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001335{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001336 tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001337 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1338}
1339
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001340static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001341{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001342 tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001343 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1344}
1345
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001346static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001347{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001348 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001349 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1350}
1351
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001352static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001353{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001354 tcg_gen_mov_i32(ret, TCGV_LOW(arg));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001355}
1356
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001357static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001358{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001359 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001360 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1361}
1362
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001363static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001364{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001365 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1366 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001367}
1368
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001369/* Note: we assume the six high bytes are set to zero */
1370static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001371{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001372 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1373 tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1374}
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001375
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001376/* Note: we assume the four high bytes are set to zero */
1377static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1378{
1379 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1380 tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1381}
1382
1383static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1384{
1385 TCGv_i32 t0, t1;
1386 t0 = tcg_temp_new_i32();
1387 t1 = tcg_temp_new_i32();
1388
1389 tcg_gen_bswap32_i32(t0, TCGV_LOW(arg));
1390 tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg));
1391 tcg_gen_mov_i32(TCGV_LOW(ret), t1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001392 tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001393 tcg_temp_free_i32(t0);
1394 tcg_temp_free_i32(t1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001395}
1396#else
1397
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001398static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001399{
1400#ifdef TCG_TARGET_HAS_ext8s_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001401 tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001402#else
1403 tcg_gen_shli_i64(ret, arg, 56);
1404 tcg_gen_sari_i64(ret, ret, 56);
1405#endif
1406}
1407
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001408static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001409{
1410#ifdef TCG_TARGET_HAS_ext16s_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001411 tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001412#else
1413 tcg_gen_shli_i64(ret, arg, 48);
1414 tcg_gen_sari_i64(ret, ret, 48);
1415#endif
1416}
1417
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001418static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001419{
1420#ifdef TCG_TARGET_HAS_ext32s_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001421 tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001422#else
1423 tcg_gen_shli_i64(ret, arg, 32);
1424 tcg_gen_sari_i64(ret, ret, 32);
1425#endif
1426}
1427
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001428static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001429{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001430#ifdef TCG_TARGET_HAS_ext8u_i64
1431 tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg);
1432#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001433 tcg_gen_andi_i64(ret, arg, 0xffu);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001434#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001435}
1436
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001437static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001438{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001439#ifdef TCG_TARGET_HAS_ext16u_i64
1440 tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg);
1441#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001442 tcg_gen_andi_i64(ret, arg, 0xffffu);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001443#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001444}
1445
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001446static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001447{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001448#ifdef TCG_TARGET_HAS_ext32u_i64
1449 tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg);
1450#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001451 tcg_gen_andi_i64(ret, arg, 0xffffffffu);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001452#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001453}
1454
1455/* Note: we assume the target supports move between 32 and 64 bit
1456 registers. This will probably break MIPS64 targets. */
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001457static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001458{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001459 tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001460}
1461
1462/* Note: we assume the target supports move between 32 and 64 bit
1463 registers */
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001464static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001465{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001466 tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001467}
1468
1469/* Note: we assume the target supports move between 32 and 64 bit
1470 registers */
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001471static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001472{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001473 tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001474}
1475
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001476/* Note: we assume the six high bytes are set to zero */
1477static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001478{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001479#ifdef TCG_TARGET_HAS_bswap16_i64
1480 tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001481#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001482 TCGv_i64 t0 = tcg_temp_new_i64();
1483
1484 tcg_gen_ext8u_i64(t0, arg);
1485 tcg_gen_shli_i64(t0, t0, 8);
1486 tcg_gen_shri_i64(ret, arg, 8);
1487 tcg_gen_or_i64(ret, ret, t0);
1488 tcg_temp_free_i64(t0);
1489#endif
1490}
1491
1492/* Note: we assume the four high bytes are set to zero */
1493static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1494{
1495#ifdef TCG_TARGET_HAS_bswap32_i64
1496 tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg);
1497#else
1498 TCGv_i64 t0, t1;
1499 t0 = tcg_temp_new_i64();
1500 t1 = tcg_temp_new_i64();
1501
1502 tcg_gen_shli_i64(t0, arg, 24);
1503 tcg_gen_ext32u_i64(t0, t0);
1504
1505 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1506 tcg_gen_shli_i64(t1, t1, 8);
1507 tcg_gen_or_i64(t0, t0, t1);
1508
1509 tcg_gen_shri_i64(t1, arg, 8);
1510 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1511 tcg_gen_or_i64(t0, t0, t1);
1512
1513 tcg_gen_shri_i64(t1, arg, 24);
1514 tcg_gen_or_i64(ret, t0, t1);
1515 tcg_temp_free_i64(t0);
1516 tcg_temp_free_i64(t1);
1517#endif
1518}
1519
1520static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1521{
1522#ifdef TCG_TARGET_HAS_bswap64_i64
1523 tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg);
1524#else
David 'Digit' Turnerddf49e52009-10-05 14:06:05 -07001525 TCGv_i64 t0 = tcg_temp_new_i64();
1526 TCGv_i64 t1 = tcg_temp_new_i64();
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001527
1528 tcg_gen_shli_i64(t0, arg, 56);
1529
1530 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1531 tcg_gen_shli_i64(t1, t1, 40);
1532 tcg_gen_or_i64(t0, t0, t1);
1533
1534 tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1535 tcg_gen_shli_i64(t1, t1, 24);
1536 tcg_gen_or_i64(t0, t0, t1);
1537
1538 tcg_gen_andi_i64(t1, arg, 0xff000000);
1539 tcg_gen_shli_i64(t1, t1, 8);
1540 tcg_gen_or_i64(t0, t0, t1);
1541
1542 tcg_gen_shri_i64(t1, arg, 8);
1543 tcg_gen_andi_i64(t1, t1, 0xff000000);
1544 tcg_gen_or_i64(t0, t0, t1);
1545
1546 tcg_gen_shri_i64(t1, arg, 24);
1547 tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1548 tcg_gen_or_i64(t0, t0, t1);
1549
1550 tcg_gen_shri_i64(t1, arg, 40);
1551 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1552 tcg_gen_or_i64(t0, t0, t1);
1553
1554 tcg_gen_shri_i64(t1, arg, 56);
1555 tcg_gen_or_i64(ret, t0, t1);
David 'Digit' Turnerddf49e52009-10-05 14:06:05 -07001556 tcg_temp_free_i64(t0);
1557 tcg_temp_free_i64(t1);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001558#endif
1559}
1560
1561#endif
1562
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001563static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001564{
1565#ifdef TCG_TARGET_HAS_neg_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001566 tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001567#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001568 TCGv_i32 t0 = tcg_const_i32(0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001569 tcg_gen_sub_i32(ret, t0, arg);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001570 tcg_temp_free_i32(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001571#endif
1572}
1573
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001574static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001575{
1576#ifdef TCG_TARGET_HAS_neg_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001577 tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001578#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001579 TCGv_i64 t0 = tcg_const_i64(0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001580 tcg_gen_sub_i64(ret, t0, arg);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001581 tcg_temp_free_i64(t0);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001582#endif
1583}
1584
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001585static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001586{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001587#ifdef TCG_TARGET_HAS_not_i32
1588 tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
1589#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001590 tcg_gen_xori_i32(ret, arg, -1);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001591#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001592}
1593
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001594static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001595{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001596#ifdef TCG_TARGET_HAS_not_i64
1597 tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg);
1598#else
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001599 tcg_gen_xori_i64(ret, arg, -1);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001600#endif
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001601}
1602
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001603static inline void tcg_gen_discard_i32(TCGv_i32 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001604{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001605 tcg_gen_op1_i32(INDEX_op_discard, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001606}
1607
1608#if TCG_TARGET_REG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001609static inline void tcg_gen_discard_i64(TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001610{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001611 tcg_gen_discard_i32(TCGV_LOW(arg));
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001612 tcg_gen_discard_i32(TCGV_HIGH(arg));
1613}
1614#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001615static inline void tcg_gen_discard_i64(TCGv_i64 arg)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001616{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001617 tcg_gen_op1_i64(INDEX_op_discard, arg);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001618}
1619#endif
1620
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001621static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
1622{
1623#if TCG_TARGET_REG_BITS == 32
1624 tcg_gen_mov_i32(TCGV_LOW(dest), low);
1625 tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1626#else
1627 TCGv_i64 tmp = tcg_temp_new_i64();
1628 /* This extension is only needed for type correctness.
1629 We may be able to do better given target specific information. */
1630 tcg_gen_extu_i32_i64(tmp, high);
1631 tcg_gen_shli_i64(tmp, tmp, 32);
1632 tcg_gen_extu_i32_i64(dest, low);
1633 tcg_gen_or_i64(dest, dest, tmp);
1634 tcg_temp_free_i64(tmp);
1635#endif
1636}
1637
1638static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high)
1639{
1640#if TCG_TARGET_REG_BITS == 32
1641 tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high));
1642#else
1643 TCGv_i64 tmp = tcg_temp_new_i64();
1644 tcg_gen_ext32u_i64(dest, low);
1645 tcg_gen_shli_i64(tmp, high, 32);
1646 tcg_gen_or_i64(dest, dest, tmp);
1647 tcg_temp_free_i64(tmp);
1648#endif
1649}
1650
1651static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1652{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001653#ifdef TCG_TARGET_HAS_andc_i32
1654 tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2);
1655#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001656 TCGv_i32 t0;
1657 t0 = tcg_temp_new_i32();
1658 tcg_gen_not_i32(t0, arg2);
1659 tcg_gen_and_i32(ret, arg1, t0);
1660 tcg_temp_free_i32(t0);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001661#endif
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001662}
1663
1664static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1665{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001666#ifdef TCG_TARGET_HAS_andc_i64
1667 tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2);
1668#elif defined(TCG_TARGET_HAS_andc_i32) && TCG_TARGET_REG_BITS == 32
1669 tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1670 tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1671#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001672 TCGv_i64 t0;
1673 t0 = tcg_temp_new_i64();
1674 tcg_gen_not_i64(t0, arg2);
1675 tcg_gen_and_i64(ret, arg1, t0);
1676 tcg_temp_free_i64(t0);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001677#endif
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001678}
1679
1680static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1681{
1682 tcg_gen_xor_i32(ret, arg1, arg2);
1683 tcg_gen_not_i32(ret, ret);
1684}
1685
1686static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1687{
1688 tcg_gen_xor_i64(ret, arg1, arg2);
1689 tcg_gen_not_i64(ret, ret);
1690}
1691
1692static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1693{
1694 tcg_gen_and_i32(ret, arg1, arg2);
1695 tcg_gen_not_i32(ret, ret);
1696}
1697
1698static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1699{
1700 tcg_gen_and_i64(ret, arg1, arg2);
1701 tcg_gen_not_i64(ret, ret);
1702}
1703
1704static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1705{
1706 tcg_gen_or_i32(ret, arg1, arg2);
1707 tcg_gen_not_i32(ret, ret);
1708}
1709
1710static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1711{
1712 tcg_gen_or_i64(ret, arg1, arg2);
1713 tcg_gen_not_i64(ret, ret);
1714}
1715
1716static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1717{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001718#ifdef TCG_TARGET_HAS_orc_i32
1719 tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2);
1720#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001721 TCGv_i32 t0;
1722 t0 = tcg_temp_new_i32();
1723 tcg_gen_not_i32(t0, arg2);
1724 tcg_gen_or_i32(ret, arg1, t0);
1725 tcg_temp_free_i32(t0);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001726#endif
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001727}
1728
1729static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1730{
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001731#ifdef TCG_TARGET_HAS_orc_i64
1732 tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2);
1733#elif defined(TCG_TARGET_HAS_orc_i32) && TCG_TARGET_REG_BITS == 32
1734 tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1735 tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1736#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001737 TCGv_i64 t0;
1738 t0 = tcg_temp_new_i64();
1739 tcg_gen_not_i64(t0, arg2);
1740 tcg_gen_or_i64(ret, arg1, t0);
1741 tcg_temp_free_i64(t0);
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07001742#endif
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001743}
1744
1745static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1746{
1747#ifdef TCG_TARGET_HAS_rot_i32
1748 tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2);
1749#else
1750 TCGv_i32 t0, t1;
1751
1752 t0 = tcg_temp_new_i32();
1753 t1 = tcg_temp_new_i32();
1754 tcg_gen_shl_i32(t0, arg1, arg2);
1755 tcg_gen_subfi_i32(t1, 32, arg2);
1756 tcg_gen_shr_i32(t1, arg1, t1);
1757 tcg_gen_or_i32(ret, t0, t1);
1758 tcg_temp_free_i32(t0);
1759 tcg_temp_free_i32(t1);
1760#endif
1761}
1762
1763static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1764{
1765#ifdef TCG_TARGET_HAS_rot_i64
1766 tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2);
1767#else
1768 TCGv_i64 t0, t1;
1769
1770 t0 = tcg_temp_new_i64();
1771 t1 = tcg_temp_new_i64();
1772 tcg_gen_shl_i64(t0, arg1, arg2);
1773 tcg_gen_subfi_i64(t1, 64, arg2);
1774 tcg_gen_shr_i64(t1, arg1, t1);
1775 tcg_gen_or_i64(ret, t0, t1);
1776 tcg_temp_free_i64(t0);
1777 tcg_temp_free_i64(t1);
1778#endif
1779}
1780
1781static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1782{
1783 /* some cases can be optimized here */
1784 if (arg2 == 0) {
1785 tcg_gen_mov_i32(ret, arg1);
1786 } else {
1787#ifdef TCG_TARGET_HAS_rot_i32
1788 TCGv_i32 t0 = tcg_const_i32(arg2);
1789 tcg_gen_rotl_i32(ret, arg1, t0);
1790 tcg_temp_free_i32(t0);
1791#else
1792 TCGv_i32 t0, t1;
1793 t0 = tcg_temp_new_i32();
1794 t1 = tcg_temp_new_i32();
1795 tcg_gen_shli_i32(t0, arg1, arg2);
1796 tcg_gen_shri_i32(t1, arg1, 32 - arg2);
1797 tcg_gen_or_i32(ret, t0, t1);
1798 tcg_temp_free_i32(t0);
1799 tcg_temp_free_i32(t1);
1800#endif
1801 }
1802}
1803
1804static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1805{
1806 /* some cases can be optimized here */
1807 if (arg2 == 0) {
1808 tcg_gen_mov_i64(ret, arg1);
1809 } else {
1810#ifdef TCG_TARGET_HAS_rot_i64
1811 TCGv_i64 t0 = tcg_const_i64(arg2);
1812 tcg_gen_rotl_i64(ret, arg1, t0);
1813 tcg_temp_free_i64(t0);
1814#else
1815 TCGv_i64 t0, t1;
1816 t0 = tcg_temp_new_i64();
1817 t1 = tcg_temp_new_i64();
1818 tcg_gen_shli_i64(t0, arg1, arg2);
1819 tcg_gen_shri_i64(t1, arg1, 64 - arg2);
1820 tcg_gen_or_i64(ret, t0, t1);
1821 tcg_temp_free_i64(t0);
1822 tcg_temp_free_i64(t1);
1823#endif
1824 }
1825}
1826
1827static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1828{
1829#ifdef TCG_TARGET_HAS_rot_i32
1830 tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2);
1831#else
1832 TCGv_i32 t0, t1;
1833
1834 t0 = tcg_temp_new_i32();
1835 t1 = tcg_temp_new_i32();
1836 tcg_gen_shr_i32(t0, arg1, arg2);
1837 tcg_gen_subfi_i32(t1, 32, arg2);
1838 tcg_gen_shl_i32(t1, arg1, t1);
1839 tcg_gen_or_i32(ret, t0, t1);
1840 tcg_temp_free_i32(t0);
1841 tcg_temp_free_i32(t1);
1842#endif
1843}
1844
1845static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1846{
1847#ifdef TCG_TARGET_HAS_rot_i64
1848 tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2);
1849#else
1850 TCGv_i64 t0, t1;
1851
1852 t0 = tcg_temp_new_i64();
1853 t1 = tcg_temp_new_i64();
David 'Digit' Turnerddf49e52009-10-05 14:06:05 -07001854 tcg_gen_shr_i64(t0, arg1, arg2);
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001855 tcg_gen_subfi_i64(t1, 64, arg2);
1856 tcg_gen_shl_i64(t1, arg1, t1);
1857 tcg_gen_or_i64(ret, t0, t1);
1858 tcg_temp_free_i64(t0);
1859 tcg_temp_free_i64(t1);
1860#endif
1861}
1862
1863static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1864{
1865 /* some cases can be optimized here */
1866 if (arg2 == 0) {
1867 tcg_gen_mov_i32(ret, arg1);
1868 } else {
1869 tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
1870 }
1871}
1872
1873static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1874{
1875 /* some cases can be optimized here */
1876 if (arg2 == 0) {
1877 tcg_gen_mov_i64(ret, arg1);
1878 } else {
1879 tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
1880 }
1881}
1882
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001883/***************************************/
1884/* QEMU specific operations. Their type depend on the QEMU CPU
1885 type. */
1886#ifndef TARGET_LONG_BITS
1887#error must include QEMU headers
1888#endif
1889
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001890#if TARGET_LONG_BITS == 32
1891#define TCGv TCGv_i32
1892#define tcg_temp_new() tcg_temp_new_i32()
1893#define tcg_global_reg_new tcg_global_reg_new_i32
1894#define tcg_global_mem_new tcg_global_mem_new_i32
1895#define tcg_temp_local_new() tcg_temp_local_new_i32()
1896#define tcg_temp_free tcg_temp_free_i32
1897#define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32
1898#define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32
1899#define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
1900#define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b)
1901#else
1902#define TCGv TCGv_i64
1903#define tcg_temp_new() tcg_temp_new_i64()
1904#define tcg_global_reg_new tcg_global_reg_new_i64
1905#define tcg_global_mem_new tcg_global_mem_new_i64
1906#define tcg_temp_local_new() tcg_temp_local_new_i64()
1907#define tcg_temp_free tcg_temp_free_i64
1908#define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64
1909#define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64
1910#define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
1911#define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b)
1912#endif
1913
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001914/* debug info: write the PC of the corresponding QEMU CPU instruction */
1915static inline void tcg_gen_debug_insn_start(uint64_t pc)
1916{
1917 /* XXX: must really use a 32 bit size for TCGArg in all cases */
1918#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
1919 tcg_gen_op2ii(INDEX_op_debug_insn_start,
1920 (uint32_t)(pc), (uint32_t)(pc >> 32));
1921#else
1922 tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
1923#endif
1924}
1925
1926static inline void tcg_gen_exit_tb(tcg_target_long val)
1927{
1928 tcg_gen_op1i(INDEX_op_exit_tb, val);
1929}
1930
1931static inline void tcg_gen_goto_tb(int idx)
1932{
1933 tcg_gen_op1i(INDEX_op_goto_tb, idx);
1934}
1935
1936#if TCG_TARGET_REG_BITS == 32
1937static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1938{
1939#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001940 tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001941#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001942 tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr),
1943 TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001944 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1945#endif
1946}
1947
1948static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1949{
1950#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001951 tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001952#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001953 tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr),
1954 TCGV_HIGH(addr), mem_index);
1955 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001956#endif
1957}
1958
1959static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1960{
1961#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001962 tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001963#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001964 tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr),
1965 TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001966 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1967#endif
1968}
1969
1970static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1971{
1972#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001973 tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001974#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001975 tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr),
1976 TCGV_HIGH(addr), mem_index);
1977 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001978#endif
1979}
1980
1981static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1982{
1983#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001984 tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001985#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001986 tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
1987 TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001988 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1989#endif
1990}
1991
1992static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
1993{
1994#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001995 tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08001996#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07001997 tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
1998 TCGV_HIGH(addr), mem_index);
1999 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002000#endif
2001}
2002
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002003static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002004{
2005#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002006 tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002007#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002008 tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret),
2009 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002010#endif
2011}
2012
2013static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2014{
2015#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002016 tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002017#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002018 tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr),
2019 TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002020#endif
2021}
2022
2023static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2024{
2025#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002026 tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002027#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002028 tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr),
2029 TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002030#endif
2031}
2032
2033static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2034{
2035#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002036 tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002037#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002038 tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr),
2039 TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002040#endif
2041}
2042
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002043static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002044{
2045#if TARGET_LONG_BITS == 32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002046 tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr,
2047 mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002048#else
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002049 tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg),
2050 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002051#endif
2052}
2053
2054#define tcg_gen_ld_ptr tcg_gen_ld_i32
2055#define tcg_gen_discard_ptr tcg_gen_discard_i32
2056
2057#else /* TCG_TARGET_REG_BITS == 32 */
2058
2059static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2060{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002061 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002062}
2063
2064static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2065{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002066 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002067}
2068
2069static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2070{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002071 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002072}
2073
2074static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2075{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002076 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002077}
2078
2079static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2080{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002081 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002082}
2083
2084static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2085{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002086 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002087}
2088
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002089static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002090{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002091 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002092}
2093
2094static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2095{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002096 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002097}
2098
2099static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2100{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002101 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002102}
2103
2104static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2105{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002106 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002107}
2108
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002109static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002110{
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002111 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index);
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002112}
2113
2114#define tcg_gen_ld_ptr tcg_gen_ld_i64
2115#define tcg_gen_discard_ptr tcg_gen_discard_i64
2116
2117#endif /* TCG_TARGET_REG_BITS != 32 */
2118
2119#if TARGET_LONG_BITS == 64
2120#define TCG_TYPE_TL TCG_TYPE_I64
2121#define tcg_gen_movi_tl tcg_gen_movi_i64
2122#define tcg_gen_mov_tl tcg_gen_mov_i64
2123#define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
2124#define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
2125#define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
2126#define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
2127#define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
2128#define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
2129#define tcg_gen_ld_tl tcg_gen_ld_i64
2130#define tcg_gen_st8_tl tcg_gen_st8_i64
2131#define tcg_gen_st16_tl tcg_gen_st16_i64
2132#define tcg_gen_st32_tl tcg_gen_st32_i64
2133#define tcg_gen_st_tl tcg_gen_st_i64
2134#define tcg_gen_add_tl tcg_gen_add_i64
2135#define tcg_gen_addi_tl tcg_gen_addi_i64
2136#define tcg_gen_sub_tl tcg_gen_sub_i64
2137#define tcg_gen_neg_tl tcg_gen_neg_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002138#define tcg_gen_subfi_tl tcg_gen_subfi_i64
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002139#define tcg_gen_subi_tl tcg_gen_subi_i64
2140#define tcg_gen_and_tl tcg_gen_and_i64
2141#define tcg_gen_andi_tl tcg_gen_andi_i64
2142#define tcg_gen_or_tl tcg_gen_or_i64
2143#define tcg_gen_ori_tl tcg_gen_ori_i64
2144#define tcg_gen_xor_tl tcg_gen_xor_i64
2145#define tcg_gen_xori_tl tcg_gen_xori_i64
2146#define tcg_gen_not_tl tcg_gen_not_i64
2147#define tcg_gen_shl_tl tcg_gen_shl_i64
2148#define tcg_gen_shli_tl tcg_gen_shli_i64
2149#define tcg_gen_shr_tl tcg_gen_shr_i64
2150#define tcg_gen_shri_tl tcg_gen_shri_i64
2151#define tcg_gen_sar_tl tcg_gen_sar_i64
2152#define tcg_gen_sari_tl tcg_gen_sari_i64
2153#define tcg_gen_brcond_tl tcg_gen_brcond_i64
2154#define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07002155#define tcg_gen_setcond_tl tcg_gen_setcond_i64
2156#define tcg_gen_setcondi_tl tcg_gen_setcondi_i64
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002157#define tcg_gen_mul_tl tcg_gen_mul_i64
2158#define tcg_gen_muli_tl tcg_gen_muli_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002159#define tcg_gen_div_tl tcg_gen_div_i64
2160#define tcg_gen_rem_tl tcg_gen_rem_i64
2161#define tcg_gen_divu_tl tcg_gen_divu_i64
2162#define tcg_gen_remu_tl tcg_gen_remu_i64
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002163#define tcg_gen_discard_tl tcg_gen_discard_i64
2164#define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
2165#define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
2166#define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
2167#define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
2168#define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
2169#define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
2170#define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
2171#define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
2172#define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
2173#define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
2174#define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
2175#define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002176#define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
2177#define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
2178#define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
2179#define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
2180#define tcg_gen_andc_tl tcg_gen_andc_i64
2181#define tcg_gen_eqv_tl tcg_gen_eqv_i64
2182#define tcg_gen_nand_tl tcg_gen_nand_i64
2183#define tcg_gen_nor_tl tcg_gen_nor_i64
2184#define tcg_gen_orc_tl tcg_gen_orc_i64
2185#define tcg_gen_rotl_tl tcg_gen_rotl_i64
2186#define tcg_gen_rotli_tl tcg_gen_rotli_i64
2187#define tcg_gen_rotr_tl tcg_gen_rotr_i64
2188#define tcg_gen_rotri_tl tcg_gen_rotri_i64
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002189#define tcg_const_tl tcg_const_i64
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002190#define tcg_const_local_tl tcg_const_local_i64
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002191#else
2192#define TCG_TYPE_TL TCG_TYPE_I32
2193#define tcg_gen_movi_tl tcg_gen_movi_i32
2194#define tcg_gen_mov_tl tcg_gen_mov_i32
2195#define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
2196#define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
2197#define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
2198#define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
2199#define tcg_gen_ld32u_tl tcg_gen_ld_i32
2200#define tcg_gen_ld32s_tl tcg_gen_ld_i32
2201#define tcg_gen_ld_tl tcg_gen_ld_i32
2202#define tcg_gen_st8_tl tcg_gen_st8_i32
2203#define tcg_gen_st16_tl tcg_gen_st16_i32
2204#define tcg_gen_st32_tl tcg_gen_st_i32
2205#define tcg_gen_st_tl tcg_gen_st_i32
2206#define tcg_gen_add_tl tcg_gen_add_i32
2207#define tcg_gen_addi_tl tcg_gen_addi_i32
2208#define tcg_gen_sub_tl tcg_gen_sub_i32
2209#define tcg_gen_neg_tl tcg_gen_neg_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002210#define tcg_gen_subfi_tl tcg_gen_subfi_i32
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002211#define tcg_gen_subi_tl tcg_gen_subi_i32
2212#define tcg_gen_and_tl tcg_gen_and_i32
2213#define tcg_gen_andi_tl tcg_gen_andi_i32
2214#define tcg_gen_or_tl tcg_gen_or_i32
2215#define tcg_gen_ori_tl tcg_gen_ori_i32
2216#define tcg_gen_xor_tl tcg_gen_xor_i32
2217#define tcg_gen_xori_tl tcg_gen_xori_i32
2218#define tcg_gen_not_tl tcg_gen_not_i32
2219#define tcg_gen_shl_tl tcg_gen_shl_i32
2220#define tcg_gen_shli_tl tcg_gen_shli_i32
2221#define tcg_gen_shr_tl tcg_gen_shr_i32
2222#define tcg_gen_shri_tl tcg_gen_shri_i32
2223#define tcg_gen_sar_tl tcg_gen_sar_i32
2224#define tcg_gen_sari_tl tcg_gen_sari_i32
2225#define tcg_gen_brcond_tl tcg_gen_brcond_i32
2226#define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
David 'Digit' Turnerb9317722010-05-10 18:53:56 -07002227#define tcg_gen_setcond_tl tcg_gen_setcond_i32
2228#define tcg_gen_setcondi_tl tcg_gen_setcondi_i32
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002229#define tcg_gen_mul_tl tcg_gen_mul_i32
2230#define tcg_gen_muli_tl tcg_gen_muli_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002231#define tcg_gen_div_tl tcg_gen_div_i32
2232#define tcg_gen_rem_tl tcg_gen_rem_i32
2233#define tcg_gen_divu_tl tcg_gen_divu_i32
2234#define tcg_gen_remu_tl tcg_gen_remu_i32
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002235#define tcg_gen_discard_tl tcg_gen_discard_i32
2236#define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2237#define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2238#define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2239#define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2240#define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2241#define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2242#define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2243#define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2244#define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2245#define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2246#define tcg_gen_ext32u_tl tcg_gen_mov_i32
2247#define tcg_gen_ext32s_tl tcg_gen_mov_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002248#define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
2249#define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
2250#define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2251#define tcg_gen_andc_tl tcg_gen_andc_i32
2252#define tcg_gen_eqv_tl tcg_gen_eqv_i32
2253#define tcg_gen_nand_tl tcg_gen_nand_i32
2254#define tcg_gen_nor_tl tcg_gen_nor_i32
2255#define tcg_gen_orc_tl tcg_gen_orc_i32
2256#define tcg_gen_rotl_tl tcg_gen_rotl_i32
2257#define tcg_gen_rotli_tl tcg_gen_rotli_i32
2258#define tcg_gen_rotr_tl tcg_gen_rotr_i32
2259#define tcg_gen_rotri_tl tcg_gen_rotri_i32
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002260#define tcg_const_tl tcg_const_i32
David 'Digit' Turner5d8f37a2009-09-14 14:32:27 -07002261#define tcg_const_local_tl tcg_const_local_i32
The Android Open Source Project8b23a6c2009-03-03 19:30:32 -08002262#endif
2263
2264#if TCG_TARGET_REG_BITS == 32
2265#define tcg_gen_add_ptr tcg_gen_add_i32
2266#define tcg_gen_addi_ptr tcg_gen_addi_i32
2267#define tcg_gen_ext_i32_ptr tcg_gen_mov_i32
2268#else /* TCG_TARGET_REG_BITS == 32 */
2269#define tcg_gen_add_ptr tcg_gen_add_i64
2270#define tcg_gen_addi_ptr tcg_gen_addi_i64
2271#define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64
2272#endif /* TCG_TARGET_REG_BITS != 32 */