1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef TCG_H
26#define TCG_H
27
28#include "cpu.h"
29#include "exec/memop.h"
30#include "qemu/bitops.h"
31#include "qemu/plugin.h"
32#include "qemu/queue.h"
33#include "tcg/tcg-mo.h"
34#include "tcg-target.h"
35#include "qemu/int128.h"
36#include "tcg/tcg-cond.h"
37
38
39#define MAX_OP_PER_INSTR 266
40
41#if HOST_LONG_BITS == 32
42#define MAX_OPC_PARAM_PER_ARG 2
43#else
44#define MAX_OPC_PARAM_PER_ARG 1
45#endif
46#define MAX_OPC_PARAM_IARGS 6
47#define MAX_OPC_PARAM_OARGS 1
48#define MAX_OPC_PARAM_ARGS (MAX_OPC_PARAM_IARGS + MAX_OPC_PARAM_OARGS)
49
50
51
52
53#define MAX_OPC_PARAM (4 + (MAX_OPC_PARAM_PER_ARG * MAX_OPC_PARAM_ARGS))
54
55#define CPU_TEMP_BUF_NLONGS 128
56#define TCG_STATIC_FRAME_SIZE (CPU_TEMP_BUF_NLONGS * sizeof(long))
57
58
59#ifndef TCG_TARGET_REG_BITS
60# if UINTPTR_MAX == UINT32_MAX
61# define TCG_TARGET_REG_BITS 32
62# elif UINTPTR_MAX == UINT64_MAX
63# define TCG_TARGET_REG_BITS 64
64# else
65# error Unknown pointer size for tcg target
66# endif
67#endif
68
69#if TCG_TARGET_REG_BITS == 32
70typedef int32_t tcg_target_long;
71typedef uint32_t tcg_target_ulong;
72#define TCG_PRIlx PRIx32
73#define TCG_PRIld PRId32
74#elif TCG_TARGET_REG_BITS == 64
75typedef int64_t tcg_target_long;
76typedef uint64_t tcg_target_ulong;
77#define TCG_PRIlx PRIx64
78#define TCG_PRIld PRId64
79#else
80#error unsupported
81#endif
82
83
84
85
86#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
87#define TCG_OVERSIZED_GUEST 1
88#else
89#define TCG_OVERSIZED_GUEST 0
90#endif
91
92#if TCG_TARGET_NB_REGS <= 32
93typedef uint32_t TCGRegSet;
94#elif TCG_TARGET_NB_REGS <= 64
95typedef uint64_t TCGRegSet;
96#else
97#error unsupported
98#endif
99
100#if TCG_TARGET_REG_BITS == 32
101
102#define TCG_TARGET_HAS_extrl_i64_i32 0
103#define TCG_TARGET_HAS_extrh_i64_i32 0
104#define TCG_TARGET_HAS_div_i64 0
105#define TCG_TARGET_HAS_rem_i64 0
106#define TCG_TARGET_HAS_div2_i64 0
107#define TCG_TARGET_HAS_rot_i64 0
108#define TCG_TARGET_HAS_ext8s_i64 0
109#define TCG_TARGET_HAS_ext16s_i64 0
110#define TCG_TARGET_HAS_ext32s_i64 0
111#define TCG_TARGET_HAS_ext8u_i64 0
112#define TCG_TARGET_HAS_ext16u_i64 0
113#define TCG_TARGET_HAS_ext32u_i64 0
114#define TCG_TARGET_HAS_bswap16_i64 0
115#define TCG_TARGET_HAS_bswap32_i64 0
116#define TCG_TARGET_HAS_bswap64_i64 0
117#define TCG_TARGET_HAS_neg_i64 0
118#define TCG_TARGET_HAS_not_i64 0
119#define TCG_TARGET_HAS_andc_i64 0
120#define TCG_TARGET_HAS_orc_i64 0
121#define TCG_TARGET_HAS_eqv_i64 0
122#define TCG_TARGET_HAS_nand_i64 0
123#define TCG_TARGET_HAS_nor_i64 0
124#define TCG_TARGET_HAS_clz_i64 0
125#define TCG_TARGET_HAS_ctz_i64 0
126#define TCG_TARGET_HAS_ctpop_i64 0
127#define TCG_TARGET_HAS_deposit_i64 0
128#define TCG_TARGET_HAS_extract_i64 0
129#define TCG_TARGET_HAS_sextract_i64 0
130#define TCG_TARGET_HAS_extract2_i64 0
131#define TCG_TARGET_HAS_movcond_i64 0
132#define TCG_TARGET_HAS_add2_i64 0
133#define TCG_TARGET_HAS_sub2_i64 0
134#define TCG_TARGET_HAS_mulu2_i64 0
135#define TCG_TARGET_HAS_muls2_i64 0
136#define TCG_TARGET_HAS_muluh_i64 0
137#define TCG_TARGET_HAS_mulsh_i64 0
138
139#define TCG_TARGET_HAS_add2_i32 1
140#define TCG_TARGET_HAS_sub2_i32 1
141#endif
142
143#ifndef TCG_TARGET_deposit_i32_valid
144#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
145#endif
146#ifndef TCG_TARGET_deposit_i64_valid
147#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
148#endif
149#ifndef TCG_TARGET_extract_i32_valid
150#define TCG_TARGET_extract_i32_valid(ofs, len) 1
151#endif
152#ifndef TCG_TARGET_extract_i64_valid
153#define TCG_TARGET_extract_i64_valid(ofs, len) 1
154#endif
155
156
157#if defined(TCG_TARGET_HAS_div_i32)
158#define TCG_TARGET_HAS_div2_i32 0
159#elif defined(TCG_TARGET_HAS_div2_i32)
160#define TCG_TARGET_HAS_div_i32 0
161#define TCG_TARGET_HAS_rem_i32 0
162#endif
163#if defined(TCG_TARGET_HAS_div_i64)
164#define TCG_TARGET_HAS_div2_i64 0
165#elif defined(TCG_TARGET_HAS_div2_i64)
166#define TCG_TARGET_HAS_div_i64 0
167#define TCG_TARGET_HAS_rem_i64 0
168#endif
169
170
171#if TCG_TARGET_REG_BITS == 32 \
172 && !(defined(TCG_TARGET_HAS_mulu2_i32) \
173 || defined(TCG_TARGET_HAS_muluh_i32))
174# error "Missing unsigned widening multiply"
175#endif
176
177#if !defined(TCG_TARGET_HAS_v64) \
178 && !defined(TCG_TARGET_HAS_v128) \
179 && !defined(TCG_TARGET_HAS_v256)
180#define TCG_TARGET_MAYBE_vec 0
181#define TCG_TARGET_HAS_abs_vec 0
182#define TCG_TARGET_HAS_neg_vec 0
183#define TCG_TARGET_HAS_not_vec 0
184#define TCG_TARGET_HAS_andc_vec 0
185#define TCG_TARGET_HAS_orc_vec 0
186#define TCG_TARGET_HAS_roti_vec 0
187#define TCG_TARGET_HAS_rots_vec 0
188#define TCG_TARGET_HAS_rotv_vec 0
189#define TCG_TARGET_HAS_shi_vec 0
190#define TCG_TARGET_HAS_shs_vec 0
191#define TCG_TARGET_HAS_shv_vec 0
192#define TCG_TARGET_HAS_mul_vec 0
193#define TCG_TARGET_HAS_sat_vec 0
194#define TCG_TARGET_HAS_minmax_vec 0
195#define TCG_TARGET_HAS_bitsel_vec 0
196#define TCG_TARGET_HAS_cmpsel_vec 0
197#else
198#define TCG_TARGET_MAYBE_vec 1
199#endif
200#ifndef TCG_TARGET_HAS_v64
201#define TCG_TARGET_HAS_v64 0
202#endif
203#ifndef TCG_TARGET_HAS_v128
204#define TCG_TARGET_HAS_v128 0
205#endif
206#ifndef TCG_TARGET_HAS_v256
207#define TCG_TARGET_HAS_v256 0
208#endif
209
210#ifndef TARGET_INSN_START_EXTRA_WORDS
211# define TARGET_INSN_START_WORDS 1
212#else
213# define TARGET_INSN_START_WORDS (1 + TARGET_INSN_START_EXTRA_WORDS)
214#endif
215
216typedef enum TCGOpcode {
217#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
218#include "tcg/tcg-opc.h"
219#undef DEF
220 NB_OPS,
221} TCGOpcode;
222
223#define tcg_regset_set_reg(d, r) ((d) |= (TCGRegSet)1 << (r))
224#define tcg_regset_reset_reg(d, r) ((d) &= ~((TCGRegSet)1 << (r)))
225#define tcg_regset_test_reg(d, r) (((d) >> (r)) & 1)
226
227#ifndef TCG_TARGET_INSN_UNIT_SIZE
228# error "Missing TCG_TARGET_INSN_UNIT_SIZE"
229#elif TCG_TARGET_INSN_UNIT_SIZE == 1
230typedef uint8_t tcg_insn_unit;
231#elif TCG_TARGET_INSN_UNIT_SIZE == 2
232typedef uint16_t tcg_insn_unit;
233#elif TCG_TARGET_INSN_UNIT_SIZE == 4
234typedef uint32_t tcg_insn_unit;
235#elif TCG_TARGET_INSN_UNIT_SIZE == 8
236typedef uint64_t tcg_insn_unit;
237#else
238
239#endif
240
241
242#if defined CONFIG_DEBUG_TCG || defined QEMU_STATIC_ANALYSIS
243# define tcg_debug_assert(X) do { assert(X); } while (0)
244#else
245# define tcg_debug_assert(X) \
246 do { if (!(X)) { __builtin_unreachable(); } } while (0)
247#endif
248
249typedef struct TCGRelocation TCGRelocation;
250struct TCGRelocation {
251 QSIMPLEQ_ENTRY(TCGRelocation) next;
252 tcg_insn_unit *ptr;
253 intptr_t addend;
254 int type;
255};
256
257typedef struct TCGLabel TCGLabel;
258struct TCGLabel {
259 unsigned present : 1;
260 unsigned has_value : 1;
261 unsigned id : 14;
262 unsigned refs : 16;
263 union {
264 uintptr_t value;
265 const tcg_insn_unit *value_ptr;
266 } u;
267 QSIMPLEQ_HEAD(, TCGRelocation) relocs;
268 QSIMPLEQ_ENTRY(TCGLabel) next;
269};
270
271typedef struct TCGPool {
272 struct TCGPool *next;
273 int size;
274 uint8_t data[] __attribute__ ((aligned));
275} TCGPool;
276
277#define TCG_POOL_CHUNK_SIZE 32768
278
279#define TCG_MAX_TEMPS 512
280#define TCG_MAX_INSNS 512
281
282
283
284#define TCG_STATIC_CALL_ARGS_SIZE 128
285
286typedef enum TCGType {
287 TCG_TYPE_I32,
288 TCG_TYPE_I64,
289
290 TCG_TYPE_V64,
291 TCG_TYPE_V128,
292 TCG_TYPE_V256,
293
294 TCG_TYPE_COUNT,
295
296
297#if TCG_TARGET_REG_BITS == 32
298 TCG_TYPE_REG = TCG_TYPE_I32,
299#else
300 TCG_TYPE_REG = TCG_TYPE_I64,
301#endif
302
303
304#if UINTPTR_MAX == UINT32_MAX
305 TCG_TYPE_PTR = TCG_TYPE_I32,
306#else
307 TCG_TYPE_PTR = TCG_TYPE_I64,
308#endif
309
310
311#if TARGET_LONG_BITS == 64
312 TCG_TYPE_TL = TCG_TYPE_I64,
313#else
314 TCG_TYPE_TL = TCG_TYPE_I32,
315#endif
316} TCGType;
317
318
319
320
321
322
323
324static inline unsigned get_alignment_bits(MemOp memop)
325{
326 unsigned a = memop & MO_AMASK;
327
328 if (a == MO_UNALN) {
329
330 a = 0;
331 } else if (a == MO_ALIGN) {
332
333 a = memop & MO_SIZE;
334 } else {
335
336 a = a >> MO_ASHIFT;
337 }
338#if defined(CONFIG_SOFTMMU)
339
340 tcg_debug_assert((TLB_FLAGS_MASK & ((1 << a) - 1)) == 0);
341#endif
342 return a;
343}
344
345typedef tcg_target_ulong TCGArg;
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377typedef struct TCGv_i32_d *TCGv_i32;
378typedef struct TCGv_i64_d *TCGv_i64;
379typedef struct TCGv_ptr_d *TCGv_ptr;
380typedef struct TCGv_vec_d *TCGv_vec;
381typedef TCGv_ptr TCGv_env;
382#if TARGET_LONG_BITS == 32
383#define TCGv TCGv_i32
384#elif TARGET_LONG_BITS == 64
385#define TCGv TCGv_i64
386#else
387#error Unhandled TARGET_LONG_BITS value
388#endif
389
390
391
392
393#define TCG_CALL_NO_READ_GLOBALS 0x0001
394
395#define TCG_CALL_NO_WRITE_GLOBALS 0x0002
396
397#define TCG_CALL_NO_SIDE_EFFECTS 0x0004
398
399#define TCG_CALL_NO_RETURN 0x0008
400
401
402#define TCG_CALL_NO_RWG TCG_CALL_NO_READ_GLOBALS
403#define TCG_CALL_NO_WG TCG_CALL_NO_WRITE_GLOBALS
404#define TCG_CALL_NO_SE TCG_CALL_NO_SIDE_EFFECTS
405#define TCG_CALL_NO_RWG_SE (TCG_CALL_NO_RWG | TCG_CALL_NO_SE)
406#define TCG_CALL_NO_WG_SE (TCG_CALL_NO_WG | TCG_CALL_NO_SE)
407
408
409#define TCG_CALL_DUMMY_ARG ((TCGArg)0)
410
411
412
413
414
415
416
417enum {
418 TCG_BSWAP_IZ = 1,
419 TCG_BSWAP_OZ = 2,
420 TCG_BSWAP_OS = 4,
421};
422
423typedef enum TCGTempVal {
424 TEMP_VAL_DEAD,
425 TEMP_VAL_REG,
426 TEMP_VAL_MEM,
427 TEMP_VAL_CONST,
428} TCGTempVal;
429
430typedef enum TCGTempKind {
431
432 TEMP_NORMAL,
433
434 TEMP_LOCAL,
435
436 TEMP_GLOBAL,
437
438 TEMP_FIXED,
439
440 TEMP_CONST,
441} TCGTempKind;
442
443typedef struct TCGTemp {
444 TCGReg reg:8;
445 TCGTempVal val_type:8;
446 TCGType base_type:8;
447 TCGType type:8;
448 TCGTempKind kind:3;
449 unsigned int indirect_reg:1;
450 unsigned int indirect_base:1;
451 unsigned int mem_coherent:1;
452 unsigned int mem_allocated:1;
453 unsigned int temp_allocated:1;
454
455 int64_t val;
456 struct TCGTemp *mem_base;
457 intptr_t mem_offset;
458 const char *name;
459
460
461
462
463 uintptr_t state;
464 void *state_ptr;
465} TCGTemp;
466
467typedef struct TCGContext TCGContext;
468
469typedef struct TCGTempSet {
470 unsigned long l[BITS_TO_LONGS(TCG_MAX_TEMPS)];
471} TCGTempSet;
472
473
474
475
476
477#define DEAD_ARG 4
478#define SYNC_ARG 1
479typedef uint16_t TCGLifeData;
480
481
482
483typedef struct TCGOp {
484 TCGOpcode opc : 8;
485
486
487 unsigned param1 : 4;
488 unsigned param2 : 4;
489
490
491 unsigned life : 16;
492
493
494 QTAILQ_ENTRY(TCGOp) link;
495#ifdef CONFIG_PLUGIN
496 QSIMPLEQ_ENTRY(TCGOp) plugin_link;
497#endif
498
499
500 TCGArg args[MAX_OPC_PARAM];
501
502
503 TCGRegSet output_pref[2];
504} TCGOp;
505
506#define TCGOP_CALLI(X) (X)->param1
507#define TCGOP_CALLO(X) (X)->param2
508
509#define TCGOP_VECL(X) (X)->param1
510#define TCGOP_VECE(X) (X)->param2
511
512
513QEMU_BUILD_BUG_ON(NB_OPS > (1 << 8));
514
515typedef struct TCGProfile {
516 int64_t cpu_exec_time;
517 int64_t tb_count1;
518 int64_t tb_count;
519 int64_t op_count;
520 int op_count_max;
521 int temp_count_max;
522 int64_t temp_count;
523 int64_t del_op_count;
524 int64_t code_in_len;
525 int64_t code_out_len;
526 int64_t search_out_len;
527 int64_t interm_time;
528 int64_t code_time;
529 int64_t la_time;
530 int64_t opt_time;
531 int64_t restore_count;
532 int64_t restore_time;
533 int64_t table_op_count[NB_OPS];
534} TCGProfile;
535
536struct TCGContext {
537 uint8_t *pool_cur, *pool_end;
538 TCGPool *pool_first, *pool_current, *pool_first_large;
539 int nb_labels;
540 int nb_globals;
541 int nb_temps;
542 int nb_indirects;
543 int nb_ops;
544
545
546 tcg_insn_unit *code_buf;
547 uint16_t *tb_jmp_reset_offset;
548 uintptr_t *tb_jmp_insn_offset;
549 uintptr_t *tb_jmp_target_addr;
550
551 TCGRegSet reserved_regs;
552 uint32_t tb_cflags;
553 intptr_t current_frame_offset;
554 intptr_t frame_start;
555 intptr_t frame_end;
556 TCGTemp *frame_temp;
557
558 tcg_insn_unit *code_ptr;
559
560#ifdef CONFIG_PROFILER
561 TCGProfile prof;
562#endif
563
564#ifdef CONFIG_DEBUG_TCG
565 int temps_in_use;
566 int goto_tb_issue_mask;
567 const TCGOpcode *vecop_list;
568#endif
569
570
571
572
573
574 void *code_gen_buffer;
575 size_t code_gen_buffer_size;
576 void *code_gen_ptr;
577 void *data_gen_ptr;
578
579
580 void *code_gen_highwater;
581
582
583 CPUState *cpu;
584
585
586#ifdef TCG_TARGET_NEED_LDST_LABELS
587 QSIMPLEQ_HEAD(, TCGLabelQemuLdst) ldst_labels;
588#endif
589#ifdef TCG_TARGET_NEED_POOL_LABELS
590 struct TCGLabelPoolData *pool_labels;
591#endif
592
593 TCGLabel *exitreq_label;
594
595#ifdef CONFIG_PLUGIN
596
597
598
599
600
601
602
603 struct qemu_plugin_tb *plugin_tb;
604
605
606 struct qemu_plugin_insn *plugin_insn;
607
608
609 QSIMPLEQ_HEAD(, TCGOp) plugin_ops;
610#endif
611
612 GHashTable *const_table[TCG_TYPE_COUNT];
613 TCGTempSet free_temps[TCG_TYPE_COUNT * 2];
614 TCGTemp temps[TCG_MAX_TEMPS];
615
616 QTAILQ_HEAD(, TCGOp) ops, free_ops;
617 QSIMPLEQ_HEAD(, TCGLabel) labels;
618
619
620
621 TCGTemp *reg_to_temp[TCG_TARGET_NB_REGS];
622
623 uint16_t gen_insn_end_off[TCG_MAX_INSNS];
624 target_ulong gen_insn_data[TCG_MAX_INSNS][TARGET_INSN_START_WORDS];
625
626
627 sigjmp_buf jmp_trans;
628};
629
630static inline bool temp_readonly(TCGTemp *ts)
631{
632 return ts->kind >= TEMP_FIXED;
633}
634
635extern __thread TCGContext *tcg_ctx;
636extern const void *tcg_code_gen_epilogue;
637extern uintptr_t tcg_splitwx_diff;
638extern TCGv_env cpu_env;
639
640bool in_code_gen_buffer(const void *p);
641
642#ifdef CONFIG_DEBUG_TCG
643const void *tcg_splitwx_to_rx(void *rw);
644void *tcg_splitwx_to_rw(const void *rx);
645#else
646static inline const void *tcg_splitwx_to_rx(void *rw)
647{
648 return rw ? rw + tcg_splitwx_diff : NULL;
649}
650
651static inline void *tcg_splitwx_to_rw(const void *rx)
652{
653 return rx ? (void *)rx - tcg_splitwx_diff : NULL;
654}
655#endif
656
657static inline size_t temp_idx(TCGTemp *ts)
658{
659 ptrdiff_t n = ts - tcg_ctx->temps;
660 tcg_debug_assert(n >= 0 && n < tcg_ctx->nb_temps);
661 return n;
662}
663
664static inline TCGArg temp_arg(TCGTemp *ts)
665{
666 return (uintptr_t)ts;
667}
668
669static inline TCGTemp *arg_temp(TCGArg a)
670{
671 return (TCGTemp *)(uintptr_t)a;
672}
673
674
675
676
677static inline TCGTemp *tcgv_i32_temp(TCGv_i32 v)
678{
679 uintptr_t o = (uintptr_t)v;
680 TCGTemp *t = (void *)tcg_ctx + o;
681 tcg_debug_assert(offsetof(TCGContext, temps[temp_idx(t)]) == o);
682 return t;
683}
684
685static inline TCGTemp *tcgv_i64_temp(TCGv_i64 v)
686{
687 return tcgv_i32_temp((TCGv_i32)v);
688}
689
690static inline TCGTemp *tcgv_ptr_temp(TCGv_ptr v)
691{
692 return tcgv_i32_temp((TCGv_i32)v);
693}
694
695static inline TCGTemp *tcgv_vec_temp(TCGv_vec v)
696{
697 return tcgv_i32_temp((TCGv_i32)v);
698}
699
700static inline TCGArg tcgv_i32_arg(TCGv_i32 v)
701{
702 return temp_arg(tcgv_i32_temp(v));
703}
704
705static inline TCGArg tcgv_i64_arg(TCGv_i64 v)
706{
707 return temp_arg(tcgv_i64_temp(v));
708}
709
710static inline TCGArg tcgv_ptr_arg(TCGv_ptr v)
711{
712 return temp_arg(tcgv_ptr_temp(v));
713}
714
715static inline TCGArg tcgv_vec_arg(TCGv_vec v)
716{
717 return temp_arg(tcgv_vec_temp(v));
718}
719
720static inline TCGv_i32 temp_tcgv_i32(TCGTemp *t)
721{
722 (void)temp_idx(t);
723 return (TCGv_i32)((void *)t - (void *)tcg_ctx);
724}
725
726static inline TCGv_i64 temp_tcgv_i64(TCGTemp *t)
727{
728 return (TCGv_i64)temp_tcgv_i32(t);
729}
730
731static inline TCGv_ptr temp_tcgv_ptr(TCGTemp *t)
732{
733 return (TCGv_ptr)temp_tcgv_i32(t);
734}
735
736static inline TCGv_vec temp_tcgv_vec(TCGTemp *t)
737{
738 return (TCGv_vec)temp_tcgv_i32(t);
739}
740
741#if TCG_TARGET_REG_BITS == 32
742static inline TCGv_i32 TCGV_LOW(TCGv_i64 t)
743{
744 return temp_tcgv_i32(tcgv_i64_temp(t));
745}
746
747static inline TCGv_i32 TCGV_HIGH(TCGv_i64 t)
748{
749 return temp_tcgv_i32(tcgv_i64_temp(t) + 1);
750}
751#endif
752
753static inline TCGArg tcg_get_insn_param(TCGOp *op, int arg)
754{
755 return op->args[arg];
756}
757
758static inline void tcg_set_insn_param(TCGOp *op, int arg, TCGArg v)
759{
760 op->args[arg] = v;
761}
762
763static inline target_ulong tcg_get_insn_start_param(TCGOp *op, int arg)
764{
765#if TARGET_LONG_BITS <= TCG_TARGET_REG_BITS
766 return tcg_get_insn_param(op, arg);
767#else
768 return tcg_get_insn_param(op, arg * 2) |
769 ((uint64_t)tcg_get_insn_param(op, arg * 2 + 1) << 32);
770#endif
771}
772
773static inline void tcg_set_insn_start_param(TCGOp *op, int arg, target_ulong v)
774{
775#if TARGET_LONG_BITS <= TCG_TARGET_REG_BITS
776 tcg_set_insn_param(op, arg, v);
777#else
778 tcg_set_insn_param(op, arg * 2, v);
779 tcg_set_insn_param(op, arg * 2 + 1, v >> 32);
780#endif
781}
782
783
784static inline TCGOp *tcg_last_op(void)
785{
786 return QTAILQ_LAST(&tcg_ctx->ops);
787}
788
789
790static inline bool tcg_op_buf_full(void)
791{
792
793
794
795
796
797
798
799 return tcg_ctx->nb_ops >= 4000;
800}
801
802
803
804
805void *tcg_malloc_internal(TCGContext *s, int size);
806void tcg_pool_reset(TCGContext *s);
807TranslationBlock *tcg_tb_alloc(TCGContext *s);
808
809void tcg_region_reset_all(void);
810
811size_t tcg_code_size(void);
812size_t tcg_code_capacity(void);
813
814void tcg_tb_insert(TranslationBlock *tb);
815void tcg_tb_remove(TranslationBlock *tb);
816TranslationBlock *tcg_tb_lookup(uintptr_t tc_ptr);
817void tcg_tb_foreach(GTraverseFunc func, gpointer user_data);
818size_t tcg_nb_tbs(void);
819
820
821static inline void *tcg_malloc(int size)
822{
823 TCGContext *s = tcg_ctx;
824 uint8_t *ptr, *ptr_end;
825
826
827 size = QEMU_ALIGN_UP(size, 8);
828
829 ptr = s->pool_cur;
830 ptr_end = ptr + size;
831 if (unlikely(ptr_end > s->pool_end)) {
832 return tcg_malloc_internal(tcg_ctx, size);
833 } else {
834 s->pool_cur = ptr_end;
835 return ptr;
836 }
837}
838
839void tcg_init(size_t tb_size, int splitwx, unsigned max_cpus);
840void tcg_register_thread(void);
841void tcg_prologue_init(TCGContext *s);
842void tcg_func_start(TCGContext *s);
843
844int tcg_gen_code(TCGContext *s, TranslationBlock *tb);
845
846void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size);
847
848TCGTemp *tcg_global_mem_new_internal(TCGType, TCGv_ptr,
849 intptr_t, const char *);
850TCGTemp *tcg_temp_new_internal(TCGType, bool);
851void tcg_temp_free_internal(TCGTemp *);
852TCGv_vec tcg_temp_new_vec(TCGType type);
853TCGv_vec tcg_temp_new_vec_matching(TCGv_vec match);
854
855static inline void tcg_temp_free_i32(TCGv_i32 arg)
856{
857 tcg_temp_free_internal(tcgv_i32_temp(arg));
858}
859
860static inline void tcg_temp_free_i64(TCGv_i64 arg)
861{
862 tcg_temp_free_internal(tcgv_i64_temp(arg));
863}
864
865static inline void tcg_temp_free_ptr(TCGv_ptr arg)
866{
867 tcg_temp_free_internal(tcgv_ptr_temp(arg));
868}
869
870static inline void tcg_temp_free_vec(TCGv_vec arg)
871{
872 tcg_temp_free_internal(tcgv_vec_temp(arg));
873}
874
875static inline TCGv_i32 tcg_global_mem_new_i32(TCGv_ptr reg, intptr_t offset,
876 const char *name)
877{
878 TCGTemp *t = tcg_global_mem_new_internal(TCG_TYPE_I32, reg, offset, name);
879 return temp_tcgv_i32(t);
880}
881
882static inline TCGv_i32 tcg_temp_new_i32(void)
883{
884 TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_I32, false);
885 return temp_tcgv_i32(t);
886}
887
888static inline TCGv_i32 tcg_temp_local_new_i32(void)
889{
890 TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_I32, true);
891 return temp_tcgv_i32(t);
892}
893
894static inline TCGv_i64 tcg_global_mem_new_i64(TCGv_ptr reg, intptr_t offset,
895 const char *name)
896{
897 TCGTemp *t = tcg_global_mem_new_internal(TCG_TYPE_I64, reg, offset, name);
898 return temp_tcgv_i64(t);
899}
900
901static inline TCGv_i64 tcg_temp_new_i64(void)
902{
903 TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_I64, false);
904 return temp_tcgv_i64(t);
905}
906
907static inline TCGv_i64 tcg_temp_local_new_i64(void)
908{
909 TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_I64, true);
910 return temp_tcgv_i64(t);
911}
912
913static inline TCGv_ptr tcg_global_mem_new_ptr(TCGv_ptr reg, intptr_t offset,
914 const char *name)
915{
916 TCGTemp *t = tcg_global_mem_new_internal(TCG_TYPE_PTR, reg, offset, name);
917 return temp_tcgv_ptr(t);
918}
919
920static inline TCGv_ptr tcg_temp_new_ptr(void)
921{
922 TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_PTR, false);
923 return temp_tcgv_ptr(t);
924}
925
926static inline TCGv_ptr tcg_temp_local_new_ptr(void)
927{
928 TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_PTR, true);
929 return temp_tcgv_ptr(t);
930}
931
932#if defined(CONFIG_DEBUG_TCG)
933
934
935
936
937
938void tcg_clear_temp_count(void);
939int tcg_check_temp_count(void);
940#else
941#define tcg_clear_temp_count() do { } while (0)
942#define tcg_check_temp_count() 0
943#endif
944
945int64_t tcg_cpu_exec_time(void);
946void tcg_dump_info(void);
947void tcg_dump_op_count(void);
948
949#define TCG_CT_CONST 1
950
951typedef struct TCGArgConstraint {
952 unsigned ct : 16;
953 unsigned alias_index : 4;
954 unsigned sort_index : 4;
955 bool oalias : 1;
956 bool ialias : 1;
957 bool newreg : 1;
958 TCGRegSet regs;
959} TCGArgConstraint;
960
961#define TCG_MAX_OP_ARGS 16
962
963
964enum {
965
966 TCG_OPF_BB_EXIT = 0x01,
967
968 TCG_OPF_BB_END = 0x02,
969
970 TCG_OPF_CALL_CLOBBER = 0x04,
971
972
973 TCG_OPF_SIDE_EFFECTS = 0x08,
974
975 TCG_OPF_64BIT = 0x10,
976
977
978 TCG_OPF_NOT_PRESENT = 0x20,
979
980 TCG_OPF_VECTOR = 0x40,
981
982 TCG_OPF_COND_BRANCH = 0x80
983};
984
985typedef struct TCGOpDef {
986 const char *name;
987 uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
988 uint8_t flags;
989 TCGArgConstraint *args_ct;
990} TCGOpDef;
991
992extern TCGOpDef tcg_op_defs[];
993extern const size_t tcg_op_defs_max;
994
995typedef struct TCGTargetOpDef {
996 TCGOpcode op;
997 const char *args_ct_str[TCG_MAX_OP_ARGS];
998} TCGTargetOpDef;
999
1000#define tcg_abort() \
1001do {\
1002 fprintf(stderr, "%s:%d: tcg fatal error\n", __FILE__, __LINE__);\
1003 abort();\
1004} while (0)
1005
1006bool tcg_op_supported(TCGOpcode op);
1007
1008void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args);
1009
1010TCGOp *tcg_emit_op(TCGOpcode opc);
1011void tcg_op_remove(TCGContext *s, TCGOp *op);
1012TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op, TCGOpcode opc);
1013TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op, TCGOpcode opc);
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023void tcg_remove_ops_after(TCGOp *op);
1024
1025void tcg_optimize(TCGContext *s);
1026
1027
1028TCGv_i32 tcg_const_i32(int32_t val);
1029TCGv_i64 tcg_const_i64(int64_t val);
1030TCGv_i32 tcg_const_local_i32(int32_t val);
1031TCGv_i64 tcg_const_local_i64(int64_t val);
1032TCGv_vec tcg_const_zeros_vec(TCGType);
1033TCGv_vec tcg_const_ones_vec(TCGType);
1034TCGv_vec tcg_const_zeros_vec_matching(TCGv_vec);
1035TCGv_vec tcg_const_ones_vec_matching(TCGv_vec);
1036
1037
1038
1039
1040
1041
1042TCGTemp *tcg_constant_internal(TCGType type, int64_t val);
1043
1044static inline TCGv_i32 tcg_constant_i32(int32_t val)
1045{
1046 return temp_tcgv_i32(tcg_constant_internal(TCG_TYPE_I32, val));
1047}
1048
1049static inline TCGv_i64 tcg_constant_i64(int64_t val)
1050{
1051 return temp_tcgv_i64(tcg_constant_internal(TCG_TYPE_I64, val));
1052}
1053
1054TCGv_vec tcg_constant_vec(TCGType type, unsigned vece, int64_t val);
1055TCGv_vec tcg_constant_vec_matching(TCGv_vec match, unsigned vece, int64_t val);
1056
1057#if UINTPTR_MAX == UINT32_MAX
1058# define tcg_const_ptr(x) ((TCGv_ptr)tcg_const_i32((intptr_t)(x)))
1059# define tcg_const_local_ptr(x) ((TCGv_ptr)tcg_const_local_i32((intptr_t)(x)))
1060#else
1061# define tcg_const_ptr(x) ((TCGv_ptr)tcg_const_i64((intptr_t)(x)))
1062# define tcg_const_local_ptr(x) ((TCGv_ptr)tcg_const_local_i64((intptr_t)(x)))
1063#endif
1064
1065TCGLabel *gen_new_label(void);
1066
1067
1068
1069
1070
1071
1072
1073
1074static inline TCGArg label_arg(TCGLabel *l)
1075{
1076 return (uintptr_t)l;
1077}
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087static inline TCGLabel *arg_label(TCGArg i)
1088{
1089 return (TCGLabel *)(uintptr_t)i;
1090}
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105static inline ptrdiff_t tcg_ptr_byte_diff(const void *a, const void *b)
1106{
1107 return a - b;
1108}
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119static inline ptrdiff_t tcg_pcrel_diff(TCGContext *s, const void *target)
1120{
1121 return tcg_ptr_byte_diff(target, tcg_splitwx_to_rx(s->code_ptr));
1122}
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132static inline ptrdiff_t tcg_tbrel_diff(TCGContext *s, const void *target)
1133{
1134 return tcg_ptr_byte_diff(target, tcg_splitwx_to_rx(s->code_buf));
1135}
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145static inline size_t tcg_current_code_size(TCGContext *s)
1146{
1147 return tcg_ptr_byte_diff(s->code_ptr, s->code_buf);
1148}
1149
1150
1151typedef uint32_t TCGMemOpIdx;
1152
1153
1154
1155
1156
1157
1158
1159
1160static inline TCGMemOpIdx make_memop_idx(MemOp op, unsigned idx)
1161{
1162 tcg_debug_assert(idx <= 15);
1163 return (op << 4) | idx;
1164}
1165
1166
1167
1168
1169
1170
1171
1172static inline MemOp get_memop(TCGMemOpIdx oi)
1173{
1174 return oi >> 4;
1175}
1176
1177
1178
1179
1180
1181
1182
1183static inline unsigned get_mmuidx(TCGMemOpIdx oi)
1184{
1185 return oi & 15;
1186}
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233#define TB_EXIT_MASK 3
1234#define TB_EXIT_IDX0 0
1235#define TB_EXIT_IDX1 1
1236#define TB_EXIT_IDXMAX 1
1237#define TB_EXIT_REQUESTED 3
1238
1239#ifdef CONFIG_TCG_INTERPRETER
1240uintptr_t tcg_qemu_tb_exec(CPUArchState *env, const void *tb_ptr);
1241#else
1242typedef uintptr_t tcg_prologue_fn(CPUArchState *env, const void *tb_ptr);
1243extern tcg_prologue_fn *tcg_qemu_tb_exec;
1244#endif
1245
1246void tcg_register_jit(const void *buf, size_t buf_size);
1247
1248#if TCG_TARGET_MAYBE_vec
1249
1250
1251
1252int tcg_can_emit_vec_op(TCGOpcode, TCGType, unsigned);
1253#else
1254static inline int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
1255{
1256 return 0;
1257}
1258#endif
1259
1260
1261void tcg_expand_vec_op(TCGOpcode, TCGType, unsigned, TCGArg, ...);
1262
1263
1264uint64_t dup_const(unsigned vece, uint64_t c);
1265
1266#define dup_const(VECE, C) \
1267 (__builtin_constant_p(VECE) \
1268 ? ( (VECE) == MO_8 ? 0x0101010101010101ull * (uint8_t)(C) \
1269 : (VECE) == MO_16 ? 0x0001000100010001ull * (uint16_t)(C) \
1270 : (VECE) == MO_32 ? 0x0000000100000001ull * (uint32_t)(C) \
1271 : (VECE) == MO_64 ? (uint64_t)(C) \
1272 : (qemu_build_not_reached_always(), 0)) \
1273 : dup_const(VECE, C))
1274
1275
1276
1277
1278#ifdef CONFIG_SOFTMMU
1279
1280tcg_target_ulong helper_ret_ldub_mmu(CPUArchState *env, target_ulong addr,
1281 TCGMemOpIdx oi, uintptr_t retaddr);
1282tcg_target_ulong helper_le_lduw_mmu(CPUArchState *env, target_ulong addr,
1283 TCGMemOpIdx oi, uintptr_t retaddr);
1284tcg_target_ulong helper_le_ldul_mmu(CPUArchState *env, target_ulong addr,
1285 TCGMemOpIdx oi, uintptr_t retaddr);
1286uint64_t helper_le_ldq_mmu(CPUArchState *env, target_ulong addr,
1287 TCGMemOpIdx oi, uintptr_t retaddr);
1288tcg_target_ulong helper_be_lduw_mmu(CPUArchState *env, target_ulong addr,
1289 TCGMemOpIdx oi, uintptr_t retaddr);
1290tcg_target_ulong helper_be_ldul_mmu(CPUArchState *env, target_ulong addr,
1291 TCGMemOpIdx oi, uintptr_t retaddr);
1292uint64_t helper_be_ldq_mmu(CPUArchState *env, target_ulong addr,
1293 TCGMemOpIdx oi, uintptr_t retaddr);
1294
1295
1296tcg_target_ulong helper_ret_ldsb_mmu(CPUArchState *env, target_ulong addr,
1297 TCGMemOpIdx oi, uintptr_t retaddr);
1298tcg_target_ulong helper_le_ldsw_mmu(CPUArchState *env, target_ulong addr,
1299 TCGMemOpIdx oi, uintptr_t retaddr);
1300tcg_target_ulong helper_le_ldsl_mmu(CPUArchState *env, target_ulong addr,
1301 TCGMemOpIdx oi, uintptr_t retaddr);
1302tcg_target_ulong helper_be_ldsw_mmu(CPUArchState *env, target_ulong addr,
1303 TCGMemOpIdx oi, uintptr_t retaddr);
1304tcg_target_ulong helper_be_ldsl_mmu(CPUArchState *env, target_ulong addr,
1305 TCGMemOpIdx oi, uintptr_t retaddr);
1306
1307void helper_ret_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val,
1308 TCGMemOpIdx oi, uintptr_t retaddr);
1309void helper_le_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val,
1310 TCGMemOpIdx oi, uintptr_t retaddr);
1311void helper_le_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val,
1312 TCGMemOpIdx oi, uintptr_t retaddr);
1313void helper_le_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
1314 TCGMemOpIdx oi, uintptr_t retaddr);
1315void helper_be_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val,
1316 TCGMemOpIdx oi, uintptr_t retaddr);
1317void helper_be_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val,
1318 TCGMemOpIdx oi, uintptr_t retaddr);
1319void helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
1320 TCGMemOpIdx oi, uintptr_t retaddr);
1321
1322
1323#ifdef TARGET_WORDS_BIGENDIAN
1324# define helper_ret_ldsw_mmu helper_be_ldsw_mmu
1325# define helper_ret_lduw_mmu helper_be_lduw_mmu
1326# define helper_ret_ldsl_mmu helper_be_ldsl_mmu
1327# define helper_ret_ldul_mmu helper_be_ldul_mmu
1328# define helper_ret_ldl_mmu helper_be_ldul_mmu
1329# define helper_ret_ldq_mmu helper_be_ldq_mmu
1330# define helper_ret_stw_mmu helper_be_stw_mmu
1331# define helper_ret_stl_mmu helper_be_stl_mmu
1332# define helper_ret_stq_mmu helper_be_stq_mmu
1333#else
1334# define helper_ret_ldsw_mmu helper_le_ldsw_mmu
1335# define helper_ret_lduw_mmu helper_le_lduw_mmu
1336# define helper_ret_ldsl_mmu helper_le_ldsl_mmu
1337# define helper_ret_ldul_mmu helper_le_ldul_mmu
1338# define helper_ret_ldl_mmu helper_le_ldul_mmu
1339# define helper_ret_ldq_mmu helper_le_ldq_mmu
1340# define helper_ret_stw_mmu helper_le_stw_mmu
1341# define helper_ret_stl_mmu helper_le_stl_mmu
1342# define helper_ret_stq_mmu helper_le_stq_mmu
1343#endif
1344#endif
1345
1346uint32_t cpu_atomic_cmpxchgb_mmu(CPUArchState *env, target_ulong addr,
1347 uint32_t cmpv, uint32_t newv,
1348 TCGMemOpIdx oi, uintptr_t retaddr);
1349uint32_t cpu_atomic_cmpxchgw_le_mmu(CPUArchState *env, target_ulong addr,
1350 uint32_t cmpv, uint32_t newv,
1351 TCGMemOpIdx oi, uintptr_t retaddr);
1352uint32_t cpu_atomic_cmpxchgl_le_mmu(CPUArchState *env, target_ulong addr,
1353 uint32_t cmpv, uint32_t newv,
1354 TCGMemOpIdx oi, uintptr_t retaddr);
1355uint64_t cpu_atomic_cmpxchgq_le_mmu(CPUArchState *env, target_ulong addr,
1356 uint64_t cmpv, uint64_t newv,
1357 TCGMemOpIdx oi, uintptr_t retaddr);
1358uint32_t cpu_atomic_cmpxchgw_be_mmu(CPUArchState *env, target_ulong addr,
1359 uint32_t cmpv, uint32_t newv,
1360 TCGMemOpIdx oi, uintptr_t retaddr);
1361uint32_t cpu_atomic_cmpxchgl_be_mmu(CPUArchState *env, target_ulong addr,
1362 uint32_t cmpv, uint32_t newv,
1363 TCGMemOpIdx oi, uintptr_t retaddr);
1364uint64_t cpu_atomic_cmpxchgq_be_mmu(CPUArchState *env, target_ulong addr,
1365 uint64_t cmpv, uint64_t newv,
1366 TCGMemOpIdx oi, uintptr_t retaddr);
1367
1368#define GEN_ATOMIC_HELPER(NAME, TYPE, SUFFIX) \
1369TYPE cpu_atomic_ ## NAME ## SUFFIX ## _mmu \
1370 (CPUArchState *env, target_ulong addr, TYPE val, \
1371 TCGMemOpIdx oi, uintptr_t retaddr);
1372
1373#ifdef CONFIG_ATOMIC64
1374#define GEN_ATOMIC_HELPER_ALL(NAME) \
1375 GEN_ATOMIC_HELPER(NAME, uint32_t, b) \
1376 GEN_ATOMIC_HELPER(NAME, uint32_t, w_le) \
1377 GEN_ATOMIC_HELPER(NAME, uint32_t, w_be) \
1378 GEN_ATOMIC_HELPER(NAME, uint32_t, l_le) \
1379 GEN_ATOMIC_HELPER(NAME, uint32_t, l_be) \
1380 GEN_ATOMIC_HELPER(NAME, uint64_t, q_le) \
1381 GEN_ATOMIC_HELPER(NAME, uint64_t, q_be)
1382#else
1383#define GEN_ATOMIC_HELPER_ALL(NAME) \
1384 GEN_ATOMIC_HELPER(NAME, uint32_t, b) \
1385 GEN_ATOMIC_HELPER(NAME, uint32_t, w_le) \
1386 GEN_ATOMIC_HELPER(NAME, uint32_t, w_be) \
1387 GEN_ATOMIC_HELPER(NAME, uint32_t, l_le) \
1388 GEN_ATOMIC_HELPER(NAME, uint32_t, l_be)
1389#endif
1390
1391GEN_ATOMIC_HELPER_ALL(fetch_add)
1392GEN_ATOMIC_HELPER_ALL(fetch_sub)
1393GEN_ATOMIC_HELPER_ALL(fetch_and)
1394GEN_ATOMIC_HELPER_ALL(fetch_or)
1395GEN_ATOMIC_HELPER_ALL(fetch_xor)
1396GEN_ATOMIC_HELPER_ALL(fetch_smin)
1397GEN_ATOMIC_HELPER_ALL(fetch_umin)
1398GEN_ATOMIC_HELPER_ALL(fetch_smax)
1399GEN_ATOMIC_HELPER_ALL(fetch_umax)
1400
1401GEN_ATOMIC_HELPER_ALL(add_fetch)
1402GEN_ATOMIC_HELPER_ALL(sub_fetch)
1403GEN_ATOMIC_HELPER_ALL(and_fetch)
1404GEN_ATOMIC_HELPER_ALL(or_fetch)
1405GEN_ATOMIC_HELPER_ALL(xor_fetch)
1406GEN_ATOMIC_HELPER_ALL(smin_fetch)
1407GEN_ATOMIC_HELPER_ALL(umin_fetch)
1408GEN_ATOMIC_HELPER_ALL(smax_fetch)
1409GEN_ATOMIC_HELPER_ALL(umax_fetch)
1410
1411GEN_ATOMIC_HELPER_ALL(xchg)
1412
1413#undef GEN_ATOMIC_HELPER_ALL
1414#undef GEN_ATOMIC_HELPER
1415
1416Int128 cpu_atomic_cmpxchgo_le_mmu(CPUArchState *env, target_ulong addr,
1417 Int128 cmpv, Int128 newv,
1418 TCGMemOpIdx oi, uintptr_t retaddr);
1419Int128 cpu_atomic_cmpxchgo_be_mmu(CPUArchState *env, target_ulong addr,
1420 Int128 cmpv, Int128 newv,
1421 TCGMemOpIdx oi, uintptr_t retaddr);
1422
1423Int128 cpu_atomic_ldo_le_mmu(CPUArchState *env, target_ulong addr,
1424 TCGMemOpIdx oi, uintptr_t retaddr);
1425Int128 cpu_atomic_ldo_be_mmu(CPUArchState *env, target_ulong addr,
1426 TCGMemOpIdx oi, uintptr_t retaddr);
1427void cpu_atomic_sto_le_mmu(CPUArchState *env, target_ulong addr, Int128 val,
1428 TCGMemOpIdx oi, uintptr_t retaddr);
1429void cpu_atomic_sto_be_mmu(CPUArchState *env, target_ulong addr, Int128 val,
1430 TCGMemOpIdx oi, uintptr_t retaddr);
1431
1432#ifdef CONFIG_DEBUG_TCG
1433void tcg_assert_listed_vecop(TCGOpcode);
1434#else
1435static inline void tcg_assert_listed_vecop(TCGOpcode op) { }
1436#endif
1437
1438static inline const TCGOpcode *tcg_swap_vecop_list(const TCGOpcode *n)
1439{
1440#ifdef CONFIG_DEBUG_TCG
1441 const TCGOpcode *o = tcg_ctx->vecop_list;
1442 tcg_ctx->vecop_list = n;
1443 return o;
1444#else
1445 return NULL;
1446#endif
1447}
1448
1449bool tcg_can_emit_vecop_list(const TCGOpcode *, TCGType, unsigned);
1450
1451#endif
1452