mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-tcg-20250117' of https://gitlab.com/rth7680/qemu into staging
tcg:
- Add TCGOP_TYPE, TCGOP_FLAGS.
- Pass type and flags to tcg_op_supported, tcg_target_op_def.
- Split out tcg-target-has.h and unexport from tcg.h.
- Reorg constraint processing; constify TCGOpDef.
- Make extract, sextract, deposit opcodes mandatory.
- Merge ext{8,16,32}{s,u} opcodes into {s}extract.
tcg/mips: Expand bswap unconditionally
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
tcg/riscv: Use BEXTI for single-bit extractions
tcg/sparc64: Use SRA, SRL for {s}extract_i64
disas/riscv: Guard dec->cfg dereference for host disassemble
util/cpuinfo-riscv: Detect Zbs
accel/tcg: Call tcg_tb_insert() for one-insn TBs
linux-user: Add missing /proc/cpuinfo fields for sparc
# -----BEGIN PGP SIGNATURE-----
#
# iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmeKnzUdHHJpY2hhcmQu
# aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+Kvgf+LG9UjXlWF9GK923E
# TllBL2rLf1OOdtTXWO15VcvGMoWDwB3tVBdhihdvXmnWju+WbfMk6mct5NhzsKn9
# LmuugMIZs+hMROj+bgMK8x47jRIh5N2rDYxcEgmyfIpYb2o9qvyqKecGVRlSJTCE
# bmt5UFbvPThBb8upoMfq3F6evuMx0szBP7wrOwSR/VGpmzIr20UTEWo6I1ALp4uj
# paFaysYol4em3dIhkiuV9cL7E0EIObaNa7l9RUci/BmTq+JaVxUnW1Y2i0PEwKwG
# FJSfYTJk3wBgAVxC2zC2g3ZM7uKuecSXMpiFopTiuyQLp7Q61i9kCNvEq0qY5tdb
# DaqR/g==
# =cv4O
# -----END PGP SIGNATURE-----
# gpg: Signature made Fri 17 Jan 2025 13:19:33 EST
# gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F
# gpg: issuer "richard.henderson@linaro.org"
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full]
# Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F
* tag 'pull-tcg-20250117' of https://gitlab.com/rth7680/qemu: (68 commits)
softfloat: Constify helpers returning float_status field
accel/tcg: Call tcg_tb_insert() for one-insn TBs
tcg: Document tb_lookup() and tcg_tb_lookup()
linux-user: Add missing /proc/cpuinfo fields for sparc
tcg/riscv: Use BEXTI for single-bit extractions
util/cpuinfo-riscv: Detect Zbs
tcg: Remove TCG_TARGET_HAS_deposit_{i32,i64}
tcg: Remove TCG_TARGET_HAS_{s}extract_{i32,i64}
tcg/tci: Remove assertions for deposit and extract
tcg/tci: Provide TCG_TARGET_{s}extract_valid
tcg/sparc64: Use SRA, SRL for {s}extract_i64
tcg/s390x: Fold the ext{8,16,32}[us] cases into {s}extract
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
tcg/riscv64: Fold the ext{8,16,32}[us] cases into {s}extract
tcg/ppc: Fold the ext{8,16,32}[us] cases into {s}extract
tcg/mips: Fold the ext{8,16,32}[us] cases into {s}extract
tcg/loongarch64: Fold the ext{8,16,32}[us] cases into {s}extract
tcg/arm: Add full [US]XT[BH] into {s}extract
tcg/aarch64: Expand extract with offset 0 with andi
tcg/aarch64: Provide TCG_TARGET_{s}extract_valid
...
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
+14
-1
@@ -249,7 +249,20 @@ static TranslationBlock *tb_htable_lookup(CPUState *cpu, vaddr pc,
|
||||
return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp);
|
||||
}
|
||||
|
||||
/* Might cause an exception, so have a longjmp destination ready */
|
||||
/**
|
||||
* tb_lookup:
|
||||
* @cpu: CPU that will execute the returned translation block
|
||||
* @pc: guest PC
|
||||
* @cs_base: arch-specific value associated with translation block
|
||||
* @flags: arch-specific translation block flags
|
||||
* @cflags: CF_* flags
|
||||
*
|
||||
* Look up a translation block inside the QHT using @pc, @cs_base, @flags and
|
||||
* @cflags. Uses @cpu's tb_jmp_cache. Might cause an exception, so have a
|
||||
* longjmp destination ready.
|
||||
*
|
||||
* Returns: an existing translation block or NULL.
|
||||
*/
|
||||
static inline TranslationBlock *tb_lookup(CPUState *cpu, vaddr pc,
|
||||
uint64_t cs_base, uint32_t flags,
|
||||
uint32_t cflags)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/translation-block.h"
|
||||
#include "tb-internal.h"
|
||||
#include "tcg-target-mo.h"
|
||||
|
||||
/*
|
||||
* Access to the various translations structures need to be serialised
|
||||
|
||||
+19
-10
@@ -531,16 +531,6 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
||||
tb_reset_jump(tb, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the TB is not associated with a physical RAM page then it must be
|
||||
* a temporary one-insn TB, and we have nothing left to do. Return early
|
||||
* before attempting to link to other TBs or add to the lookup table.
|
||||
*/
|
||||
if (tb_page_addr0(tb) == -1) {
|
||||
assert_no_pages_locked();
|
||||
return tb;
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert TB into the corresponding region tree before publishing it
|
||||
* through QHT. Otherwise rewinding happened in the TB might fail to
|
||||
@@ -548,6 +538,25 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
||||
*/
|
||||
tcg_tb_insert(tb);
|
||||
|
||||
/*
|
||||
* If the TB is not associated with a physical RAM page then it must be
|
||||
* a temporary one-insn TB.
|
||||
*
|
||||
* Such TBs must be added to region trees in order to make sure that
|
||||
* restore_state_to_opc() - which on some architectures is not limited to
|
||||
* rewinding, but also affects exception handling! - is called when such a
|
||||
* TB causes an exception.
|
||||
*
|
||||
* At the same time, temporary one-insn TBs must be executed at most once,
|
||||
* because subsequent reads from, e.g., I/O memory may return different
|
||||
* values. So return early before attempting to link to other TBs or add
|
||||
* to the QHT.
|
||||
*/
|
||||
if (tb_page_addr0(tb) == -1) {
|
||||
assert_no_pages_locked();
|
||||
return tb;
|
||||
}
|
||||
|
||||
/*
|
||||
* No explicit memory barrier is required -- tb_link_page() makes the
|
||||
* TB visible in a consistent state.
|
||||
|
||||
+12
-11
@@ -2611,7 +2611,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
||||
break;
|
||||
case 2: op = rv_op_c_li; break;
|
||||
case 3:
|
||||
if (dec->cfg->ext_zcmop) {
|
||||
if (dec->cfg && dec->cfg->ext_zcmop) {
|
||||
if ((((inst >> 2) & 0b111111) == 0b100000) &&
|
||||
(((inst >> 11) & 0b11) == 0b0)) {
|
||||
unsigned int cmop_code = 0;
|
||||
@@ -2712,7 +2712,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
||||
op = rv_op_c_sqsp;
|
||||
} else {
|
||||
op = rv_op_c_fsdsp;
|
||||
if (dec->cfg->ext_zcmp && ((inst >> 12) & 0b01)) {
|
||||
if (dec->cfg && dec->cfg->ext_zcmp && ((inst >> 12) & 0b01)) {
|
||||
switch ((inst >> 8) & 0b01111) {
|
||||
case 8:
|
||||
if (((inst >> 4) & 0b01111) >= 4) {
|
||||
@@ -2738,7 +2738,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
||||
} else {
|
||||
switch ((inst >> 10) & 0b011) {
|
||||
case 0:
|
||||
if (!dec->cfg->ext_zcmt) {
|
||||
if (dec->cfg && !dec->cfg->ext_zcmt) {
|
||||
break;
|
||||
}
|
||||
if (((inst >> 2) & 0xFF) >= 32) {
|
||||
@@ -2748,7 +2748,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!dec->cfg->ext_zcmp) {
|
||||
if (dec->cfg && !dec->cfg->ext_zcmp) {
|
||||
break;
|
||||
}
|
||||
switch ((inst >> 5) & 0b011) {
|
||||
@@ -2956,7 +2956,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
||||
break;
|
||||
case 5:
|
||||
op = rv_op_auipc;
|
||||
if (dec->cfg->ext_zicfilp &&
|
||||
if (dec->cfg && dec->cfg->ext_zicfilp &&
|
||||
(((inst >> 7) & 0b11111) == 0b00000)) {
|
||||
op = rv_op_lpad;
|
||||
}
|
||||
@@ -4058,7 +4058,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
||||
case 2: op = rv_op_csrrs; break;
|
||||
case 3: op = rv_op_csrrc; break;
|
||||
case 4:
|
||||
if (dec->cfg->ext_zimop) {
|
||||
if (dec->cfg && dec->cfg->ext_zimop) {
|
||||
int imm_mop5, imm_mop3, reg_num;
|
||||
if ((extract32(inst, 22, 10) & 0b1011001111)
|
||||
== 0b1000000111) {
|
||||
@@ -5112,28 +5112,28 @@ static GString *format_inst(size_t tab, rv_decode *dec)
|
||||
g_string_append(buf, rv_ireg_name_sym[dec->rs2]);
|
||||
break;
|
||||
case '3':
|
||||
if (dec->cfg->ext_zfinx) {
|
||||
if (dec->cfg && dec->cfg->ext_zfinx) {
|
||||
g_string_append(buf, rv_ireg_name_sym[dec->rd]);
|
||||
} else {
|
||||
g_string_append(buf, rv_freg_name_sym[dec->rd]);
|
||||
}
|
||||
break;
|
||||
case '4':
|
||||
if (dec->cfg->ext_zfinx) {
|
||||
if (dec->cfg && dec->cfg->ext_zfinx) {
|
||||
g_string_append(buf, rv_ireg_name_sym[dec->rs1]);
|
||||
} else {
|
||||
g_string_append(buf, rv_freg_name_sym[dec->rs1]);
|
||||
}
|
||||
break;
|
||||
case '5':
|
||||
if (dec->cfg->ext_zfinx) {
|
||||
if (dec->cfg && dec->cfg->ext_zfinx) {
|
||||
g_string_append(buf, rv_ireg_name_sym[dec->rs2]);
|
||||
} else {
|
||||
g_string_append(buf, rv_freg_name_sym[dec->rs2]);
|
||||
}
|
||||
break;
|
||||
case '6':
|
||||
if (dec->cfg->ext_zfinx) {
|
||||
if (dec->cfg && dec->cfg->ext_zfinx) {
|
||||
g_string_append(buf, rv_ireg_name_sym[dec->rs3]);
|
||||
} else {
|
||||
g_string_append(buf, rv_freg_name_sym[dec->rs3]);
|
||||
@@ -5439,7 +5439,8 @@ static GString *disasm_inst(rv_isa isa, uint64_t pc, rv_inst inst,
|
||||
const rv_opcode_data *opcode_data = decoders[i].opcode_data;
|
||||
void (*decode_func)(rv_decode *, rv_isa) = decoders[i].decode_func;
|
||||
|
||||
if (guard_func(cfg)) {
|
||||
/* always_true_p don't dereference cfg */
|
||||
if (((i == 0) || cfg) && guard_func(cfg)) {
|
||||
dec.opcode_data = opcode_data;
|
||||
decode_func(&dec, isa);
|
||||
if (dec.op != rv_op_illegal)
|
||||
|
||||
@@ -712,10 +712,9 @@ QEMU specific operations
|
||||
Host vector operations
|
||||
----------------------
|
||||
|
||||
All of the vector ops have two parameters, ``TCGOP_VECL`` & ``TCGOP_VECE``.
|
||||
The former specifies the length of the vector in log2 64-bit units; the
|
||||
latter specifies the length of the element (if applicable) in log2 8-bit units.
|
||||
E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
|
||||
All of the vector ops have two parameters, ``TCGOP_TYPE`` & ``TCGOP_VECE``.
|
||||
The former specifies the length of the vector as a TCGType; the latter
|
||||
specifies the length of the element (if applicable) in log2 8-bit units.
|
||||
|
||||
.. list-table::
|
||||
|
||||
@@ -729,7 +728,7 @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
|
||||
|
||||
* - dup_vec *v0*, *r1*
|
||||
|
||||
- | Duplicate the low N bits of *r1* into VECL/VECE copies across *v0*.
|
||||
- | Duplicate the low N bits of *r1* into TYPE/VECE copies across *v0*.
|
||||
|
||||
* - dupi_vec *v0*, *c*
|
||||
|
||||
@@ -738,7 +737,7 @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
|
||||
|
||||
* - dup2_vec *v0*, *r1*, *r2*
|
||||
|
||||
- | Duplicate *r2*:*r1* into VECL/64 copies across *v0*. This opcode is
|
||||
- | Duplicate *r2*:*r1* into TYPE/64 copies across *v0*. This opcode is
|
||||
only present for 32-bit hosts.
|
||||
|
||||
* - add_vec *v0*, *v1*, *v2*
|
||||
@@ -810,7 +809,7 @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
for (i = 0; i < VECL/VECE; ++i) {
|
||||
for (i = 0; i < TYPE/VECE; ++i) {
|
||||
v0[i] = v1[i] << s2;
|
||||
}
|
||||
|
||||
@@ -832,7 +831,7 @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
for (i = 0; i < VECL/VECE; ++i) {
|
||||
for (i = 0; i < TYPE/VECE; ++i) {
|
||||
v0[i] = v1[i] << v2[i];
|
||||
}
|
||||
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
#define CPUINFO_ALWAYS (1u << 0) /* so cpuinfo is nonzero */
|
||||
#define CPUINFO_ZBA (1u << 1)
|
||||
#define CPUINFO_ZBB (1u << 2)
|
||||
#define CPUINFO_ZICOND (1u << 3)
|
||||
#define CPUINFO_ZVE64X (1u << 4)
|
||||
#define CPUINFO_ZBS (1u << 3)
|
||||
#define CPUINFO_ZICOND (1u << 4)
|
||||
#define CPUINFO_ZVE64X (1u << 5)
|
||||
|
||||
/* Initialized with a constructor. */
|
||||
extern unsigned cpuinfo;
|
||||
|
||||
@@ -124,58 +124,61 @@ static inline void set_no_signaling_nans(bool val, float_status *status)
|
||||
status->no_signaling_nans = val;
|
||||
}
|
||||
|
||||
static inline bool get_float_detect_tininess(float_status *status)
|
||||
static inline bool get_float_detect_tininess(const float_status *status)
|
||||
{
|
||||
return status->tininess_before_rounding;
|
||||
}
|
||||
|
||||
static inline FloatRoundMode get_float_rounding_mode(float_status *status)
|
||||
static inline FloatRoundMode get_float_rounding_mode(const float_status *status)
|
||||
{
|
||||
return status->float_rounding_mode;
|
||||
}
|
||||
|
||||
static inline int get_float_exception_flags(float_status *status)
|
||||
static inline int get_float_exception_flags(const float_status *status)
|
||||
{
|
||||
return status->float_exception_flags;
|
||||
}
|
||||
|
||||
static inline FloatX80RoundPrec
|
||||
get_floatx80_rounding_precision(float_status *status)
|
||||
get_floatx80_rounding_precision(const float_status *status)
|
||||
{
|
||||
return status->floatx80_rounding_precision;
|
||||
}
|
||||
|
||||
static inline Float2NaNPropRule get_float_2nan_prop_rule(float_status *status)
|
||||
static inline Float2NaNPropRule
|
||||
get_float_2nan_prop_rule(const float_status *status)
|
||||
{
|
||||
return status->float_2nan_prop_rule;
|
||||
}
|
||||
|
||||
static inline Float3NaNPropRule get_float_3nan_prop_rule(float_status *status)
|
||||
static inline Float3NaNPropRule
|
||||
get_float_3nan_prop_rule(const float_status *status)
|
||||
{
|
||||
return status->float_3nan_prop_rule;
|
||||
}
|
||||
|
||||
static inline FloatInfZeroNaNRule get_float_infzeronan_rule(float_status *status)
|
||||
static inline FloatInfZeroNaNRule
|
||||
get_float_infzeronan_rule(const float_status *status)
|
||||
{
|
||||
return status->float_infzeronan_rule;
|
||||
}
|
||||
|
||||
static inline uint8_t get_float_default_nan_pattern(float_status *status)
|
||||
static inline uint8_t get_float_default_nan_pattern(const float_status *status)
|
||||
{
|
||||
return status->default_nan_pattern;
|
||||
}
|
||||
|
||||
static inline bool get_flush_to_zero(float_status *status)
|
||||
static inline bool get_flush_to_zero(const float_status *status)
|
||||
{
|
||||
return status->flush_to_zero;
|
||||
}
|
||||
|
||||
static inline bool get_flush_inputs_to_zero(float_status *status)
|
||||
static inline bool get_flush_inputs_to_zero(const float_status *status)
|
||||
{
|
||||
return status->flush_inputs_to_zero;
|
||||
}
|
||||
|
||||
static inline bool get_default_nan_mode(float_status *status)
|
||||
static inline bool get_default_nan_mode(const float_status *status)
|
||||
{
|
||||
return status->default_nan_mode;
|
||||
}
|
||||
|
||||
+160
-195
@@ -33,20 +33,13 @@ DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
|
||||
/* variable number of parameters */
|
||||
DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(br, 0, 0, 1, TCG_OPF_BB_END)
|
||||
DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
|
||||
|
||||
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
# define IMPL64 TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT
|
||||
#else
|
||||
# define IMPL64 TCG_OPF_64BIT
|
||||
#endif
|
||||
|
||||
DEF(mb, 0, 0, 1, 0)
|
||||
DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(setcond_i32, 1, 2, 1, 0)
|
||||
DEF(negsetcond_i32, 1, 2, 1, IMPL(TCG_TARGET_HAS_negsetcond_i32))
|
||||
DEF(negsetcond_i32, 1, 2, 1, 0)
|
||||
DEF(movcond_i32, 1, 4, 1, 0)
|
||||
/* load/store */
|
||||
DEF(ld8u_i32, 1, 1, 1, 0)
|
||||
@@ -61,12 +54,12 @@ DEF(st_i32, 0, 2, 1, 0)
|
||||
DEF(add_i32, 1, 2, 0, 0)
|
||||
DEF(sub_i32, 1, 2, 0, 0)
|
||||
DEF(mul_i32, 1, 2, 0, 0)
|
||||
DEF(div_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_div_i32))
|
||||
DEF(divu_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_div_i32))
|
||||
DEF(rem_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rem_i32))
|
||||
DEF(remu_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rem_i32))
|
||||
DEF(div2_i32, 2, 3, 0, IMPL(TCG_TARGET_HAS_div2_i32))
|
||||
DEF(divu2_i32, 2, 3, 0, IMPL(TCG_TARGET_HAS_div2_i32))
|
||||
DEF(div_i32, 1, 2, 0, 0)
|
||||
DEF(divu_i32, 1, 2, 0, 0)
|
||||
DEF(rem_i32, 1, 2, 0, 0)
|
||||
DEF(remu_i32, 1, 2, 0, 0)
|
||||
DEF(div2_i32, 2, 3, 0, 0)
|
||||
DEF(divu2_i32, 2, 3, 0, 0)
|
||||
DEF(and_i32, 1, 2, 0, 0)
|
||||
DEF(or_i32, 1, 2, 0, 0)
|
||||
DEF(xor_i32, 1, 2, 0, 0)
|
||||
@@ -74,127 +67,122 @@ DEF(xor_i32, 1, 2, 0, 0)
|
||||
DEF(shl_i32, 1, 2, 0, 0)
|
||||
DEF(shr_i32, 1, 2, 0, 0)
|
||||
DEF(sar_i32, 1, 2, 0, 0)
|
||||
DEF(rotl_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32))
|
||||
DEF(rotr_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32))
|
||||
DEF(deposit_i32, 1, 2, 2, IMPL(TCG_TARGET_HAS_deposit_i32))
|
||||
DEF(extract_i32, 1, 1, 2, IMPL(TCG_TARGET_HAS_extract_i32))
|
||||
DEF(sextract_i32, 1, 1, 2, IMPL(TCG_TARGET_HAS_sextract_i32))
|
||||
DEF(extract2_i32, 1, 2, 1, IMPL(TCG_TARGET_HAS_extract2_i32))
|
||||
DEF(rotl_i32, 1, 2, 0, 0)
|
||||
DEF(rotr_i32, 1, 2, 0, 0)
|
||||
DEF(deposit_i32, 1, 2, 2, 0)
|
||||
DEF(extract_i32, 1, 1, 2, 0)
|
||||
DEF(sextract_i32, 1, 1, 2, 0)
|
||||
DEF(extract2_i32, 1, 2, 1, 0)
|
||||
|
||||
DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH)
|
||||
|
||||
DEF(add2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_add2_i32))
|
||||
DEF(sub2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_sub2_i32))
|
||||
DEF(mulu2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_mulu2_i32))
|
||||
DEF(muls2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_muls2_i32))
|
||||
DEF(muluh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_muluh_i32))
|
||||
DEF(mulsh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_mulsh_i32))
|
||||
DEF(brcond2_i32, 0, 4, 2,
|
||||
TCG_OPF_BB_END | TCG_OPF_COND_BRANCH | IMPL(TCG_TARGET_REG_BITS == 32))
|
||||
DEF(setcond2_i32, 1, 4, 1, IMPL(TCG_TARGET_REG_BITS == 32))
|
||||
DEF(add2_i32, 2, 4, 0, 0)
|
||||
DEF(sub2_i32, 2, 4, 0, 0)
|
||||
DEF(mulu2_i32, 2, 2, 0, 0)
|
||||
DEF(muls2_i32, 2, 2, 0, 0)
|
||||
DEF(muluh_i32, 1, 2, 0, 0)
|
||||
DEF(mulsh_i32, 1, 2, 0, 0)
|
||||
DEF(brcond2_i32, 0, 4, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH)
|
||||
DEF(setcond2_i32, 1, 4, 1, 0)
|
||||
|
||||
DEF(ext8s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8s_i32))
|
||||
DEF(ext16s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext16s_i32))
|
||||
DEF(ext8u_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8u_i32))
|
||||
DEF(ext16u_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext16u_i32))
|
||||
DEF(bswap16_i32, 1, 1, 1, IMPL(TCG_TARGET_HAS_bswap16_i32))
|
||||
DEF(bswap32_i32, 1, 1, 1, IMPL(TCG_TARGET_HAS_bswap32_i32))
|
||||
DEF(not_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_not_i32))
|
||||
DEF(ext8s_i32, 1, 1, 0, 0)
|
||||
DEF(ext16s_i32, 1, 1, 0, 0)
|
||||
DEF(ext8u_i32, 1, 1, 0, 0)
|
||||
DEF(ext16u_i32, 1, 1, 0, 0)
|
||||
DEF(bswap16_i32, 1, 1, 1, 0)
|
||||
DEF(bswap32_i32, 1, 1, 1, 0)
|
||||
DEF(not_i32, 1, 1, 0, 0)
|
||||
DEF(neg_i32, 1, 1, 0, 0)
|
||||
DEF(andc_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_andc_i32))
|
||||
DEF(orc_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_orc_i32))
|
||||
DEF(eqv_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_eqv_i32))
|
||||
DEF(nand_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nand_i32))
|
||||
DEF(nor_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nor_i32))
|
||||
DEF(clz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_clz_i32))
|
||||
DEF(ctz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_ctz_i32))
|
||||
DEF(ctpop_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ctpop_i32))
|
||||
DEF(andc_i32, 1, 2, 0, 0)
|
||||
DEF(orc_i32, 1, 2, 0, 0)
|
||||
DEF(eqv_i32, 1, 2, 0, 0)
|
||||
DEF(nand_i32, 1, 2, 0, 0)
|
||||
DEF(nor_i32, 1, 2, 0, 0)
|
||||
DEF(clz_i32, 1, 2, 0, 0)
|
||||
DEF(ctz_i32, 1, 2, 0, 0)
|
||||
DEF(ctpop_i32, 1, 1, 0, 0)
|
||||
|
||||
DEF(mov_i64, 1, 1, 0, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
|
||||
DEF(setcond_i64, 1, 2, 1, IMPL64)
|
||||
DEF(negsetcond_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_negsetcond_i64))
|
||||
DEF(movcond_i64, 1, 4, 1, IMPL64)
|
||||
DEF(mov_i64, 1, 1, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(setcond_i64, 1, 2, 1, 0)
|
||||
DEF(negsetcond_i64, 1, 2, 1, 0)
|
||||
DEF(movcond_i64, 1, 4, 1, 0)
|
||||
/* load/store */
|
||||
DEF(ld8u_i64, 1, 1, 1, IMPL64)
|
||||
DEF(ld8s_i64, 1, 1, 1, IMPL64)
|
||||
DEF(ld16u_i64, 1, 1, 1, IMPL64)
|
||||
DEF(ld16s_i64, 1, 1, 1, IMPL64)
|
||||
DEF(ld32u_i64, 1, 1, 1, IMPL64)
|
||||
DEF(ld32s_i64, 1, 1, 1, IMPL64)
|
||||
DEF(ld_i64, 1, 1, 1, IMPL64)
|
||||
DEF(st8_i64, 0, 2, 1, IMPL64)
|
||||
DEF(st16_i64, 0, 2, 1, IMPL64)
|
||||
DEF(st32_i64, 0, 2, 1, IMPL64)
|
||||
DEF(st_i64, 0, 2, 1, IMPL64)
|
||||
DEF(ld8u_i64, 1, 1, 1, 0)
|
||||
DEF(ld8s_i64, 1, 1, 1, 0)
|
||||
DEF(ld16u_i64, 1, 1, 1, 0)
|
||||
DEF(ld16s_i64, 1, 1, 1, 0)
|
||||
DEF(ld32u_i64, 1, 1, 1, 0)
|
||||
DEF(ld32s_i64, 1, 1, 1, 0)
|
||||
DEF(ld_i64, 1, 1, 1, 0)
|
||||
DEF(st8_i64, 0, 2, 1, 0)
|
||||
DEF(st16_i64, 0, 2, 1, 0)
|
||||
DEF(st32_i64, 0, 2, 1, 0)
|
||||
DEF(st_i64, 0, 2, 1, 0)
|
||||
/* arith */
|
||||
DEF(add_i64, 1, 2, 0, IMPL64)
|
||||
DEF(sub_i64, 1, 2, 0, IMPL64)
|
||||
DEF(mul_i64, 1, 2, 0, IMPL64)
|
||||
DEF(div_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div_i64))
|
||||
DEF(divu_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div_i64))
|
||||
DEF(rem_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rem_i64))
|
||||
DEF(remu_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rem_i64))
|
||||
DEF(div2_i64, 2, 3, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div2_i64))
|
||||
DEF(divu2_i64, 2, 3, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div2_i64))
|
||||
DEF(and_i64, 1, 2, 0, IMPL64)
|
||||
DEF(or_i64, 1, 2, 0, IMPL64)
|
||||
DEF(xor_i64, 1, 2, 0, IMPL64)
|
||||
DEF(add_i64, 1, 2, 0, 0)
|
||||
DEF(sub_i64, 1, 2, 0, 0)
|
||||
DEF(mul_i64, 1, 2, 0, 0)
|
||||
DEF(div_i64, 1, 2, 0, 0)
|
||||
DEF(divu_i64, 1, 2, 0, 0)
|
||||
DEF(rem_i64, 1, 2, 0, 0)
|
||||
DEF(remu_i64, 1, 2, 0, 0)
|
||||
DEF(div2_i64, 2, 3, 0, 0)
|
||||
DEF(divu2_i64, 2, 3, 0, 0)
|
||||
DEF(and_i64, 1, 2, 0, 0)
|
||||
DEF(or_i64, 1, 2, 0, 0)
|
||||
DEF(xor_i64, 1, 2, 0, 0)
|
||||
/* shifts/rotates */
|
||||
DEF(shl_i64, 1, 2, 0, IMPL64)
|
||||
DEF(shr_i64, 1, 2, 0, IMPL64)
|
||||
DEF(sar_i64, 1, 2, 0, IMPL64)
|
||||
DEF(rotl_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64))
|
||||
DEF(rotr_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64))
|
||||
DEF(deposit_i64, 1, 2, 2, IMPL64 | IMPL(TCG_TARGET_HAS_deposit_i64))
|
||||
DEF(extract_i64, 1, 1, 2, IMPL64 | IMPL(TCG_TARGET_HAS_extract_i64))
|
||||
DEF(sextract_i64, 1, 1, 2, IMPL64 | IMPL(TCG_TARGET_HAS_sextract_i64))
|
||||
DEF(extract2_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_extract2_i64))
|
||||
DEF(shl_i64, 1, 2, 0, 0)
|
||||
DEF(shr_i64, 1, 2, 0, 0)
|
||||
DEF(sar_i64, 1, 2, 0, 0)
|
||||
DEF(rotl_i64, 1, 2, 0, 0)
|
||||
DEF(rotr_i64, 1, 2, 0, 0)
|
||||
DEF(deposit_i64, 1, 2, 2, 0)
|
||||
DEF(extract_i64, 1, 1, 2, 0)
|
||||
DEF(sextract_i64, 1, 1, 2, 0)
|
||||
DEF(extract2_i64, 1, 2, 1, 0)
|
||||
|
||||
/* size changing ops */
|
||||
DEF(ext_i32_i64, 1, 1, 0, IMPL64)
|
||||
DEF(extu_i32_i64, 1, 1, 0, IMPL64)
|
||||
DEF(extrl_i64_i32, 1, 1, 0,
|
||||
IMPL(TCG_TARGET_HAS_extr_i64_i32)
|
||||
| (TCG_TARGET_REG_BITS == 32 ? TCG_OPF_NOT_PRESENT : 0))
|
||||
DEF(extrh_i64_i32, 1, 1, 0,
|
||||
IMPL(TCG_TARGET_HAS_extr_i64_i32)
|
||||
| (TCG_TARGET_REG_BITS == 32 ? TCG_OPF_NOT_PRESENT : 0))
|
||||
DEF(ext_i32_i64, 1, 1, 0, 0)
|
||||
DEF(extu_i32_i64, 1, 1, 0, 0)
|
||||
DEF(extrl_i64_i32, 1, 1, 0, 0)
|
||||
DEF(extrh_i64_i32, 1, 1, 0, 0)
|
||||
|
||||
DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH | IMPL64)
|
||||
DEF(ext8s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8s_i64))
|
||||
DEF(ext16s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16s_i64))
|
||||
DEF(ext32s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32s_i64))
|
||||
DEF(ext8u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8u_i64))
|
||||
DEF(ext16u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16u_i64))
|
||||
DEF(ext32u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32u_i64))
|
||||
DEF(bswap16_i64, 1, 1, 1, IMPL64 | IMPL(TCG_TARGET_HAS_bswap16_i64))
|
||||
DEF(bswap32_i64, 1, 1, 1, IMPL64 | IMPL(TCG_TARGET_HAS_bswap32_i64))
|
||||
DEF(bswap64_i64, 1, 1, 1, IMPL64 | IMPL(TCG_TARGET_HAS_bswap64_i64))
|
||||
DEF(not_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_not_i64))
|
||||
DEF(neg_i64, 1, 1, 0, IMPL64)
|
||||
DEF(andc_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_andc_i64))
|
||||
DEF(orc_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_orc_i64))
|
||||
DEF(eqv_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_eqv_i64))
|
||||
DEF(nand_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nand_i64))
|
||||
DEF(nor_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nor_i64))
|
||||
DEF(clz_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_clz_i64))
|
||||
DEF(ctz_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ctz_i64))
|
||||
DEF(ctpop_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ctpop_i64))
|
||||
DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH)
|
||||
DEF(ext8s_i64, 1, 1, 0, 0)
|
||||
DEF(ext16s_i64, 1, 1, 0, 0)
|
||||
DEF(ext32s_i64, 1, 1, 0, 0)
|
||||
DEF(ext8u_i64, 1, 1, 0, 0)
|
||||
DEF(ext16u_i64, 1, 1, 0, 0)
|
||||
DEF(ext32u_i64, 1, 1, 0, 0)
|
||||
DEF(bswap16_i64, 1, 1, 1, 0)
|
||||
DEF(bswap32_i64, 1, 1, 1, 0)
|
||||
DEF(bswap64_i64, 1, 1, 1, 0)
|
||||
DEF(not_i64, 1, 1, 0, 0)
|
||||
DEF(neg_i64, 1, 1, 0, 0)
|
||||
DEF(andc_i64, 1, 2, 0, 0)
|
||||
DEF(orc_i64, 1, 2, 0, 0)
|
||||
DEF(eqv_i64, 1, 2, 0, 0)
|
||||
DEF(nand_i64, 1, 2, 0, 0)
|
||||
DEF(nor_i64, 1, 2, 0, 0)
|
||||
DEF(clz_i64, 1, 2, 0, 0)
|
||||
DEF(ctz_i64, 1, 2, 0, 0)
|
||||
DEF(ctpop_i64, 1, 1, 0, 0)
|
||||
|
||||
DEF(add2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_add2_i64))
|
||||
DEF(sub2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_sub2_i64))
|
||||
DEF(mulu2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulu2_i64))
|
||||
DEF(muls2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muls2_i64))
|
||||
DEF(muluh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muluh_i64))
|
||||
DEF(mulsh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulsh_i64))
|
||||
DEF(add2_i64, 2, 4, 0, 0)
|
||||
DEF(sub2_i64, 2, 4, 0, 0)
|
||||
DEF(mulu2_i64, 2, 2, 0, 0)
|
||||
DEF(muls2_i64, 2, 2, 0, 0)
|
||||
DEF(muluh_i64, 1, 2, 0, 0)
|
||||
DEF(mulsh_i64, 1, 2, 0, 0)
|
||||
|
||||
#define DATA64_ARGS (TCG_TARGET_REG_BITS == 64 ? 1 : 2)
|
||||
|
||||
/* There are tcg_ctx->insn_start_words here, not just one. */
|
||||
DEF(insn_start, 0, 0, DATA64_ARGS, TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
|
||||
DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
|
||||
DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
|
||||
DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
|
||||
DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
|
||||
|
||||
DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
@@ -206,113 +194,90 @@ DEF(qemu_ld_a32_i32, 1, 1, 1,
|
||||
DEF(qemu_st_a32_i32, 0, 1 + 1, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_ld_a32_i64, DATA64_ARGS, 1, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_st_a32_i64, 0, DATA64_ARGS + 1, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
|
||||
DEF(qemu_ld_a64_i32, 1, DATA64_ARGS, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_st_a64_i32, 0, 1 + DATA64_ARGS, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_ld_a64_i64, DATA64_ARGS, DATA64_ARGS, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
|
||||
/* Only used by i386 to cope with stupid register constraints. */
|
||||
DEF(qemu_st8_a32_i32, 0, 1 + 1, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
|
||||
IMPL(TCG_TARGET_HAS_qemu_st8_i32))
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
|
||||
IMPL(TCG_TARGET_HAS_qemu_st8_i32))
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
|
||||
/* Only for 64-bit hosts at the moment. */
|
||||
DEF(qemu_ld_a32_i128, 2, 1, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
|
||||
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
|
||||
DEF(qemu_ld_a64_i128, 2, 1, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
|
||||
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
|
||||
DEF(qemu_st_a32_i128, 0, 3, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
|
||||
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
|
||||
DEF(qemu_st_a64_i128, 0, 3, 1,
|
||||
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
|
||||
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
|
||||
DEF(qemu_ld_a32_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_ld_a64_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_st_a32_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
DEF(qemu_st_a64_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
|
||||
|
||||
/* Host vector support. */
|
||||
|
||||
#define IMPLVEC TCG_OPF_VECTOR | IMPL(TCG_TARGET_MAYBE_vec)
|
||||
|
||||
DEF(mov_vec, 1, 1, 0, TCG_OPF_VECTOR | TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(dup_vec, 1, 1, 0, IMPLVEC)
|
||||
DEF(dup2_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_REG_BITS == 32))
|
||||
DEF(dup_vec, 1, 1, 0, TCG_OPF_VECTOR)
|
||||
DEF(dup2_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(ld_vec, 1, 1, 1, IMPLVEC)
|
||||
DEF(st_vec, 0, 2, 1, IMPLVEC)
|
||||
DEF(dupm_vec, 1, 1, 1, IMPLVEC)
|
||||
DEF(ld_vec, 1, 1, 1, TCG_OPF_VECTOR)
|
||||
DEF(st_vec, 0, 2, 1, TCG_OPF_VECTOR)
|
||||
DEF(dupm_vec, 1, 1, 1, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(add_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(sub_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(mul_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_mul_vec))
|
||||
DEF(neg_vec, 1, 1, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_neg_vec))
|
||||
DEF(abs_vec, 1, 1, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_abs_vec))
|
||||
DEF(ssadd_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
|
||||
DEF(usadd_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
|
||||
DEF(sssub_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
|
||||
DEF(ussub_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
|
||||
DEF(smin_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
|
||||
DEF(umin_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
|
||||
DEF(smax_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
|
||||
DEF(umax_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
|
||||
DEF(add_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(sub_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(mul_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(neg_vec, 1, 1, 0, TCG_OPF_VECTOR)
|
||||
DEF(abs_vec, 1, 1, 0, TCG_OPF_VECTOR)
|
||||
DEF(ssadd_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(usadd_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(sssub_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(ussub_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(smin_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(umin_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(smax_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(umax_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(and_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(or_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(xor_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(andc_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_andc_vec))
|
||||
DEF(orc_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_orc_vec))
|
||||
DEF(nand_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_nand_vec))
|
||||
DEF(nor_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_nor_vec))
|
||||
DEF(eqv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_eqv_vec))
|
||||
DEF(not_vec, 1, 1, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_not_vec))
|
||||
DEF(and_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(or_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(xor_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(andc_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(orc_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(nand_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(nor_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(eqv_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(not_vec, 1, 1, 0, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(shli_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_shi_vec))
|
||||
DEF(shri_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_shi_vec))
|
||||
DEF(sari_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_shi_vec))
|
||||
DEF(rotli_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_roti_vec))
|
||||
DEF(shli_vec, 1, 1, 1, TCG_OPF_VECTOR)
|
||||
DEF(shri_vec, 1, 1, 1, TCG_OPF_VECTOR)
|
||||
DEF(sari_vec, 1, 1, 1, TCG_OPF_VECTOR)
|
||||
DEF(rotli_vec, 1, 1, 1, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(shls_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shs_vec))
|
||||
DEF(shrs_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shs_vec))
|
||||
DEF(sars_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shs_vec))
|
||||
DEF(rotls_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_rots_vec))
|
||||
DEF(shls_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(shrs_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(sars_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(rotls_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(shlv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shv_vec))
|
||||
DEF(shrv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shv_vec))
|
||||
DEF(sarv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shv_vec))
|
||||
DEF(rotlv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_rotv_vec))
|
||||
DEF(rotrv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_rotv_vec))
|
||||
DEF(shlv_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(shrv_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(sarv_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(rotlv_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(rotrv_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(cmp_vec, 1, 2, 1, IMPLVEC)
|
||||
DEF(cmp_vec, 1, 2, 1, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(bitsel_vec, 1, 3, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_bitsel_vec))
|
||||
DEF(cmpsel_vec, 1, 4, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_cmpsel_vec))
|
||||
DEF(bitsel_vec, 1, 3, 0, TCG_OPF_VECTOR)
|
||||
DEF(cmpsel_vec, 1, 4, 1, TCG_OPF_VECTOR)
|
||||
|
||||
DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
|
||||
|
||||
#if TCG_TARGET_MAYBE_vec
|
||||
#include "tcg-target.opc.h"
|
||||
#endif
|
||||
|
||||
#ifdef TCG_TARGET_INTERPRETER
|
||||
/* These opcodes are only for use between the tci generator and interpreter. */
|
||||
DEF(tci_movi, 1, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
DEF(tci_movl, 1, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
#endif
|
||||
#include "tcg-target-opc.h.inc"
|
||||
|
||||
#undef DATA64_ARGS
|
||||
#undef IMPL
|
||||
#undef IMPL64
|
||||
#undef IMPLVEC
|
||||
#undef DEF
|
||||
|
||||
+56
-131
@@ -64,111 +64,6 @@ typedef uint64_t TCGRegSet;
|
||||
#error unsupported
|
||||
#endif
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
/* Turn some undef macros into false macros. */
|
||||
#define TCG_TARGET_HAS_extr_i64_i32 0
|
||||
#define TCG_TARGET_HAS_div_i64 0
|
||||
#define TCG_TARGET_HAS_rem_i64 0
|
||||
#define TCG_TARGET_HAS_div2_i64 0
|
||||
#define TCG_TARGET_HAS_rot_i64 0
|
||||
#define TCG_TARGET_HAS_ext8s_i64 0
|
||||
#define TCG_TARGET_HAS_ext16s_i64 0
|
||||
#define TCG_TARGET_HAS_ext32s_i64 0
|
||||
#define TCG_TARGET_HAS_ext8u_i64 0
|
||||
#define TCG_TARGET_HAS_ext16u_i64 0
|
||||
#define TCG_TARGET_HAS_ext32u_i64 0
|
||||
#define TCG_TARGET_HAS_bswap16_i64 0
|
||||
#define TCG_TARGET_HAS_bswap32_i64 0
|
||||
#define TCG_TARGET_HAS_bswap64_i64 0
|
||||
#define TCG_TARGET_HAS_not_i64 0
|
||||
#define TCG_TARGET_HAS_andc_i64 0
|
||||
#define TCG_TARGET_HAS_orc_i64 0
|
||||
#define TCG_TARGET_HAS_eqv_i64 0
|
||||
#define TCG_TARGET_HAS_nand_i64 0
|
||||
#define TCG_TARGET_HAS_nor_i64 0
|
||||
#define TCG_TARGET_HAS_clz_i64 0
|
||||
#define TCG_TARGET_HAS_ctz_i64 0
|
||||
#define TCG_TARGET_HAS_ctpop_i64 0
|
||||
#define TCG_TARGET_HAS_deposit_i64 0
|
||||
#define TCG_TARGET_HAS_extract_i64 0
|
||||
#define TCG_TARGET_HAS_sextract_i64 0
|
||||
#define TCG_TARGET_HAS_extract2_i64 0
|
||||
#define TCG_TARGET_HAS_negsetcond_i64 0
|
||||
#define TCG_TARGET_HAS_add2_i64 0
|
||||
#define TCG_TARGET_HAS_sub2_i64 0
|
||||
#define TCG_TARGET_HAS_mulu2_i64 0
|
||||
#define TCG_TARGET_HAS_muls2_i64 0
|
||||
#define TCG_TARGET_HAS_muluh_i64 0
|
||||
#define TCG_TARGET_HAS_mulsh_i64 0
|
||||
/* Turn some undef macros into true macros. */
|
||||
#define TCG_TARGET_HAS_add2_i32 1
|
||||
#define TCG_TARGET_HAS_sub2_i32 1
|
||||
#endif
|
||||
|
||||
#ifndef TCG_TARGET_deposit_i32_valid
|
||||
#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
|
||||
#endif
|
||||
#ifndef TCG_TARGET_deposit_i64_valid
|
||||
#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
|
||||
#endif
|
||||
#ifndef TCG_TARGET_extract_i32_valid
|
||||
#define TCG_TARGET_extract_i32_valid(ofs, len) 1
|
||||
#endif
|
||||
#ifndef TCG_TARGET_extract_i64_valid
|
||||
#define TCG_TARGET_extract_i64_valid(ofs, len) 1
|
||||
#endif
|
||||
|
||||
/* Only one of DIV or DIV2 should be defined. */
|
||||
#if defined(TCG_TARGET_HAS_div_i32)
|
||||
#define TCG_TARGET_HAS_div2_i32 0
|
||||
#elif defined(TCG_TARGET_HAS_div2_i32)
|
||||
#define TCG_TARGET_HAS_div_i32 0
|
||||
#define TCG_TARGET_HAS_rem_i32 0
|
||||
#endif
|
||||
#if defined(TCG_TARGET_HAS_div_i64)
|
||||
#define TCG_TARGET_HAS_div2_i64 0
|
||||
#elif defined(TCG_TARGET_HAS_div2_i64)
|
||||
#define TCG_TARGET_HAS_div_i64 0
|
||||
#define TCG_TARGET_HAS_rem_i64 0
|
||||
#endif
|
||||
|
||||
#if !defined(TCG_TARGET_HAS_v64) \
|
||||
&& !defined(TCG_TARGET_HAS_v128) \
|
||||
&& !defined(TCG_TARGET_HAS_v256)
|
||||
#define TCG_TARGET_MAYBE_vec 0
|
||||
#define TCG_TARGET_HAS_abs_vec 0
|
||||
#define TCG_TARGET_HAS_neg_vec 0
|
||||
#define TCG_TARGET_HAS_not_vec 0
|
||||
#define TCG_TARGET_HAS_andc_vec 0
|
||||
#define TCG_TARGET_HAS_orc_vec 0
|
||||
#define TCG_TARGET_HAS_nand_vec 0
|
||||
#define TCG_TARGET_HAS_nor_vec 0
|
||||
#define TCG_TARGET_HAS_eqv_vec 0
|
||||
#define TCG_TARGET_HAS_roti_vec 0
|
||||
#define TCG_TARGET_HAS_rots_vec 0
|
||||
#define TCG_TARGET_HAS_rotv_vec 0
|
||||
#define TCG_TARGET_HAS_shi_vec 0
|
||||
#define TCG_TARGET_HAS_shs_vec 0
|
||||
#define TCG_TARGET_HAS_shv_vec 0
|
||||
#define TCG_TARGET_HAS_mul_vec 0
|
||||
#define TCG_TARGET_HAS_sat_vec 0
|
||||
#define TCG_TARGET_HAS_minmax_vec 0
|
||||
#define TCG_TARGET_HAS_bitsel_vec 0
|
||||
#define TCG_TARGET_HAS_cmpsel_vec 0
|
||||
#define TCG_TARGET_HAS_tst_vec 0
|
||||
#else
|
||||
#define TCG_TARGET_MAYBE_vec 1
|
||||
#endif
|
||||
#ifndef TCG_TARGET_HAS_v64
|
||||
#define TCG_TARGET_HAS_v64 0
|
||||
#endif
|
||||
#ifndef TCG_TARGET_HAS_v128
|
||||
#define TCG_TARGET_HAS_v128 0
|
||||
#endif
|
||||
#ifndef TCG_TARGET_HAS_v256
|
||||
#define TCG_TARGET_HAS_v256 0
|
||||
#endif
|
||||
|
||||
typedef enum TCGOpcode {
|
||||
#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
|
||||
#include "tcg/tcg-opc.h"
|
||||
@@ -439,7 +334,8 @@ struct TCGOp {
|
||||
#define TCGOP_CALLI(X) (X)->param1
|
||||
#define TCGOP_CALLO(X) (X)->param2
|
||||
|
||||
#define TCGOP_VECL(X) (X)->param1
|
||||
#define TCGOP_TYPE(X) (X)->param1
|
||||
#define TCGOP_FLAGS(X) (X)->param2
|
||||
#define TCGOP_VECE(X) (X)->param2
|
||||
|
||||
/* Make sure operands fit in the bitfields above. */
|
||||
@@ -497,12 +393,8 @@ struct TCGContext {
|
||||
CPUState *cpu; /* *_trans */
|
||||
|
||||
/* These structures are private to tcg-target.c.inc. */
|
||||
#ifdef TCG_TARGET_NEED_LDST_LABELS
|
||||
QSIMPLEQ_HEAD(, TCGLabelQemuLdst) ldst_labels;
|
||||
#endif
|
||||
#ifdef TCG_TARGET_NEED_POOL_LABELS
|
||||
struct TCGLabelPoolData *pool_labels;
|
||||
#endif
|
||||
|
||||
TCGLabel *exitreq_label;
|
||||
|
||||
@@ -746,10 +638,51 @@ void tcg_region_reset_all(void);
|
||||
size_t tcg_code_size(void);
|
||||
size_t tcg_code_capacity(void);
|
||||
|
||||
/**
|
||||
* tcg_tb_insert:
|
||||
* @tb: translation block to insert
|
||||
*
|
||||
* Insert @tb into the region trees.
|
||||
*/
|
||||
void tcg_tb_insert(TranslationBlock *tb);
|
||||
|
||||
/**
|
||||
* tcg_tb_remove:
|
||||
* @tb: translation block to remove
|
||||
*
|
||||
* Remove @tb from the region trees.
|
||||
*/
|
||||
void tcg_tb_remove(TranslationBlock *tb);
|
||||
|
||||
/**
|
||||
* tcg_tb_lookup:
|
||||
* @tc_ptr: host PC to look up
|
||||
*
|
||||
* Look up a translation block inside the region trees by @tc_ptr. This is
|
||||
* useful for exception handling, but must not be used for the purposes of
|
||||
* executing the returned translation block. See struct tb_tc for more
|
||||
* information.
|
||||
*
|
||||
* Returns: a translation block previously inserted into the region trees,
|
||||
* such that @tc_ptr points anywhere inside the code generated for it, or
|
||||
* NULL.
|
||||
*/
|
||||
TranslationBlock *tcg_tb_lookup(uintptr_t tc_ptr);
|
||||
|
||||
/**
|
||||
* tcg_tb_foreach:
|
||||
* @func: callback
|
||||
* @user_data: opaque value to pass to @callback
|
||||
*
|
||||
* Call @func for each translation block inserted into the region trees.
|
||||
*/
|
||||
void tcg_tb_foreach(GTraverseFunc func, gpointer user_data);
|
||||
|
||||
/**
|
||||
* tcg_nb_tbs:
|
||||
*
|
||||
* Returns: the number of translation blocks inserted into the region trees.
|
||||
*/
|
||||
size_t tcg_nb_tbs(void);
|
||||
|
||||
/* user-mode: Called with mmap_lock held. */
|
||||
@@ -807,8 +740,6 @@ enum {
|
||||
/* Instruction has side effects: it cannot be removed if its outputs
|
||||
are not used, and might trigger exceptions. */
|
||||
TCG_OPF_SIDE_EFFECTS = 0x08,
|
||||
/* Instruction operands are 64-bits (otherwise 32-bits). */
|
||||
TCG_OPF_64BIT = 0x10,
|
||||
/* Instruction is optional and not implemented by the host, or insn
|
||||
is generic and should not be implemented by the host. */
|
||||
TCG_OPF_NOT_PRESENT = 0x20,
|
||||
@@ -822,18 +753,23 @@ typedef struct TCGOpDef {
|
||||
const char *name;
|
||||
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
|
||||
uint8_t flags;
|
||||
TCGArgConstraint *args_ct;
|
||||
} TCGOpDef;
|
||||
|
||||
extern TCGOpDef tcg_op_defs[];
|
||||
extern const TCGOpDef tcg_op_defs[];
|
||||
extern const size_t tcg_op_defs_max;
|
||||
|
||||
typedef struct TCGTargetOpDef {
|
||||
TCGOpcode op;
|
||||
const char *args_ct_str[TCG_MAX_OP_ARGS];
|
||||
} TCGTargetOpDef;
|
||||
|
||||
bool tcg_op_supported(TCGOpcode op);
|
||||
/*
|
||||
* tcg_op_supported:
|
||||
* Query if @op, for @type and @flags, is supported by the host
|
||||
* on which we are currently executing.
|
||||
*/
|
||||
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
|
||||
/*
|
||||
* tcg_op_deposit_valid:
|
||||
* Query if a deposit into (ofs, len) is supported for @type by
|
||||
* the host on which we are currently executing.
|
||||
*/
|
||||
bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len);
|
||||
|
||||
void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
|
||||
void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
|
||||
@@ -854,10 +790,6 @@ void tcg_gen_call7(void *func, TCGHelperInfo *, TCGTemp *ret,
|
||||
|
||||
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
|
||||
void tcg_op_remove(TCGContext *s, TCGOp *op);
|
||||
TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
|
||||
TCGOpcode opc, unsigned nargs);
|
||||
TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
|
||||
TCGOpcode opc, unsigned nargs);
|
||||
|
||||
/**
|
||||
* tcg_remove_ops_after:
|
||||
@@ -1016,17 +948,10 @@ extern tcg_prologue_fn *tcg_qemu_tb_exec;
|
||||
|
||||
void tcg_register_jit(const void *buf, size_t buf_size);
|
||||
|
||||
#if TCG_TARGET_MAYBE_vec
|
||||
/* Return zero if the tuple (opc, type, vece) is unsupportable;
|
||||
return > 0 if it is directly supportable;
|
||||
return < 0 if we must call tcg_expand_vec_op. */
|
||||
int tcg_can_emit_vec_op(TCGOpcode, TCGType, unsigned);
|
||||
#else
|
||||
static inline int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Expand the tuple (opc, type, vece) on the given arguments. */
|
||||
void tcg_expand_vec_op(TCGOpcode, TCGType, unsigned, TCGArg, ...);
|
||||
|
||||
@@ -8,7 +8,25 @@
|
||||
|
||||
static int open_cpuinfo(CPUArchState *cpu_env, int fd)
|
||||
{
|
||||
dprintf(fd, "type\t\t: sun4u\n");
|
||||
int i, num_cpus;
|
||||
const char *cpu_type;
|
||||
|
||||
num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
if (cpu_env->def.features & CPU_FEATURE_HYPV) {
|
||||
cpu_type = "sun4v";
|
||||
} else {
|
||||
cpu_type = "sun4u";
|
||||
}
|
||||
|
||||
dprintf(fd, "cpu\t\t: %s (QEMU)\n", cpu_env->def.name);
|
||||
dprintf(fd, "type\t\t: %s\n", cpu_type);
|
||||
dprintf(fd, "ncpus probed\t: %d\n", num_cpus);
|
||||
dprintf(fd, "ncpus active\t: %d\n", num_cpus);
|
||||
dprintf(fd, "State:\n");
|
||||
for (i = 0; i < num_cpus; i++) {
|
||||
dprintf(fd, "CPU%d:\t\t: online\n", i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#define HAVE_ARCH_PROC_CPUINFO
|
||||
|
||||
@@ -8219,6 +8219,7 @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
|
||||
TCGv_i64 tcg_rn, tcg_y;
|
||||
DisasCompare c;
|
||||
unsigned nzcv;
|
||||
bool has_andc;
|
||||
|
||||
/* Set T0 = !COND. */
|
||||
arm_test_cc(&c, a->cond);
|
||||
@@ -8249,17 +8250,18 @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
|
||||
tcg_gen_subi_i32(tcg_t2, tcg_t0, 1);
|
||||
|
||||
nzcv = a->nzcv;
|
||||
has_andc = tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0);
|
||||
if (nzcv & 8) { /* N */
|
||||
tcg_gen_or_i32(cpu_NF, cpu_NF, tcg_t1);
|
||||
} else {
|
||||
if (TCG_TARGET_HAS_andc_i32) {
|
||||
if (has_andc) {
|
||||
tcg_gen_andc_i32(cpu_NF, cpu_NF, tcg_t1);
|
||||
} else {
|
||||
tcg_gen_and_i32(cpu_NF, cpu_NF, tcg_t2);
|
||||
}
|
||||
}
|
||||
if (nzcv & 4) { /* Z */
|
||||
if (TCG_TARGET_HAS_andc_i32) {
|
||||
if (has_andc) {
|
||||
tcg_gen_andc_i32(cpu_ZF, cpu_ZF, tcg_t1);
|
||||
} else {
|
||||
tcg_gen_and_i32(cpu_ZF, cpu_ZF, tcg_t2);
|
||||
@@ -8270,7 +8272,7 @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
|
||||
if (nzcv & 2) { /* C */
|
||||
tcg_gen_or_i32(cpu_CF, cpu_CF, tcg_t0);
|
||||
} else {
|
||||
if (TCG_TARGET_HAS_andc_i32) {
|
||||
if (has_andc) {
|
||||
tcg_gen_andc_i32(cpu_CF, cpu_CF, tcg_t1);
|
||||
} else {
|
||||
tcg_gen_and_i32(cpu_CF, cpu_CF, tcg_t2);
|
||||
@@ -8279,7 +8281,7 @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
|
||||
if (nzcv & 1) { /* V */
|
||||
tcg_gen_or_i32(cpu_VF, cpu_VF, tcg_t1);
|
||||
} else {
|
||||
if (TCG_TARGET_HAS_andc_i32) {
|
||||
if (has_andc) {
|
||||
tcg_gen_andc_i32(cpu_VF, cpu_VF, tcg_t1);
|
||||
} else {
|
||||
tcg_gen_and_i32(cpu_VF, cpu_VF, tcg_t2);
|
||||
|
||||
@@ -596,14 +596,8 @@ static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
|
||||
static void gen_bsl1n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
|
||||
TCGv_vec m, TCGv_vec k)
|
||||
{
|
||||
if (TCG_TARGET_HAS_bitsel_vec) {
|
||||
tcg_gen_not_vec(vece, n, n);
|
||||
tcg_gen_bitsel_vec(vece, d, k, n, m);
|
||||
} else {
|
||||
tcg_gen_andc_vec(vece, n, k, n);
|
||||
tcg_gen_andc_vec(vece, m, m, k);
|
||||
tcg_gen_or_vec(vece, d, n, m);
|
||||
}
|
||||
tcg_gen_not_vec(vece, n, n);
|
||||
tcg_gen_bitsel_vec(vece, d, k, n, m);
|
||||
}
|
||||
|
||||
static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
|
||||
@@ -628,7 +622,7 @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
|
||||
* = | ~(m | k)
|
||||
*/
|
||||
tcg_gen_and_i64(n, n, k);
|
||||
if (TCG_TARGET_HAS_orc_i64) {
|
||||
if (tcg_op_supported(INDEX_op_orc_i64, TCG_TYPE_I64, 0)) {
|
||||
tcg_gen_or_i64(m, m, k);
|
||||
tcg_gen_orc_i64(d, n, m);
|
||||
} else {
|
||||
@@ -640,14 +634,8 @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
|
||||
static void gen_bsl2n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
|
||||
TCGv_vec m, TCGv_vec k)
|
||||
{
|
||||
if (TCG_TARGET_HAS_bitsel_vec) {
|
||||
tcg_gen_not_vec(vece, m, m);
|
||||
tcg_gen_bitsel_vec(vece, d, k, n, m);
|
||||
} else {
|
||||
tcg_gen_and_vec(vece, n, n, k);
|
||||
tcg_gen_or_vec(vece, m, m, k);
|
||||
tcg_gen_orc_vec(vece, d, n, m);
|
||||
}
|
||||
tcg_gen_not_vec(vece, m, m);
|
||||
tcg_gen_bitsel_vec(vece, d, k, n, m);
|
||||
}
|
||||
|
||||
static void gen_bsl2n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
|
||||
|
||||
@@ -493,7 +493,7 @@ static void gen_add_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
|
||||
static void gen_adc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
if (TCG_TARGET_HAS_add2_i32) {
|
||||
if (tcg_op_supported(INDEX_op_add2_i32, TCG_TYPE_I32, 0)) {
|
||||
tcg_gen_movi_i32(tmp, 0);
|
||||
tcg_gen_add2_i32(cpu_NF, cpu_CF, t0, tmp, cpu_CF, tmp);
|
||||
tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1, tmp);
|
||||
|
||||
@@ -24,13 +24,9 @@
|
||||
* The exact opcode to check depends on 32- vs. 64-bit.
|
||||
*/
|
||||
#ifdef TARGET_X86_64
|
||||
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
|
||||
#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i64_valid
|
||||
#define TCG_TARGET_extract_tl_valid TCG_TARGET_extract_i64_valid
|
||||
#define INDEX_op_extract2_tl INDEX_op_extract2_i64
|
||||
#else
|
||||
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
|
||||
#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i32_valid
|
||||
#define TCG_TARGET_extract_tl_valid TCG_TARGET_extract_i32_valid
|
||||
#define INDEX_op_extract2_tl INDEX_op_extract2_i32
|
||||
#endif
|
||||
|
||||
#define MMX_OFFSET(reg) \
|
||||
@@ -3018,7 +3014,7 @@ static void gen_PMOVMSKB(DisasContext *s, X86DecodedInsn *decode)
|
||||
tcg_gen_ld8u_tl(s->T0, tcg_env, offsetof(CPUX86State, xmm_t0.ZMM_B(vec_len - 1)));
|
||||
while (vec_len > 8) {
|
||||
vec_len -= 8;
|
||||
if (TCG_TARGET_HAS_extract2_tl) {
|
||||
if (tcg_op_supported(INDEX_op_extract2_tl, TCG_TYPE_TL, 0)) {
|
||||
/*
|
||||
* Load the next byte of the result into the high byte of T.
|
||||
* TCG does a similar expansion of deposit to shl+extract2; by
|
||||
@@ -3472,7 +3468,7 @@ static void gen_RCL(DisasContext *s, X86DecodedInsn *decode)
|
||||
}
|
||||
|
||||
/* Compute high part, including incoming carry. */
|
||||
if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
|
||||
if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
|
||||
/* high = (T0 << 1) | cin */
|
||||
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
|
||||
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
|
||||
@@ -3524,7 +3520,7 @@ static void gen_RCR(DisasContext *s, X86DecodedInsn *decode)
|
||||
}
|
||||
|
||||
/* Save incoming carry into high, it will be shifted later. */
|
||||
if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
|
||||
if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
|
||||
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
|
||||
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
|
||||
} else {
|
||||
|
||||
@@ -3980,7 +3980,7 @@ static void decode_bit_andacc(DisasContext *ctx)
|
||||
pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_and_tl);
|
||||
break;
|
||||
case OPC2_32_BIT_AND_NOR_T:
|
||||
if (TCG_TARGET_HAS_andc_i32) {
|
||||
if (tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0)) {
|
||||
gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
|
||||
pos1, pos2, &tcg_gen_or_tl, &tcg_gen_andc_tl);
|
||||
} else {
|
||||
@@ -4113,7 +4113,7 @@ static void decode_bit_orand(DisasContext *ctx)
|
||||
pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_or_tl);
|
||||
break;
|
||||
case OPC2_32_BIT_OR_NOR_T:
|
||||
if (TCG_TARGET_HAS_orc_i32) {
|
||||
if (tcg_op_supported(INDEX_op_orc_i32, TCG_TYPE_I32, 0)) {
|
||||
gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
|
||||
pos1, pos2, &tcg_gen_or_tl, &tcg_gen_orc_tl);
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Define target-specific opcode support
|
||||
* Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
|
||||
*/
|
||||
|
||||
#ifndef TCG_TARGET_HAS_H
|
||||
#define TCG_TARGET_HAS_H
|
||||
|
||||
#include "host/cpuinfo.h"
|
||||
|
||||
#define have_lse (cpuinfo & CPUINFO_LSE)
|
||||
#define have_lse2 (cpuinfo & CPUINFO_LSE2)
|
||||
|
||||
/* optional instructions */
|
||||
#define TCG_TARGET_HAS_div_i32 1
|
||||
#define TCG_TARGET_HAS_rem_i32 1
|
||||
#define TCG_TARGET_HAS_ext8s_i32 1
|
||||
#define TCG_TARGET_HAS_ext16s_i32 1
|
||||
#define TCG_TARGET_HAS_ext8u_i32 1
|
||||
#define TCG_TARGET_HAS_ext16u_i32 1
|
||||
#define TCG_TARGET_HAS_bswap16_i32 1
|
||||
#define TCG_TARGET_HAS_bswap32_i32 1
|
||||
#define TCG_TARGET_HAS_not_i32 1
|
||||
#define TCG_TARGET_HAS_rot_i32 1
|
||||
#define TCG_TARGET_HAS_andc_i32 1
|
||||
#define TCG_TARGET_HAS_orc_i32 1
|
||||
#define TCG_TARGET_HAS_eqv_i32 1
|
||||
#define TCG_TARGET_HAS_nand_i32 0
|
||||
#define TCG_TARGET_HAS_nor_i32 0
|
||||
#define TCG_TARGET_HAS_clz_i32 1
|
||||
#define TCG_TARGET_HAS_ctz_i32 1
|
||||
#define TCG_TARGET_HAS_ctpop_i32 0
|
||||
#define TCG_TARGET_HAS_extract2_i32 1
|
||||
#define TCG_TARGET_HAS_negsetcond_i32 1
|
||||
#define TCG_TARGET_HAS_add2_i32 1
|
||||
#define TCG_TARGET_HAS_sub2_i32 1
|
||||
#define TCG_TARGET_HAS_mulu2_i32 0
|
||||
#define TCG_TARGET_HAS_muls2_i32 0
|
||||
#define TCG_TARGET_HAS_muluh_i32 0
|
||||
#define TCG_TARGET_HAS_mulsh_i32 0
|
||||
#define TCG_TARGET_HAS_extr_i64_i32 0
|
||||
#define TCG_TARGET_HAS_qemu_st8_i32 0
|
||||
|
||||
#define TCG_TARGET_HAS_div_i64 1
|
||||
#define TCG_TARGET_HAS_rem_i64 1
|
||||
#define TCG_TARGET_HAS_ext8s_i64 1
|
||||
#define TCG_TARGET_HAS_ext16s_i64 1
|
||||
#define TCG_TARGET_HAS_ext32s_i64 1
|
||||
#define TCG_TARGET_HAS_ext8u_i64 1
|
||||
#define TCG_TARGET_HAS_ext16u_i64 1
|
||||
#define TCG_TARGET_HAS_ext32u_i64 1
|
||||
#define TCG_TARGET_HAS_bswap16_i64 1
|
||||
#define TCG_TARGET_HAS_bswap32_i64 1
|
||||
#define TCG_TARGET_HAS_bswap64_i64 1
|
||||
#define TCG_TARGET_HAS_not_i64 1
|
||||
#define TCG_TARGET_HAS_rot_i64 1
|
||||
#define TCG_TARGET_HAS_andc_i64 1
|
||||
#define TCG_TARGET_HAS_orc_i64 1
|
||||
#define TCG_TARGET_HAS_eqv_i64 1
|
||||
#define TCG_TARGET_HAS_nand_i64 0
|
||||
#define TCG_TARGET_HAS_nor_i64 0
|
||||
#define TCG_TARGET_HAS_clz_i64 1
|
||||
#define TCG_TARGET_HAS_ctz_i64 1
|
||||
#define TCG_TARGET_HAS_ctpop_i64 0
|
||||
#define TCG_TARGET_HAS_extract2_i64 1
|
||||
#define TCG_TARGET_HAS_negsetcond_i64 1
|
||||
#define TCG_TARGET_HAS_add2_i64 1
|
||||
#define TCG_TARGET_HAS_sub2_i64 1
|
||||
#define TCG_TARGET_HAS_mulu2_i64 0
|
||||
#define TCG_TARGET_HAS_muls2_i64 0
|
||||
#define TCG_TARGET_HAS_muluh_i64 1
|
||||
#define TCG_TARGET_HAS_mulsh_i64 1
|
||||
|
||||
/*
|
||||
* Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
|
||||
* which requires writable pages. We must defer to the helper for user-only,
|
||||
* but in system mode all ram is writable for the host.
|
||||
*/
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
|
||||
#else
|
||||
#define TCG_TARGET_HAS_qemu_ldst_i128 1
|
||||
#endif
|
||||
|
||||
#define TCG_TARGET_HAS_tst 1
|
||||
|
||||
#define TCG_TARGET_HAS_v64 1
|
||||
#define TCG_TARGET_HAS_v128 1
|
||||
#define TCG_TARGET_HAS_v256 0
|
||||
|
||||
#define TCG_TARGET_HAS_andc_vec 1
|
||||
#define TCG_TARGET_HAS_orc_vec 1
|
||||
#define TCG_TARGET_HAS_nand_vec 0
|
||||
#define TCG_TARGET_HAS_nor_vec 0
|
||||
#define TCG_TARGET_HAS_eqv_vec 0
|
||||
#define TCG_TARGET_HAS_not_vec 1
|
||||
#define TCG_TARGET_HAS_neg_vec 1
|
||||
#define TCG_TARGET_HAS_abs_vec 1
|
||||
#define TCG_TARGET_HAS_roti_vec 0
|
||||
#define TCG_TARGET_HAS_rots_vec 0
|
||||
#define TCG_TARGET_HAS_rotv_vec 0
|
||||
#define TCG_TARGET_HAS_shi_vec 1
|
||||
#define TCG_TARGET_HAS_shs_vec 0
|
||||
#define TCG_TARGET_HAS_shv_vec 1
|
||||
#define TCG_TARGET_HAS_mul_vec 1
|
||||
#define TCG_TARGET_HAS_sat_vec 1
|
||||
#define TCG_TARGET_HAS_minmax_vec 1
|
||||
#define TCG_TARGET_HAS_bitsel_vec 1
|
||||
#define TCG_TARGET_HAS_cmpsel_vec 0
|
||||
#define TCG_TARGET_HAS_tst_vec 1
|
||||
|
||||
#define TCG_TARGET_extract_valid(type, ofs, len) 1
|
||||
#define TCG_TARGET_sextract_valid(type, ofs, len) 1
|
||||
#define TCG_TARGET_deposit_valid(type, ofs, len) 1
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Define target-specific memory model
|
||||
* Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
|
||||
*/
|
||||
|
||||
#ifndef TCG_TARGET_MO_H
|
||||
#define TCG_TARGET_MO_H
|
||||
|
||||
#define TCG_TARGET_DEFAULT_MO 0
|
||||
|
||||
#endif
|
||||
@@ -11,5 +11,5 @@
|
||||
* consider these to be UNSPEC with names.
|
||||
*/
|
||||
|
||||
DEF(aa64_sshl_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(aa64_sli_vec, 1, 2, 1, IMPLVEC)
|
||||
DEF(aa64_sshl_vec, 1, 2, 0, TCG_OPF_VECTOR)
|
||||
DEF(aa64_sli_vec, 1, 2, 1, TCG_OPF_VECTOR)
|
||||
@@ -10,10 +10,21 @@
|
||||
* See the COPYING file in the top-level directory for details.
|
||||
*/
|
||||
|
||||
#include "../tcg-ldst.c.inc"
|
||||
#include "../tcg-pool.c.inc"
|
||||
#include "qemu/bitops.h"
|
||||
|
||||
/* Used for function call generation. */
|
||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
#ifdef CONFIG_DARWIN
|
||||
# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
|
||||
#else
|
||||
# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||
#endif
|
||||
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||
|
||||
/* We're going to re-use TCGType in setting of the SF bit, which controls
|
||||
the size of the operation performed. If we know the values match, it
|
||||
makes things much cleaner. */
|
||||
@@ -2104,14 +2115,10 @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
|
||||
flush_idcache_range(jmp_rx, jmp_rw, 4);
|
||||
}
|
||||
|
||||
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
|
||||
const TCGArg args[TCG_MAX_OP_ARGS],
|
||||
const int const_args[TCG_MAX_OP_ARGS])
|
||||
{
|
||||
/* 99% of the time, we can signal the use of extension registers
|
||||
by looking to see if the opcode handles 64-bit data. */
|
||||
TCGType ext = (tcg_op_defs[opc].flags & TCG_OPF_64BIT) != 0;
|
||||
|
||||
/* Hoist the loads of the most common arguments. */
|
||||
TCGArg a0 = args[0];
|
||||
TCGArg a1 = args[1];
|
||||
@@ -2443,7 +2450,12 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
|
||||
case INDEX_op_extract_i64:
|
||||
case INDEX_op_extract_i32:
|
||||
tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
|
||||
if (a2 == 0) {
|
||||
uint64_t mask = MAKE_64BIT_MASK(0, args[3]);
|
||||
tcg_out_logicali(s, I3404_ANDI, ext, a0, a1, mask);
|
||||
} else {
|
||||
tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case INDEX_op_sextract_i64:
|
||||
@@ -2951,7 +2963,8 @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
|
||||
}
|
||||
}
|
||||
|
||||
static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
|
||||
static TCGConstraintSetIndex
|
||||
tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
|
||||
{
|
||||
switch (op) {
|
||||
case INDEX_op_goto_ptr:
|
||||
@@ -3147,7 +3160,7 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
|
||||
return C_O1_I2(w, 0, w);
|
||||
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
return C_NotImplemented;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,8 +13,6 @@
|
||||
#ifndef AARCH64_TCG_TARGET_H
|
||||
#define AARCH64_TCG_TARGET_H
|
||||
|
||||
#include "host/cpuinfo.h"
|
||||
|
||||
#define TCG_TARGET_INSN_UNIT_SIZE 4
|
||||
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
|
||||
|
||||
@@ -49,128 +47,4 @@ typedef enum {
|
||||
|
||||
#define TCG_TARGET_NB_REGS 64
|
||||
|
||||
/* used for function call generation */
|
||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
#ifdef CONFIG_DARWIN
|
||||
# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
|
||||
#else
|
||||
# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||
#endif
|
||||
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||
|
||||
#define have_lse (cpuinfo & CPUINFO_LSE)
|
||||
#define have_lse2 (cpuinfo & CPUINFO_LSE2)
|
||||
|
||||
/* optional instructions */
|
||||
#define TCG_TARGET_HAS_div_i32 1
|
||||
#define TCG_TARGET_HAS_rem_i32 1
|
||||
#define TCG_TARGET_HAS_ext8s_i32 1
|
||||
#define TCG_TARGET_HAS_ext16s_i32 1
|
||||
#define TCG_TARGET_HAS_ext8u_i32 1
|
||||
#define TCG_TARGET_HAS_ext16u_i32 1
|
||||
#define TCG_TARGET_HAS_bswap16_i32 1
|
||||
#define TCG_TARGET_HAS_bswap32_i32 1
|
||||
#define TCG_TARGET_HAS_not_i32 1
|
||||
#define TCG_TARGET_HAS_rot_i32 1
|
||||
#define TCG_TARGET_HAS_andc_i32 1
|
||||
#define TCG_TARGET_HAS_orc_i32 1
|
||||
#define TCG_TARGET_HAS_eqv_i32 1
|
||||
#define TCG_TARGET_HAS_nand_i32 0
|
||||
#define TCG_TARGET_HAS_nor_i32 0
|
||||
#define TCG_TARGET_HAS_clz_i32 1
|
||||
#define TCG_TARGET_HAS_ctz_i32 1
|
||||
#define TCG_TARGET_HAS_ctpop_i32 0
|
||||
#define TCG_TARGET_HAS_deposit_i32 1
|
||||
#define TCG_TARGET_HAS_extract_i32 1
|
||||
#define TCG_TARGET_HAS_sextract_i32 1
|
||||
#define TCG_TARGET_HAS_extract2_i32 1
|
||||
#define TCG_TARGET_HAS_negsetcond_i32 1
|
||||
#define TCG_TARGET_HAS_add2_i32 1
|
||||
#define TCG_TARGET_HAS_sub2_i32 1
|
||||
#define TCG_TARGET_HAS_mulu2_i32 0
|
||||
#define TCG_TARGET_HAS_muls2_i32 0
|
||||
#define TCG_TARGET_HAS_muluh_i32 0
|
||||
#define TCG_TARGET_HAS_mulsh_i32 0
|
||||
#define TCG_TARGET_HAS_extr_i64_i32 0
|
||||
#define TCG_TARGET_HAS_qemu_st8_i32 0
|
||||
|
||||
#define TCG_TARGET_HAS_div_i64 1
|
||||
#define TCG_TARGET_HAS_rem_i64 1
|
||||
#define TCG_TARGET_HAS_ext8s_i64 1
|
||||
#define TCG_TARGET_HAS_ext16s_i64 1
|
||||
#define TCG_TARGET_HAS_ext32s_i64 1
|
||||
#define TCG_TARGET_HAS_ext8u_i64 1
|
||||
#define TCG_TARGET_HAS_ext16u_i64 1
|
||||
#define TCG_TARGET_HAS_ext32u_i64 1
|
||||
#define TCG_TARGET_HAS_bswap16_i64 1
|
||||
#define TCG_TARGET_HAS_bswap32_i64 1
|
||||
#define TCG_TARGET_HAS_bswap64_i64 1
|
||||
#define TCG_TARGET_HAS_not_i64 1
|
||||
#define TCG_TARGET_HAS_rot_i64 1
|
||||
#define TCG_TARGET_HAS_andc_i64 1
|
||||
#define TCG_TARGET_HAS_orc_i64 1
|
||||
#define TCG_TARGET_HAS_eqv_i64 1
|
||||
#define TCG_TARGET_HAS_nand_i64 0
|
||||
#define TCG_TARGET_HAS_nor_i64 0
|
||||
#define TCG_TARGET_HAS_clz_i64 1
|
||||
#define TCG_TARGET_HAS_ctz_i64 1
|
||||
#define TCG_TARGET_HAS_ctpop_i64 0
|
||||
#define TCG_TARGET_HAS_deposit_i64 1
|
||||
#define TCG_TARGET_HAS_extract_i64 1
|
||||
#define TCG_TARGET_HAS_sextract_i64 1
|
||||
#define TCG_TARGET_HAS_extract2_i64 1
|
||||
#define TCG_TARGET_HAS_negsetcond_i64 1
|
||||
#define TCG_TARGET_HAS_add2_i64 1
|
||||
#define TCG_TARGET_HAS_sub2_i64 1
|
||||
#define TCG_TARGET_HAS_mulu2_i64 0
|
||||
#define TCG_TARGET_HAS_muls2_i64 0
|
||||
#define TCG_TARGET_HAS_muluh_i64 1
|
||||
#define TCG_TARGET_HAS_mulsh_i64 1
|
||||
|
||||
/*
|
||||
* Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
|
||||
* which requires writable pages. We must defer to the helper for user-only,
|
||||
* but in system mode all ram is writable for the host.
|
||||
*/
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
|
||||
#else
|
||||
#define TCG_TARGET_HAS_qemu_ldst_i128 1
|
||||
#endif
|
||||
|
||||
#define TCG_TARGET_HAS_tst 1
|
||||
|
||||
#define TCG_TARGET_HAS_v64 1
|
||||
#define TCG_TARGET_HAS_v128 1
|
||||
#define TCG_TARGET_HAS_v256 0
|
||||
|
||||
#define TCG_TARGET_HAS_andc_vec 1
|
||||
#define TCG_TARGET_HAS_orc_vec 1
|
||||
#define TCG_TARGET_HAS_nand_vec 0
|
||||
#define TCG_TARGET_HAS_nor_vec 0
|
||||
#define TCG_TARGET_HAS_eqv_vec 0
|
||||
#define TCG_TARGET_HAS_not_vec 1
|
||||
#define TCG_TARGET_HAS_neg_vec 1
|
||||
#define TCG_TARGET_HAS_abs_vec 1
|
||||
#define TCG_TARGET_HAS_roti_vec 0
|
||||
#define TCG_TARGET_HAS_rots_vec 0
|
||||
#define TCG_TARGET_HAS_rotv_vec 0
|
||||
#define TCG_TARGET_HAS_shi_vec 1
|
||||
#define TCG_TARGET_HAS_shs_vec 0
|
||||
#define TCG_TARGET_HAS_shv_vec 1
|
||||
#define TCG_TARGET_HAS_mul_vec 1
|
||||
#define TCG_TARGET_HAS_sat_vec 1
|
||||
#define TCG_TARGET_HAS_minmax_vec 1
|
||||
#define TCG_TARGET_HAS_bitsel_vec 1
|
||||
#define TCG_TARGET_HAS_cmpsel_vec 0
|
||||
#define TCG_TARGET_HAS_tst_vec 1
|
||||
|
||||
#define TCG_TARGET_DEFAULT_MO (0)
|
||||
#define TCG_TARGET_NEED_LDST_LABELS
|
||||
#define TCG_TARGET_NEED_POOL_LABELS
|
||||
|
||||
#endif /* AARCH64_TCG_TARGET_H */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user