2 * Tiny Code Generator for QEMU
4 * Copyright (c) 2009-2010 Aurelien Jarno <aurelien@aurel32.net>
5 * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 #include "tcg-be-null.h"
29 * Register definitions
33 static const char * const tcg_target_reg_names
[TCG_TARGET_NB_REGS
] = {
34 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
35 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
36 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
37 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
38 "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
39 "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
40 "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
41 "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
45 #ifdef CONFIG_USE_GUEST_BASE
46 #define TCG_GUEST_BASE_REG TCG_REG_R55
48 #define TCG_GUEST_BASE_REG TCG_REG_R0
54 /* Branch registers */
66 /* Floating point registers */
86 /* Predicate registers */
106 /* Application registers */
111 static const int tcg_target_reg_alloc_order
[] = {
165 static const int tcg_target_call_iarg_regs
[8] = {
176 static const int tcg_target_call_oarg_regs
[] = {
184 /* bundle templates: stops (double bar in the IA64 manual) are marked with
185 an uppercase letter. */
214 OPC_ADD_A1
= 0x10000000000ull
,
215 OPC_AND_A1
= 0x10060000000ull
,
216 OPC_AND_A3
= 0x10160000000ull
,
217 OPC_ANDCM_A1
= 0x10068000000ull
,
218 OPC_ANDCM_A3
= 0x10168000000ull
,
219 OPC_ADDS_A4
= 0x10800000000ull
,
220 OPC_ADDL_A5
= 0x12000000000ull
,
221 OPC_ALLOC_M34
= 0x02c00000000ull
,
222 OPC_BR_DPTK_FEW_B1
= 0x08400000000ull
,
223 OPC_BR_SPTK_MANY_B1
= 0x08000001000ull
,
224 OPC_BR_SPTK_MANY_B4
= 0x00100001000ull
,
225 OPC_BR_CALL_SPTK_MANY_B5
= 0x02100001000ull
,
226 OPC_BR_RET_SPTK_MANY_B4
= 0x00108001100ull
,
227 OPC_BRL_SPTK_MANY_X3
= 0x18000001000ull
,
228 OPC_BRL_CALL_SPTK_MANY_X4
= 0x1a000001000ull
,
229 OPC_CMP_LT_A6
= 0x18000000000ull
,
230 OPC_CMP_LTU_A6
= 0x1a000000000ull
,
231 OPC_CMP_EQ_A6
= 0x1c000000000ull
,
232 OPC_CMP4_LT_A6
= 0x18400000000ull
,
233 OPC_CMP4_LTU_A6
= 0x1a400000000ull
,
234 OPC_CMP4_EQ_A6
= 0x1c400000000ull
,
235 OPC_DEP_I14
= 0x0ae00000000ull
,
236 OPC_DEP_I15
= 0x08000000000ull
,
237 OPC_DEP_Z_I12
= 0x0a600000000ull
,
238 OPC_EXTR_I11
= 0x0a400002000ull
,
239 OPC_EXTR_U_I11
= 0x0a400000000ull
,
240 OPC_FCVT_FX_TRUNC_S1_F10
= 0x004d0000000ull
,
241 OPC_FCVT_FXU_TRUNC_S1_F10
= 0x004d8000000ull
,
242 OPC_FCVT_XF_F11
= 0x000e0000000ull
,
243 OPC_FMA_S1_F1
= 0x10400000000ull
,
244 OPC_FNMA_S1_F1
= 0x18400000000ull
,
245 OPC_FRCPA_S1_F6
= 0x00600000000ull
,
246 OPC_GETF_SIG_M19
= 0x08708000000ull
,
247 OPC_LD1_M1
= 0x08000000000ull
,
248 OPC_LD1_M3
= 0x0a000000000ull
,
249 OPC_LD2_M1
= 0x08040000000ull
,
250 OPC_LD2_M3
= 0x0a040000000ull
,
251 OPC_LD4_M1
= 0x08080000000ull
,
252 OPC_LD4_M3
= 0x0a080000000ull
,
253 OPC_LD8_M1
= 0x080c0000000ull
,
254 OPC_LD8_M3
= 0x0a0c0000000ull
,
255 OPC_MUX1_I3
= 0x0eca0000000ull
,
256 OPC_NOP_B9
= 0x04008000000ull
,
257 OPC_NOP_F16
= 0x00008000000ull
,
258 OPC_NOP_I18
= 0x00008000000ull
,
259 OPC_NOP_M48
= 0x00008000000ull
,
260 OPC_MOV_I21
= 0x00e00100000ull
,
261 OPC_MOV_RET_I21
= 0x00e00500000ull
,
262 OPC_MOV_I22
= 0x00188000000ull
,
263 OPC_MOV_I_I26
= 0x00150000000ull
,
264 OPC_MOVL_X2
= 0x0c000000000ull
,
265 OPC_OR_A1
= 0x10070000000ull
,
266 OPC_OR_A3
= 0x10170000000ull
,
267 OPC_SETF_EXP_M18
= 0x0c748000000ull
,
268 OPC_SETF_SIG_M18
= 0x0c708000000ull
,
269 OPC_SHL_I7
= 0x0f240000000ull
,
270 OPC_SHR_I5
= 0x0f220000000ull
,
271 OPC_SHR_U_I5
= 0x0f200000000ull
,
272 OPC_SHRP_I10
= 0x0ac00000000ull
,
273 OPC_SXT1_I29
= 0x000a0000000ull
,
274 OPC_SXT2_I29
= 0x000a8000000ull
,
275 OPC_SXT4_I29
= 0x000b0000000ull
,
276 OPC_ST1_M4
= 0x08c00000000ull
,
277 OPC_ST2_M4
= 0x08c40000000ull
,
278 OPC_ST4_M4
= 0x08c80000000ull
,
279 OPC_ST8_M4
= 0x08cc0000000ull
,
280 OPC_SUB_A1
= 0x10028000000ull
,
281 OPC_SUB_A3
= 0x10128000000ull
,
282 OPC_UNPACK4_L_I2
= 0x0f860000000ull
,
283 OPC_XMA_L_F2
= 0x1d000000000ull
,
284 OPC_XOR_A1
= 0x10078000000ull
,
285 OPC_XOR_A3
= 0x10178000000ull
,
286 OPC_ZXT1_I29
= 0x00080000000ull
,
287 OPC_ZXT2_I29
= 0x00088000000ull
,
288 OPC_ZXT4_I29
= 0x00090000000ull
,
290 INSN_NOP_M
= OPC_NOP_M48
, /* nop.m 0 */
291 INSN_NOP_I
= OPC_NOP_I18
, /* nop.i 0 */
294 static inline uint64_t tcg_opc_a1(int qp
, uint64_t opc
, int r1
,
298 | ((r3
& 0x7f) << 20)
299 | ((r2
& 0x7f) << 13)
304 static inline uint64_t tcg_opc_a3(int qp
, uint64_t opc
, int r1
,
305 uint64_t imm
, int r3
)
308 | ((imm
& 0x80) << 29) /* s */
309 | ((imm
& 0x7f) << 13) /* imm7b */
310 | ((r3
& 0x7f) << 20)
315 static inline uint64_t tcg_opc_a4(int qp
, uint64_t opc
, int r1
,
316 uint64_t imm
, int r3
)
319 | ((imm
& 0x2000) << 23) /* s */
320 | ((imm
& 0x1f80) << 20) /* imm6d */
321 | ((imm
& 0x007f) << 13) /* imm7b */
322 | ((r3
& 0x7f) << 20)
327 static inline uint64_t tcg_opc_a5(int qp
, uint64_t opc
, int r1
,
328 uint64_t imm
, int r3
)
331 | ((imm
& 0x200000) << 15) /* s */
332 | ((imm
& 0x1f0000) << 6) /* imm5c */
333 | ((imm
& 0x00ff80) << 20) /* imm9d */
334 | ((imm
& 0x00007f) << 13) /* imm7b */
335 | ((r3
& 0x03) << 20)
340 static inline uint64_t tcg_opc_a6(int qp
, uint64_t opc
, int p1
,
341 int p2
, int r2
, int r3
)
344 | ((p2
& 0x3f) << 27)
345 | ((r3
& 0x7f) << 20)
346 | ((r2
& 0x7f) << 13)
351 static inline uint64_t tcg_opc_b1(int qp
, uint64_t opc
, uint64_t imm
)
354 | ((imm
& 0x100000) << 16) /* s */
355 | ((imm
& 0x0fffff) << 13) /* imm20b */
359 static inline uint64_t tcg_opc_b4(int qp
, uint64_t opc
, int b2
)
366 static inline uint64_t tcg_opc_b5(int qp
, uint64_t opc
, int b1
, int b2
)
375 static inline uint64_t tcg_opc_b9(int qp
, uint64_t opc
, uint64_t imm
)
378 | ((imm
& 0x100000) << 16) /* i */
379 | ((imm
& 0x0fffff) << 6) /* imm20a */
383 static inline uint64_t tcg_opc_f1(int qp
, uint64_t opc
, int f1
,
384 int f3
, int f4
, int f2
)
387 | ((f4
& 0x7f) << 27)
388 | ((f3
& 0x7f) << 20)
389 | ((f2
& 0x7f) << 13)
394 static inline uint64_t tcg_opc_f2(int qp
, uint64_t opc
, int f1
,
395 int f3
, int f4
, int f2
)
398 | ((f4
& 0x7f) << 27)
399 | ((f3
& 0x7f) << 20)
400 | ((f2
& 0x7f) << 13)
405 static inline uint64_t tcg_opc_f6(int qp
, uint64_t opc
, int f1
,
406 int p2
, int f2
, int f3
)
409 | ((p2
& 0x3f) << 27)
410 | ((f3
& 0x7f) << 20)
411 | ((f2
& 0x7f) << 13)
416 static inline uint64_t tcg_opc_f10(int qp
, uint64_t opc
, int f1
, int f2
)
419 | ((f2
& 0x7f) << 13)
424 static inline uint64_t tcg_opc_f11(int qp
, uint64_t opc
, int f1
, int f2
)
427 | ((f2
& 0x7f) << 13)
432 static inline uint64_t tcg_opc_f16(int qp
, uint64_t opc
, uint64_t imm
)
435 | ((imm
& 0x100000) << 16) /* i */
436 | ((imm
& 0x0fffff) << 6) /* imm20a */
440 static inline uint64_t tcg_opc_i2(int qp
, uint64_t opc
, int r1
,
444 | ((r3
& 0x7f) << 20)
445 | ((r2
& 0x7f) << 13)
450 static inline uint64_t tcg_opc_i3(int qp
, uint64_t opc
, int r1
,
454 | ((mbtype
& 0x0f) << 20)
455 | ((r2
& 0x7f) << 13)
460 static inline uint64_t tcg_opc_i5(int qp
, uint64_t opc
, int r1
,
464 | ((r3
& 0x7f) << 20)
465 | ((r2
& 0x7f) << 13)
470 static inline uint64_t tcg_opc_i7(int qp
, uint64_t opc
, int r1
,
474 | ((r3
& 0x7f) << 20)
475 | ((r2
& 0x7f) << 13)
480 static inline uint64_t tcg_opc_i10(int qp
, uint64_t opc
, int r1
,
481 int r2
, int r3
, uint64_t count
)
484 | ((count
& 0x3f) << 27)
485 | ((r3
& 0x7f) << 20)
486 | ((r2
& 0x7f) << 13)
491 static inline uint64_t tcg_opc_i11(int qp
, uint64_t opc
, int r1
,
492 int r3
, uint64_t pos
, uint64_t len
)
495 | ((len
& 0x3f) << 27)
496 | ((r3
& 0x7f) << 20)
497 | ((pos
& 0x3f) << 14)
502 static inline uint64_t tcg_opc_i12(int qp
, uint64_t opc
, int r1
,
503 int r2
, uint64_t pos
, uint64_t len
)
506 | ((len
& 0x3f) << 27)
507 | ((pos
& 0x3f) << 20)
508 | ((r2
& 0x7f) << 13)
513 static inline uint64_t tcg_opc_i14(int qp
, uint64_t opc
, int r1
, uint64_t imm
,
514 int r3
, uint64_t pos
, uint64_t len
)
517 | ((imm
& 0x01) << 36)
518 | ((len
& 0x3f) << 27)
519 | ((r3
& 0x7f) << 20)
520 | ((pos
& 0x3f) << 14)
525 static inline uint64_t tcg_opc_i15(int qp
, uint64_t opc
, int r1
, int r2
,
526 int r3
, uint64_t pos
, uint64_t len
)
529 | ((pos
& 0x3f) << 31)
530 | ((len
& 0x0f) << 27)
531 | ((r3
& 0x7f) << 20)
532 | ((r2
& 0x7f) << 13)
537 static inline uint64_t tcg_opc_i18(int qp
, uint64_t opc
, uint64_t imm
)
540 | ((imm
& 0x100000) << 16) /* i */
541 | ((imm
& 0x0fffff) << 6) /* imm20a */
545 static inline uint64_t tcg_opc_i21(int qp
, uint64_t opc
, int b1
,
546 int r2
, uint64_t imm
)
549 | ((imm
& 0x1ff) << 24)
550 | ((r2
& 0x7f) << 13)
555 static inline uint64_t tcg_opc_i22(int qp
, uint64_t opc
, int r1
, int b2
)
563 static inline uint64_t tcg_opc_i26(int qp
, uint64_t opc
, int ar3
, int r2
)
566 | ((ar3
& 0x7f) << 20)
567 | ((r2
& 0x7f) << 13)
571 static inline uint64_t tcg_opc_i29(int qp
, uint64_t opc
, int r1
, int r3
)
574 | ((r3
& 0x7f) << 20)
579 static inline uint64_t tcg_opc_l2(uint64_t imm
)
581 return (imm
& 0x7fffffffffc00000ull
) >> 22;
584 static inline uint64_t tcg_opc_l3(uint64_t imm
)
586 return (imm
& 0x07fffffffff00000ull
) >> 18;
589 #define tcg_opc_l4 tcg_opc_l3
591 static inline uint64_t tcg_opc_m1(int qp
, uint64_t opc
, int r1
, int r3
)
594 | ((r3
& 0x7f) << 20)
599 static inline uint64_t tcg_opc_m3(int qp
, uint64_t opc
, int r1
,
600 int r3
, uint64_t imm
)
603 | ((imm
& 0x100) << 28) /* s */
604 | ((imm
& 0x080) << 20) /* i */
605 | ((imm
& 0x07f) << 13) /* imm7b */
606 | ((r3
& 0x7f) << 20)
611 static inline uint64_t tcg_opc_m4(int qp
, uint64_t opc
, int r2
, int r3
)
614 | ((r3
& 0x7f) << 20)
615 | ((r2
& 0x7f) << 13)
619 static inline uint64_t tcg_opc_m18(int qp
, uint64_t opc
, int f1
, int r2
)
622 | ((r2
& 0x7f) << 13)
627 static inline uint64_t tcg_opc_m19(int qp
, uint64_t opc
, int r1
, int f2
)
630 | ((f2
& 0x7f) << 13)
635 static inline uint64_t tcg_opc_m34(int qp
, uint64_t opc
, int r1
,
636 int sof
, int sol
, int sor
)
639 | ((sor
& 0x0f) << 27)
640 | ((sol
& 0x7f) << 20)
641 | ((sof
& 0x7f) << 13)
646 static inline uint64_t tcg_opc_m48(int qp
, uint64_t opc
, uint64_t imm
)
649 | ((imm
& 0x100000) << 16) /* i */
650 | ((imm
& 0x0fffff) << 6) /* imm20a */
654 static inline uint64_t tcg_opc_x2(int qp
, uint64_t opc
,
655 int r1
, uint64_t imm
)
658 | ((imm
& 0x8000000000000000ull
) >> 27) /* i */
659 | (imm
& 0x0000000000200000ull
) /* ic */
660 | ((imm
& 0x00000000001f0000ull
) << 6) /* imm5c */
661 | ((imm
& 0x000000000000ff80ull
) << 20) /* imm9d */
662 | ((imm
& 0x000000000000007full
) << 13) /* imm7b */
667 static inline uint64_t tcg_opc_x3(int qp
, uint64_t opc
, uint64_t imm
)
670 | ((imm
& 0x0800000000000000ull
) >> 23) /* i */
671 | ((imm
& 0x00000000000fffffull
) << 13) /* imm20b */
675 static inline uint64_t tcg_opc_x4(int qp
, uint64_t opc
, int b1
, uint64_t imm
)
678 | ((imm
& 0x0800000000000000ull
) >> 23) /* i */
679 | ((imm
& 0x00000000000fffffull
) << 13) /* imm20b */
689 static inline void reloc_pcrel21b(void *pc
, intptr_t target
)
695 slot
= (intptr_t)pc
& 3;
696 pc
= (void *)((intptr_t)pc
& ~3);
698 disp
= target
- (intptr_t)pc
;
699 imm
= (uint64_t) disp
>> 4;
703 *(uint64_t *)(pc
+ 0) = (*(uint64_t *)(pc
+ 8) & 0xfffffdc00003ffffull
)
704 | ((imm
& 0x100000) << 21) /* s */
705 | ((imm
& 0x0fffff) << 18); /* imm20b */
708 *(uint64_t *)(pc
+ 8) = (*(uint64_t *)(pc
+ 8) & 0xfffffffffffb8000ull
)
709 | ((imm
& 0x100000) >> 2) /* s */
710 | ((imm
& 0x0fffe0) >> 5); /* imm20b */
711 *(uint64_t *)(pc
+ 0) = (*(uint64_t *)(pc
+ 0) & 0x07ffffffffffffffull
)
712 | ((imm
& 0x00001f) << 59); /* imm20b */
715 *(uint64_t *)(pc
+ 8) = (*(uint64_t *)(pc
+ 8) & 0xf700000fffffffffull
)
716 | ((imm
& 0x100000) << 39) /* s */
717 | ((imm
& 0x0fffff) << 36); /* imm20b */
722 static inline uint64_t get_reloc_pcrel21b (void *pc
)
727 slot
= (tcg_target_long
) pc
& 3;
728 pc
= (void *)((tcg_target_long
) pc
& ~3);
730 low
= (*(uint64_t *)(pc
+ 0));
731 high
= (*(uint64_t *)(pc
+ 8));
735 return ((low
>> 21) & 0x100000) + /* s */
736 ((low
>> 18) & 0x0fffff); /* imm20b */
738 return ((high
<< 2) & 0x100000) + /* s */
739 ((high
<< 5) & 0x0fffe0) + /* imm20b */
740 ((low
>> 59) & 0x00001f); /* imm20b */
742 return ((high
>> 39) & 0x100000) + /* s */
743 ((high
>> 36) & 0x0fffff); /* imm20b */
749 static inline void reloc_pcrel60b(void *pc
, intptr_t target
)
754 disp
= target
- (intptr_t)pc
;
755 imm
= (uint64_t) disp
>> 4;
757 *(uint64_t *)(pc
+ 8) = (*(uint64_t *)(pc
+ 8) & 0xf700000fff800000ull
)
758 | (imm
& 0x0800000000000000ull
) /* s */
759 | ((imm
& 0x07fffff000000000ull
) >> 36) /* imm39 */
760 | ((imm
& 0x00000000000fffffull
) << 36); /* imm20b */
761 *(uint64_t *)(pc
+ 0) = (*(uint64_t *)(pc
+ 0) & 0x00003fffffffffffull
)
762 | ((imm
& 0x0000000ffff00000ull
) << 28); /* imm39 */
765 static inline uint64_t get_reloc_pcrel60b (void *pc
)
769 low
= (*(uint64_t *)(pc
+ 0));
770 high
= (*(uint64_t *)(pc
+ 8));
772 return ((high
) & 0x0800000000000000ull
) + /* s */
773 ((high
>> 36) & 0x00000000000fffffull
) + /* imm20b */
774 ((high
<< 36) & 0x07fffff000000000ull
) + /* imm39 */
775 ((low
>> 28) & 0x0000000ffff00000ull
); /* imm39 */
779 static void patch_reloc(uint8_t *code_ptr
, int type
,
780 intptr_t value
, intptr_t addend
)
784 case R_IA64_PCREL21B
:
785 reloc_pcrel21b(code_ptr
, value
);
787 case R_IA64_PCREL60B
:
788 reloc_pcrel60b(code_ptr
, value
);
798 /* parse target specific constraints */
799 static int target_parse_constraint(TCGArgConstraint
*ct
, const char **pct_str
)
806 ct
->ct
|= TCG_CT_REG
;
807 tcg_regset_set(ct
->u
.regs
, 0xffffffffffffffffull
);
810 ct
->ct
|= TCG_CT_CONST_S22
;
813 ct
->ct
|= TCG_CT_REG
;
814 tcg_regset_set(ct
->u
.regs
, 0xffffffffffffffffull
);
815 #if defined(CONFIG_SOFTMMU)
816 tcg_regset_reset_reg(ct
->u
.regs
, TCG_REG_R56
);
817 tcg_regset_reset_reg(ct
->u
.regs
, TCG_REG_R57
);
821 /* We are cheating a bit here, using the fact that the register
822 r0 is also the register number 0. Hence there is no need
823 to check for const_args in each instruction. */
824 ct
->ct
|= TCG_CT_CONST_ZERO
;
834 /* test if a constant matches the constraint */
835 static inline int tcg_target_const_match(tcg_target_long val
,
836 const TCGArgConstraint
*arg_ct
)
840 if (ct
& TCG_CT_CONST
)
842 else if ((ct
& TCG_CT_CONST_ZERO
) && val
== 0)
844 else if ((ct
& TCG_CT_CONST_S22
) && val
== ((int32_t)val
<< 10) >> 10)
854 static uint8_t *tb_ret_addr
;
856 static inline void tcg_out_bundle(TCGContext
*s
, int template,
857 uint64_t slot0
, uint64_t slot1
,
860 template &= 0x1f; /* 5 bits */
861 slot0
&= 0x1ffffffffffull
; /* 41 bits */
862 slot1
&= 0x1ffffffffffull
; /* 41 bits */
863 slot2
&= 0x1ffffffffffull
; /* 41 bits */
865 *(uint64_t *)(s
->code_ptr
+ 0) = (slot1
<< 46) | (slot0
<< 5) | template;
866 *(uint64_t *)(s
->code_ptr
+ 8) = (slot2
<< 23) | (slot1
>> 18);
870 static inline void tcg_out_mov(TCGContext
*s
, TCGType type
,
871 TCGReg ret
, TCGReg arg
)
873 tcg_out_bundle(s
, mmI
,
876 tcg_opc_a4(TCG_REG_P0
, OPC_ADDS_A4
, ret
, 0, arg
));
879 static inline void tcg_out_movi(TCGContext
*s
, TCGType type
,
880 TCGReg reg
, tcg_target_long arg
)
882 tcg_out_bundle(s
, mLX
,
885 tcg_opc_x2 (TCG_REG_P0
, OPC_MOVL_X2
, reg
, arg
));
888 static void tcg_out_br(TCGContext
*s
, int label_index
)
890 TCGLabel
*l
= &s
->labels
[label_index
];
892 /* We pay attention here to not modify the branch target by reading
893 the existing value and using it again. This ensure that caches and
894 memory are kept coherent during retranslation. */
895 tcg_out_bundle(s
, mmB
,
898 tcg_opc_b1 (TCG_REG_P0
, OPC_BR_SPTK_MANY_B1
,
899 get_reloc_pcrel21b(s
->code_ptr
+ 2)));
902 reloc_pcrel21b((s
->code_ptr
- 16) + 2, l
->u
.value
);
904 tcg_out_reloc(s
, (s
->code_ptr
- 16) + 2,
905 R_IA64_PCREL21B
, label_index
, 0);
909 static inline void tcg_out_calli(TCGContext
*s
, uintptr_t addr
)
911 /* Look through the function descriptor. */
912 uintptr_t disp
, *desc
= (uintptr_t *)addr
;
913 tcg_out_bundle(s
, mlx
,
915 tcg_opc_l2 (desc
[1]),
916 tcg_opc_x2 (TCG_REG_P0
, OPC_MOVL_X2
, TCG_REG_R1
, desc
[1]));
917 disp
= (desc
[0] - (uintptr_t)s
->code_ptr
) >> 4;
918 tcg_out_bundle(s
, mLX
,
921 tcg_opc_x4 (TCG_REG_P0
, OPC_BRL_CALL_SPTK_MANY_X4
,
925 static inline void tcg_out_callr(TCGContext
*s
, TCGReg addr
)
927 tcg_out_bundle(s
, MmI
,
928 tcg_opc_m1 (TCG_REG_P0
, OPC_LD8_M1
, TCG_REG_R2
, addr
),
929 tcg_opc_a4 (TCG_REG_P0
, OPC_ADDS_A4
, TCG_REG_R3
, 8, addr
),
930 tcg_opc_i21(TCG_REG_P0
, OPC_MOV_I21
,
931 TCG_REG_B6
, TCG_REG_R2
, 0));
932 tcg_out_bundle(s
, mmB
,
933 tcg_opc_m1 (TCG_REG_P0
, OPC_LD8_M1
, TCG_REG_R1
, TCG_REG_R3
),
935 tcg_opc_b5 (TCG_REG_P0
, OPC_BR_CALL_SPTK_MANY_B5
,
936 TCG_REG_B0
, TCG_REG_B6
));
939 static void tcg_out_exit_tb(TCGContext
*s
, tcg_target_long arg
)
944 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_REG_R8
, arg
);
946 disp
= tb_ret_addr
- s
->code_ptr
;
947 imm
= (uint64_t)disp
>> 4;
949 tcg_out_bundle(s
, mLX
,
952 tcg_opc_x3 (TCG_REG_P0
, OPC_BRL_SPTK_MANY_X3
, imm
));
955 static inline void tcg_out_goto_tb(TCGContext
*s
, TCGArg arg
)
957 if (s
->tb_jmp_offset
) {
958 /* direct jump method */
961 /* indirect jump method */
962 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_REG_R2
,
963 (tcg_target_long
)(s
->tb_next
+ arg
));
964 tcg_out_bundle(s
, MmI
,
965 tcg_opc_m1 (TCG_REG_P0
, OPC_LD8_M1
,
966 TCG_REG_R2
, TCG_REG_R2
),
968 tcg_opc_i21(TCG_REG_P0
, OPC_MOV_I21
, TCG_REG_B6
,
970 tcg_out_bundle(s
, mmB
,
973 tcg_opc_b4 (TCG_REG_P0
, OPC_BR_SPTK_MANY_B4
,
976 s
->tb_next_offset
[arg
] = s
->code_ptr
- s
->code_buf
;
979 static inline void tcg_out_jmp(TCGContext
*s
, TCGArg addr
)
981 tcg_out_bundle(s
, mmI
,
984 tcg_opc_i21(TCG_REG_P0
, OPC_MOV_I21
, TCG_REG_B6
, addr
, 0));
985 tcg_out_bundle(s
, mmB
,
988 tcg_opc_b4(TCG_REG_P0
, OPC_BR_SPTK_MANY_B4
, TCG_REG_B6
));
991 static inline void tcg_out_ld_rel(TCGContext
*s
, uint64_t opc_m4
, TCGArg arg
,
992 TCGArg arg1
, tcg_target_long arg2
)
994 if (arg2
== ((int16_t)arg2
>> 2) << 2) {
995 tcg_out_bundle(s
, MmI
,
996 tcg_opc_a4(TCG_REG_P0
, OPC_ADDS_A4
,
997 TCG_REG_R2
, arg2
, arg1
),
998 tcg_opc_m1 (TCG_REG_P0
, opc_m4
, arg
, TCG_REG_R2
),
1001 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_REG_R2
, arg2
);
1002 tcg_out_bundle(s
, MmI
,
1003 tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
,
1004 TCG_REG_R2
, TCG_REG_R2
, arg1
),
1005 tcg_opc_m1 (TCG_REG_P0
, opc_m4
, arg
, TCG_REG_R2
),
1010 static inline void tcg_out_st_rel(TCGContext
*s
, uint64_t opc_m4
, TCGArg arg
,
1011 TCGArg arg1
, tcg_target_long arg2
)
1013 if (arg2
== ((int16_t)arg2
>> 2) << 2) {
1014 tcg_out_bundle(s
, MmI
,
1015 tcg_opc_a4(TCG_REG_P0
, OPC_ADDS_A4
,
1016 TCG_REG_R2
, arg2
, arg1
),
1017 tcg_opc_m4 (TCG_REG_P0
, opc_m4
, arg
, TCG_REG_R2
),
1020 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_REG_R2
, arg2
);
1021 tcg_out_bundle(s
, MmI
,
1022 tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
,
1023 TCG_REG_R2
, TCG_REG_R2
, arg1
),
1024 tcg_opc_m4 (TCG_REG_P0
, opc_m4
, arg
, TCG_REG_R2
),
1029 static inline void tcg_out_ld(TCGContext
*s
, TCGType type
, TCGReg arg
,
1030 TCGReg arg1
, intptr_t arg2
)
1032 if (type
== TCG_TYPE_I32
) {
1033 tcg_out_ld_rel(s
, OPC_LD4_M1
, arg
, arg1
, arg2
);
1035 tcg_out_ld_rel(s
, OPC_LD8_M1
, arg
, arg1
, arg2
);
1039 static inline void tcg_out_st(TCGContext
*s
, TCGType type
, TCGReg arg
,
1040 TCGReg arg1
, intptr_t arg2
)
1042 if (type
== TCG_TYPE_I32
) {
1043 tcg_out_st_rel(s
, OPC_ST4_M4
, arg
, arg1
, arg2
);
1045 tcg_out_st_rel(s
, OPC_ST8_M4
, arg
, arg1
, arg2
);
1049 static inline void tcg_out_alu(TCGContext
*s
, uint64_t opc_a1
, uint64_t opc_a3
,
1050 TCGReg ret
, TCGArg arg1
, int const_arg1
,
1051 TCGArg arg2
, int const_arg2
)
1053 uint64_t opc1
= 0, opc2
= 0, opc3
= 0;
1055 if (const_arg2
&& arg2
!= 0) {
1056 opc2
= tcg_opc_a5(TCG_REG_P0
, OPC_ADDL_A5
,
1057 TCG_REG_R3
, arg2
, TCG_REG_R0
);
1060 if (const_arg1
&& arg1
!= 0) {
1061 if (opc_a3
&& arg1
== (int8_t)arg1
) {
1062 opc3
= tcg_opc_a3(TCG_REG_P0
, opc_a3
, ret
, arg1
, arg2
);
1064 opc1
= tcg_opc_a5(TCG_REG_P0
, OPC_ADDL_A5
,
1065 TCG_REG_R2
, arg1
, TCG_REG_R0
);
1070 opc3
= tcg_opc_a1(TCG_REG_P0
, opc_a1
, ret
, arg1
, arg2
);
1073 tcg_out_bundle(s
, (opc1
|| opc2
? mII
: miI
),
1074 opc1
? opc1
: INSN_NOP_M
,
1075 opc2
? opc2
: INSN_NOP_I
,
1079 static inline void tcg_out_add(TCGContext
*s
, TCGReg ret
, TCGReg arg1
,
1080 TCGArg arg2
, int const_arg2
)
1082 if (const_arg2
&& arg2
== sextract64(arg2
, 0, 14)) {
1083 tcg_out_bundle(s
, mmI
,
1086 tcg_opc_a4(TCG_REG_P0
, OPC_ADDS_A4
, ret
, arg2
, arg1
));
1088 tcg_out_alu(s
, OPC_ADD_A1
, 0, ret
, arg1
, 0, arg2
, const_arg2
);
1092 static inline void tcg_out_sub(TCGContext
*s
, TCGReg ret
, TCGArg arg1
,
1093 int const_arg1
, TCGArg arg2
, int const_arg2
)
1095 if (!const_arg1
&& const_arg2
&& -arg2
== sextract64(-arg2
, 0, 14)) {
1096 tcg_out_bundle(s
, mmI
,
1099 tcg_opc_a4(TCG_REG_P0
, OPC_ADDS_A4
, ret
, -arg2
, arg1
));
1101 tcg_out_alu(s
, OPC_SUB_A1
, OPC_SUB_A3
, ret
,
1102 arg1
, const_arg1
, arg2
, const_arg2
);
1106 static inline void tcg_out_eqv(TCGContext
*s
, TCGArg ret
,
1107 TCGArg arg1
, int const_arg1
,
1108 TCGArg arg2
, int const_arg2
)
1110 tcg_out_bundle(s
, mII
,
1112 tcg_opc_a1 (TCG_REG_P0
, OPC_XOR_A1
, ret
, arg1
, arg2
),
1113 tcg_opc_a3 (TCG_REG_P0
, OPC_ANDCM_A3
, ret
, -1, ret
));
1116 static inline void tcg_out_nand(TCGContext
*s
, TCGArg ret
,
1117 TCGArg arg1
, int const_arg1
,
1118 TCGArg arg2
, int const_arg2
)
1120 tcg_out_bundle(s
, mII
,
1122 tcg_opc_a1 (TCG_REG_P0
, OPC_AND_A1
, ret
, arg1
, arg2
),
1123 tcg_opc_a3 (TCG_REG_P0
, OPC_ANDCM_A3
, ret
, -1, ret
));
1126 static inline void tcg_out_nor(TCGContext
*s
, TCGArg ret
,
1127 TCGArg arg1
, int const_arg1
,
1128 TCGArg arg2
, int const_arg2
)
1130 tcg_out_bundle(s
, mII
,
1132 tcg_opc_a1 (TCG_REG_P0
, OPC_OR_A1
, ret
, arg1
, arg2
),
1133 tcg_opc_a3 (TCG_REG_P0
, OPC_ANDCM_A3
, ret
, -1, ret
));
1136 static inline void tcg_out_orc(TCGContext
*s
, TCGArg ret
,
1137 TCGArg arg1
, int const_arg1
,
1138 TCGArg arg2
, int const_arg2
)
1140 tcg_out_bundle(s
, mII
,
1142 tcg_opc_a3 (TCG_REG_P0
, OPC_ANDCM_A3
, TCG_REG_R2
, -1, arg2
),
1143 tcg_opc_a1 (TCG_REG_P0
, OPC_OR_A1
, ret
, arg1
, TCG_REG_R2
));
1146 static inline void tcg_out_mul(TCGContext
*s
, TCGArg ret
,
1147 TCGArg arg1
, TCGArg arg2
)
1149 tcg_out_bundle(s
, mmI
,
1150 tcg_opc_m18(TCG_REG_P0
, OPC_SETF_SIG_M18
, TCG_REG_F6
, arg1
),
1151 tcg_opc_m18(TCG_REG_P0
, OPC_SETF_SIG_M18
, TCG_REG_F7
, arg2
),
1153 tcg_out_bundle(s
, mmF
,
1156 tcg_opc_f2 (TCG_REG_P0
, OPC_XMA_L_F2
, TCG_REG_F6
, TCG_REG_F6
,
1157 TCG_REG_F7
, TCG_REG_F0
));
1158 tcg_out_bundle(s
, miI
,
1159 tcg_opc_m19(TCG_REG_P0
, OPC_GETF_SIG_M19
, ret
, TCG_REG_F6
),
1164 static inline void tcg_out_sar_i32(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1165 TCGArg arg2
, int const_arg2
)
1168 tcg_out_bundle(s
, miI
,
1171 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_I11
,
1172 ret
, arg1
, arg2
, 31 - arg2
));
1174 tcg_out_bundle(s
, mII
,
1175 tcg_opc_a3 (TCG_REG_P0
, OPC_AND_A3
,
1176 TCG_REG_R3
, 0x1f, arg2
),
1177 tcg_opc_i29(TCG_REG_P0
, OPC_SXT4_I29
, TCG_REG_R2
, arg1
),
1178 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_I5
, ret
,
1179 TCG_REG_R2
, TCG_REG_R3
));
1183 static inline void tcg_out_sar_i64(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1184 TCGArg arg2
, int const_arg2
)
1187 tcg_out_bundle(s
, miI
,
1190 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_I11
,
1191 ret
, arg1
, arg2
, 63 - arg2
));
1193 tcg_out_bundle(s
, miI
,
1196 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_I5
, ret
, arg1
, arg2
));
1200 static inline void tcg_out_shl_i32(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1201 TCGArg arg2
, int const_arg2
)
1204 tcg_out_bundle(s
, miI
,
1207 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
, ret
,
1208 arg1
, 63 - arg2
, 31 - arg2
));
1210 tcg_out_bundle(s
, mII
,
1212 tcg_opc_a3 (TCG_REG_P0
, OPC_AND_A3
, TCG_REG_R2
,
1214 tcg_opc_i7 (TCG_REG_P0
, OPC_SHL_I7
, ret
,
1219 static inline void tcg_out_shl_i64(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1220 TCGArg arg2
, int const_arg2
)
1223 tcg_out_bundle(s
, miI
,
1226 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
, ret
,
1227 arg1
, 63 - arg2
, 63 - arg2
));
1229 tcg_out_bundle(s
, miI
,
1232 tcg_opc_i7 (TCG_REG_P0
, OPC_SHL_I7
, ret
,
1237 static inline void tcg_out_shr_i32(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1238 TCGArg arg2
, int const_arg2
)
1241 tcg_out_bundle(s
, miI
,
1244 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_U_I11
, ret
,
1245 arg1
, arg2
, 31 - arg2
));
1247 tcg_out_bundle(s
, mII
,
1248 tcg_opc_a3 (TCG_REG_P0
, OPC_AND_A3
, TCG_REG_R3
,
1250 tcg_opc_i29(TCG_REG_P0
, OPC_ZXT4_I29
, TCG_REG_R2
, arg1
),
1251 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_U_I5
, ret
,
1252 TCG_REG_R2
, TCG_REG_R3
));
1256 static inline void tcg_out_shr_i64(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1257 TCGArg arg2
, int const_arg2
)
1260 tcg_out_bundle(s
, miI
,
1263 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_U_I11
, ret
,
1264 arg1
, arg2
, 63 - arg2
));
1266 tcg_out_bundle(s
, miI
,
1269 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_U_I5
, ret
,
1274 static inline void tcg_out_rotl_i32(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1275 TCGArg arg2
, int const_arg2
)
1278 tcg_out_bundle(s
, mII
,
1280 tcg_opc_i2 (TCG_REG_P0
, OPC_UNPACK4_L_I2
,
1281 TCG_REG_R2
, arg1
, arg1
),
1282 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_U_I11
, ret
,
1283 TCG_REG_R2
, 32 - arg2
, 31));
1285 tcg_out_bundle(s
, miI
,
1287 tcg_opc_i2 (TCG_REG_P0
, OPC_UNPACK4_L_I2
,
1288 TCG_REG_R2
, arg1
, arg1
),
1289 tcg_opc_a3 (TCG_REG_P0
, OPC_AND_A3
, TCG_REG_R3
,
1291 tcg_out_bundle(s
, mII
,
1293 tcg_opc_a3 (TCG_REG_P0
, OPC_SUB_A3
, TCG_REG_R3
,
1295 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_U_I5
, ret
,
1296 TCG_REG_R2
, TCG_REG_R3
));
1300 static inline void tcg_out_rotl_i64(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1301 TCGArg arg2
, int const_arg2
)
1304 tcg_out_bundle(s
, miI
,
1307 tcg_opc_i10(TCG_REG_P0
, OPC_SHRP_I10
, ret
, arg1
,
1308 arg1
, 0x40 - arg2
));
1310 tcg_out_bundle(s
, mII
,
1311 tcg_opc_a3 (TCG_REG_P0
, OPC_SUB_A3
, TCG_REG_R2
,
1313 tcg_opc_i7 (TCG_REG_P0
, OPC_SHL_I7
, TCG_REG_R3
,
1315 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_U_I5
, TCG_REG_R2
,
1317 tcg_out_bundle(s
, miI
,
1320 tcg_opc_a1 (TCG_REG_P0
, OPC_OR_A1
, ret
,
1321 TCG_REG_R2
, TCG_REG_R3
));
1325 static inline void tcg_out_rotr_i32(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1326 TCGArg arg2
, int const_arg2
)
1329 tcg_out_bundle(s
, mII
,
1331 tcg_opc_i2 (TCG_REG_P0
, OPC_UNPACK4_L_I2
,
1332 TCG_REG_R2
, arg1
, arg1
),
1333 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_U_I11
, ret
,
1334 TCG_REG_R2
, arg2
, 31));
1336 tcg_out_bundle(s
, mII
,
1337 tcg_opc_a3 (TCG_REG_P0
, OPC_AND_A3
, TCG_REG_R3
,
1339 tcg_opc_i2 (TCG_REG_P0
, OPC_UNPACK4_L_I2
,
1340 TCG_REG_R2
, arg1
, arg1
),
1341 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_U_I5
, ret
,
1342 TCG_REG_R2
, TCG_REG_R3
));
1346 static inline void tcg_out_rotr_i64(TCGContext
*s
, TCGArg ret
, TCGArg arg1
,
1347 TCGArg arg2
, int const_arg2
)
1350 tcg_out_bundle(s
, miI
,
1353 tcg_opc_i10(TCG_REG_P0
, OPC_SHRP_I10
, ret
, arg1
,
1356 tcg_out_bundle(s
, mII
,
1357 tcg_opc_a3 (TCG_REG_P0
, OPC_SUB_A3
, TCG_REG_R2
,
1359 tcg_opc_i5 (TCG_REG_P0
, OPC_SHR_U_I5
, TCG_REG_R3
,
1361 tcg_opc_i7 (TCG_REG_P0
, OPC_SHL_I7
, TCG_REG_R2
,
1363 tcg_out_bundle(s
, miI
,
1366 tcg_opc_a1 (TCG_REG_P0
, OPC_OR_A1
, ret
,
1367 TCG_REG_R2
, TCG_REG_R3
));
1371 static inline void tcg_out_ext(TCGContext
*s
, uint64_t opc_i29
,
1372 TCGArg ret
, TCGArg arg
)
1374 tcg_out_bundle(s
, miI
,
1377 tcg_opc_i29(TCG_REG_P0
, opc_i29
, ret
, arg
));
1380 static inline void tcg_out_bswap16(TCGContext
*s
, TCGArg ret
, TCGArg arg
)
1382 tcg_out_bundle(s
, mII
,
1384 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
, ret
, arg
, 15, 15),
1385 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
, ret
, ret
, 0xb));
1388 static inline void tcg_out_bswap32(TCGContext
*s
, TCGArg ret
, TCGArg arg
)
1390 tcg_out_bundle(s
, mII
,
1392 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
, ret
, arg
, 31, 31),
1393 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
, ret
, ret
, 0xb));
1396 static inline void tcg_out_bswap64(TCGContext
*s
, TCGArg ret
, TCGArg arg
)
1398 tcg_out_bundle(s
, miI
,
1401 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
, ret
, arg
, 0xb));
1404 static inline void tcg_out_deposit(TCGContext
*s
, TCGArg ret
, TCGArg a1
,
1405 TCGArg a2
, int const_a2
, int pos
, int len
)
1407 uint64_t i1
= 0, i2
= 0;
1408 int cpos
= 63 - pos
, lm1
= len
- 1;
1411 /* Truncate the value of a constant a2 to the width of the field. */
1412 int mask
= (1u << len
) - 1;
1415 if (a2
== 0 || a2
== mask
) {
1416 /* 1-bit signed constant inserted into register. */
1417 i2
= tcg_opc_i14(TCG_REG_P0
, OPC_DEP_I14
, ret
, a2
, a1
, cpos
, lm1
);
1419 /* Otherwise, load any constant into a temporary. Do this into
1420 the first I slot to help out with cross-unit delays. */
1421 i1
= tcg_opc_a5(TCG_REG_P0
, OPC_ADDL_A5
,
1422 TCG_REG_R2
, a2
, TCG_REG_R0
);
1427 i2
= tcg_opc_i15(TCG_REG_P0
, OPC_DEP_I15
, ret
, a2
, a1
, cpos
, lm1
);
1429 tcg_out_bundle(s
, (i1
? mII
: miI
),
1431 i1
? i1
: INSN_NOP_I
,
1435 static inline uint64_t tcg_opc_cmp_a(int qp
, TCGCond cond
, TCGArg arg1
,
1436 TCGArg arg2
, int cmp4
)
1438 uint64_t opc_eq_a6
, opc_lt_a6
, opc_ltu_a6
;
1441 opc_eq_a6
= OPC_CMP4_EQ_A6
;
1442 opc_lt_a6
= OPC_CMP4_LT_A6
;
1443 opc_ltu_a6
= OPC_CMP4_LTU_A6
;
1445 opc_eq_a6
= OPC_CMP_EQ_A6
;
1446 opc_lt_a6
= OPC_CMP_LT_A6
;
1447 opc_ltu_a6
= OPC_CMP_LTU_A6
;
1452 return tcg_opc_a6 (qp
, opc_eq_a6
, TCG_REG_P6
, TCG_REG_P7
, arg1
, arg2
);
1454 return tcg_opc_a6 (qp
, opc_eq_a6
, TCG_REG_P7
, TCG_REG_P6
, arg1
, arg2
);
1456 return tcg_opc_a6 (qp
, opc_lt_a6
, TCG_REG_P6
, TCG_REG_P7
, arg1
, arg2
);
1458 return tcg_opc_a6 (qp
, opc_ltu_a6
, TCG_REG_P6
, TCG_REG_P7
, arg1
, arg2
);
1460 return tcg_opc_a6 (qp
, opc_lt_a6
, TCG_REG_P7
, TCG_REG_P6
, arg1
, arg2
);
1462 return tcg_opc_a6 (qp
, opc_ltu_a6
, TCG_REG_P7
, TCG_REG_P6
, arg1
, arg2
);
1464 return tcg_opc_a6 (qp
, opc_lt_a6
, TCG_REG_P7
, TCG_REG_P6
, arg2
, arg1
);
1466 return tcg_opc_a6 (qp
, opc_ltu_a6
, TCG_REG_P7
, TCG_REG_P6
, arg2
, arg1
);
1468 return tcg_opc_a6 (qp
, opc_lt_a6
, TCG_REG_P6
, TCG_REG_P7
, arg2
, arg1
);
1470 return tcg_opc_a6 (qp
, opc_ltu_a6
, TCG_REG_P6
, TCG_REG_P7
, arg2
, arg1
);
1477 static inline void tcg_out_brcond(TCGContext
*s
, TCGCond cond
, TCGReg arg1
,
1478 TCGReg arg2
, int label_index
, int cmp4
)
1480 TCGLabel
*l
= &s
->labels
[label_index
];
1482 tcg_out_bundle(s
, miB
,
1484 tcg_opc_cmp_a(TCG_REG_P0
, cond
, arg1
, arg2
, cmp4
),
1485 tcg_opc_b1(TCG_REG_P6
, OPC_BR_DPTK_FEW_B1
,
1486 get_reloc_pcrel21b(s
->code_ptr
+ 2)));
1489 reloc_pcrel21b((s
->code_ptr
- 16) + 2, l
->u
.value
);
1491 tcg_out_reloc(s
, (s
->code_ptr
- 16) + 2,
1492 R_IA64_PCREL21B
, label_index
, 0);
1496 static inline void tcg_out_setcond(TCGContext
*s
, TCGCond cond
, TCGArg ret
,
1497 TCGArg arg1
, TCGArg arg2
, int cmp4
)
1499 tcg_out_bundle(s
, MmI
,
1500 tcg_opc_cmp_a(TCG_REG_P0
, cond
, arg1
, arg2
, cmp4
),
1501 tcg_opc_a5(TCG_REG_P6
, OPC_ADDL_A5
, ret
, 1, TCG_REG_R0
),
1502 tcg_opc_a5(TCG_REG_P7
, OPC_ADDL_A5
, ret
, 0, TCG_REG_R0
));
1505 static inline void tcg_out_movcond(TCGContext
*s
, TCGCond cond
, TCGArg ret
,
1506 TCGArg c1
, TCGArg c2
,
1507 TCGArg v1
, int const_v1
,
1508 TCGArg v2
, int const_v2
, int cmp4
)
1510 uint64_t opc1
, opc2
;
1513 opc1
= tcg_opc_a5(TCG_REG_P6
, OPC_ADDL_A5
, ret
, v1
, TCG_REG_R0
);
1514 } else if (ret
== v1
) {
1517 opc1
= tcg_opc_a4(TCG_REG_P6
, OPC_ADDS_A4
, ret
, 0, v1
);
1520 opc2
= tcg_opc_a5(TCG_REG_P7
, OPC_ADDL_A5
, ret
, v2
, TCG_REG_R0
);
1521 } else if (ret
== v2
) {
1524 opc2
= tcg_opc_a4(TCG_REG_P7
, OPC_ADDS_A4
, ret
, 0, v2
);
1527 tcg_out_bundle(s
, MmI
,
1528 tcg_opc_cmp_a(TCG_REG_P0
, cond
, c1
, c2
, cmp4
),
1533 #if defined(CONFIG_SOFTMMU)
1534 /* Load and compare a TLB entry, and return the result in (p6, p7).
1535 R2 is loaded with the address of the addend TLB entry.
1536 R57 is loaded with the address, zero extented on 32-bit targets. */
1537 static inline void tcg_out_qemu_tlb(TCGContext
*s
, TCGArg addr_reg
,
1538 TCGMemOp s_bits
, uint64_t offset_rw
,
1539 uint64_t offset_addend
)
1541 tcg_out_bundle(s
, mII
,
1543 tcg_opc_i11(TCG_REG_P0
, OPC_EXTR_U_I11
, TCG_REG_R2
,
1544 addr_reg
, TARGET_PAGE_BITS
, CPU_TLB_BITS
- 1),
1545 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
, TCG_REG_R2
,
1546 TCG_REG_R2
, 63 - CPU_TLB_ENTRY_BITS
,
1547 63 - CPU_TLB_ENTRY_BITS
));
1548 tcg_out_bundle(s
, mII
,
1549 tcg_opc_a5 (TCG_REG_P0
, OPC_ADDL_A5
, TCG_REG_R2
,
1550 offset_rw
, TCG_REG_R2
),
1551 #if TARGET_LONG_BITS == 32
1552 tcg_opc_i29(TCG_REG_P0
, OPC_ZXT4_I29
, TCG_REG_R57
, addr_reg
),
1554 tcg_opc_a4(TCG_REG_P0
, OPC_ADDS_A4
, TCG_REG_R57
,
1557 tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
, TCG_REG_R2
,
1558 TCG_REG_R2
, TCG_AREG0
));
1559 tcg_out_bundle(s
, mII
,
1560 tcg_opc_m3 (TCG_REG_P0
,
1561 (TARGET_LONG_BITS
== 32
1562 ? OPC_LD4_M3
: OPC_LD8_M3
), TCG_REG_R56
,
1563 TCG_REG_R2
, offset_addend
- offset_rw
),
1564 tcg_opc_i14(TCG_REG_P0
, OPC_DEP_I14
, TCG_REG_R3
, 0,
1565 TCG_REG_R57
, 63 - s_bits
,
1566 TARGET_PAGE_BITS
- s_bits
- 1),
1567 tcg_opc_a6 (TCG_REG_P0
, OPC_CMP_EQ_A6
, TCG_REG_P6
,
1568 TCG_REG_P7
, TCG_REG_R3
, TCG_REG_R56
));
1571 /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr,
1573 static const void * const qemu_ld_helpers
[4] = {
1580 static inline void tcg_out_qemu_ld(TCGContext
*s
, const TCGArg
*args
,
1583 static const uint64_t opc_ld_m1
[4] = {
1584 OPC_LD1_M1
, OPC_LD2_M1
, OPC_LD4_M1
, OPC_LD8_M1
1586 static const uint64_t opc_ext_i29
[8] = {
1587 OPC_ZXT1_I29
, OPC_ZXT2_I29
, OPC_ZXT4_I29
, 0,
1588 OPC_SXT1_I29
, OPC_SXT2_I29
, OPC_SXT4_I29
, 0
1590 int addr_reg
, data_reg
, mem_index
;
1591 TCGMemOp s_bits
, bswap
;
1596 s_bits
= opc
& MO_SIZE
;
1597 bswap
= opc
& MO_BSWAP
;
1599 /* Read the TLB entry */
1600 tcg_out_qemu_tlb(s
, addr_reg
, s_bits
,
1601 offsetof(CPUArchState
, tlb_table
[mem_index
][0].addr_read
),
1602 offsetof(CPUArchState
, tlb_table
[mem_index
][0].addend
));
1604 /* P6 is the fast path, and P7 the slow path */
1605 tcg_out_bundle(s
, mLX
,
1606 tcg_opc_a4 (TCG_REG_P7
, OPC_ADDS_A4
,
1607 TCG_REG_R56
, 0, TCG_AREG0
),
1608 tcg_opc_l2 ((tcg_target_long
) qemu_ld_helpers
[s_bits
]),
1609 tcg_opc_x2 (TCG_REG_P7
, OPC_MOVL_X2
, TCG_REG_R2
,
1610 (tcg_target_long
) qemu_ld_helpers
[s_bits
]));
1611 tcg_out_bundle(s
, MmI
,
1612 tcg_opc_m3 (TCG_REG_P0
, OPC_LD8_M3
, TCG_REG_R3
,
1614 tcg_opc_a1 (TCG_REG_P6
, OPC_ADD_A1
, TCG_REG_R3
,
1615 TCG_REG_R3
, TCG_REG_R57
),
1616 tcg_opc_i21(TCG_REG_P7
, OPC_MOV_I21
, TCG_REG_B6
,
1618 if (bswap
&& s_bits
== MO_16
) {
1619 tcg_out_bundle(s
, MmI
,
1620 tcg_opc_m1 (TCG_REG_P6
, opc_ld_m1
[s_bits
],
1621 TCG_REG_R8
, TCG_REG_R3
),
1622 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
, TCG_REG_R1
, TCG_REG_R2
),
1623 tcg_opc_i12(TCG_REG_P6
, OPC_DEP_Z_I12
,
1624 TCG_REG_R8
, TCG_REG_R8
, 15, 15));
1625 } else if (bswap
&& s_bits
== MO_32
) {
1626 tcg_out_bundle(s
, MmI
,
1627 tcg_opc_m1 (TCG_REG_P6
, opc_ld_m1
[s_bits
],
1628 TCG_REG_R8
, TCG_REG_R3
),
1629 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
, TCG_REG_R1
, TCG_REG_R2
),
1630 tcg_opc_i12(TCG_REG_P6
, OPC_DEP_Z_I12
,
1631 TCG_REG_R8
, TCG_REG_R8
, 31, 31));
1633 tcg_out_bundle(s
, mmI
,
1634 tcg_opc_m1 (TCG_REG_P6
, opc_ld_m1
[s_bits
],
1635 TCG_REG_R8
, TCG_REG_R3
),
1636 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
, TCG_REG_R1
, TCG_REG_R2
),
1640 tcg_out_bundle(s
, miB
,
1641 tcg_opc_a5 (TCG_REG_P7
, OPC_ADDL_A5
, TCG_REG_R58
,
1642 mem_index
, TCG_REG_R0
),
1644 tcg_opc_b5 (TCG_REG_P7
, OPC_BR_CALL_SPTK_MANY_B5
,
1645 TCG_REG_B0
, TCG_REG_B6
));
1647 tcg_out_bundle(s
, miB
,
1648 tcg_opc_a5 (TCG_REG_P7
, OPC_ADDL_A5
, TCG_REG_R58
,
1649 mem_index
, TCG_REG_R0
),
1650 tcg_opc_i3 (TCG_REG_P6
, OPC_MUX1_I3
,
1651 TCG_REG_R8
, TCG_REG_R8
, 0xb),
1652 tcg_opc_b5 (TCG_REG_P7
, OPC_BR_CALL_SPTK_MANY_B5
,
1653 TCG_REG_B0
, TCG_REG_B6
));
1656 if (s_bits
== MO_64
) {
1657 tcg_out_bundle(s
, miI
,
1660 tcg_opc_a4 (TCG_REG_P0
, OPC_ADDS_A4
,
1661 data_reg
, 0, TCG_REG_R8
));
1663 tcg_out_bundle(s
, miI
,
1666 tcg_opc_i29(TCG_REG_P0
, opc_ext_i29
[opc
& MO_SSIZE
],
1667 data_reg
, TCG_REG_R8
));
1671 /* helper signature: helper_st_mmu(CPUState *env, target_ulong addr,
1672 uintxx_t val, int mmu_idx) */
1673 static const void * const qemu_st_helpers
[4] = {
1680 static inline void tcg_out_qemu_st(TCGContext
*s
, const TCGArg
*args
,
1683 static const uint64_t opc_st_m4
[4] = {
1684 OPC_ST1_M4
, OPC_ST2_M4
, OPC_ST4_M4
, OPC_ST8_M4
1686 int addr_reg
, data_reg
, mem_index
;
1692 s_bits
= opc
& MO_SIZE
;
1694 tcg_out_qemu_tlb(s
, addr_reg
, s_bits
,
1695 offsetof(CPUArchState
, tlb_table
[mem_index
][0].addr_write
),
1696 offsetof(CPUArchState
, tlb_table
[mem_index
][0].addend
));
1698 /* P6 is the fast path, and P7 the slow path */
1699 tcg_out_bundle(s
, mLX
,
1700 tcg_opc_a4 (TCG_REG_P7
, OPC_ADDS_A4
,
1701 TCG_REG_R56
, 0, TCG_AREG0
),
1702 tcg_opc_l2 ((tcg_target_long
) qemu_st_helpers
[s_bits
]),
1703 tcg_opc_x2 (TCG_REG_P7
, OPC_MOVL_X2
, TCG_REG_R2
,
1704 (tcg_target_long
) qemu_st_helpers
[s_bits
]));
1705 tcg_out_bundle(s
, MmI
,
1706 tcg_opc_m3 (TCG_REG_P0
, OPC_LD8_M3
, TCG_REG_R3
,
1708 tcg_opc_a1 (TCG_REG_P6
, OPC_ADD_A1
, TCG_REG_R3
,
1709 TCG_REG_R3
, TCG_REG_R57
),
1710 tcg_opc_i21(TCG_REG_P7
, OPC_MOV_I21
, TCG_REG_B6
,
1718 tcg_out_bundle(s
, mii
,
1719 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
,
1720 TCG_REG_R1
, TCG_REG_R2
),
1721 tcg_opc_a4 (TCG_REG_P7
, OPC_ADDS_A4
, TCG_REG_R58
,
1726 case MO_16
| MO_BSWAP
:
1727 tcg_out_bundle(s
, miI
,
1728 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
,
1729 TCG_REG_R1
, TCG_REG_R2
),
1731 tcg_opc_i12(TCG_REG_P6
, OPC_DEP_Z_I12
,
1732 TCG_REG_R2
, data_reg
, 15, 15));
1733 tcg_out_bundle(s
, miI
,
1734 tcg_opc_a4 (TCG_REG_P7
, OPC_ADDS_A4
, TCG_REG_R58
,
1737 tcg_opc_i3 (TCG_REG_P6
, OPC_MUX1_I3
,
1738 TCG_REG_R2
, TCG_REG_R2
, 0xb));
1739 data_reg
= TCG_REG_R2
;
1742 case MO_32
| MO_BSWAP
:
1743 tcg_out_bundle(s
, miI
,
1744 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
,
1745 TCG_REG_R1
, TCG_REG_R2
),
1747 tcg_opc_i12(TCG_REG_P6
, OPC_DEP_Z_I12
,
1748 TCG_REG_R2
, data_reg
, 31, 31));
1749 tcg_out_bundle(s
, miI
,
1750 tcg_opc_a4 (TCG_REG_P7
, OPC_ADDS_A4
, TCG_REG_R58
,
1753 tcg_opc_i3 (TCG_REG_P6
, OPC_MUX1_I3
,
1754 TCG_REG_R2
, TCG_REG_R2
, 0xb));
1755 data_reg
= TCG_REG_R2
;
1758 case MO_64
| MO_BSWAP
:
1759 tcg_out_bundle(s
, miI
,
1760 tcg_opc_m1 (TCG_REG_P7
, OPC_LD8_M1
,
1761 TCG_REG_R1
, TCG_REG_R2
),
1762 tcg_opc_a4 (TCG_REG_P7
, OPC_ADDS_A4
, TCG_REG_R58
,
1764 tcg_opc_i3 (TCG_REG_P6
, OPC_MUX1_I3
,
1765 TCG_REG_R2
, data_reg
, 0xb));
1766 data_reg
= TCG_REG_R2
;
1773 tcg_out_bundle(s
, miB
,
1774 tcg_opc_m4 (TCG_REG_P6
, opc_st_m4
[s_bits
],
1775 data_reg
, TCG_REG_R3
),
1776 tcg_opc_a5 (TCG_REG_P7
, OPC_ADDL_A5
, TCG_REG_R59
,
1777 mem_index
, TCG_REG_R0
),
1778 tcg_opc_b5 (TCG_REG_P7
, OPC_BR_CALL_SPTK_MANY_B5
,
1779 TCG_REG_B0
, TCG_REG_B6
));
1782 #else /* !CONFIG_SOFTMMU */
1784 static inline void tcg_out_qemu_ld(TCGContext
*s
, const TCGArg
*args
,
1787 static uint64_t const opc_ld_m1
[4] = {
1788 OPC_LD1_M1
, OPC_LD2_M1
, OPC_LD4_M1
, OPC_LD8_M1
1790 static uint64_t const opc_sxt_i29
[4] = {
1791 OPC_SXT1_I29
, OPC_SXT2_I29
, OPC_SXT4_I29
, 0
1793 int addr_reg
, data_reg
;
1794 TCGMemOp s_bits
, bswap
;
1798 s_bits
= opc
& MO_SIZE
;
1799 bswap
= opc
& MO_BSWAP
;
1801 #if TARGET_LONG_BITS == 32
1802 if (GUEST_BASE
!= 0) {
1803 tcg_out_bundle(s
, mII
,
1805 tcg_opc_i29(TCG_REG_P0
, OPC_ZXT4_I29
,
1806 TCG_REG_R3
, addr_reg
),
1807 tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
, TCG_REG_R2
,
1808 TCG_GUEST_BASE_REG
, TCG_REG_R3
));
1810 tcg_out_bundle(s
, miI
,
1812 tcg_opc_i29(TCG_REG_P0
, OPC_ZXT4_I29
,
1813 TCG_REG_R2
, addr_reg
),
1818 if (!(opc
& MO_SIGN
)) {
1819 tcg_out_bundle(s
, miI
,
1820 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1821 data_reg
, TCG_REG_R2
),
1825 tcg_out_bundle(s
, mII
,
1826 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1827 data_reg
, TCG_REG_R2
),
1829 tcg_opc_i29(TCG_REG_P0
, opc_sxt_i29
[s_bits
],
1830 data_reg
, data_reg
));
1832 } else if (s_bits
== MO_64
) {
1833 tcg_out_bundle(s
, mII
,
1834 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1835 data_reg
, TCG_REG_R2
),
1837 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1838 data_reg
, data_reg
, 0xb));
1840 if (s_bits
== MO_16
) {
1841 tcg_out_bundle(s
, mII
,
1842 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1843 data_reg
, TCG_REG_R2
),
1845 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
1846 data_reg
, data_reg
, 15, 15));
1848 tcg_out_bundle(s
, mII
,
1849 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1850 data_reg
, TCG_REG_R2
),
1852 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
1853 data_reg
, data_reg
, 31, 31));
1855 if (!(opc
& MO_SIGN
)) {
1856 tcg_out_bundle(s
, miI
,
1859 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1860 data_reg
, data_reg
, 0xb));
1862 tcg_out_bundle(s
, mII
,
1864 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1865 data_reg
, data_reg
, 0xb),
1866 tcg_opc_i29(TCG_REG_P0
, opc_sxt_i29
[s_bits
],
1867 data_reg
, data_reg
));
1871 if (GUEST_BASE
!= 0) {
1872 tcg_out_bundle(s
, MmI
,
1873 tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
, TCG_REG_R2
,
1874 TCG_GUEST_BASE_REG
, addr_reg
),
1875 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1876 data_reg
, TCG_REG_R2
),
1879 tcg_out_bundle(s
, mmI
,
1881 tcg_opc_m1 (TCG_REG_P0
, opc_ld_m1
[s_bits
],
1882 data_reg
, addr_reg
),
1886 if (bswap
&& s_bits
== MO_16
) {
1887 tcg_out_bundle(s
, mII
,
1889 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
1890 data_reg
, data_reg
, 15, 15),
1891 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1892 data_reg
, data_reg
, 0xb));
1893 } else if (bswap
&& s_bits
== MO_32
) {
1894 tcg_out_bundle(s
, mII
,
1896 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
1897 data_reg
, data_reg
, 31, 31),
1898 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1899 data_reg
, data_reg
, 0xb));
1900 } else if (bswap
&& s_bits
== MO_64
) {
1901 tcg_out_bundle(s
, miI
,
1904 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1905 data_reg
, data_reg
, 0xb));
1907 if (opc
& MO_SIGN
) {
1908 tcg_out_bundle(s
, miI
,
1911 tcg_opc_i29(TCG_REG_P0
, opc_sxt_i29
[s_bits
],
1912 data_reg
, data_reg
));
1917 static inline void tcg_out_qemu_st(TCGContext
*s
, const TCGArg
*args
,
1920 static uint64_t const opc_st_m4
[4] = {
1921 OPC_ST1_M4
, OPC_ST2_M4
, OPC_ST4_M4
, OPC_ST8_M4
1923 int addr_reg
, data_reg
;
1924 #if TARGET_LONG_BITS == 64
1925 uint64_t add_guest_base
;
1927 TCGMemOp s_bits
, bswap
;
1931 s_bits
= opc
& MO_SIZE
;
1932 bswap
= opc
& MO_BSWAP
;
1934 #if TARGET_LONG_BITS == 32
1935 if (GUEST_BASE
!= 0) {
1936 tcg_out_bundle(s
, mII
,
1938 tcg_opc_i29(TCG_REG_P0
, OPC_ZXT4_I29
,
1939 TCG_REG_R3
, addr_reg
),
1940 tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
, TCG_REG_R2
,
1941 TCG_GUEST_BASE_REG
, TCG_REG_R3
));
1943 tcg_out_bundle(s
, miI
,
1945 tcg_opc_i29(TCG_REG_P0
, OPC_ZXT4_I29
,
1946 TCG_REG_R2
, addr_reg
),
1951 if (s_bits
== MO_16
) {
1952 tcg_out_bundle(s
, mII
,
1954 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
1955 TCG_REG_R3
, data_reg
, 15, 15),
1956 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1957 TCG_REG_R3
, TCG_REG_R3
, 0xb));
1958 data_reg
= TCG_REG_R3
;
1959 } else if (s_bits
== MO_32
) {
1960 tcg_out_bundle(s
, mII
,
1962 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
1963 TCG_REG_R3
, data_reg
, 31, 31),
1964 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1965 TCG_REG_R3
, TCG_REG_R3
, 0xb));
1966 data_reg
= TCG_REG_R3
;
1967 } else if (s_bits
== MO_64
) {
1968 tcg_out_bundle(s
, miI
,
1971 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
1972 TCG_REG_R3
, data_reg
, 0xb));
1973 data_reg
= TCG_REG_R3
;
1976 tcg_out_bundle(s
, mmI
,
1977 tcg_opc_m4 (TCG_REG_P0
, opc_st_m4
[s_bits
],
1978 data_reg
, TCG_REG_R2
),
1982 if (GUEST_BASE
!= 0) {
1983 add_guest_base
= tcg_opc_a1 (TCG_REG_P0
, OPC_ADD_A1
, TCG_REG_R2
,
1984 TCG_GUEST_BASE_REG
, addr_reg
);
1985 addr_reg
= TCG_REG_R2
;
1987 add_guest_base
= INSN_NOP_M
;
1991 tcg_out_bundle(s
, (GUEST_BASE
? MmI
: mmI
),
1993 tcg_opc_m4 (TCG_REG_P0
, opc_st_m4
[s_bits
],
1994 data_reg
, addr_reg
),
1997 if (s_bits
== MO_16
) {
1998 tcg_out_bundle(s
, mII
,
2000 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
2001 TCG_REG_R3
, data_reg
, 15, 15),
2002 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
2003 TCG_REG_R3
, TCG_REG_R3
, 0xb));
2004 data_reg
= TCG_REG_R3
;
2005 } else if (s_bits
== MO_32
) {
2006 tcg_out_bundle(s
, mII
,
2008 tcg_opc_i12(TCG_REG_P0
, OPC_DEP_Z_I12
,
2009 TCG_REG_R3
, data_reg
, 31, 31),
2010 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
2011 TCG_REG_R3
, TCG_REG_R3
, 0xb));
2012 data_reg
= TCG_REG_R3
;
2013 } else if (s_bits
== MO_64
) {
2014 tcg_out_bundle(s
, miI
,
2017 tcg_opc_i3 (TCG_REG_P0
, OPC_MUX1_I3
,
2018 TCG_REG_R3
, data_reg
, 0xb));
2019 data_reg
= TCG_REG_R3
;
2021 tcg_out_bundle(s
, miI
,
2022 tcg_opc_m4 (TCG_REG_P0
, opc_st_m4
[s_bits
],
2023 data_reg
, addr_reg
),
2032 static inline void tcg_out_op(TCGContext
*s
, TCGOpcode opc
,
2033 const TCGArg
*args
, const int *const_args
)
2036 case INDEX_op_exit_tb
:
2037 tcg_out_exit_tb(s
, args
[0]);
2040 tcg_out_br(s
, args
[0]);
2043 if (likely(const_args
[0])) {
2044 tcg_out_calli(s
, args
[0]);
2046 tcg_out_callr(s
, args
[0]);
2049 case INDEX_op_goto_tb
:
2050 tcg_out_goto_tb(s
, args
[0]);
2053 case INDEX_op_movi_i32
:
2054 tcg_out_movi(s
, TCG_TYPE_I32
, args
[0], args
[1]);
2056 case INDEX_op_movi_i64
:
2057 tcg_out_movi(s
, TCG_TYPE_I64
, args
[0], args
[1]);
2060 case INDEX_op_ld8u_i32
:
2061 case INDEX_op_ld8u_i64
:
2062 tcg_out_ld_rel(s
, OPC_LD1_M1
, args
[0], args
[1], args
[2]);
2064 case INDEX_op_ld8s_i32
:
2065 case INDEX_op_ld8s_i64
:
2066 tcg_out_ld_rel(s
, OPC_LD1_M1
, args
[0], args
[1], args
[2]);
2067 tcg_out_ext(s
, OPC_SXT1_I29
, args
[0], args
[0]);
2069 case INDEX_op_ld16u_i32
:
2070 case INDEX_op_ld16u_i64
:
2071 tcg_out_ld_rel(s
, OPC_LD2_M1
, args
[0], args
[1], args
[2]);
2073 case INDEX_op_ld16s_i32
:
2074 case INDEX_op_ld16s_i64
:
2075 tcg_out_ld_rel(s
, OPC_LD2_M1
, args
[0], args
[1], args
[2]);
2076 tcg_out_ext(s
, OPC_SXT2_I29
, args
[0], args
[0]);
2078 case INDEX_op_ld_i32
:
2079 case INDEX_op_ld32u_i64
:
2080 tcg_out_ld_rel(s
, OPC_LD4_M1
, args
[0], args
[1], args
[2]);
2082 case INDEX_op_ld32s_i64
:
2083 tcg_out_ld_rel(s
, OPC_LD4_M1
, args
[0], args
[1], args
[2]);
2084 tcg_out_ext(s
, OPC_SXT4_I29
, args
[0], args
[0]);
2086 case INDEX_op_ld_i64
:
2087 tcg_out_ld_rel(s
, OPC_LD8_M1
, args
[0], args
[1], args
[2]);
2089 case INDEX_op_st8_i32
:
2090 case INDEX_op_st8_i64
:
2091 tcg_out_st_rel(s
, OPC_ST1_M4
, args
[0], args
[1], args
[2]);
2093 case INDEX_op_st16_i32
:
2094 case INDEX_op_st16_i64
:
2095 tcg_out_st_rel(s
, OPC_ST2_M4
, args
[0], args
[1], args
[2]);
2097 case INDEX_op_st_i32
:
2098 case INDEX_op_st32_i64
:
2099 tcg_out_st_rel(s
, OPC_ST4_M4
, args
[0], args
[1], args
[2]);
2101 case INDEX_op_st_i64
:
2102 tcg_out_st_rel(s
, OPC_ST8_M4
, args
[0], args
[1], args
[2]);
2105 case INDEX_op_add_i32
:
2106 case INDEX_op_add_i64
:
2107 tcg_out_add(s
, args
[0], args
[1], args
[2], const_args
[2]);
2109 case INDEX_op_sub_i32
:
2110 case INDEX_op_sub_i64
:
2111 tcg_out_sub(s
, args
[0], args
[1], const_args
[1], args
[2], const_args
[2]);
2114 case INDEX_op_and_i32
:
2115 case INDEX_op_and_i64
:
2116 /* TCG expects arg2 constant; A3 expects arg1 constant. Swap. */
2117 tcg_out_alu(s
, OPC_AND_A1
, OPC_AND_A3
, args
[0],
2118 args
[2], const_args
[2], args
[1], const_args
[1]);
2120 case INDEX_op_andc_i32
:
2121 case INDEX_op_andc_i64
:
2122 tcg_out_alu(s
, OPC_ANDCM_A1
, OPC_ANDCM_A3
, args
[0],
2123 args
[1], const_args
[1], args
[2], const_args
[2]);
2125 case INDEX_op_eqv_i32
:
2126 case INDEX_op_eqv_i64
:
2127 tcg_out_eqv(s
, args
[0], args
[1], const_args
[1],
2128 args
[2], const_args
[2]);
2130 case INDEX_op_nand_i32
:
2131 case INDEX_op_nand_i64
:
2132 tcg_out_nand(s
, args
[0], args
[1], const_args
[1],
2133 args
[2], const_args
[2]);
2135 case INDEX_op_nor_i32
:
2136 case INDEX_op_nor_i64
:
2137 tcg_out_nor(s
, args
[0], args
[1], const_args
[1],
2138 args
[2], const_args
[2]);
2140 case INDEX_op_or_i32
:
2141 case INDEX_op_or_i64
:
2142 /* TCG expects arg2 constant; A3 expects arg1 constant. Swap. */
2143 tcg_out_alu(s
, OPC_OR_A1
, OPC_OR_A3
, args
[0],
2144 args
[2], const_args
[2], args
[1], const_args
[1]);
2146 case INDEX_op_orc_i32
:
2147 case INDEX_op_orc_i64
:
2148 tcg_out_orc(s
, args
[0], args
[1], const_args
[1],
2149 args
[2], const_args
[2]);
2151 case INDEX_op_xor_i32
:
2152 case INDEX_op_xor_i64
:
2153 /* TCG expects arg2 constant; A3 expects arg1 constant. Swap. */
2154 tcg_out_alu(s
, OPC_XOR_A1
, OPC_XOR_A3
, args
[0],
2155 args
[2], const_args
[2], args
[1], const_args
[1]);
2158 case INDEX_op_mul_i32
:
2159 case INDEX_op_mul_i64
:
2160 tcg_out_mul(s
, args
[0], args
[1], args
[2]);
2163 case INDEX_op_sar_i32
:
2164 tcg_out_sar_i32(s
, args
[0], args
[1], args
[2], const_args
[2]);
2166 case INDEX_op_sar_i64
:
2167 tcg_out_sar_i64(s
, args
[0], args
[1], args
[2], const_args
[2]);
2169 case INDEX_op_shl_i32
:
2170 tcg_out_shl_i32(s
, args
[0], args
[1], args
[2], const_args
[2]);
2172 case INDEX_op_shl_i64
:
2173 tcg_out_shl_i64(s
, args
[0], args
[1], args
[2], const_args
[2]);
2175 case INDEX_op_shr_i32
:
2176 tcg_out_shr_i32(s
, args
[0], args
[1], args
[2], const_args
[2]);
2178 case INDEX_op_shr_i64
:
2179 tcg_out_shr_i64(s
, args
[0], args
[1], args
[2], const_args
[2]);
2181 case INDEX_op_rotl_i32
:
2182 tcg_out_rotl_i32(s
, args
[0], args
[1], args
[2], const_args
[2]);
2184 case INDEX_op_rotl_i64
:
2185 tcg_out_rotl_i64(s
, args
[0], args
[1], args
[2], const_args
[2]);
2187 case INDEX_op_rotr_i32
:
2188 tcg_out_rotr_i32(s
, args
[0], args
[1], args
[2], const_args
[2]);
2190 case INDEX_op_rotr_i64
:
2191 tcg_out_rotr_i64(s
, args
[0], args
[1], args
[2], const_args
[2]);
2194 case INDEX_op_ext8s_i32
:
2195 case INDEX_op_ext8s_i64
:
2196 tcg_out_ext(s
, OPC_SXT1_I29
, args
[0], args
[1]);
2198 case INDEX_op_ext8u_i32
:
2199 case INDEX_op_ext8u_i64
:
2200 tcg_out_ext(s
, OPC_ZXT1_I29
, args
[0], args
[1]);
2202 case INDEX_op_ext16s_i32
:
2203 case INDEX_op_ext16s_i64
:
2204 tcg_out_ext(s
, OPC_SXT2_I29
, args
[0], args
[1]);
2206 case INDEX_op_ext16u_i32
:
2207 case INDEX_op_ext16u_i64
:
2208 tcg_out_ext(s
, OPC_ZXT2_I29
, args
[0], args
[1]);
2210 case INDEX_op_ext32s_i64
:
2211 tcg_out_ext(s
, OPC_SXT4_I29
, args
[0], args
[1]);
2213 case INDEX_op_ext32u_i64
:
2214 tcg_out_ext(s
, OPC_ZXT4_I29
, args
[0], args
[1]);
2217 case INDEX_op_bswap16_i32
:
2218 case INDEX_op_bswap16_i64
:
2219 tcg_out_bswap16(s
, args
[0], args
[1]);
2221 case INDEX_op_bswap32_i32
:
2222 case INDEX_op_bswap32_i64
:
2223 tcg_out_bswap32(s
, args
[0], args
[1]);
2225 case INDEX_op_bswap64_i64
:
2226 tcg_out_bswap64(s
, args
[0], args
[1]);
2229 case INDEX_op_deposit_i32
:
2230 case INDEX_op_deposit_i64
:
2231 tcg_out_deposit(s
, args
[0], args
[1], args
[2], const_args
[2],
2235 case INDEX_op_brcond_i32
:
2236 tcg_out_brcond(s
, args
[2], args
[0], args
[1], args
[3], 1);
2238 case INDEX_op_brcond_i64
:
2239 tcg_out_brcond(s
, args
[2], args
[0], args
[1], args
[3], 0);
2241 case INDEX_op_setcond_i32
:
2242 tcg_out_setcond(s
, args
[3], args
[0], args
[1], args
[2], 1);
2244 case INDEX_op_setcond_i64
:
2245 tcg_out_setcond(s
, args
[3], args
[0], args
[1], args
[2], 0);
2247 case INDEX_op_movcond_i32
:
2248 tcg_out_movcond(s
, args
[5], args
[0], args
[1], args
[2],
2249 args
[3], const_args
[3], args
[4], const_args
[4], 1);
2251 case INDEX_op_movcond_i64
:
2252 tcg_out_movcond(s
, args
[5], args
[0], args
[1], args
[2],
2253 args
[3], const_args
[3], args
[4], const_args
[4], 0);
2256 case INDEX_op_qemu_ld8u
:
2257 tcg_out_qemu_ld(s
, args
, MO_UB
);
2259 case INDEX_op_qemu_ld8s
:
2260 tcg_out_qemu_ld(s
, args
, MO_SB
);
2262 case INDEX_op_qemu_ld16u
:
2263 tcg_out_qemu_ld(s
, args
, MO_TEUW
);
2265 case INDEX_op_qemu_ld16s
:
2266 tcg_out_qemu_ld(s
, args
, MO_TESW
);
2268 case INDEX_op_qemu_ld32
:
2269 case INDEX_op_qemu_ld32u
:
2270 tcg_out_qemu_ld(s
, args
, MO_TEUL
);
2272 case INDEX_op_qemu_ld32s
:
2273 tcg_out_qemu_ld(s
, args
, MO_TESL
);
2275 case INDEX_op_qemu_ld64
:
2276 tcg_out_qemu_ld(s
, args
, MO_TEQ
);
2279 case INDEX_op_qemu_st8
:
2280 tcg_out_qemu_st(s
, args
, MO_UB
);
2282 case INDEX_op_qemu_st16
:
2283 tcg_out_qemu_st(s
, args
, MO_TEUW
);
2285 case INDEX_op_qemu_st32
:
2286 tcg_out_qemu_st(s
, args
, MO_TEUL
);
2288 case INDEX_op_qemu_st64
:
2289 tcg_out_qemu_st(s
, args
, MO_TEQ
);
2297 static const TCGTargetOpDef ia64_op_defs
[] = {
2298 { INDEX_op_br
, { } },
2299 { INDEX_op_call
, { "ri" } },
2300 { INDEX_op_exit_tb
, { } },
2301 { INDEX_op_goto_tb
, { } },
2303 { INDEX_op_mov_i32
, { "r", "r" } },
2304 { INDEX_op_movi_i32
, { "r" } },
2306 { INDEX_op_ld8u_i32
, { "r", "r" } },
2307 { INDEX_op_ld8s_i32
, { "r", "r" } },
2308 { INDEX_op_ld16u_i32
, { "r", "r" } },
2309 { INDEX_op_ld16s_i32
, { "r", "r" } },
2310 { INDEX_op_ld_i32
, { "r", "r" } },
2311 { INDEX_op_st8_i32
, { "rZ", "r" } },
2312 { INDEX_op_st16_i32
, { "rZ", "r" } },
2313 { INDEX_op_st_i32
, { "rZ", "r" } },
2315 { INDEX_op_add_i32
, { "r", "rZ", "rI" } },
2316 { INDEX_op_sub_i32
, { "r", "rI", "rI" } },
2318 { INDEX_op_and_i32
, { "r", "rI", "rI" } },
2319 { INDEX_op_andc_i32
, { "r", "rI", "rI" } },
2320 { INDEX_op_eqv_i32
, { "r", "rZ", "rZ" } },
2321 { INDEX_op_nand_i32
, { "r", "rZ", "rZ" } },
2322 { INDEX_op_nor_i32
, { "r", "rZ", "rZ" } },
2323 { INDEX_op_or_i32
, { "r", "rI", "rI" } },
2324 { INDEX_op_orc_i32
, { "r", "rZ", "rZ" } },
2325 { INDEX_op_xor_i32
, { "r", "rI", "rI" } },
2327 { INDEX_op_mul_i32
, { "r", "rZ", "rZ" } },
2329 { INDEX_op_sar_i32
, { "r", "rZ", "ri" } },
2330 { INDEX_op_shl_i32
, { "r", "rZ", "ri" } },
2331 { INDEX_op_shr_i32
, { "r", "rZ", "ri" } },
2332 { INDEX_op_rotl_i32
, { "r", "rZ", "ri" } },
2333 { INDEX_op_rotr_i32
, { "r", "rZ", "ri" } },
2335 { INDEX_op_ext8s_i32
, { "r", "rZ"} },
2336 { INDEX_op_ext8u_i32
, { "r", "rZ"} },
2337 { INDEX_op_ext16s_i32
, { "r", "rZ"} },
2338 { INDEX_op_ext16u_i32
, { "r", "rZ"} },
2340 { INDEX_op_bswap16_i32
, { "r", "rZ" } },
2341 { INDEX_op_bswap32_i32
, { "r", "rZ" } },
2343 { INDEX_op_brcond_i32
, { "rZ", "rZ" } },
2344 { INDEX_op_setcond_i32
, { "r", "rZ", "rZ" } },
2345 { INDEX_op_movcond_i32
, { "r", "rZ", "rZ", "rI", "rI" } },
2347 { INDEX_op_mov_i64
, { "r", "r" } },
2348 { INDEX_op_movi_i64
, { "r" } },
2350 { INDEX_op_ld8u_i64
, { "r", "r" } },
2351 { INDEX_op_ld8s_i64
, { "r", "r" } },
2352 { INDEX_op_ld16u_i64
, { "r", "r" } },
2353 { INDEX_op_ld16s_i64
, { "r", "r" } },
2354 { INDEX_op_ld32u_i64
, { "r", "r" } },
2355 { INDEX_op_ld32s_i64
, { "r", "r" } },
2356 { INDEX_op_ld_i64
, { "r", "r" } },
2357 { INDEX_op_st8_i64
, { "rZ", "r" } },
2358 { INDEX_op_st16_i64
, { "rZ", "r" } },
2359 { INDEX_op_st32_i64
, { "rZ", "r" } },
2360 { INDEX_op_st_i64
, { "rZ", "r" } },
2362 { INDEX_op_add_i64
, { "r", "rZ", "rI" } },
2363 { INDEX_op_sub_i64
, { "r", "rI", "rI" } },
2365 { INDEX_op_and_i64
, { "r", "rI", "rI" } },
2366 { INDEX_op_andc_i64
, { "r", "rI", "rI" } },
2367 { INDEX_op_eqv_i64
, { "r", "rZ", "rZ" } },
2368 { INDEX_op_nand_i64
, { "r", "rZ", "rZ" } },
2369 { INDEX_op_nor_i64
, { "r", "rZ", "rZ" } },
2370 { INDEX_op_or_i64
, { "r", "rI", "rI" } },
2371 { INDEX_op_orc_i64
, { "r", "rZ", "rZ" } },
2372 { INDEX_op_xor_i64
, { "r", "rI", "rI" } },
2374 { INDEX_op_mul_i64
, { "r", "rZ", "rZ" } },
2376 { INDEX_op_sar_i64
, { "r", "rZ", "ri" } },
2377 { INDEX_op_shl_i64
, { "r", "rZ", "ri" } },
2378 { INDEX_op_shr_i64
, { "r", "rZ", "ri" } },
2379 { INDEX_op_rotl_i64
, { "r", "rZ", "ri" } },
2380 { INDEX_op_rotr_i64
, { "r", "rZ", "ri" } },
2382 { INDEX_op_ext8s_i64
, { "r", "rZ"} },
2383 { INDEX_op_ext8u_i64
, { "r", "rZ"} },
2384 { INDEX_op_ext16s_i64
, { "r", "rZ"} },
2385 { INDEX_op_ext16u_i64
, { "r", "rZ"} },
2386 { INDEX_op_ext32s_i64
, { "r", "rZ"} },
2387 { INDEX_op_ext32u_i64
, { "r", "rZ"} },
2389 { INDEX_op_bswap16_i64
, { "r", "rZ" } },
2390 { INDEX_op_bswap32_i64
, { "r", "rZ" } },
2391 { INDEX_op_bswap64_i64
, { "r", "rZ" } },
2393 { INDEX_op_brcond_i64
, { "rZ", "rZ" } },
2394 { INDEX_op_setcond_i64
, { "r", "rZ", "rZ" } },
2395 { INDEX_op_movcond_i64
, { "r", "rZ", "rZ", "rI", "rI" } },
2397 { INDEX_op_deposit_i32
, { "r", "rZ", "ri" } },
2398 { INDEX_op_deposit_i64
, { "r", "rZ", "ri" } },
2400 { INDEX_op_qemu_ld8u
, { "r", "r" } },
2401 { INDEX_op_qemu_ld8s
, { "r", "r" } },
2402 { INDEX_op_qemu_ld16u
, { "r", "r" } },
2403 { INDEX_op_qemu_ld16s
, { "r", "r" } },
2404 { INDEX_op_qemu_ld32
, { "r", "r" } },
2405 { INDEX_op_qemu_ld32u
, { "r", "r" } },
2406 { INDEX_op_qemu_ld32s
, { "r", "r" } },
2407 { INDEX_op_qemu_ld64
, { "r", "r" } },
2409 { INDEX_op_qemu_st8
, { "SZ", "r" } },
2410 { INDEX_op_qemu_st16
, { "SZ", "r" } },
2411 { INDEX_op_qemu_st32
, { "SZ", "r" } },
2412 { INDEX_op_qemu_st64
, { "SZ", "r" } },
2417 /* Generate global QEMU prologue and epilogue code */
2418 static void tcg_target_qemu_prologue(TCGContext
*s
)
2422 /* reserve some stack space */
2423 frame_size
= TCG_STATIC_CALL_ARGS_SIZE
+
2424 CPU_TEMP_BUF_NLONGS
* sizeof(long);
2425 frame_size
= (frame_size
+ TCG_TARGET_STACK_ALIGN
- 1) &
2426 ~(TCG_TARGET_STACK_ALIGN
- 1);
2427 tcg_set_frame(s
, TCG_REG_CALL_STACK
, TCG_STATIC_CALL_ARGS_SIZE
,
2428 CPU_TEMP_BUF_NLONGS
* sizeof(long));
2430 /* First emit adhoc function descriptor */
2431 *(uint64_t *)(s
->code_ptr
) = (uint64_t)s
->code_ptr
+ 16; /* entry point */
2432 s
->code_ptr
+= 16; /* skip GP */
2435 tcg_out_bundle(s
, miI
,
2436 tcg_opc_m34(TCG_REG_P0
, OPC_ALLOC_M34
,
2437 TCG_REG_R34
, 32, 24, 0),
2439 tcg_opc_i21(TCG_REG_P0
, OPC_MOV_I21
,
2440 TCG_REG_B6
, TCG_REG_R33
, 0));
2442 /* ??? If GUEST_BASE < 0x200000, we could load the register via
2443 an ADDL in the M slot of the next bundle. */
2444 if (GUEST_BASE
!= 0) {
2445 tcg_out_bundle(s
, mlx
,
2447 tcg_opc_l2 (GUEST_BASE
),
2448 tcg_opc_x2 (TCG_REG_P0
, OPC_MOVL_X2
,
2449 TCG_GUEST_BASE_REG
, GUEST_BASE
));
2450 tcg_regset_set_reg(s
->reserved_regs
, TCG_GUEST_BASE_REG
);
2453 tcg_out_bundle(s
, miB
,
2454 tcg_opc_a4 (TCG_REG_P0
, OPC_ADDS_A4
,
2455 TCG_REG_R12
, -frame_size
, TCG_REG_R12
),
2456 tcg_opc_i22(TCG_REG_P0
, OPC_MOV_I22
,
2457 TCG_REG_R33
, TCG_REG_B0
),
2458 tcg_opc_b4 (TCG_REG_P0
, OPC_BR_SPTK_MANY_B4
, TCG_REG_B6
));
2461 tb_ret_addr
= s
->code_ptr
;
2462 tcg_out_bundle(s
, miI
,
2464 tcg_opc_i21(TCG_REG_P0
, OPC_MOV_I21
,
2465 TCG_REG_B0
, TCG_REG_R33
, 0),
2466 tcg_opc_a4 (TCG_REG_P0
, OPC_ADDS_A4
,
2467 TCG_REG_R12
, frame_size
, TCG_REG_R12
));
2468 tcg_out_bundle(s
, miB
,
2470 tcg_opc_i26(TCG_REG_P0
, OPC_MOV_I_I26
,
2471 TCG_REG_PFS
, TCG_REG_R34
),
2472 tcg_opc_b4 (TCG_REG_P0
, OPC_BR_RET_SPTK_MANY_B4
,
2476 static void tcg_target_init(TCGContext
*s
)
2478 tcg_regset_set(tcg_target_available_regs
[TCG_TYPE_I32
],
2479 0xffffffffffffffffull
);
2480 tcg_regset_set(tcg_target_available_regs
[TCG_TYPE_I64
],
2481 0xffffffffffffffffull
);
2483 tcg_regset_clear(tcg_target_call_clobber_regs
);
2484 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R8
);
2485 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R9
);
2486 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R10
);
2487 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R11
);
2488 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R14
);
2489 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R15
);
2490 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R16
);
2491 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R17
);
2492 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R18
);
2493 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R19
);
2494 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R20
);
2495 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R21
);
2496 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R22
);
2497 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R23
);
2498 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R24
);
2499 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R25
);
2500 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R26
);
2501 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R27
);
2502 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R28
);
2503 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R29
);
2504 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R30
);
2505 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R31
);
2506 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R56
);
2507 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R57
);
2508 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R58
);
2509 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R59
);
2510 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R60
);
2511 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R61
);
2512 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R62
);
2513 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R63
);
2515 tcg_regset_clear(s
->reserved_regs
);
2516 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R0
); /* zero register */
2517 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R1
); /* global pointer */
2518 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R2
); /* internal use */
2519 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R3
); /* internal use */
2520 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R12
); /* stack pointer */
2521 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R13
); /* thread pointer */
2522 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R33
); /* return address */
2523 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R34
); /* PFS */
2525 /* The following 4 are not in use, are call-saved, but *not* saved
2526 by the prologue. Therefore we cannot use them without modifying
2527 the prologue. There doesn't seem to be any good reason to use
2528 these as opposed to the windowed registers. */
2529 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R4
);
2530 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R5
);
2531 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R6
);
2532 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R7
);
2534 tcg_add_target_add_op_defs(ia64_op_defs
);