configure: remove variable bogus_os
[qemu/ar7.git] / tcg / sparc / tcg-target.c.inc
blob6775bd30fc9fba63800ed9aac9e71dddc8154f70
1 /*
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  */
25 #include "../tcg-pool.c.inc"
27 #ifdef CONFIG_DEBUG_TCG
28 static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
29     "%g0",
30     "%g1",
31     "%g2",
32     "%g3",
33     "%g4",
34     "%g5",
35     "%g6",
36     "%g7",
37     "%o0",
38     "%o1",
39     "%o2",
40     "%o3",
41     "%o4",
42     "%o5",
43     "%o6",
44     "%o7",
45     "%l0",
46     "%l1",
47     "%l2",
48     "%l3",
49     "%l4",
50     "%l5",
51     "%l6",
52     "%l7",
53     "%i0",
54     "%i1",
55     "%i2",
56     "%i3",
57     "%i4",
58     "%i5",
59     "%i6",
60     "%i7",
62 #endif
64 #ifdef __arch64__
65 # define SPARC64 1
66 #else
67 # define SPARC64 0
68 #endif
70 /* Note that sparcv8plus can only hold 64 bit quantities in %g and %o
71    registers.  These are saved manually by the kernel in full 64-bit
72    slots.  The %i and %l registers are saved by the register window
73    mechanism, which only allocates space for 32 bits.  Given that this
74    window spill/fill can happen on any signal, we must consider the
75    high bits of the %i and %l registers garbage at all times.  */
76 #if SPARC64
77 # define ALL_64  0xffffffffu
78 #else
79 # define ALL_64  0xffffu
80 #endif
82 /* Define some temporary registers.  T2 is used for constant generation.  */
83 #define TCG_REG_T1  TCG_REG_G1
84 #define TCG_REG_T2  TCG_REG_O7
86 #ifndef CONFIG_SOFTMMU
87 # define TCG_GUEST_BASE_REG TCG_REG_I5
88 #endif
90 #define TCG_REG_TB  TCG_REG_I1
91 #define USE_REG_TB  (sizeof(void *) > 4)
93 static const int tcg_target_reg_alloc_order[] = {
94     TCG_REG_L0,
95     TCG_REG_L1,
96     TCG_REG_L2,
97     TCG_REG_L3,
98     TCG_REG_L4,
99     TCG_REG_L5,
100     TCG_REG_L6,
101     TCG_REG_L7,
103     TCG_REG_I0,
104     TCG_REG_I1,
105     TCG_REG_I2,
106     TCG_REG_I3,
107     TCG_REG_I4,
108     TCG_REG_I5,
110     TCG_REG_G2,
111     TCG_REG_G3,
112     TCG_REG_G4,
113     TCG_REG_G5,
115     TCG_REG_O0,
116     TCG_REG_O1,
117     TCG_REG_O2,
118     TCG_REG_O3,
119     TCG_REG_O4,
120     TCG_REG_O5,
123 static const int tcg_target_call_iarg_regs[6] = {
124     TCG_REG_O0,
125     TCG_REG_O1,
126     TCG_REG_O2,
127     TCG_REG_O3,
128     TCG_REG_O4,
129     TCG_REG_O5,
132 static const int tcg_target_call_oarg_regs[] = {
133     TCG_REG_O0,
134     TCG_REG_O1,
135     TCG_REG_O2,
136     TCG_REG_O3,
139 #define INSN_OP(x)  ((x) << 30)
140 #define INSN_OP2(x) ((x) << 22)
141 #define INSN_OP3(x) ((x) << 19)
142 #define INSN_OPF(x) ((x) << 5)
143 #define INSN_RD(x)  ((x) << 25)
144 #define INSN_RS1(x) ((x) << 14)
145 #define INSN_RS2(x) (x)
146 #define INSN_ASI(x) ((x) << 5)
148 #define INSN_IMM10(x) ((1 << 13) | ((x) & 0x3ff))
149 #define INSN_IMM11(x) ((1 << 13) | ((x) & 0x7ff))
150 #define INSN_IMM13(x) ((1 << 13) | ((x) & 0x1fff))
151 #define INSN_OFF16(x) ((((x) >> 2) & 0x3fff) | ((((x) >> 16) & 3) << 20))
152 #define INSN_OFF19(x) (((x) >> 2) & 0x07ffff)
153 #define INSN_COND(x) ((x) << 25)
155 #define COND_N     0x0
156 #define COND_E     0x1
157 #define COND_LE    0x2
158 #define COND_L     0x3
159 #define COND_LEU   0x4
160 #define COND_CS    0x5
161 #define COND_NEG   0x6
162 #define COND_VS    0x7
163 #define COND_A     0x8
164 #define COND_NE    0x9
165 #define COND_G     0xa
166 #define COND_GE    0xb
167 #define COND_GU    0xc
168 #define COND_CC    0xd
169 #define COND_POS   0xe
170 #define COND_VC    0xf
171 #define BA         (INSN_OP(0) | INSN_COND(COND_A) | INSN_OP2(0x2))
173 #define RCOND_Z    1
174 #define RCOND_LEZ  2
175 #define RCOND_LZ   3
176 #define RCOND_NZ   5
177 #define RCOND_GZ   6
178 #define RCOND_GEZ  7
180 #define MOVCC_ICC  (1 << 18)
181 #define MOVCC_XCC  (1 << 18 | 1 << 12)
183 #define BPCC_ICC   0
184 #define BPCC_XCC   (2 << 20)
185 #define BPCC_PT    (1 << 19)
186 #define BPCC_PN    0
187 #define BPCC_A     (1 << 29)
189 #define BPR_PT     BPCC_PT
191 #define ARITH_ADD  (INSN_OP(2) | INSN_OP3(0x00))
192 #define ARITH_ADDCC (INSN_OP(2) | INSN_OP3(0x10))
193 #define ARITH_AND  (INSN_OP(2) | INSN_OP3(0x01))
194 #define ARITH_ANDN (INSN_OP(2) | INSN_OP3(0x05))
195 #define ARITH_OR   (INSN_OP(2) | INSN_OP3(0x02))
196 #define ARITH_ORCC (INSN_OP(2) | INSN_OP3(0x12))
197 #define ARITH_ORN  (INSN_OP(2) | INSN_OP3(0x06))
198 #define ARITH_XOR  (INSN_OP(2) | INSN_OP3(0x03))
199 #define ARITH_SUB  (INSN_OP(2) | INSN_OP3(0x04))
200 #define ARITH_SUBCC (INSN_OP(2) | INSN_OP3(0x14))
201 #define ARITH_ADDC (INSN_OP(2) | INSN_OP3(0x08))
202 #define ARITH_SUBC (INSN_OP(2) | INSN_OP3(0x0c))
203 #define ARITH_UMUL (INSN_OP(2) | INSN_OP3(0x0a))
204 #define ARITH_SMUL (INSN_OP(2) | INSN_OP3(0x0b))
205 #define ARITH_UDIV (INSN_OP(2) | INSN_OP3(0x0e))
206 #define ARITH_SDIV (INSN_OP(2) | INSN_OP3(0x0f))
207 #define ARITH_MULX (INSN_OP(2) | INSN_OP3(0x09))
208 #define ARITH_UDIVX (INSN_OP(2) | INSN_OP3(0x0d))
209 #define ARITH_SDIVX (INSN_OP(2) | INSN_OP3(0x2d))
210 #define ARITH_MOVCC (INSN_OP(2) | INSN_OP3(0x2c))
211 #define ARITH_MOVR (INSN_OP(2) | INSN_OP3(0x2f))
213 #define ARITH_ADDXC (INSN_OP(2) | INSN_OP3(0x36) | INSN_OPF(0x11))
214 #define ARITH_UMULXHI (INSN_OP(2) | INSN_OP3(0x36) | INSN_OPF(0x16))
216 #define SHIFT_SLL  (INSN_OP(2) | INSN_OP3(0x25))
217 #define SHIFT_SRL  (INSN_OP(2) | INSN_OP3(0x26))
218 #define SHIFT_SRA  (INSN_OP(2) | INSN_OP3(0x27))
220 #define SHIFT_SLLX (INSN_OP(2) | INSN_OP3(0x25) | (1 << 12))
221 #define SHIFT_SRLX (INSN_OP(2) | INSN_OP3(0x26) | (1 << 12))
222 #define SHIFT_SRAX (INSN_OP(2) | INSN_OP3(0x27) | (1 << 12))
224 #define RDY        (INSN_OP(2) | INSN_OP3(0x28) | INSN_RS1(0))
225 #define WRY        (INSN_OP(2) | INSN_OP3(0x30) | INSN_RD(0))
226 #define JMPL       (INSN_OP(2) | INSN_OP3(0x38))
227 #define RETURN     (INSN_OP(2) | INSN_OP3(0x39))
228 #define SAVE       (INSN_OP(2) | INSN_OP3(0x3c))
229 #define RESTORE    (INSN_OP(2) | INSN_OP3(0x3d))
230 #define SETHI      (INSN_OP(0) | INSN_OP2(0x4))
231 #define CALL       INSN_OP(1)
232 #define LDUB       (INSN_OP(3) | INSN_OP3(0x01))
233 #define LDSB       (INSN_OP(3) | INSN_OP3(0x09))
234 #define LDUH       (INSN_OP(3) | INSN_OP3(0x02))
235 #define LDSH       (INSN_OP(3) | INSN_OP3(0x0a))
236 #define LDUW       (INSN_OP(3) | INSN_OP3(0x00))
237 #define LDSW       (INSN_OP(3) | INSN_OP3(0x08))
238 #define LDX        (INSN_OP(3) | INSN_OP3(0x0b))
239 #define STB        (INSN_OP(3) | INSN_OP3(0x05))
240 #define STH        (INSN_OP(3) | INSN_OP3(0x06))
241 #define STW        (INSN_OP(3) | INSN_OP3(0x04))
242 #define STX        (INSN_OP(3) | INSN_OP3(0x0e))
243 #define LDUBA      (INSN_OP(3) | INSN_OP3(0x11))
244 #define LDSBA      (INSN_OP(3) | INSN_OP3(0x19))
245 #define LDUHA      (INSN_OP(3) | INSN_OP3(0x12))
246 #define LDSHA      (INSN_OP(3) | INSN_OP3(0x1a))
247 #define LDUWA      (INSN_OP(3) | INSN_OP3(0x10))
248 #define LDSWA      (INSN_OP(3) | INSN_OP3(0x18))
249 #define LDXA       (INSN_OP(3) | INSN_OP3(0x1b))
250 #define STBA       (INSN_OP(3) | INSN_OP3(0x15))
251 #define STHA       (INSN_OP(3) | INSN_OP3(0x16))
252 #define STWA       (INSN_OP(3) | INSN_OP3(0x14))
253 #define STXA       (INSN_OP(3) | INSN_OP3(0x1e))
255 #define MEMBAR     (INSN_OP(2) | INSN_OP3(0x28) | INSN_RS1(15) | (1 << 13))
257 #define NOP        (SETHI | INSN_RD(TCG_REG_G0) | 0)
259 #ifndef ASI_PRIMARY_LITTLE
260 #define ASI_PRIMARY_LITTLE 0x88
261 #endif
263 #define LDUH_LE    (LDUHA | INSN_ASI(ASI_PRIMARY_LITTLE))
264 #define LDSH_LE    (LDSHA | INSN_ASI(ASI_PRIMARY_LITTLE))
265 #define LDUW_LE    (LDUWA | INSN_ASI(ASI_PRIMARY_LITTLE))
266 #define LDSW_LE    (LDSWA | INSN_ASI(ASI_PRIMARY_LITTLE))
267 #define LDX_LE     (LDXA  | INSN_ASI(ASI_PRIMARY_LITTLE))
269 #define STH_LE     (STHA  | INSN_ASI(ASI_PRIMARY_LITTLE))
270 #define STW_LE     (STWA  | INSN_ASI(ASI_PRIMARY_LITTLE))
271 #define STX_LE     (STXA  | INSN_ASI(ASI_PRIMARY_LITTLE))
273 #ifndef use_vis3_instructions
274 bool use_vis3_instructions;
275 #endif
277 static inline int check_fit_i64(int64_t val, unsigned int bits)
279     return val == sextract64(val, 0, bits);
282 static inline int check_fit_i32(int32_t val, unsigned int bits)
284     return val == sextract32(val, 0, bits);
287 #define check_fit_tl    check_fit_i64
288 #if SPARC64
289 # define check_fit_ptr  check_fit_i64
290 #else
291 # define check_fit_ptr  check_fit_i32
292 #endif
294 static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
295                         intptr_t value, intptr_t addend)
297     uint32_t insn = *code_ptr;
298     intptr_t pcrel;
300     value += addend;
301     pcrel = tcg_ptr_byte_diff((tcg_insn_unit *)value, code_ptr);
303     switch (type) {
304     case R_SPARC_WDISP16:
305         assert(check_fit_ptr(pcrel >> 2, 16));
306         insn &= ~INSN_OFF16(-1);
307         insn |= INSN_OFF16(pcrel);
308         break;
309     case R_SPARC_WDISP19:
310         assert(check_fit_ptr(pcrel >> 2, 19));
311         insn &= ~INSN_OFF19(-1);
312         insn |= INSN_OFF19(pcrel);
313         break;
314     default:
315         g_assert_not_reached();
316     }
318     *code_ptr = insn;
319     return true;
322 /* parse target specific constraints */
323 static const char *target_parse_constraint(TCGArgConstraint *ct,
324                                            const char *ct_str, TCGType type)
326     switch (*ct_str++) {
327     case 'r':
328         ct->regs = 0xffffffff;
329         break;
330     case 'R':
331         ct->regs = ALL_64;
332         break;
333     case 'A': /* qemu_ld/st address constraint */
334         ct->regs = TARGET_LONG_BITS == 64 ? ALL_64 : 0xffffffff;
335     reserve_helpers:
336         tcg_regset_reset_reg(ct->regs, TCG_REG_O0);
337         tcg_regset_reset_reg(ct->regs, TCG_REG_O1);
338         tcg_regset_reset_reg(ct->regs, TCG_REG_O2);
339         break;
340     case 's': /* qemu_st data 32-bit constraint */
341         ct->regs = 0xffffffff;
342         goto reserve_helpers;
343     case 'S': /* qemu_st data 64-bit constraint */
344         ct->regs = ALL_64;
345         goto reserve_helpers;
346     case 'I':
347         ct->ct |= TCG_CT_CONST_S11;
348         break;
349     case 'J':
350         ct->ct |= TCG_CT_CONST_S13;
351         break;
352     case 'Z':
353         ct->ct |= TCG_CT_CONST_ZERO;
354         break;
355     default:
356         return NULL;
357     }
358     return ct_str;
361 /* test if a constant matches the constraint */
362 static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
363                                          const TCGArgConstraint *arg_ct)
365     int ct = arg_ct->ct;
367     if (ct & TCG_CT_CONST) {
368         return 1;
369     }
371     if (type == TCG_TYPE_I32) {
372         val = (int32_t)val;
373     }
375     if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
376         return 1;
377     } else if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11)) {
378         return 1;
379     } else if ((ct & TCG_CT_CONST_S13) && check_fit_tl(val, 13)) {
380         return 1;
381     } else {
382         return 0;
383     }
386 static inline void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1,
387                                  TCGReg rs2, int op)
389     tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | INSN_RS2(rs2));
392 static inline void tcg_out_arithi(TCGContext *s, TCGReg rd, TCGReg rs1,
393                                   int32_t offset, int op)
395     tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | INSN_IMM13(offset));
398 static void tcg_out_arithc(TCGContext *s, TCGReg rd, TCGReg rs1,
399                            int32_t val2, int val2const, int op)
401     tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1)
402               | (val2const ? INSN_IMM13(val2) : INSN_RS2(val2)));
405 static inline bool tcg_out_mov(TCGContext *s, TCGType type,
406                                TCGReg ret, TCGReg arg)
408     if (ret != arg) {
409         tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR);
410     }
411     return true;
414 static inline void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg)
416     tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10));
419 static inline void tcg_out_movi_imm13(TCGContext *s, TCGReg ret, int32_t arg)
421     tcg_out_arithi(s, ret, TCG_REG_G0, arg, ARITH_OR);
424 static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
425                              tcg_target_long arg, bool in_prologue)
427     tcg_target_long hi, lo = (int32_t)arg;
428     tcg_target_long test, lsb;
430     /* Make sure we test 32-bit constants for imm13 properly.  */
431     if (type == TCG_TYPE_I32) {
432         arg = lo;
433     }
435     /* A 13-bit constant sign-extended to 64-bits.  */
436     if (check_fit_tl(arg, 13)) {
437         tcg_out_movi_imm13(s, ret, arg);
438         return;
439     }
441     /* A 13-bit constant relative to the TB.  */
442     if (!in_prologue && USE_REG_TB) {
443         test = arg - (uintptr_t)s->code_gen_ptr;
444         if (check_fit_ptr(test, 13)) {
445             tcg_out_arithi(s, ret, TCG_REG_TB, test, ARITH_ADD);
446             return;
447         }
448     }
450     /* A 32-bit constant, or 32-bit zero-extended to 64-bits.  */
451     if (type == TCG_TYPE_I32 || arg == (uint32_t)arg) {
452         tcg_out_sethi(s, ret, arg);
453         if (arg & 0x3ff) {
454             tcg_out_arithi(s, ret, ret, arg & 0x3ff, ARITH_OR);
455         }
456         return;
457     }
459     /* A 32-bit constant sign-extended to 64-bits.  */
460     if (arg == lo) {
461         tcg_out_sethi(s, ret, ~arg);
462         tcg_out_arithi(s, ret, ret, (arg & 0x3ff) | -0x400, ARITH_XOR);
463         return;
464     }
466     /* A 21-bit constant, shifted.  */
467     lsb = ctz64(arg);
468     test = (tcg_target_long)arg >> lsb;
469     if (check_fit_tl(test, 13)) {
470         tcg_out_movi_imm13(s, ret, test);
471         tcg_out_arithi(s, ret, ret, lsb, SHIFT_SLLX);
472         return;
473     } else if (lsb > 10 && test == extract64(test, 0, 21)) {
474         tcg_out_sethi(s, ret, test << 10);
475         tcg_out_arithi(s, ret, ret, lsb - 10, SHIFT_SLLX);
476         return;
477     }
479     /* A 64-bit constant decomposed into 2 32-bit pieces.  */
480     if (check_fit_i32(lo, 13)) {
481         hi = (arg - lo) >> 32;
482         tcg_out_movi(s, TCG_TYPE_I32, ret, hi);
483         tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX);
484         tcg_out_arithi(s, ret, ret, lo, ARITH_ADD);
485     } else {
486         hi = arg >> 32;
487         tcg_out_movi(s, TCG_TYPE_I32, ret, hi);
488         tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_T2, lo);
489         tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX);
490         tcg_out_arith(s, ret, ret, TCG_REG_T2, ARITH_OR);
491     }
494 static inline void tcg_out_movi(TCGContext *s, TCGType type,
495                                 TCGReg ret, tcg_target_long arg)
497     tcg_out_movi_int(s, type, ret, arg, false);
500 static inline void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1,
501                                    TCGReg a2, int op)
503     tcg_out32(s, op | INSN_RD(data) | INSN_RS1(a1) | INSN_RS2(a2));
506 static void tcg_out_ldst(TCGContext *s, TCGReg ret, TCGReg addr,
507                          intptr_t offset, int op)
509     if (check_fit_ptr(offset, 13)) {
510         tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(addr) |
511                   INSN_IMM13(offset));
512     } else {
513         tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, offset);
514         tcg_out_ldst_rr(s, ret, addr, TCG_REG_T1, op);
515     }
518 static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret,
519                               TCGReg arg1, intptr_t arg2)
521     tcg_out_ldst(s, ret, arg1, arg2, (type == TCG_TYPE_I32 ? LDUW : LDX));
524 static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg,
525                               TCGReg arg1, intptr_t arg2)
527     tcg_out_ldst(s, arg, arg1, arg2, (type == TCG_TYPE_I32 ? STW : STX));
530 static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
531                                TCGReg base, intptr_t ofs)
533     if (val == 0) {
534         tcg_out_st(s, type, TCG_REG_G0, base, ofs);
535         return true;
536     }
537     return false;
540 static void tcg_out_ld_ptr(TCGContext *s, TCGReg ret, uintptr_t arg)
542     intptr_t diff = arg - (uintptr_t)s->code_gen_ptr;
543     if (USE_REG_TB && check_fit_ptr(diff, 13)) {
544         tcg_out_ld(s, TCG_TYPE_PTR, ret, TCG_REG_TB, diff);
545         return;
546     }
547     tcg_out_movi(s, TCG_TYPE_PTR, ret, arg & ~0x3ff);
548     tcg_out_ld(s, TCG_TYPE_PTR, ret, ret, arg & 0x3ff);
551 static inline void tcg_out_sety(TCGContext *s, TCGReg rs)
553     tcg_out32(s, WRY | INSN_RS1(TCG_REG_G0) | INSN_RS2(rs));
556 static inline void tcg_out_rdy(TCGContext *s, TCGReg rd)
558     tcg_out32(s, RDY | INSN_RD(rd));
561 static void tcg_out_div32(TCGContext *s, TCGReg rd, TCGReg rs1,
562                           int32_t val2, int val2const, int uns)
564     /* Load Y with the sign/zero extension of RS1 to 64-bits.  */
565     if (uns) {
566         tcg_out_sety(s, TCG_REG_G0);
567     } else {
568         tcg_out_arithi(s, TCG_REG_T1, rs1, 31, SHIFT_SRA);
569         tcg_out_sety(s, TCG_REG_T1);
570     }
572     tcg_out_arithc(s, rd, rs1, val2, val2const,
573                    uns ? ARITH_UDIV : ARITH_SDIV);
576 static inline void tcg_out_nop(TCGContext *s)
578     tcg_out32(s, NOP);
581 static const uint8_t tcg_cond_to_bcond[] = {
582     [TCG_COND_EQ] = COND_E,
583     [TCG_COND_NE] = COND_NE,
584     [TCG_COND_LT] = COND_L,
585     [TCG_COND_GE] = COND_GE,
586     [TCG_COND_LE] = COND_LE,
587     [TCG_COND_GT] = COND_G,
588     [TCG_COND_LTU] = COND_CS,
589     [TCG_COND_GEU] = COND_CC,
590     [TCG_COND_LEU] = COND_LEU,
591     [TCG_COND_GTU] = COND_GU,
594 static const uint8_t tcg_cond_to_rcond[] = {
595     [TCG_COND_EQ] = RCOND_Z,
596     [TCG_COND_NE] = RCOND_NZ,
597     [TCG_COND_LT] = RCOND_LZ,
598     [TCG_COND_GT] = RCOND_GZ,
599     [TCG_COND_LE] = RCOND_LEZ,
600     [TCG_COND_GE] = RCOND_GEZ
603 static void tcg_out_bpcc0(TCGContext *s, int scond, int flags, int off19)
605     tcg_out32(s, INSN_OP(0) | INSN_OP2(1) | INSN_COND(scond) | flags | off19);
608 static void tcg_out_bpcc(TCGContext *s, int scond, int flags, TCGLabel *l)
610     int off19 = 0;
612     if (l->has_value) {
613         off19 = INSN_OFF19(tcg_pcrel_diff(s, l->u.value_ptr));
614     } else {
615         tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP19, l, 0);
616     }
617     tcg_out_bpcc0(s, scond, flags, off19);
620 static void tcg_out_cmp(TCGContext *s, TCGReg c1, int32_t c2, int c2const)
622     tcg_out_arithc(s, TCG_REG_G0, c1, c2, c2const, ARITH_SUBCC);
625 static void tcg_out_brcond_i32(TCGContext *s, TCGCond cond, TCGReg arg1,
626                                int32_t arg2, int const_arg2, TCGLabel *l)
628     tcg_out_cmp(s, arg1, arg2, const_arg2);
629     tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_ICC | BPCC_PT, l);
630     tcg_out_nop(s);
633 static void tcg_out_movcc(TCGContext *s, TCGCond cond, int cc, TCGReg ret,
634                           int32_t v1, int v1const)
636     tcg_out32(s, ARITH_MOVCC | cc | INSN_RD(ret)
637               | INSN_RS1(tcg_cond_to_bcond[cond])
638               | (v1const ? INSN_IMM11(v1) : INSN_RS2(v1)));
641 static void tcg_out_movcond_i32(TCGContext *s, TCGCond cond, TCGReg ret,
642                                 TCGReg c1, int32_t c2, int c2const,
643                                 int32_t v1, int v1const)
645     tcg_out_cmp(s, c1, c2, c2const);
646     tcg_out_movcc(s, cond, MOVCC_ICC, ret, v1, v1const);
649 static void tcg_out_brcond_i64(TCGContext *s, TCGCond cond, TCGReg arg1,
650                                int32_t arg2, int const_arg2, TCGLabel *l)
652     /* For 64-bit signed comparisons vs zero, we can avoid the compare.  */
653     if (arg2 == 0 && !is_unsigned_cond(cond)) {
654         int off16 = 0;
656         if (l->has_value) {
657             off16 = INSN_OFF16(tcg_pcrel_diff(s, l->u.value_ptr));
658         } else {
659             tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP16, l, 0);
660         }
661         tcg_out32(s, INSN_OP(0) | INSN_OP2(3) | BPR_PT | INSN_RS1(arg1)
662                   | INSN_COND(tcg_cond_to_rcond[cond]) | off16);
663     } else {
664         tcg_out_cmp(s, arg1, arg2, const_arg2);
665         tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_XCC | BPCC_PT, l);
666     }
667     tcg_out_nop(s);
670 static void tcg_out_movr(TCGContext *s, TCGCond cond, TCGReg ret, TCGReg c1,
671                          int32_t v1, int v1const)
673     tcg_out32(s, ARITH_MOVR | INSN_RD(ret) | INSN_RS1(c1)
674               | (tcg_cond_to_rcond[cond] << 10)
675               | (v1const ? INSN_IMM10(v1) : INSN_RS2(v1)));
678 static void tcg_out_movcond_i64(TCGContext *s, TCGCond cond, TCGReg ret,
679                                 TCGReg c1, int32_t c2, int c2const,
680                                 int32_t v1, int v1const)
682     /* For 64-bit signed comparisons vs zero, we can avoid the compare.
683        Note that the immediate range is one bit smaller, so we must check
684        for that as well.  */
685     if (c2 == 0 && !is_unsigned_cond(cond)
686         && (!v1const || check_fit_i32(v1, 10))) {
687         tcg_out_movr(s, cond, ret, c1, v1, v1const);
688     } else {
689         tcg_out_cmp(s, c1, c2, c2const);
690         tcg_out_movcc(s, cond, MOVCC_XCC, ret, v1, v1const);
691     }
694 static void tcg_out_setcond_i32(TCGContext *s, TCGCond cond, TCGReg ret,
695                                 TCGReg c1, int32_t c2, int c2const)
697     /* For 32-bit comparisons, we can play games with ADDC/SUBC.  */
698     switch (cond) {
699     case TCG_COND_LTU:
700     case TCG_COND_GEU:
701         /* The result of the comparison is in the carry bit.  */
702         break;
704     case TCG_COND_EQ:
705     case TCG_COND_NE:
706         /* For equality, we can transform to inequality vs zero.  */
707         if (c2 != 0) {
708             tcg_out_arithc(s, TCG_REG_T1, c1, c2, c2const, ARITH_XOR);
709             c2 = TCG_REG_T1;
710         } else {
711             c2 = c1;
712         }
713         c1 = TCG_REG_G0, c2const = 0;
714         cond = (cond == TCG_COND_EQ ? TCG_COND_GEU : TCG_COND_LTU);
715         break;
717     case TCG_COND_GTU:
718     case TCG_COND_LEU:
719         /* If we don't need to load a constant into a register, we can
720            swap the operands on GTU/LEU.  There's no benefit to loading
721            the constant into a temporary register.  */
722         if (!c2const || c2 == 0) {
723             TCGReg t = c1;
724             c1 = c2;
725             c2 = t;
726             c2const = 0;
727             cond = tcg_swap_cond(cond);
728             break;
729         }
730         /* FALLTHRU */
732     default:
733         tcg_out_cmp(s, c1, c2, c2const);
734         tcg_out_movi_imm13(s, ret, 0);
735         tcg_out_movcc(s, cond, MOVCC_ICC, ret, 1, 1);
736         return;
737     }
739     tcg_out_cmp(s, c1, c2, c2const);
740     if (cond == TCG_COND_LTU) {
741         tcg_out_arithi(s, ret, TCG_REG_G0, 0, ARITH_ADDC);
742     } else {
743         tcg_out_arithi(s, ret, TCG_REG_G0, -1, ARITH_SUBC);
744     }
747 static void tcg_out_setcond_i64(TCGContext *s, TCGCond cond, TCGReg ret,
748                                 TCGReg c1, int32_t c2, int c2const)
750     if (use_vis3_instructions) {
751         switch (cond) {
752         case TCG_COND_NE:
753             if (c2 != 0) {
754                 break;
755             }
756             c2 = c1, c2const = 0, c1 = TCG_REG_G0;
757             /* FALLTHRU */
758         case TCG_COND_LTU:
759             tcg_out_cmp(s, c1, c2, c2const);
760             tcg_out_arith(s, ret, TCG_REG_G0, TCG_REG_G0, ARITH_ADDXC);
761             return;
762         default:
763             break;
764         }
765     }
767     /* For 64-bit signed comparisons vs zero, we can avoid the compare
768        if the input does not overlap the output.  */
769     if (c2 == 0 && !is_unsigned_cond(cond) && c1 != ret) {
770         tcg_out_movi_imm13(s, ret, 0);
771         tcg_out_movr(s, cond, ret, c1, 1, 1);
772     } else {
773         tcg_out_cmp(s, c1, c2, c2const);
774         tcg_out_movi_imm13(s, ret, 0);
775         tcg_out_movcc(s, cond, MOVCC_XCC, ret, 1, 1);
776     }
779 static void tcg_out_addsub2_i32(TCGContext *s, TCGReg rl, TCGReg rh,
780                                 TCGReg al, TCGReg ah, int32_t bl, int blconst,
781                                 int32_t bh, int bhconst, int opl, int oph)
783     TCGReg tmp = TCG_REG_T1;
785     /* Note that the low parts are fully consumed before tmp is set.  */
786     if (rl != ah && (bhconst || rl != bh)) {
787         tmp = rl;
788     }
790     tcg_out_arithc(s, tmp, al, bl, blconst, opl);
791     tcg_out_arithc(s, rh, ah, bh, bhconst, oph);
792     tcg_out_mov(s, TCG_TYPE_I32, rl, tmp);
795 static void tcg_out_addsub2_i64(TCGContext *s, TCGReg rl, TCGReg rh,
796                                 TCGReg al, TCGReg ah, int32_t bl, int blconst,
797                                 int32_t bh, int bhconst, bool is_sub)
799     TCGReg tmp = TCG_REG_T1;
801     /* Note that the low parts are fully consumed before tmp is set.  */
802     if (rl != ah && (bhconst || rl != bh)) {
803         tmp = rl;
804     }
806     tcg_out_arithc(s, tmp, al, bl, blconst, is_sub ? ARITH_SUBCC : ARITH_ADDCC);
808     if (use_vis3_instructions && !is_sub) {
809         /* Note that ADDXC doesn't accept immediates.  */
810         if (bhconst && bh != 0) {
811            tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_T2, bh);
812            bh = TCG_REG_T2;
813         }
814         tcg_out_arith(s, rh, ah, bh, ARITH_ADDXC);
815     } else if (bh == TCG_REG_G0) {
816         /* If we have a zero, we can perform the operation in two insns,
817            with the arithmetic first, and a conditional move into place.  */
818         if (rh == ah) {
819             tcg_out_arithi(s, TCG_REG_T2, ah, 1,
820                            is_sub ? ARITH_SUB : ARITH_ADD);
821             tcg_out_movcc(s, TCG_COND_LTU, MOVCC_XCC, rh, TCG_REG_T2, 0);
822         } else {
823             tcg_out_arithi(s, rh, ah, 1, is_sub ? ARITH_SUB : ARITH_ADD);
824             tcg_out_movcc(s, TCG_COND_GEU, MOVCC_XCC, rh, ah, 0);
825         }
826     } else {
827         /* Otherwise adjust BH as if there is carry into T2 ... */
828         if (bhconst) {
829             tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_T2, bh + (is_sub ? -1 : 1));
830         } else {
831             tcg_out_arithi(s, TCG_REG_T2, bh, 1,
832                            is_sub ? ARITH_SUB : ARITH_ADD);
833         }
834         /* ... smoosh T2 back to original BH if carry is clear ... */
835         tcg_out_movcc(s, TCG_COND_GEU, MOVCC_XCC, TCG_REG_T2, bh, bhconst);
836         /* ... and finally perform the arithmetic with the new operand.  */
837         tcg_out_arith(s, rh, ah, TCG_REG_T2, is_sub ? ARITH_SUB : ARITH_ADD);
838     }
840     tcg_out_mov(s, TCG_TYPE_I64, rl, tmp);
843 static void tcg_out_call_nodelay(TCGContext *s, tcg_insn_unit *dest,
844                                  bool in_prologue)
846     ptrdiff_t disp = tcg_pcrel_diff(s, dest);
848     if (disp == (int32_t)disp) {
849         tcg_out32(s, CALL | (uint32_t)disp >> 2);
850     } else {
851         uintptr_t desti = (uintptr_t)dest;
852         tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_REG_T1,
853                          desti & ~0xfff, in_prologue);
854         tcg_out_arithi(s, TCG_REG_O7, TCG_REG_T1, desti & 0xfff, JMPL);
855     }
858 static void tcg_out_call(TCGContext *s, tcg_insn_unit *dest)
860     tcg_out_call_nodelay(s, dest, false);
861     tcg_out_nop(s);
864 static void tcg_out_mb(TCGContext *s, TCGArg a0)
866     /* Note that the TCG memory order constants mirror the Sparc MEMBAR.  */
867     tcg_out32(s, MEMBAR | (a0 & TCG_MO_ALL));
870 #ifdef CONFIG_SOFTMMU
871 static tcg_insn_unit *qemu_ld_trampoline[16];
872 static tcg_insn_unit *qemu_st_trampoline[16];
874 static void emit_extend(TCGContext *s, TCGReg r, int op)
876     /* Emit zero extend of 8, 16 or 32 bit data as
877      * required by the MO_* value op; do nothing for 64 bit.
878      */
879     switch (op & MO_SIZE) {
880     case MO_8:
881         tcg_out_arithi(s, r, r, 0xff, ARITH_AND);
882         break;
883     case MO_16:
884         tcg_out_arithi(s, r, r, 16, SHIFT_SLL);
885         tcg_out_arithi(s, r, r, 16, SHIFT_SRL);
886         break;
887     case MO_32:
888         if (SPARC64) {
889             tcg_out_arith(s, r, r, 0, SHIFT_SRL);
890         }
891         break;
892     case MO_64:
893         break;
894     }
897 static void build_trampolines(TCGContext *s)
899     static void * const qemu_ld_helpers[16] = {
900         [MO_UB]   = helper_ret_ldub_mmu,
901         [MO_SB]   = helper_ret_ldsb_mmu,
902         [MO_LEUW] = helper_le_lduw_mmu,
903         [MO_LESW] = helper_le_ldsw_mmu,
904         [MO_LEUL] = helper_le_ldul_mmu,
905         [MO_LEQ]  = helper_le_ldq_mmu,
906         [MO_BEUW] = helper_be_lduw_mmu,
907         [MO_BESW] = helper_be_ldsw_mmu,
908         [MO_BEUL] = helper_be_ldul_mmu,
909         [MO_BEQ]  = helper_be_ldq_mmu,
910     };
911     static void * const qemu_st_helpers[16] = {
912         [MO_UB]   = helper_ret_stb_mmu,
913         [MO_LEUW] = helper_le_stw_mmu,
914         [MO_LEUL] = helper_le_stl_mmu,
915         [MO_LEQ]  = helper_le_stq_mmu,
916         [MO_BEUW] = helper_be_stw_mmu,
917         [MO_BEUL] = helper_be_stl_mmu,
918         [MO_BEQ]  = helper_be_stq_mmu,
919     };
921     int i;
922     TCGReg ra;
924     for (i = 0; i < 16; ++i) {
925         if (qemu_ld_helpers[i] == NULL) {
926             continue;
927         }
929         /* May as well align the trampoline.  */
930         while ((uintptr_t)s->code_ptr & 15) {
931             tcg_out_nop(s);
932         }
933         qemu_ld_trampoline[i] = s->code_ptr;
935         if (SPARC64 || TARGET_LONG_BITS == 32) {
936             ra = TCG_REG_O3;
937         } else {
938             /* Install the high part of the address.  */
939             tcg_out_arithi(s, TCG_REG_O1, TCG_REG_O2, 32, SHIFT_SRLX);
940             ra = TCG_REG_O4;
941         }
943         /* Set the retaddr operand.  */
944         tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7);
945         /* Set the env operand.  */
946         tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0);
947         /* Tail call.  */
948         tcg_out_call_nodelay(s, qemu_ld_helpers[i], true);
949         tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O7, ra);
950     }
952     for (i = 0; i < 16; ++i) {
953         if (qemu_st_helpers[i] == NULL) {
954             continue;
955         }
957         /* May as well align the trampoline.  */
958         while ((uintptr_t)s->code_ptr & 15) {
959             tcg_out_nop(s);
960         }
961         qemu_st_trampoline[i] = s->code_ptr;
963         if (SPARC64) {
964             emit_extend(s, TCG_REG_O2, i);
965             ra = TCG_REG_O4;
966         } else {
967             ra = TCG_REG_O1;
968             if (TARGET_LONG_BITS == 64) {
969                 /* Install the high part of the address.  */
970                 tcg_out_arithi(s, ra, ra + 1, 32, SHIFT_SRLX);
971                 ra += 2;
972             } else {
973                 ra += 1;
974             }
975             if ((i & MO_SIZE) == MO_64) {
976                 /* Install the high part of the data.  */
977                 tcg_out_arithi(s, ra, ra + 1, 32, SHIFT_SRLX);
978                 ra += 2;
979             } else {
980                 emit_extend(s, ra, i);
981                 ra += 1;
982             }
983             /* Skip the oi argument.  */
984             ra += 1;
985         }
986                 
987         /* Set the retaddr operand.  */
988         if (ra >= TCG_REG_O6) {
989             tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_O7, TCG_REG_CALL_STACK,
990                        TCG_TARGET_CALL_STACK_OFFSET);
991             ra = TCG_REG_G1;
992         }
993         tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7);
994         /* Set the env operand.  */
995         tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0);
996         /* Tail call.  */
997         tcg_out_call_nodelay(s, qemu_st_helpers[i], true);
998         tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O7, ra);
999     }
1001 #endif
1003 /* Generate global QEMU prologue and epilogue code */
1004 static void tcg_target_qemu_prologue(TCGContext *s)
1006     int tmp_buf_size, frame_size;
1008     /* The TCG temp buffer is at the top of the frame, immediately
1009        below the frame pointer.  */
1010     tmp_buf_size = CPU_TEMP_BUF_NLONGS * (int)sizeof(long);
1011     tcg_set_frame(s, TCG_REG_I6, TCG_TARGET_STACK_BIAS - tmp_buf_size,
1012                   tmp_buf_size);
1014     /* TCG_TARGET_CALL_STACK_OFFSET includes the stack bias, but is
1015        otherwise the minimal frame usable by callees.  */
1016     frame_size = TCG_TARGET_CALL_STACK_OFFSET - TCG_TARGET_STACK_BIAS;
1017     frame_size += TCG_STATIC_CALL_ARGS_SIZE + tmp_buf_size;
1018     frame_size += TCG_TARGET_STACK_ALIGN - 1;
1019     frame_size &= -TCG_TARGET_STACK_ALIGN;
1020     tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) |
1021               INSN_IMM13(-frame_size));
1023 #ifndef CONFIG_SOFTMMU
1024     if (guest_base != 0) {
1025         tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, guest_base, true);
1026         tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
1027     }
1028 #endif
1030     /* We choose TCG_REG_TB such that no move is required.  */
1031     if (USE_REG_TB) {
1032         QEMU_BUILD_BUG_ON(TCG_REG_TB != TCG_REG_I1);
1033         tcg_regset_set_reg(s->reserved_regs, TCG_REG_TB);
1034     }
1036     tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I1, 0, JMPL);
1037     /* delay slot */
1038     tcg_out_nop(s);
1040     /* Epilogue for goto_ptr.  */
1041     s->code_gen_epilogue = s->code_ptr;
1042     tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN);
1043     /* delay slot */
1044     tcg_out_movi_imm13(s, TCG_REG_O0, 0);
1046 #ifdef CONFIG_SOFTMMU
1047     build_trampolines(s);
1048 #endif
1051 static void tcg_out_nop_fill(tcg_insn_unit *p, int count)
1053     int i;
1054     for (i = 0; i < count; ++i) {
1055         p[i] = NOP;
1056     }
1059 #if defined(CONFIG_SOFTMMU)
1061 /* We expect to use a 13-bit negative offset from ENV.  */
1062 QEMU_BUILD_BUG_ON(TLB_MASK_TABLE_OFS(0) > 0);
1063 QEMU_BUILD_BUG_ON(TLB_MASK_TABLE_OFS(0) < -(1 << 12));
1065 /* Perform the TLB load and compare.
1067    Inputs:
1068    ADDRLO and ADDRHI contain the possible two parts of the address.
1070    MEM_INDEX and S_BITS are the memory context and log2 size of the load.
1072    WHICH is the offset into the CPUTLBEntry structure of the slot to read.
1073    This should be offsetof addr_read or addr_write.
1075    The result of the TLB comparison is in %[ix]cc.  The sanitized address
1076    is in the returned register, maybe %o0.  The TLB addend is in %o1.  */
1078 static TCGReg tcg_out_tlb_load(TCGContext *s, TCGReg addr, int mem_index,
1079                                MemOp opc, int which)
1081     int fast_off = TLB_MASK_TABLE_OFS(mem_index);
1082     int mask_off = fast_off + offsetof(CPUTLBDescFast, mask);
1083     int table_off = fast_off + offsetof(CPUTLBDescFast, table);
1084     const TCGReg r0 = TCG_REG_O0;
1085     const TCGReg r1 = TCG_REG_O1;
1086     const TCGReg r2 = TCG_REG_O2;
1087     unsigned s_bits = opc & MO_SIZE;
1088     unsigned a_bits = get_alignment_bits(opc);
1089     tcg_target_long compare_mask;
1091     /* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx].  */
1092     tcg_out_ld(s, TCG_TYPE_PTR, r0, TCG_AREG0, mask_off);
1093     tcg_out_ld(s, TCG_TYPE_PTR, r1, TCG_AREG0, table_off);
1095     /* Extract the page index, shifted into place for tlb index.  */
1096     tcg_out_arithi(s, r2, addr, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS,
1097                    SHIFT_SRL);
1098     tcg_out_arith(s, r2, r2, r0, ARITH_AND);
1100     /* Add the tlb_table pointer, creating the CPUTLBEntry address into R2.  */
1101     tcg_out_arith(s, r2, r2, r1, ARITH_ADD);
1103     /* Load the tlb comparator and the addend.  */
1104     tcg_out_ld(s, TCG_TYPE_TL, r0, r2, which);
1105     tcg_out_ld(s, TCG_TYPE_PTR, r1, r2, offsetof(CPUTLBEntry, addend));
1107     /* Mask out the page offset, except for the required alignment.
1108        We don't support unaligned accesses.  */
1109     if (a_bits < s_bits) {
1110         a_bits = s_bits;
1111     }
1112     compare_mask = (tcg_target_ulong)TARGET_PAGE_MASK | ((1 << a_bits) - 1);
1113     if (check_fit_tl(compare_mask, 13)) {
1114         tcg_out_arithi(s, r2, addr, compare_mask, ARITH_AND);
1115     } else {
1116         tcg_out_movi(s, TCG_TYPE_TL, r2, compare_mask);
1117         tcg_out_arith(s, r2, addr, r2, ARITH_AND);
1118     }
1119     tcg_out_cmp(s, r0, r2, 0);
1121     /* If the guest address must be zero-extended, do so now.  */
1122     if (SPARC64 && TARGET_LONG_BITS == 32) {
1123         tcg_out_arithi(s, r0, addr, 0, SHIFT_SRL);
1124         return r0;
1125     }
1126     return addr;
1128 #endif /* CONFIG_SOFTMMU */
1130 static const int qemu_ld_opc[16] = {
1131     [MO_UB]   = LDUB,
1132     [MO_SB]   = LDSB,
1134     [MO_BEUW] = LDUH,
1135     [MO_BESW] = LDSH,
1136     [MO_BEUL] = LDUW,
1137     [MO_BESL] = LDSW,
1138     [MO_BEQ]  = LDX,
1140     [MO_LEUW] = LDUH_LE,
1141     [MO_LESW] = LDSH_LE,
1142     [MO_LEUL] = LDUW_LE,
1143     [MO_LESL] = LDSW_LE,
1144     [MO_LEQ]  = LDX_LE,
1147 static const int qemu_st_opc[16] = {
1148     [MO_UB]   = STB,
1150     [MO_BEUW] = STH,
1151     [MO_BEUL] = STW,
1152     [MO_BEQ]  = STX,
1154     [MO_LEUW] = STH_LE,
1155     [MO_LEUL] = STW_LE,
1156     [MO_LEQ]  = STX_LE,
1159 static void tcg_out_qemu_ld(TCGContext *s, TCGReg data, TCGReg addr,
1160                             TCGMemOpIdx oi, bool is_64)
1162     MemOp memop = get_memop(oi);
1163 #ifdef CONFIG_SOFTMMU
1164     unsigned memi = get_mmuidx(oi);
1165     TCGReg addrz, param;
1166     tcg_insn_unit *func;
1167     tcg_insn_unit *label_ptr;
1169     addrz = tcg_out_tlb_load(s, addr, memi, memop,
1170                              offsetof(CPUTLBEntry, addr_read));
1172     /* The fast path is exactly one insn.  Thus we can perform the
1173        entire TLB Hit in the (annulled) delay slot of the branch
1174        over the TLB Miss case.  */
1176     /* beq,a,pt %[xi]cc, label0 */
1177     label_ptr = s->code_ptr;
1178     tcg_out_bpcc0(s, COND_E, BPCC_A | BPCC_PT
1179                   | (TARGET_LONG_BITS == 64 ? BPCC_XCC : BPCC_ICC), 0);
1180     /* delay slot */
1181     tcg_out_ldst_rr(s, data, addrz, TCG_REG_O1,
1182                     qemu_ld_opc[memop & (MO_BSWAP | MO_SSIZE)]);
1184     /* TLB Miss.  */
1186     param = TCG_REG_O1;
1187     if (!SPARC64 && TARGET_LONG_BITS == 64) {
1188         /* Skip the high-part; we'll perform the extract in the trampoline.  */
1189         param++;
1190     }
1191     tcg_out_mov(s, TCG_TYPE_REG, param++, addrz);
1193     /* We use the helpers to extend SB and SW data, leaving the case
1194        of SL needing explicit extending below.  */
1195     if ((memop & MO_SSIZE) == MO_SL) {
1196         func = qemu_ld_trampoline[memop & (MO_BSWAP | MO_SIZE)];
1197     } else {
1198         func = qemu_ld_trampoline[memop & (MO_BSWAP | MO_SSIZE)];
1199     }
1200     tcg_debug_assert(func != NULL);
1201     tcg_out_call_nodelay(s, func, false);
1202     /* delay slot */
1203     tcg_out_movi(s, TCG_TYPE_I32, param, oi);
1205     /* Recall that all of the helpers return 64-bit results.
1206        Which complicates things for sparcv8plus.  */
1207     if (SPARC64) {
1208         /* We let the helper sign-extend SB and SW, but leave SL for here.  */
1209         if (is_64 && (memop & MO_SSIZE) == MO_SL) {
1210             tcg_out_arithi(s, data, TCG_REG_O0, 0, SHIFT_SRA);
1211         } else {
1212             tcg_out_mov(s, TCG_TYPE_REG, data, TCG_REG_O0);
1213         }
1214     } else {
1215         if ((memop & MO_SIZE) == MO_64) {
1216             tcg_out_arithi(s, TCG_REG_O0, TCG_REG_O0, 32, SHIFT_SLLX);
1217             tcg_out_arithi(s, TCG_REG_O1, TCG_REG_O1, 0, SHIFT_SRL);
1218             tcg_out_arith(s, data, TCG_REG_O0, TCG_REG_O1, ARITH_OR);
1219         } else if (is_64) {
1220             /* Re-extend from 32-bit rather than reassembling when we
1221                know the high register must be an extension.  */
1222             tcg_out_arithi(s, data, TCG_REG_O1, 0,
1223                            memop & MO_SIGN ? SHIFT_SRA : SHIFT_SRL);
1224         } else {
1225             tcg_out_mov(s, TCG_TYPE_I32, data, TCG_REG_O1);
1226         }
1227     }
1229     *label_ptr |= INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr));
1230 #else
1231     if (SPARC64 && TARGET_LONG_BITS == 32) {
1232         tcg_out_arithi(s, TCG_REG_T1, addr, 0, SHIFT_SRL);
1233         addr = TCG_REG_T1;
1234     }
1235     tcg_out_ldst_rr(s, data, addr,
1236                     (guest_base ? TCG_GUEST_BASE_REG : TCG_REG_G0),
1237                     qemu_ld_opc[memop & (MO_BSWAP | MO_SSIZE)]);
1238 #endif /* CONFIG_SOFTMMU */
1241 static void tcg_out_qemu_st(TCGContext *s, TCGReg data, TCGReg addr,
1242                             TCGMemOpIdx oi)
1244     MemOp memop = get_memop(oi);
1245 #ifdef CONFIG_SOFTMMU
1246     unsigned memi = get_mmuidx(oi);
1247     TCGReg addrz, param;
1248     tcg_insn_unit *func;
1249     tcg_insn_unit *label_ptr;
1251     addrz = tcg_out_tlb_load(s, addr, memi, memop,
1252                              offsetof(CPUTLBEntry, addr_write));
1254     /* The fast path is exactly one insn.  Thus we can perform the entire
1255        TLB Hit in the (annulled) delay slot of the branch over TLB Miss.  */
1256     /* beq,a,pt %[xi]cc, label0 */
1257     label_ptr = s->code_ptr;
1258     tcg_out_bpcc0(s, COND_E, BPCC_A | BPCC_PT
1259                   | (TARGET_LONG_BITS == 64 ? BPCC_XCC : BPCC_ICC), 0);
1260     /* delay slot */
1261     tcg_out_ldst_rr(s, data, addrz, TCG_REG_O1,
1262                     qemu_st_opc[memop & (MO_BSWAP | MO_SIZE)]);
1264     /* TLB Miss.  */
1266     param = TCG_REG_O1;
1267     if (!SPARC64 && TARGET_LONG_BITS == 64) {
1268         /* Skip the high-part; we'll perform the extract in the trampoline.  */
1269         param++;
1270     }
1271     tcg_out_mov(s, TCG_TYPE_REG, param++, addrz);
1272     if (!SPARC64 && (memop & MO_SIZE) == MO_64) {
1273         /* Skip the high-part; we'll perform the extract in the trampoline.  */
1274         param++;
1275     }
1276     tcg_out_mov(s, TCG_TYPE_REG, param++, data);
1278     func = qemu_st_trampoline[memop & (MO_BSWAP | MO_SIZE)];
1279     tcg_debug_assert(func != NULL);
1280     tcg_out_call_nodelay(s, func, false);
1281     /* delay slot */
1282     tcg_out_movi(s, TCG_TYPE_I32, param, oi);
1284     *label_ptr |= INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr));
1285 #else
1286     if (SPARC64 && TARGET_LONG_BITS == 32) {
1287         tcg_out_arithi(s, TCG_REG_T1, addr, 0, SHIFT_SRL);
1288         addr = TCG_REG_T1;
1289     }
1290     tcg_out_ldst_rr(s, data, addr,
1291                     (guest_base ? TCG_GUEST_BASE_REG : TCG_REG_G0),
1292                     qemu_st_opc[memop & (MO_BSWAP | MO_SIZE)]);
1293 #endif /* CONFIG_SOFTMMU */
1296 static void tcg_out_op(TCGContext *s, TCGOpcode opc,
1297                        const TCGArg args[TCG_MAX_OP_ARGS],
1298                        const int const_args[TCG_MAX_OP_ARGS])
1300     TCGArg a0, a1, a2;
1301     int c, c2;
1303     /* Hoist the loads of the most common arguments.  */
1304     a0 = args[0];
1305     a1 = args[1];
1306     a2 = args[2];
1307     c2 = const_args[2];
1309     switch (opc) {
1310     case INDEX_op_exit_tb:
1311         if (check_fit_ptr(a0, 13)) {
1312             tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN);
1313             tcg_out_movi_imm13(s, TCG_REG_O0, a0);
1314             break;
1315         } else if (USE_REG_TB) {
1316             intptr_t tb_diff = a0 - (uintptr_t)s->code_gen_ptr;
1317             if (check_fit_ptr(tb_diff, 13)) {
1318                 tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN);
1319                 /* Note that TCG_REG_TB has been unwound to O1.  */
1320                 tcg_out_arithi(s, TCG_REG_O0, TCG_REG_O1, tb_diff, ARITH_ADD);
1321                 break;
1322             }
1323         }
1324         tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I0, a0 & ~0x3ff);
1325         tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN);
1326         tcg_out_arithi(s, TCG_REG_O0, TCG_REG_O0, a0 & 0x3ff, ARITH_OR);
1327         break;
1328     case INDEX_op_goto_tb:
1329         if (s->tb_jmp_insn_offset) {
1330             /* direct jump method */
1331             if (USE_REG_TB) {
1332                 /* make sure the patch is 8-byte aligned.  */
1333                 if ((intptr_t)s->code_ptr & 4) {
1334                     tcg_out_nop(s);
1335                 }
1336                 s->tb_jmp_insn_offset[a0] = tcg_current_code_size(s);
1337                 tcg_out_sethi(s, TCG_REG_T1, 0);
1338                 tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 0, ARITH_OR);
1339                 tcg_out_arith(s, TCG_REG_G0, TCG_REG_TB, TCG_REG_T1, JMPL);
1340                 tcg_out_arith(s, TCG_REG_TB, TCG_REG_TB, TCG_REG_T1, ARITH_ADD);
1341             } else {
1342                 s->tb_jmp_insn_offset[a0] = tcg_current_code_size(s);
1343                 tcg_out32(s, CALL);
1344                 tcg_out_nop(s);
1345             }
1346         } else {
1347             /* indirect jump method */
1348             tcg_out_ld_ptr(s, TCG_REG_TB,
1349                            (uintptr_t)(s->tb_jmp_target_addr + a0));
1350             tcg_out_arithi(s, TCG_REG_G0, TCG_REG_TB, 0, JMPL);
1351             tcg_out_nop(s);
1352         }
1353         set_jmp_reset_offset(s, a0);
1355         /* For the unlinked path of goto_tb, we need to reset
1356            TCG_REG_TB to the beginning of this TB.  */
1357         if (USE_REG_TB) {
1358             c = -tcg_current_code_size(s);
1359             if (check_fit_i32(c, 13)) {
1360                 tcg_out_arithi(s, TCG_REG_TB, TCG_REG_TB, c, ARITH_ADD);
1361             } else {
1362                 tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, c);
1363                 tcg_out_arith(s, TCG_REG_TB, TCG_REG_TB,
1364                               TCG_REG_T1, ARITH_ADD);
1365             }
1366         }
1367         break;
1368     case INDEX_op_goto_ptr:
1369         tcg_out_arithi(s, TCG_REG_G0, a0, 0, JMPL);
1370         if (USE_REG_TB) {
1371             tcg_out_arith(s, TCG_REG_TB, a0, TCG_REG_G0, ARITH_OR);
1372         } else {
1373             tcg_out_nop(s);
1374         }
1375         break;
1376     case INDEX_op_br:
1377         tcg_out_bpcc(s, COND_A, BPCC_PT, arg_label(a0));
1378         tcg_out_nop(s);
1379         break;
1381 #define OP_32_64(x)                             \
1382         glue(glue(case INDEX_op_, x), _i32):    \
1383         glue(glue(case INDEX_op_, x), _i64)
1385     OP_32_64(ld8u):
1386         tcg_out_ldst(s, a0, a1, a2, LDUB);
1387         break;
1388     OP_32_64(ld8s):
1389         tcg_out_ldst(s, a0, a1, a2, LDSB);
1390         break;
1391     OP_32_64(ld16u):
1392         tcg_out_ldst(s, a0, a1, a2, LDUH);
1393         break;
1394     OP_32_64(ld16s):
1395         tcg_out_ldst(s, a0, a1, a2, LDSH);
1396         break;
1397     case INDEX_op_ld_i32:
1398     case INDEX_op_ld32u_i64:
1399         tcg_out_ldst(s, a0, a1, a2, LDUW);
1400         break;
1401     OP_32_64(st8):
1402         tcg_out_ldst(s, a0, a1, a2, STB);
1403         break;
1404     OP_32_64(st16):
1405         tcg_out_ldst(s, a0, a1, a2, STH);
1406         break;
1407     case INDEX_op_st_i32:
1408     case INDEX_op_st32_i64:
1409         tcg_out_ldst(s, a0, a1, a2, STW);
1410         break;
1411     OP_32_64(add):
1412         c = ARITH_ADD;
1413         goto gen_arith;
1414     OP_32_64(sub):
1415         c = ARITH_SUB;
1416         goto gen_arith;
1417     OP_32_64(and):
1418         c = ARITH_AND;
1419         goto gen_arith;
1420     OP_32_64(andc):
1421         c = ARITH_ANDN;
1422         goto gen_arith;
1423     OP_32_64(or):
1424         c = ARITH_OR;
1425         goto gen_arith;
1426     OP_32_64(orc):
1427         c = ARITH_ORN;
1428         goto gen_arith;
1429     OP_32_64(xor):
1430         c = ARITH_XOR;
1431         goto gen_arith;
1432     case INDEX_op_shl_i32:
1433         c = SHIFT_SLL;
1434     do_shift32:
1435         /* Limit immediate shift count lest we create an illegal insn.  */
1436         tcg_out_arithc(s, a0, a1, a2 & 31, c2, c);
1437         break;
1438     case INDEX_op_shr_i32:
1439         c = SHIFT_SRL;
1440         goto do_shift32;
1441     case INDEX_op_sar_i32:
1442         c = SHIFT_SRA;
1443         goto do_shift32;
1444     case INDEX_op_mul_i32:
1445         c = ARITH_UMUL;
1446         goto gen_arith;
1448     OP_32_64(neg):
1449         c = ARITH_SUB;
1450         goto gen_arith1;
1451     OP_32_64(not):
1452         c = ARITH_ORN;
1453         goto gen_arith1;
1455     case INDEX_op_div_i32:
1456         tcg_out_div32(s, a0, a1, a2, c2, 0);
1457         break;
1458     case INDEX_op_divu_i32:
1459         tcg_out_div32(s, a0, a1, a2, c2, 1);
1460         break;
1462     case INDEX_op_brcond_i32:
1463         tcg_out_brcond_i32(s, a2, a0, a1, const_args[1], arg_label(args[3]));
1464         break;
1465     case INDEX_op_setcond_i32:
1466         tcg_out_setcond_i32(s, args[3], a0, a1, a2, c2);
1467         break;
1468     case INDEX_op_movcond_i32:
1469         tcg_out_movcond_i32(s, args[5], a0, a1, a2, c2, args[3], const_args[3]);
1470         break;
1472     case INDEX_op_add2_i32:
1473         tcg_out_addsub2_i32(s, args[0], args[1], args[2], args[3],
1474                             args[4], const_args[4], args[5], const_args[5],
1475                             ARITH_ADDCC, ARITH_ADDC);
1476         break;
1477     case INDEX_op_sub2_i32:
1478         tcg_out_addsub2_i32(s, args[0], args[1], args[2], args[3],
1479                             args[4], const_args[4], args[5], const_args[5],
1480                             ARITH_SUBCC, ARITH_SUBC);
1481         break;
1482     case INDEX_op_mulu2_i32:
1483         c = ARITH_UMUL;
1484         goto do_mul2;
1485     case INDEX_op_muls2_i32:
1486         c = ARITH_SMUL;
1487     do_mul2:
1488         /* The 32-bit multiply insns produce a full 64-bit result.  If the
1489            destination register can hold it, we can avoid the slower RDY.  */
1490         tcg_out_arithc(s, a0, a2, args[3], const_args[3], c);
1491         if (SPARC64 || a0 <= TCG_REG_O7) {
1492             tcg_out_arithi(s, a1, a0, 32, SHIFT_SRLX);
1493         } else {
1494             tcg_out_rdy(s, a1);
1495         }
1496         break;
1498     case INDEX_op_qemu_ld_i32:
1499         tcg_out_qemu_ld(s, a0, a1, a2, false);
1500         break;
1501     case INDEX_op_qemu_ld_i64:
1502         tcg_out_qemu_ld(s, a0, a1, a2, true);
1503         break;
1504     case INDEX_op_qemu_st_i32:
1505     case INDEX_op_qemu_st_i64:
1506         tcg_out_qemu_st(s, a0, a1, a2);
1507         break;
1509     case INDEX_op_ld32s_i64:
1510         tcg_out_ldst(s, a0, a1, a2, LDSW);
1511         break;
1512     case INDEX_op_ld_i64:
1513         tcg_out_ldst(s, a0, a1, a2, LDX);
1514         break;
1515     case INDEX_op_st_i64:
1516         tcg_out_ldst(s, a0, a1, a2, STX);
1517         break;
1518     case INDEX_op_shl_i64:
1519         c = SHIFT_SLLX;
1520     do_shift64:
1521         /* Limit immediate shift count lest we create an illegal insn.  */
1522         tcg_out_arithc(s, a0, a1, a2 & 63, c2, c);
1523         break;
1524     case INDEX_op_shr_i64:
1525         c = SHIFT_SRLX;
1526         goto do_shift64;
1527     case INDEX_op_sar_i64:
1528         c = SHIFT_SRAX;
1529         goto do_shift64;
1530     case INDEX_op_mul_i64:
1531         c = ARITH_MULX;
1532         goto gen_arith;
1533     case INDEX_op_div_i64:
1534         c = ARITH_SDIVX;
1535         goto gen_arith;
1536     case INDEX_op_divu_i64:
1537         c = ARITH_UDIVX;
1538         goto gen_arith;
1539     case INDEX_op_ext_i32_i64:
1540     case INDEX_op_ext32s_i64:
1541         tcg_out_arithi(s, a0, a1, 0, SHIFT_SRA);
1542         break;
1543     case INDEX_op_extu_i32_i64:
1544     case INDEX_op_ext32u_i64:
1545         tcg_out_arithi(s, a0, a1, 0, SHIFT_SRL);
1546         break;
1547     case INDEX_op_extrl_i64_i32:
1548         tcg_out_mov(s, TCG_TYPE_I32, a0, a1);
1549         break;
1550     case INDEX_op_extrh_i64_i32:
1551         tcg_out_arithi(s, a0, a1, 32, SHIFT_SRLX);
1552         break;
1554     case INDEX_op_brcond_i64:
1555         tcg_out_brcond_i64(s, a2, a0, a1, const_args[1], arg_label(args[3]));
1556         break;
1557     case INDEX_op_setcond_i64:
1558         tcg_out_setcond_i64(s, args[3], a0, a1, a2, c2);
1559         break;
1560     case INDEX_op_movcond_i64:
1561         tcg_out_movcond_i64(s, args[5], a0, a1, a2, c2, args[3], const_args[3]);
1562         break;
1563     case INDEX_op_add2_i64:
1564         tcg_out_addsub2_i64(s, args[0], args[1], args[2], args[3], args[4],
1565                             const_args[4], args[5], const_args[5], false);
1566         break;
1567     case INDEX_op_sub2_i64:
1568         tcg_out_addsub2_i64(s, args[0], args[1], args[2], args[3], args[4],
1569                             const_args[4], args[5], const_args[5], true);
1570         break;
1571     case INDEX_op_muluh_i64:
1572         tcg_out_arith(s, args[0], args[1], args[2], ARITH_UMULXHI);
1573         break;
1575     gen_arith:
1576         tcg_out_arithc(s, a0, a1, a2, c2, c);
1577         break;
1579     gen_arith1:
1580         tcg_out_arithc(s, a0, TCG_REG_G0, a1, const_args[1], c);
1581         break;
1583     case INDEX_op_mb:
1584         tcg_out_mb(s, a0);
1585         break;
1587     case INDEX_op_mov_i32:  /* Always emitted via tcg_out_mov.  */
1588     case INDEX_op_mov_i64:
1589     case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi.  */
1590     case INDEX_op_movi_i64:
1591     case INDEX_op_call:     /* Always emitted via tcg_out_call.  */
1592     default:
1593         tcg_abort();
1594     }
1597 static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode op)
1599     static const TCGTargetOpDef r = { .args_ct_str = { "r" } };
1600     static const TCGTargetOpDef r_r = { .args_ct_str = { "r", "r" } };
1601     static const TCGTargetOpDef R_r = { .args_ct_str = { "R", "r" } };
1602     static const TCGTargetOpDef r_R = { .args_ct_str = { "r", "R" } };
1603     static const TCGTargetOpDef R_R = { .args_ct_str = { "R", "R" } };
1604     static const TCGTargetOpDef r_A = { .args_ct_str = { "r", "A" } };
1605     static const TCGTargetOpDef R_A = { .args_ct_str = { "R", "A" } };
1606     static const TCGTargetOpDef rZ_r = { .args_ct_str = { "rZ", "r" } };
1607     static const TCGTargetOpDef RZ_r = { .args_ct_str = { "RZ", "r" } };
1608     static const TCGTargetOpDef sZ_A = { .args_ct_str = { "sZ", "A" } };
1609     static const TCGTargetOpDef SZ_A = { .args_ct_str = { "SZ", "A" } };
1610     static const TCGTargetOpDef rZ_rJ = { .args_ct_str = { "rZ", "rJ" } };
1611     static const TCGTargetOpDef RZ_RJ = { .args_ct_str = { "RZ", "RJ" } };
1612     static const TCGTargetOpDef R_R_R = { .args_ct_str = { "R", "R", "R" } };
1613     static const TCGTargetOpDef r_rZ_rJ
1614         = { .args_ct_str = { "r", "rZ", "rJ" } };
1615     static const TCGTargetOpDef R_RZ_RJ
1616         = { .args_ct_str = { "R", "RZ", "RJ" } };
1617     static const TCGTargetOpDef r_r_rZ_rJ
1618         = { .args_ct_str = { "r", "r", "rZ", "rJ" } };
1619     static const TCGTargetOpDef movc_32
1620         = { .args_ct_str = { "r", "rZ", "rJ", "rI", "0" } };
1621     static const TCGTargetOpDef movc_64
1622         = { .args_ct_str = { "R", "RZ", "RJ", "RI", "0" } };
1623     static const TCGTargetOpDef add2_32
1624         = { .args_ct_str = { "r", "r", "rZ", "rZ", "rJ", "rJ" } };
1625     static const TCGTargetOpDef add2_64
1626         = { .args_ct_str = { "R", "R", "RZ", "RZ", "RJ", "RI" } };
1628     switch (op) {
1629     case INDEX_op_goto_ptr:
1630         return &r;
1632     case INDEX_op_ld8u_i32:
1633     case INDEX_op_ld8s_i32:
1634     case INDEX_op_ld16u_i32:
1635     case INDEX_op_ld16s_i32:
1636     case INDEX_op_ld_i32:
1637     case INDEX_op_neg_i32:
1638     case INDEX_op_not_i32:
1639         return &r_r;
1641     case INDEX_op_st8_i32:
1642     case INDEX_op_st16_i32:
1643     case INDEX_op_st_i32:
1644         return &rZ_r;
1646     case INDEX_op_add_i32:
1647     case INDEX_op_mul_i32:
1648     case INDEX_op_div_i32:
1649     case INDEX_op_divu_i32:
1650     case INDEX_op_sub_i32:
1651     case INDEX_op_and_i32:
1652     case INDEX_op_andc_i32:
1653     case INDEX_op_or_i32:
1654     case INDEX_op_orc_i32:
1655     case INDEX_op_xor_i32:
1656     case INDEX_op_shl_i32:
1657     case INDEX_op_shr_i32:
1658     case INDEX_op_sar_i32:
1659     case INDEX_op_setcond_i32:
1660         return &r_rZ_rJ;
1662     case INDEX_op_brcond_i32:
1663         return &rZ_rJ;
1664     case INDEX_op_movcond_i32:
1665         return &movc_32;
1666     case INDEX_op_add2_i32:
1667     case INDEX_op_sub2_i32:
1668         return &add2_32;
1669     case INDEX_op_mulu2_i32:
1670     case INDEX_op_muls2_i32:
1671         return &r_r_rZ_rJ;
1673     case INDEX_op_ld8u_i64:
1674     case INDEX_op_ld8s_i64:
1675     case INDEX_op_ld16u_i64:
1676     case INDEX_op_ld16s_i64:
1677     case INDEX_op_ld32u_i64:
1678     case INDEX_op_ld32s_i64:
1679     case INDEX_op_ld_i64:
1680     case INDEX_op_ext_i32_i64:
1681     case INDEX_op_extu_i32_i64:
1682         return &R_r;
1684     case INDEX_op_st8_i64:
1685     case INDEX_op_st16_i64:
1686     case INDEX_op_st32_i64:
1687     case INDEX_op_st_i64:
1688         return &RZ_r;
1690     case INDEX_op_add_i64:
1691     case INDEX_op_mul_i64:
1692     case INDEX_op_div_i64:
1693     case INDEX_op_divu_i64:
1694     case INDEX_op_sub_i64:
1695     case INDEX_op_and_i64:
1696     case INDEX_op_andc_i64:
1697     case INDEX_op_or_i64:
1698     case INDEX_op_orc_i64:
1699     case INDEX_op_xor_i64:
1700     case INDEX_op_shl_i64:
1701     case INDEX_op_shr_i64:
1702     case INDEX_op_sar_i64:
1703     case INDEX_op_setcond_i64:
1704         return &R_RZ_RJ;
1706     case INDEX_op_neg_i64:
1707     case INDEX_op_not_i64:
1708     case INDEX_op_ext32s_i64:
1709     case INDEX_op_ext32u_i64:
1710         return &R_R;
1712     case INDEX_op_extrl_i64_i32:
1713     case INDEX_op_extrh_i64_i32:
1714         return &r_R;
1716     case INDEX_op_brcond_i64:
1717         return &RZ_RJ;
1718     case INDEX_op_movcond_i64:
1719         return &movc_64;
1720     case INDEX_op_add2_i64:
1721     case INDEX_op_sub2_i64:
1722         return &add2_64;
1723     case INDEX_op_muluh_i64:
1724         return &R_R_R;
1726     case INDEX_op_qemu_ld_i32:
1727         return &r_A;
1728     case INDEX_op_qemu_ld_i64:
1729         return &R_A;
1730     case INDEX_op_qemu_st_i32:
1731         return &sZ_A;
1732     case INDEX_op_qemu_st_i64:
1733         return &SZ_A;
1735     default:
1736         return NULL;
1737     }
1740 static void tcg_target_init(TCGContext *s)
1742     /* Only probe for the platform and capabilities if we havn't already
1743        determined maximum values at compile time.  */
1744 #ifndef use_vis3_instructions
1745     {
1746         unsigned long hwcap = qemu_getauxval(AT_HWCAP);
1747         use_vis3_instructions = (hwcap & HWCAP_SPARC_VIS3) != 0;
1748     }
1749 #endif
1751     tcg_target_available_regs[TCG_TYPE_I32] = 0xffffffff;
1752     tcg_target_available_regs[TCG_TYPE_I64] = ALL_64;
1754     tcg_target_call_clobber_regs = 0;
1755     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G1);
1756     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G2);
1757     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G3);
1758     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G4);
1759     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G5);
1760     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G6);
1761     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_G7);
1762     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O0);
1763     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O1);
1764     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O2);
1765     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O3);
1766     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O4);
1767     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O5);
1768     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O6);
1769     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_O7);
1771     s->reserved_regs = 0;
1772     tcg_regset_set_reg(s->reserved_regs, TCG_REG_G0); /* zero */
1773     tcg_regset_set_reg(s->reserved_regs, TCG_REG_G6); /* reserved for os */
1774     tcg_regset_set_reg(s->reserved_regs, TCG_REG_G7); /* thread pointer */
1775     tcg_regset_set_reg(s->reserved_regs, TCG_REG_I6); /* frame pointer */
1776     tcg_regset_set_reg(s->reserved_regs, TCG_REG_I7); /* return address */
1777     tcg_regset_set_reg(s->reserved_regs, TCG_REG_O6); /* stack pointer */
1778     tcg_regset_set_reg(s->reserved_regs, TCG_REG_T1); /* for internal use */
1779     tcg_regset_set_reg(s->reserved_regs, TCG_REG_T2); /* for internal use */
1782 #if SPARC64
1783 # define ELF_HOST_MACHINE  EM_SPARCV9
1784 #else
1785 # define ELF_HOST_MACHINE  EM_SPARC32PLUS
1786 # define ELF_HOST_FLAGS    EF_SPARC_32PLUS
1787 #endif
1789 typedef struct {
1790     DebugFrameHeader h;
1791     uint8_t fde_def_cfa[SPARC64 ? 4 : 2];
1792     uint8_t fde_win_save;
1793     uint8_t fde_ret_save[3];
1794 } DebugFrame;
1796 static const DebugFrame debug_frame = {
1797     .h.cie.len = sizeof(DebugFrameCIE)-4, /* length after .len member */
1798     .h.cie.id = -1,
1799     .h.cie.version = 1,
1800     .h.cie.code_align = 1,
1801     .h.cie.data_align = -sizeof(void *) & 0x7f,
1802     .h.cie.return_column = 15,            /* o7 */
1804     /* Total FDE size does not include the "len" member.  */
1805     .h.fde.len = sizeof(DebugFrame) - offsetof(DebugFrame, h.fde.cie_offset),
1807     .fde_def_cfa = {
1808 #if SPARC64
1809         12, 30,                         /* DW_CFA_def_cfa i6, 2047 */
1810         (2047 & 0x7f) | 0x80, (2047 >> 7)
1811 #else
1812         13, 30                          /* DW_CFA_def_cfa_register i6 */
1813 #endif
1814     },
1815     .fde_win_save = 0x2d,               /* DW_CFA_GNU_window_save */
1816     .fde_ret_save = { 9, 15, 31 },      /* DW_CFA_register o7, i7 */
1819 void tcg_register_jit(void *buf, size_t buf_size)
1821     tcg_register_jit_int(buf, buf_size, &debug_frame, sizeof(debug_frame));
1824 void tb_target_set_jmp_target(uintptr_t tc_ptr, uintptr_t jmp_addr,
1825                               uintptr_t addr)
1827     intptr_t tb_disp = addr - tc_ptr;
1828     intptr_t br_disp = addr - jmp_addr;
1829     tcg_insn_unit i1, i2;
1831     /* We can reach the entire address space for ILP32.
1832        For LP64, the code_gen_buffer can't be larger than 2GB.  */
1833     tcg_debug_assert(tb_disp == (int32_t)tb_disp);
1834     tcg_debug_assert(br_disp == (int32_t)br_disp);
1836     if (!USE_REG_TB) {
1837         qatomic_set((uint32_t *)jmp_addr,
1838                     deposit32(CALL, 0, 30, br_disp >> 2));
1839         flush_icache_range(jmp_addr, jmp_addr + 4);
1840         return;
1841     }
1843     /* This does not exercise the range of the branch, but we do
1844        still need to be able to load the new value of TCG_REG_TB.
1845        But this does still happen quite often.  */
1846     if (check_fit_ptr(tb_disp, 13)) {
1847         /* ba,pt %icc, addr */
1848         i1 = (INSN_OP(0) | INSN_OP2(1) | INSN_COND(COND_A)
1849               | BPCC_ICC | BPCC_PT | INSN_OFF19(br_disp));
1850         i2 = (ARITH_ADD | INSN_RD(TCG_REG_TB) | INSN_RS1(TCG_REG_TB)
1851               | INSN_IMM13(tb_disp));
1852     } else if (tb_disp >= 0) {
1853         i1 = SETHI | INSN_RD(TCG_REG_T1) | ((tb_disp & 0xfffffc00) >> 10);
1854         i2 = (ARITH_OR | INSN_RD(TCG_REG_T1) | INSN_RS1(TCG_REG_T1)
1855               | INSN_IMM13(tb_disp & 0x3ff));
1856     } else {
1857         i1 = SETHI | INSN_RD(TCG_REG_T1) | ((~tb_disp & 0xfffffc00) >> 10);
1858         i2 = (ARITH_XOR | INSN_RD(TCG_REG_T1) | INSN_RS1(TCG_REG_T1)
1859               | INSN_IMM13((tb_disp & 0x3ff) | -0x400));
1860     }
1862     qatomic_set((uint64_t *)jmp_addr, deposit64(i2, 32, 32, i1));
1863     flush_icache_range(jmp_addr, jmp_addr + 8);