18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Tiny Code Generator for QEMU
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2008 Fabrice Bellard
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions:
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE.
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
2486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
2586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifndef TCG_H
2686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_H
2786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-common.h"
2986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#include "qemu/bitops.h"
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg-target.h"
3186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
3286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Default target word size to pointer size.  */
3386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifndef TCG_TARGET_REG_BITS
3486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# if UINTPTR_MAX == UINT32_MAX
3586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#  define TCG_TARGET_REG_BITS 32
3686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# elif UINTPTR_MAX == UINT64_MAX
3786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#  define TCG_TARGET_REG_BITS 64
3886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# else
3986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#  error Unknown pointer size for tcg target
4086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# endif
4186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef int32_t tcg_target_long;
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef uint32_t tcg_target_ulong;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_PRIlx PRIx32
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_PRIld PRId32
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif TCG_TARGET_REG_BITS == 64
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef int64_t tcg_target_long;
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef uint64_t tcg_target_ulong;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_PRIlx PRIx64
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_PRIld PRId64
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#error unsupported
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#include "tcg-runtime.h"
5886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_NB_REGS <= 32
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef uint32_t TCGRegSet;
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif TCG_TARGET_NB_REGS <= 64
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef uint64_t TCGRegSet;
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#error unsupported
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32
6886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Turn some undef macros into false macros.  */
6986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_div_i64          0
7086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_rem_i64          0
7186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_div2_i64         0
7286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_rot_i64          0
7386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_ext8s_i64        0
7486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_ext16s_i64       0
7586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_ext32s_i64       0
7686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_ext8u_i64        0
7786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_ext16u_i64       0
7886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_ext32u_i64       0
7986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_bswap16_i64      0
8086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_bswap32_i64      0
8186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_bswap64_i64      0
8286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_neg_i64          0
8386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_not_i64          0
8486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_andc_i64         0
8586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_orc_i64          0
8686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_eqv_i64          0
8786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_nand_i64         0
8886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_nor_i64          0
8986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_deposit_i64      0
9086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_movcond_i64      0
9186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_add2_i64         0
9286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_sub2_i64         0
9386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_mulu2_i64        0
9486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_muls2_i64        0
9586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_muluh_i64        0
9686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_mulsh_i64        0
9786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Turn some undef macros into true macros.  */
9886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_add2_i32         1
9986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_sub2_i32         1
10086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_mulu2_i32        1
10186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
10286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
10386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifndef TCG_TARGET_deposit_i32_valid
10486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
10586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
10686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifndef TCG_TARGET_deposit_i64_valid
10786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
10886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
10986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
11086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Only one of DIV or DIV2 should be defined.  */
11186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if defined(TCG_TARGET_HAS_div_i32)
11286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_div2_i32         0
11386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#elif defined(TCG_TARGET_HAS_div2_i32)
11486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_div_i32          0
11586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_rem_i32          0
11686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
11786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if defined(TCG_TARGET_HAS_div_i64)
11886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_div2_i64         0
11986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#elif defined(TCG_TARGET_HAS_div2_i64)
12086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_div_i64          0
12186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_TARGET_HAS_rem_i64          0
12286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
12386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
124f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnertypedef enum TCGOpcode {
125f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg-opc.h"
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef DEF
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    NB_OPS,
129f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} TCGOpcode;
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_clear(d) (d) = 0
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_set(d, s) (d) = (s)
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_set32(d, reg, val32) (d) |= (val32) << (reg)
134b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#define tcg_regset_set_reg(d, r) (d) |= 1L << (r)
135b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#define tcg_regset_reset_reg(d, r) (d) &= ~(1L << (r))
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_test_reg(d, r) (((d) >> (r)) & 1)
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_or(d, a, b) (d) = (a) | (b)
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_and(d, a, b) (d) = (a) & (b)
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_andnot(d, a, b) (d) = (a) & ~(b)
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_regset_not(d, a) (d) = ~(a)
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGRelocation {
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct TCGRelocation *next;
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int type;
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t *ptr;
14686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    intptr_t addend;
14786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} TCGRelocation;
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGLabel {
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int has_value;
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    union {
15286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner        uintptr_t value;
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        TCGRelocation *first_reloc;
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } u;
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGLabel;
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGPool {
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct TCGPool *next;
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int size;
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t data[0] __attribute__ ((aligned));
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGPool;
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_POOL_CHUNK_SIZE 32768
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_MAX_LABELS 512
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_MAX_TEMPS 512
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* when the size of the arguments of a called function is smaller than
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   this value, they are statically allocated in the TB stack frame */
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_STATIC_CALL_ARGS_SIZE 128
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
173f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnertypedef enum TCGType {
174f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_I32,
175f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_I64,
176f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_COUNT, /* number of different types */
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
178f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    /* An alias for the size of the host register.  */
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32
180f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_REG = TCG_TYPE_I32,
181f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#else
182f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_REG = TCG_TYPE_I64,
183f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#endif
184f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner
18586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* An alias for the size of the native pointer.  */
18686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if UINTPTR_MAX == UINT32_MAX
18786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_TYPE_PTR = TCG_TYPE_I32,
18886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else
18986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_TYPE_PTR = TCG_TYPE_I64,
19086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
191f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner
192f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    /* An alias for the size of the target "long", aka register.  */
193f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#if TARGET_LONG_BITS == 64
194f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_TL = TCG_TYPE_I64,
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
196f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCG_TYPE_TL = TCG_TYPE_I32,
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
198f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} TCGType;
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
20086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Constants for qemu_ld and qemu_st for the Memory Operation field.  */
20186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertypedef enum TCGMemOp {
20286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_8     = 0,
20386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_16    = 1,
20486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_32    = 2,
20586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_64    = 3,
20686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_SIZE  = 3,   /* Mask for the above.  */
20786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
20886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_SIGN  = 4,   /* Sign-extended, otherwise zero-extended.  */
20986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
21086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BSWAP = 8,   /* Host reverse endian.  */
21186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN
21286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LE    = MO_BSWAP,
21386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BE    = 0,
21486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else
21586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LE    = 0,
21686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BE    = MO_BSWAP,
21786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
21886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifdef TARGET_WORDS_BIGENDIAN
21986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TE    = MO_BE,
22086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else
22186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TE    = MO_LE,
22286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
22386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
22486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* Combinations of the above, for ease of use.  */
22586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_UB    = MO_8,
22686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_UW    = MO_16,
22786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_UL    = MO_32,
22886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_SB    = MO_SIGN | MO_8,
22986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_SW    = MO_SIGN | MO_16,
23086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_SL    = MO_SIGN | MO_32,
23186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_Q     = MO_64,
23286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
23386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LEUW  = MO_LE | MO_UW,
23486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LEUL  = MO_LE | MO_UL,
23586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LESW  = MO_LE | MO_SW,
23686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LESL  = MO_LE | MO_SL,
23786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_LEQ   = MO_LE | MO_Q,
23886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
23986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BEUW  = MO_BE | MO_UW,
24086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BEUL  = MO_BE | MO_UL,
24186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BESW  = MO_BE | MO_SW,
24286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BESL  = MO_BE | MO_SL,
24386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_BEQ   = MO_BE | MO_Q,
24486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
24586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TEUW  = MO_TE | MO_UW,
24686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TEUL  = MO_TE | MO_UL,
24786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TESW  = MO_TE | MO_SW,
24886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TESL  = MO_TE | MO_SL,
24986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_TEQ   = MO_TE | MO_Q,
25086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
25186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    MO_SSIZE = MO_SIZE | MO_SIGN,
25286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} TCGMemOp;
25386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef tcg_target_ulong TCGArg;
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
25686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Define a type and accessor macros for variables.  Using a struct is
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   nice because it gives some level of type safely.  Ideally the compiler
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   be able to see through all this.  However in practice this is not true,
25986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner   especially on targets with braindamaged ABIs (e.g. i386).
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   We use plain int by default to avoid this runtime overhead.
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   Users of tcg_gen_* don't need to know about any of this, and should
2625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   treat TCGv as an opaque type.
2630bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner   In addition we do typechecking for different types of variables.  TCGv_i32
2645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   and TCGv_i64 are 32/64-bit variables respectively.  TCGv and TCGv_ptr
2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   are aliases for target_ulong and host pointer sized values respectively.
2665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
268b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#ifdef CONFIG_DEBUG_TCG
2695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEBUG_TCGV 1
2705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_TCGV
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int i32;
2775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} TCGv_i32;
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct
2805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
2815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int i64;
2825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} TCGv_i64;
2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2840bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turnertypedef struct {
2850bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner    int iptr;
2860bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner} TCGv_ptr;
2870bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner
2885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MAKE_TCGV_I32(i) __extension__                  \
2895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ({ TCGv_i32 make_tcgv_tmp = {i}; make_tcgv_tmp;})
2905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MAKE_TCGV_I64(i) __extension__                  \
2915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ({ TCGv_i64 make_tcgv_tmp = {i}; make_tcgv_tmp;})
2920bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define MAKE_TCGV_PTR(i) __extension__                  \
2930bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner    ({ TCGv_ptr make_tcgv_tmp = {i}; make_tcgv_tmp; })
2945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_I32(t) ((t).i32)
2955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_I64(t) ((t).i64)
2960bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define GET_TCGV_PTR(t) ((t).iptr)
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32
2985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_LOW(t) MAKE_TCGV_I32(GET_TCGV_I64(t))
2995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_HIGH(t) MAKE_TCGV_I32(GET_TCGV_I64(t) + 1)
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !DEBUG_TCGV */
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef int TCGv_i32;
3055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef int TCGv_i64;
3060bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32
3070bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define TCGv_ptr TCGv_i32
3080bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#else
3090bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define TCGv_ptr TCGv_i64
3100bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#endif
3115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MAKE_TCGV_I32(x) (x)
3125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MAKE_TCGV_I64(x) (x)
3130bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define MAKE_TCGV_PTR(x) (x)
3145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_I32(t) (t)
3155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_I64(t) (t)
3160bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define GET_TCGV_PTR(t) (t)
3175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32
3195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_LOW(t) (t)
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCGV_HIGH(t) ((t) + 1)
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* DEBUG_TCGV */
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_EQUAL_I32(a, b) (GET_TCGV_I32(a) == GET_TCGV_I32(b))
3265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_EQUAL_I64(a, b) (GET_TCGV_I64(a) == GET_TCGV_I64(b))
3275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Dummy definition to avoid compiler warnings.  */
3295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_UNUSED_I32(x) x = MAKE_TCGV_I32(-1)
3305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCGV_UNUSED_I64(x) x = MAKE_TCGV_I64(-1)
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
33286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_IS_UNUSED_I32(x) (GET_TCGV_I32(x) == -1)
33386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_IS_UNUSED_I64(x) (GET_TCGV_I64(x) == -1)
33486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* call flags */
33686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Helper does not read globals (either directly or through an exception). It
33786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner   implies TCG_CALL_NO_WRITE_GLOBALS. */
33886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_READ_GLOBALS    0x0010
33986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Helper does not write globals */
34086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_WRITE_GLOBALS   0x0020
34186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Helper can be safely suppressed if the return value is not used. */
34286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_SIDE_EFFECTS    0x0040
34386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
34486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* convenience version of most used call flags */
34586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_RWG         TCG_CALL_NO_READ_GLOBALS
34686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_WG          TCG_CALL_NO_WRITE_GLOBALS
34786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_SE          TCG_CALL_NO_SIDE_EFFECTS
34886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_RWG_SE      (TCG_CALL_NO_RWG | TCG_CALL_NO_SE)
34986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCG_CALL_NO_WG_SE       (TCG_CALL_NO_WG | TCG_CALL_NO_SE)
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* used to align parameters */
3525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define TCG_CALL_DUMMY_TCGV     MAKE_TCGV_I32(-1)
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_CALL_DUMMY_ARG      ((TCGArg)(-1))
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
35586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Conditions.  Note that these are laid out for easy manipulation by
35686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner   the functions below:
35786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner     bit 0 is used for inverting;
35886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner     bit 1 is signed,
35986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner     bit 2 is unsigned,
36086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner     bit 3 is used with bit 0 for swapping signed/unsigned.  */
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef enum {
36286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* non-signed */
36386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_NEVER  = 0 | 0 | 0 | 0,
36486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_ALWAYS = 0 | 0 | 0 | 1,
36586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_EQ     = 8 | 0 | 0 | 0,
36686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_NE     = 8 | 0 | 0 | 1,
36786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* signed */
36886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_LT     = 0 | 0 | 2 | 0,
36986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_GE     = 0 | 0 | 2 | 1,
37086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_LE     = 8 | 0 | 2 | 0,
37186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_GT     = 8 | 0 | 2 | 1,
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* unsigned */
37386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_LTU    = 0 | 4 | 0 | 0,
37486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_GEU    = 0 | 4 | 0 | 1,
37586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_LEU    = 8 | 4 | 0 | 0,
37686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_COND_GTU    = 8 | 4 | 0 | 1,
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGCond;
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
379b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner/* Invert the sense of the comparison.  */
380b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turnerstatic inline TCGCond tcg_invert_cond(TCGCond c)
381b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{
382b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner    return (TCGCond)(c ^ 1);
383b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner}
384b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner
385b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner/* Swap the operands in a comparison.  */
386b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turnerstatic inline TCGCond tcg_swap_cond(TCGCond c)
387b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{
38886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    return c & 6 ? (TCGCond)(c ^ 9) : c;
389b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner}
390b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner
39186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Create an "unsigned" version of a "signed" comparison.  */
392b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turnerstatic inline TCGCond tcg_unsigned_cond(TCGCond c)
393b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{
39486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    return c & 2 ? (TCGCond)(c ^ 6) : c;
39586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner}
39686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
39786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Must a comparison be considered unsigned?  */
39886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline bool is_unsigned_cond(TCGCond c)
39986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{
40086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    return (c & 4) != 0;
40186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner}
40286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
40386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Create a "high" version of a double-word comparison.
40486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner   This removes equality from a LTE or GTE comparison.  */
40586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline TCGCond tcg_high_cond(TCGCond c)
40686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{
40786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    switch (c) {
40886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    case TCG_COND_GE:
40986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    case TCG_COND_LE:
41086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    case TCG_COND_GEU:
41186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    case TCG_COND_LEU:
41286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner        return (TCGCond)(c ^ 8);
41386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    default:
41486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner        return c;
41586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    }
416b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner}
417b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TEMP_VAL_DEAD  0
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TEMP_VAL_REG   1
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TEMP_VAL_MEM   2
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TEMP_VAL_CONST 3
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: optimize memory layout */
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGTemp {
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGType base_type;
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGType type;
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int val_type;
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int reg;
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tcg_target_long val;
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int mem_reg;
43186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    intptr_t mem_offset;
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned int fixed_reg:1;
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned int mem_coherent:1;
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned int mem_allocated:1;
43586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    unsigned int temp_local:1; /* If true, the temp is saved across
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                  basic blocks. Otherwise, it is not
43786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                  preserved across basic blocks. */
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned int temp_allocated:1; /* never used for code gen */
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *name;
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGTemp;
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGContext TCGContext;
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
44486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertypedef struct TCGTempSet {
44586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    unsigned long l[BITS_TO_LONGS(TCG_MAX_TEMPS)];
44686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} TCGTempSet;
44786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct TCGContext {
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t *pool_cur, *pool_end;
45086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCGPool *pool_first, *pool_current, *pool_first_large;
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGLabel *labels;
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int nb_labels;
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int nb_globals;
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int nb_temps;
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* goto_tb support */
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t *code_buf;
45886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    uintptr_t *tb_next;
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint16_t *tb_next_offset;
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint16_t *tb_jmp_offset; /* != NULL if USE_DIRECT_JUMP */
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* liveness analysis */
46353a08edf171bdbc7e3a2d89b78b96a33361a2760David 'Digit' Turner    uint16_t *op_dead_args; /* for each operation, each bit tells if the
46453a08edf171bdbc7e3a2d89b78b96a33361a2760David 'Digit' Turner                               corresponding argument is dead */
46586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    uint8_t *op_sync_args;  /* for each operation, each bit tells if the
46686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                               corresponding output argument needs to be
46786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                               sync to memory. */
46886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* tells in which temporary a given register is. It does not take
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       into account fixed registers */
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int reg_to_temp[TCG_TARGET_NB_REGS];
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGRegSet reserved_regs;
47386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    intptr_t current_frame_offset;
47486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    intptr_t frame_start;
47586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    intptr_t frame_end;
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int frame_reg;
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t *code_ptr;
47986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCGTemp temps[TCG_MAX_TEMPS]; /* globals first, temps after */
48086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCGTempSet free_temps[TCG_TYPE_COUNT * 2];
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4829142071536d74f1b8370f79851c9c2ca92496628David 'Digit' Turner    GHashTable *helpers;
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* profiling info */
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t tb_count1;
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t tb_count;
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t op_count; /* total insn count */
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int op_count_max; /* max insn per TB */
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t temp_count;
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int temp_count_max;
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t del_op_count;
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t code_in_len;
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t code_out_len;
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t interm_time;
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t code_time;
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t la_time;
49886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    int64_t opt_time;
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t restore_count;
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t restore_time;
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
502f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner
503f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#ifdef CONFIG_DEBUG_TCG
504f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    int temps_in_use;
50586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    int goto_tb_issue_mask;
506f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#endif
5071348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner
508975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    uint16_t gen_opc_buf[OPC_BUF_SIZE];
509975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    TCGArg gen_opparam_buf[OPPARAM_BUF_SIZE];
510975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner
511975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    uint16_t *gen_opc_ptr;
512975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    TCGArg *gen_opparam_ptr;
513975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    target_ulong gen_opc_pc[OPC_BUF_SIZE];
514975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    uint16_t gen_opc_icount[OPC_BUF_SIZE];
515975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
516975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner
517975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    /* Code generation */
518975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    int code_gen_max_blocks;
51986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    uint8_t *code_gen_prologue;
52086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    uint8_t *code_gen_buffer;
521975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    size_t code_gen_buffer_size;
522975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    /* threshold to flush the translated code buffer */
523975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    size_t code_gen_buffer_max_size;
524975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner    uint8_t *code_gen_ptr;
525975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner
5261348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner    TBContext tb_ctx;
52786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
52886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* The TCGBackendData structure is private to tcg-target.c.  */
52986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    struct TCGBackendData *be;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern TCGContext tcg_ctx;
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pool based memory allocation */
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *tcg_malloc_internal(TCGContext *s, int size);
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tcg_pool_reset(TCGContext *s);
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tcg_pool_delete(TCGContext *s);
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void *tcg_malloc(int size)
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGContext *s = &tcg_ctx;
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t *ptr, *ptr_end;
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    size = (size + sizeof(long) - 1) & ~(sizeof(long) - 1);
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ptr = s->pool_cur;
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ptr_end = ptr + size;
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (unlikely(ptr_end > s->pool_end)) {
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return tcg_malloc_internal(&tcg_ctx, size);
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        s->pool_cur = ptr_end;
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return ptr;
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tcg_context_init(TCGContext *s);
556f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnervoid tcg_prologue_init(TCGContext *s);
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tcg_func_start(TCGContext *s);
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint tcg_gen_code(TCGContext *s, uint8_t *gen_code_buf);
5605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint tcg_gen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset);
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
56286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_set_frame(TCGContext *s, int reg, intptr_t start, intptr_t size);
5635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i32 tcg_global_reg_new_i32(int reg, const char *name);
56586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' TurnerTCGv_i32 tcg_global_mem_new_i32(int reg, intptr_t offset, const char *name);
5665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i32 tcg_temp_new_internal_i32(int temp_local);
5675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline TCGv_i32 tcg_temp_new_i32(void)
5685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
5695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return tcg_temp_new_internal_i32(0);
5705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
5715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline TCGv_i32 tcg_temp_local_new_i32(void)
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return tcg_temp_new_internal_i32(1);
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid tcg_temp_free_i32(TCGv_i32 arg);
5765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerchar *tcg_get_arg_str_i32(TCGContext *s, char *buf, int buf_size, TCGv_i32 arg);
5775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i64 tcg_global_reg_new_i64(int reg, const char *name);
57986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' TurnerTCGv_i64 tcg_global_mem_new_i64(int reg, intptr_t offset, const char *name);
5805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i64 tcg_temp_new_internal_i64(int temp_local);
5815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline TCGv_i64 tcg_temp_new_i64(void)
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return tcg_temp_new_internal_i64(0);
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline TCGv_i64 tcg_temp_local_new_i64(void)
5865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
5875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return tcg_temp_new_internal_i64(1);
5885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
5895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid tcg_temp_free_i64(TCGv_i64 arg);
5905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerchar *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg);
5915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
592f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#if defined(CONFIG_DEBUG_TCG)
593f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner/* If you call tcg_clear_temp_count() at the start of a section of
594f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner * code which is not supposed to leak any TCG temporaries, then
595f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner * calling tcg_check_temp_count() at the end of the section will
596f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner * return 1 if the section did in fact leak a temporary.
597f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner */
598f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnervoid tcg_clear_temp_count(void);
599f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerint tcg_check_temp_count(void);
600f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#else
601f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define tcg_clear_temp_count() do { } while (0)
602f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define tcg_check_temp_count() 0
603f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#endif
604f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner
605f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnervoid tcg_dump_info(FILE *f, fprintf_function cpu_fprintf);
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_CT_ALIAS  0x80
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_CT_IALIAS 0x40
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_CT_REG    0x01
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_CT_CONST  0x02 /* any constant of register size */
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGArgConstraint {
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint16_t ct;
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t alias_index;
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    union {
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        TCGRegSet regs;
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } u;
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGArgConstraint;
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TCG_MAX_OP_ARGS 16
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
62286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Bits for TCGOpDef->flags, 8 bits available.  */
62386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerenum {
62486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* Instruction defines the end of a basic block.  */
62586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_OPF_BB_END       = 0x01,
62686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* Instruction clobbers call registers and potentially update globals.  */
62786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_OPF_CALL_CLOBBER = 0x02,
62886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* Instruction has side effects: it cannot be removed if its outputs
62986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner       are not used, and might trigger exceptions.  */
63086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_OPF_SIDE_EFFECTS = 0x04,
63186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* Instruction operands are 64-bits (otherwise 32-bits).  */
63286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_OPF_64BIT        = 0x08,
63386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    /* Instruction is optional and not implemented by the host, or insn
63486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner       is generic and should not be implemened by the host.  */
63586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    TCG_OPF_NOT_PRESENT  = 0x10,
63686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner};
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGOpDef {
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *name;
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t flags;
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGArgConstraint *args_ct;
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int *sorted_args;
644b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#if defined(CONFIG_DEBUG_TCG)
645b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner    int used;
646b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#endif
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGOpDef;
648c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner
64986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerextern TCGOpDef tcg_op_defs[];
65086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerextern const size_t tcg_op_defs_max;
65186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TCGTargetOpDef {
653f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner    TCGOpcode op;
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *args_ct_str[TCG_MAX_OP_ARGS];
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} TCGTargetOpDef;
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_abort() \
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo {\
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    fprintf(stderr, "%s:%d: tcg fatal error\n", __FILE__, __LINE__);\
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    abort();\
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} while (0)
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
66386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifdef CONFIG_DEBUG_TCG
66486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_debug_assert(X) do { assert(X); } while (0)
66586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#elif QEMU_GNUC_PREREQ(4, 5)
66686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_debug_assert(X) \
66786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    do { if (!(X)) { __builtin_unreachable(); } } while (0)
66886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else
66986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_debug_assert(X) do { (void)(X); } while (0)
67086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
67186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tcg_add_target_add_op_defs(const TCGTargetOpDef *tdefs);
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
67486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if UINTPTR_MAX == UINT32_MAX
6750bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define TCGV_NAT_TO_PTR(n) MAKE_TCGV_PTR(GET_TCGV_I32(n))
6760bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I32(GET_TCGV_PTR(n))
6770bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner
67886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i32((intptr_t)(V)))
6790bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_global_reg_new_ptr(R, N) \
6800bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner    TCGV_NAT_TO_PTR(tcg_global_reg_new_i32((R), (N)))
6810bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_global_mem_new_ptr(R, O, N) \
6820bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner    TCGV_NAT_TO_PTR(tcg_global_mem_new_i32((R), (O), (N)))
6830bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_temp_new_ptr() TCGV_NAT_TO_PTR(tcg_temp_new_i32())
6840bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_temp_free_ptr(T) tcg_temp_free_i32(TCGV_PTR_TO_NAT(T))
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
6860bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define TCGV_NAT_TO_PTR(n) MAKE_TCGV_PTR(GET_TCGV_I64(n))
6870bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I64(GET_TCGV_PTR(n))
6880bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner
68986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i64((intptr_t)(V)))
6900bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_global_reg_new_ptr(R, N) \
6910bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner    TCGV_NAT_TO_PTR(tcg_global_reg_new_i64((R), (N)))
6920bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_global_mem_new_ptr(R, O, N) \
6930bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner    TCGV_NAT_TO_PTR(tcg_global_mem_new_i64((R), (O), (N)))
6940bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_temp_new_ptr() TCGV_NAT_TO_PTR(tcg_temp_new_i64())
6950bee5e821a3e9a40fa26ca65ea7cf235c25c06c1David 'Digit' Turner#define tcg_temp_free_ptr(T) tcg_temp_free_i64(TCGV_PTR_TO_NAT(T))
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
6995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   int sizemask, TCGArg ret, int nargs, TCGArg *args);
7005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
7015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid tcg_gen_shifti_i64(TCGv_i64 ret, TCGv_i64 arg1,
7025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        int c, int right, int arith);
7035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
70486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' TurnerTCGArg *tcg_optimize(TCGContext *s, uint16_t *tcg_opc_ptr, TCGArg *args,
70586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                     TCGOpDef *tcg_op_def);
70686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
7075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* only used for debugging purposes */
70886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_dump_ops(TCGContext *s);
7095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
7105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid dump_ops(const uint16_t *opc_buf, const TCGArg *opparam_buf);
7115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i32 tcg_const_i32(int32_t val);
7125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i64 tcg_const_i64(int64_t val);
7135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i32 tcg_const_local_i32(int32_t val);
7145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerTCGv_i64 tcg_const_local_i64(int64_t val);
7155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
71686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/**
71786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * tcg_qemu_tb_exec:
71886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * @env: CPUArchState * for the CPU
71986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * @tb_ptr: address of generated code for the TB to execute
72086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *
72186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * Start executing code from a given translation block.
72286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * Where translation blocks have been linked, execution
72386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * may proceed from the given TB into successive ones.
72486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * Control eventually returns only when some action is needed
72586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * from the top-level loop: either control must pass to a TB
72686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * which has not yet been directly linked, or an asynchronous
72786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * event such as an interrupt needs handling.
72886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *
72986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * The return value is a pointer to the next TB to execute
73086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * (if known; otherwise zero). This pointer is assumed to be
73186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * 4-aligned, and the bottom two bits are used to return further
73286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * information:
73386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *  0, 1: the link between this TB and the next is via the specified
73486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        TB index (0 or 1). That is, we left the TB via (the equivalent
73586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        of) "goto_tb <index>". The main loop uses this to determine
73686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        how to link the TB just executed to the next.
73786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *  2:    we are using instruction counting code generation, and we
73886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        did not start executing this TB because the instruction counter
73986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        would hit zero midway through it. In this case the next-TB pointer
74086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        returned is the TB we were about to execute, and the caller must
74186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        arrange to execute the remaining count of instructions.
74286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *  3:    we stopped because the CPU's exit_request flag was set
74386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        (usually meaning that there is an interrupt that needs to be
74486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        handled). The next-TB pointer returned is the TB we were
74586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *        about to execute when we noticed the pending exit request.
74686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *
74786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * If the bottom two bits indicate an exit-via-index then the CPU
74886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * state is correctly synchronised and ready for execution of the next
74986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * TB (and in particular the guest PC is the address to execute next).
75086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * Otherwise, we gave up on execution of this TB before it started, and
75186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * the caller must fix up the CPU state by calling cpu_pc_from_tb()
75286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * with the next-TB pointer we return.
75386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *
75486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * Note that TCG targets may use a different definition of tcg_qemu_tb_exec
75586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * to this default (which just calls the prologue.code emitted by
75686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * tcg_target_qemu_prologue()).
75786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner */
75886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TB_EXIT_MASK 3
75986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TB_EXIT_IDX0 0
76086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TB_EXIT_IDX1 1
76186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TB_EXIT_ICOUNT_EXPIRED 2
76286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TB_EXIT_REQUESTED 3
76386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
76453a08edf171bdbc7e3a2d89b78b96a33361a2760David 'Digit' Turner#if !defined(tcg_qemu_tb_exec)
76586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_qemu_tb_exec(env, tb_ptr) \
76686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner    ((uintptr_t (*)(void *, void *))tcg_ctx.code_gen_prologue)(env, tb_ptr)
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
76886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
76986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_register_jit(void *buf, size_t buf_size);
77086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
77186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/*
77286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * Memory helpers that will be used by TCG generated code.
77386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner */
77486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifdef CONFIG_SOFTMMU
77586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Value zero-extended to tcg register size.  */
77686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_ret_ldub_mmu(CPUArchState *env, target_ulong addr,
77786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                     int mmu_idx, uintptr_t retaddr);
77886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_le_lduw_mmu(CPUArchState *env, target_ulong addr,
77986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
78086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_le_ldul_mmu(CPUArchState *env, target_ulong addr,
78186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
78286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint64_t helper_le_ldq_mmu(CPUArchState *env, target_ulong addr,
78386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                           int mmu_idx, uintptr_t retaddr);
78486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_be_lduw_mmu(CPUArchState *env, target_ulong addr,
78586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
78686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_be_ldul_mmu(CPUArchState *env, target_ulong addr,
78786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
78886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint64_t helper_be_ldq_mmu(CPUArchState *env, target_ulong addr,
78986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                           int mmu_idx, uintptr_t retaddr);
79086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
79186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Value sign-extended to tcg register size.  */
79286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_ret_ldsb_mmu(CPUArchState *env, target_ulong addr,
79386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                     int mmu_idx, uintptr_t retaddr);
79486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_le_ldsw_mmu(CPUArchState *env, target_ulong addr,
79586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
79686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_le_ldsl_mmu(CPUArchState *env, target_ulong addr,
79786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
79886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_be_ldsw_mmu(CPUArchState *env, target_ulong addr,
79986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
80086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnertcg_target_ulong helper_be_ldsl_mmu(CPUArchState *env, target_ulong addr,
80186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                                    int mmu_idx, uintptr_t retaddr);
80286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
80386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_ret_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val,
80486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                        int mmu_idx, uintptr_t retaddr);
80586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_le_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val,
80686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                       int mmu_idx, uintptr_t retaddr);
80786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_le_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val,
80886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                       int mmu_idx, uintptr_t retaddr);
80986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_le_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
81086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                       int mmu_idx, uintptr_t retaddr);
81186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_be_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val,
81286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                       int mmu_idx, uintptr_t retaddr);
81386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_be_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val,
81486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                       int mmu_idx, uintptr_t retaddr);
81586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
81686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                       int mmu_idx, uintptr_t retaddr);
81786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
81886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* Temporary aliases until backends are converted.  */
81986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifdef TARGET_WORDS_BIGENDIAN
82086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldsw_mmu  helper_be_ldsw_mmu
82186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_lduw_mmu  helper_be_lduw_mmu
82286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldsl_mmu  helper_be_ldsl_mmu
82386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldul_mmu  helper_be_ldul_mmu
82486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldq_mmu   helper_be_ldq_mmu
82586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_stw_mmu   helper_be_stw_mmu
82686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_stl_mmu   helper_be_stl_mmu
82786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_stq_mmu   helper_be_stq_mmu
82886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else
82986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldsw_mmu  helper_le_ldsw_mmu
83086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_lduw_mmu  helper_le_lduw_mmu
83186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldsl_mmu  helper_le_ldsl_mmu
83286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldul_mmu  helper_le_ldul_mmu
83386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_ldq_mmu   helper_le_ldq_mmu
83486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_stw_mmu   helper_le_stw_mmu
83586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_stl_mmu   helper_le_stl_mmu
83686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define helper_ret_stq_mmu   helper_le_stq_mmu
83786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif
83886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
83986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint8_t helper_ldb_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
84086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint16_t helper_ldw_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
84186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint32_t helper_ldl_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
84286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint64_t helper_ldq_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
84386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
84486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_stb_mmu(CPUArchState *env, target_ulong addr,
84586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                    uint8_t val, int mmu_idx);
84686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_stw_mmu(CPUArchState *env, target_ulong addr,
84786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                    uint16_t val, int mmu_idx);
84886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_stl_mmu(CPUArchState *env, target_ulong addr,
84986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                    uint32_t val, int mmu_idx);
85086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid helper_stq_mmu(CPUArchState *env, target_ulong addr,
85186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner                    uint64_t val, int mmu_idx);
85286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif /* CONFIG_SOFTMMU */
85386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner
85486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif /* TCG_H */
855