mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-tcg-20230305' of https://gitlab.com/rth7680/qemu into staging
tcg: Merge two sequential labels accel/tcg: Retain prot flags from tlb_fill accel/tcg: Honor TLB_DISCARD_WRITE in atomic_mmu_lookup accel/tcg: Honor TLB_WATCHPOINTS in atomic_mmu_lookup target/sparc: Use tlb_set_page_full include/qemu/cpuid: Introduce xgetbv_low tcg/i386: Mark Win64 call-saved vector regs as reserved tcg: Decode the operand to INDEX_op_mb in dumps Portion of the target/ patchset which eliminates use of tcg_temp_free* Portion of the target/ patchset which eliminates use of tcg_const* # -----BEGIN PGP SIGNATURE----- # # iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmQFNegdHHJpY2hhcmQu # aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV9WsQf+Ljs3WA5lvMPlpaSn # Li35ay/A1f2cU6FYspl81su4/c7Ft9Q8rkPF4K1n1rwuvqR91G25WTQIrw8NFPXZ # VU9GNGQc1qIVYO/hAH3fvgDmPxUF+tJDgT/BTNc1ldy6/v7QM3GWcEy8+O3H9S+K # uj6vIuWke0ukq6ZGmSAZnXEaJFq3HU26mcP4KxDxfIUcezMtDVp6QevqzVxM65aa # pUDh3qtsLGOxIYwthvu6avMQXORBhSB75awCuYH4QPJRpr3ahigcGsCr2gdVAQ8p # R7BbpUUdK5Huos971oouJrt5FwwbVgGEx78eF27sl0H8QMoNhsfyn6PcN8nPENLJ # MZYd+w== # =8goQ # -----END PGP SIGNATURE----- # gpg: Signature made Mon 06 Mar 2023 00:38:00 GMT # 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-20230305' of https://gitlab.com/rth7680/qemu: (84 commits) target/xtensa: Avoid tcg_const_i32 target/xtensa: Split constant in bit shift target/xtensa: Use tcg_gen_subfi_i32 in translate_sll target/xtensa: Avoid tcg_const_i32 in translate_l32r target/xtensa: Tidy translate_clamps target/xtensa: Tidy translate_bb target/sparc: Avoid tcg_const_{tl,i32} target/s390x: Split out gen_ri2 target/riscv: Avoid tcg_const_* target/microblaze: Avoid tcg_const_* throughout target/i386: Simplify POPF target/hexagon/idef-parser: Use gen_constant for gen_extend_tcg_width_op target/hexagon/idef-parser: Use gen_tmp for gen_rvalue_pred target/hexagon/idef-parser: Use gen_tmp for gen_pred_assign target/hexagon/idef-parser: Use gen_tmp for LPCFG target/hexagon: Use tcg_constant_* for gen_constant_from_imm docs/devel/tcg-ops: Drop recommendation to free temps tracing: remove transform.py include/exec/gen-icount: Drop tcg_temp_free in gen_tb_start target/tricore: Drop tcg_temp_free ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+30
-13
@@ -1250,7 +1250,6 @@ void tlb_set_page_full(CPUState *cpu, int mmu_idx,
|
||||
desc->fulltlb[index] = *full;
|
||||
desc->fulltlb[index].xlat_section = iotlb - vaddr_page;
|
||||
desc->fulltlb[index].phys_addr = paddr_page;
|
||||
desc->fulltlb[index].prot = prot;
|
||||
|
||||
/* Now calculate the new entry */
|
||||
tn.addend = addend - vaddr_page;
|
||||
@@ -1768,6 +1767,7 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
|
||||
CPUTLBEntry *tlbe;
|
||||
target_ulong tlb_addr;
|
||||
void *hostaddr;
|
||||
CPUTLBEntryFull *full;
|
||||
|
||||
tcg_debug_assert(mmu_idx < NB_MMU_MODES);
|
||||
|
||||
@@ -1806,17 +1806,26 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
|
||||
tlb_addr = tlb_addr_write(tlbe) & ~TLB_INVALID_MASK;
|
||||
}
|
||||
|
||||
/* Let the guest notice RMW on a write-only page. */
|
||||
if ((prot & PAGE_READ) &&
|
||||
unlikely(tlbe->addr_read != (tlb_addr & ~TLB_NOTDIRTY))) {
|
||||
tlb_fill(env_cpu(env), addr, size,
|
||||
MMU_DATA_LOAD, mmu_idx, retaddr);
|
||||
if (prot & PAGE_READ) {
|
||||
/*
|
||||
* Since we don't support reads and writes to different addresses,
|
||||
* and we do have the proper page loaded for write, this shouldn't
|
||||
* ever return. But just in case, handle via stop-the-world.
|
||||
* Let the guest notice RMW on a write-only page.
|
||||
* We have just verified that the page is writable.
|
||||
* Subpage lookups may have left TLB_INVALID_MASK set,
|
||||
* but addr_read will only be -1 if PAGE_READ was unset.
|
||||
*/
|
||||
goto stop_the_world;
|
||||
if (unlikely(tlbe->addr_read == -1)) {
|
||||
tlb_fill(env_cpu(env), addr, size,
|
||||
MMU_DATA_LOAD, mmu_idx, retaddr);
|
||||
/*
|
||||
* Since we don't support reads and writes to different
|
||||
* addresses, and we do have the proper page loaded for
|
||||
* write, this shouldn't ever return. But just in case,
|
||||
* handle via stop-the-world.
|
||||
*/
|
||||
goto stop_the_world;
|
||||
}
|
||||
/* Collect TLB_WATCHPOINT for read. */
|
||||
tlb_addr |= tlbe->addr_read;
|
||||
}
|
||||
} else /* if (prot & PAGE_READ) */ {
|
||||
tlb_addr = tlbe->addr_read;
|
||||
@@ -1832,17 +1841,25 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
|
||||
}
|
||||
|
||||
/* Notice an IO access or a needs-MMU-lookup access */
|
||||
if (unlikely(tlb_addr & TLB_MMIO)) {
|
||||
if (unlikely(tlb_addr & (TLB_MMIO | TLB_DISCARD_WRITE))) {
|
||||
/* There's really nothing that can be done to
|
||||
support this apart from stop-the-world. */
|
||||
goto stop_the_world;
|
||||
}
|
||||
|
||||
hostaddr = (void *)((uintptr_t)addr + tlbe->addend);
|
||||
full = &env_tlb(env)->d[mmu_idx].fulltlb[index];
|
||||
|
||||
if (unlikely(tlb_addr & TLB_NOTDIRTY)) {
|
||||
notdirty_write(env_cpu(env), addr, size,
|
||||
&env_tlb(env)->d[mmu_idx].fulltlb[index], retaddr);
|
||||
notdirty_write(env_cpu(env), addr, size, full, retaddr);
|
||||
}
|
||||
|
||||
if (unlikely(tlb_addr & TLB_WATCHPOINT)) {
|
||||
QEMU_BUILD_BUG_ON(PAGE_READ != BP_MEM_READ);
|
||||
QEMU_BUILD_BUG_ON(PAGE_WRITE != BP_MEM_WRITE);
|
||||
/* therefore prot == watchpoint bits */
|
||||
cpu_check_watchpoint(env_cpu(env), addr, size,
|
||||
full->attrs, prot, retaddr);
|
||||
}
|
||||
|
||||
return hostaddr;
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "sysemu/cpu-timers.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/guest-random.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/hwaddr.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#include "qemu/qemu-print.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/cacheinfo.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "exec/log.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "sysemu/cpu-timers.h"
|
||||
|
||||
@@ -18,19 +18,6 @@
|
||||
#include "exec/plugin-gen.h"
|
||||
#include "exec/replay-core.h"
|
||||
|
||||
/* Pairs with tcg_clear_temp_count.
|
||||
To be called by #TranslatorOps.{translate_insn,tb_stop} if
|
||||
(1) the target is sufficiently clean to support reporting,
|
||||
(2) as and when all temporaries are known to be consumed.
|
||||
For most targets, (2) is at the end of translate_insn. */
|
||||
void translator_loop_temp_check(DisasContextBase *db)
|
||||
{
|
||||
if (tcg_check_temp_count()) {
|
||||
qemu_log("warning: TCG temporary leaks before "
|
||||
TARGET_FMT_lx "\n", db->pc_next);
|
||||
}
|
||||
}
|
||||
|
||||
bool translator_use_goto_tb(DisasContextBase *db, target_ulong dest)
|
||||
{
|
||||
/* Suppress goto_tb if requested. */
|
||||
@@ -67,9 +54,6 @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
|
||||
ops->init_disas_context(db, cpu);
|
||||
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
|
||||
|
||||
/* Reset the temp count so that we can identify leaks */
|
||||
tcg_clear_temp_count();
|
||||
|
||||
/* Start translating. */
|
||||
gen_tb_start(db->tb);
|
||||
ops->tb_start(db, cpu);
|
||||
|
||||
@@ -951,10 +951,6 @@ Recommended coding rules for best performance
|
||||
often modified, e.g. the integer registers and the condition
|
||||
codes. TCG will be able to use host registers to store them.
|
||||
|
||||
- Free temporaries when they are no longer used (``tcg_temp_free``).
|
||||
Since ``tcg_const_x`` also creates a temporary, you should free it
|
||||
after it is used.
|
||||
|
||||
- Don't hesitate to use helpers for complicated or seldom used guest
|
||||
instructions. There is little performance advantage in using TCG to
|
||||
implement guest instructions taking more than about twenty TCG
|
||||
|
||||
@@ -61,8 +61,6 @@ static inline void gen_tb_start(const TranslationBlock *tb)
|
||||
offsetof(ArchCPU, parent_obj.can_do_io) -
|
||||
offsetof(ArchCPU, env));
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(count);
|
||||
}
|
||||
|
||||
static inline void gen_tb_end(const TranslationBlock *tb, int num_insns)
|
||||
|
||||
@@ -150,8 +150,6 @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
|
||||
target_ulong pc, void *host_pc,
|
||||
const TranslatorOps *ops, DisasContextBase *db);
|
||||
|
||||
void translator_loop_temp_check(DisasContextBase *db);
|
||||
|
||||
/**
|
||||
* translator_use_goto_tb
|
||||
* @db: Disassembly context
|
||||
|
||||
@@ -923,9 +923,10 @@ void cpu_single_step(CPUState *cpu, int enabled);
|
||||
#define BP_GDB 0x10
|
||||
#define BP_CPU 0x20
|
||||
#define BP_ANY (BP_GDB | BP_CPU)
|
||||
#define BP_WATCHPOINT_HIT_READ 0x40
|
||||
#define BP_WATCHPOINT_HIT_WRITE 0x80
|
||||
#define BP_WATCHPOINT_HIT (BP_WATCHPOINT_HIT_READ | BP_WATCHPOINT_HIT_WRITE)
|
||||
#define BP_HIT_SHIFT 6
|
||||
#define BP_WATCHPOINT_HIT_READ (BP_MEM_READ << BP_HIT_SHIFT)
|
||||
#define BP_WATCHPOINT_HIT_WRITE (BP_MEM_WRITE << BP_HIT_SHIFT)
|
||||
#define BP_WATCHPOINT_HIT (BP_MEM_ACCESS << BP_HIT_SHIFT)
|
||||
|
||||
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
|
||||
CPUBreakpoint **breakpoint);
|
||||
|
||||
@@ -71,4 +71,11 @@
|
||||
#define bit_LZCNT (1 << 5)
|
||||
#endif
|
||||
|
||||
static inline unsigned xgetbv_low(unsigned c)
|
||||
{
|
||||
unsigned a, d;
|
||||
asm("xgetbv" : "=a"(a), "=d"(d) : "c"(c));
|
||||
return a;
|
||||
}
|
||||
|
||||
#endif /* QEMU_CPUID_H */
|
||||
|
||||
@@ -259,12 +259,7 @@ static inline void gen_set_label(TCGLabel *l)
|
||||
tcg_gen_op1(INDEX_op_set_label, label_arg(l));
|
||||
}
|
||||
|
||||
static inline void tcg_gen_br(TCGLabel *l)
|
||||
{
|
||||
l->refs++;
|
||||
tcg_gen_op1(INDEX_op_br, label_arg(l));
|
||||
}
|
||||
|
||||
void tcg_gen_br(TCGLabel *l);
|
||||
void tcg_gen_mb(TCGBar);
|
||||
|
||||
/* Helper calls. */
|
||||
|
||||
+13
-20
@@ -238,16 +238,23 @@ struct TCGRelocation {
|
||||
int type;
|
||||
};
|
||||
|
||||
typedef struct TCGOp TCGOp;
|
||||
typedef struct TCGLabelUse TCGLabelUse;
|
||||
struct TCGLabelUse {
|
||||
QSIMPLEQ_ENTRY(TCGLabelUse) next;
|
||||
TCGOp *op;
|
||||
};
|
||||
|
||||
typedef struct TCGLabel TCGLabel;
|
||||
struct TCGLabel {
|
||||
unsigned present : 1;
|
||||
unsigned has_value : 1;
|
||||
unsigned id : 14;
|
||||
unsigned refs : 16;
|
||||
bool present;
|
||||
bool has_value;
|
||||
uint16_t id;
|
||||
union {
|
||||
uintptr_t value;
|
||||
const tcg_insn_unit *value_ptr;
|
||||
} u;
|
||||
QSIMPLEQ_HEAD(, TCGLabelUse) branches;
|
||||
QSIMPLEQ_HEAD(, TCGRelocation) relocs;
|
||||
QSIMPLEQ_ENTRY(TCGLabel) next;
|
||||
};
|
||||
@@ -487,7 +494,7 @@ typedef struct TCGTempSet {
|
||||
#define SYNC_ARG (1 << 0)
|
||||
typedef uint32_t TCGLifeData;
|
||||
|
||||
typedef struct TCGOp {
|
||||
struct TCGOp {
|
||||
TCGOpcode opc : 8;
|
||||
unsigned nargs : 8;
|
||||
|
||||
@@ -506,7 +513,7 @@ typedef struct TCGOp {
|
||||
|
||||
/* Arguments for the opcode. */
|
||||
TCGArg args[];
|
||||
} TCGOp;
|
||||
};
|
||||
|
||||
#define TCGOP_CALLI(X) (X)->param1
|
||||
#define TCGOP_CALLO(X) (X)->param2
|
||||
@@ -567,7 +574,6 @@ struct TCGContext {
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_TCG
|
||||
int temps_in_use;
|
||||
int goto_tb_issue_mask;
|
||||
const TCGOpcode *vecop_list;
|
||||
#endif
|
||||
@@ -958,19 +964,6 @@ static inline TCGv_ptr tcg_temp_new_ptr(void)
|
||||
return temp_tcgv_ptr(t);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_TCG)
|
||||
/* If you call tcg_clear_temp_count() at the start of a section of
|
||||
* code which is not supposed to leak any TCG temporaries, then
|
||||
* calling tcg_check_temp_count() at the end of the section will
|
||||
* return 1 if the section did in fact leak a temporary.
|
||||
*/
|
||||
void tcg_clear_temp_count(void);
|
||||
int tcg_check_temp_count(void);
|
||||
#else
|
||||
#define tcg_clear_temp_count() do { } while (0)
|
||||
#define tcg_check_temp_count() 0
|
||||
#endif
|
||||
|
||||
int64_t tcg_cpu_exec_time(void);
|
||||
void tcg_dump_info(GString *buf);
|
||||
void tcg_dump_op_count(GString *buf);
|
||||
|
||||
@@ -2861,7 +2861,6 @@ tracetool_depends = files(
|
||||
'scripts/tracetool/format/log_stap.py',
|
||||
'scripts/tracetool/format/stap.py',
|
||||
'scripts/tracetool/__init__.py',
|
||||
'scripts/tracetool/transform.py',
|
||||
'scripts/tracetool/vcpu.py'
|
||||
)
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ import weakref
|
||||
|
||||
import tracetool.format
|
||||
import tracetool.backend
|
||||
import tracetool.transform
|
||||
|
||||
|
||||
def error_write(*lines):
|
||||
@@ -190,18 +189,6 @@ class Arguments:
|
||||
"""List of argument names casted to their type."""
|
||||
return ["(%s)%s" % (type_, name) for type_, name in self._args]
|
||||
|
||||
def transform(self, *trans):
|
||||
"""Return a new Arguments instance with transformed types.
|
||||
|
||||
The types in the resulting Arguments instance are transformed according
|
||||
to tracetool.transform.transform_type.
|
||||
"""
|
||||
res = []
|
||||
for type_, name in self._args:
|
||||
res.append((tracetool.transform.transform_type(type_, *trans),
|
||||
name))
|
||||
return Arguments(res)
|
||||
|
||||
|
||||
class Event(object):
|
||||
"""Event description.
|
||||
@@ -358,16 +345,6 @@ class Event(object):
|
||||
fmt = Event.QEMU_TRACE
|
||||
return fmt % {"name": self.name, "NAME": self.name.upper()}
|
||||
|
||||
def transform(self, *trans):
|
||||
"""Return a new Event with transformed Arguments."""
|
||||
return Event(self.name,
|
||||
list(self.properties),
|
||||
self.fmt,
|
||||
self.args.transform(*trans),
|
||||
self.lineno,
|
||||
self.filename,
|
||||
self)
|
||||
|
||||
|
||||
def read_events(fobj, fname):
|
||||
"""Generate the output for the given (format, backends) pair.
|
||||
|
||||
@@ -1,168 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Type-transformation rules.
|
||||
"""
|
||||
|
||||
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__copyright__ = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__license__ = "GPL version 2 or (at your option) any later version"
|
||||
|
||||
__maintainer__ = "Stefan Hajnoczi"
|
||||
__email__ = "stefanha@redhat.com"
|
||||
|
||||
|
||||
def _transform_type(type_, trans):
|
||||
if isinstance(trans, str):
|
||||
return trans
|
||||
elif isinstance(trans, dict):
|
||||
if type_ in trans:
|
||||
return _transform_type(type_, trans[type_])
|
||||
elif None in trans:
|
||||
return _transform_type(type_, trans[None])
|
||||
else:
|
||||
return type_
|
||||
elif callable(trans):
|
||||
return trans(type_)
|
||||
else:
|
||||
raise ValueError("Invalid type transformation rule: %s" % trans)
|
||||
|
||||
|
||||
def transform_type(type_, *trans):
|
||||
"""Return a new type transformed according to the given rules.
|
||||
|
||||
Applies each of the transformation rules in trans in order.
|
||||
|
||||
If an element of trans is a string, return it.
|
||||
|
||||
If an element of trans is a function, call it with type_ as its only
|
||||
argument.
|
||||
|
||||
If an element of trans is a dict, search type_ in its keys. If type_ is
|
||||
a key, use the value as a transformation rule for type_. Otherwise, if
|
||||
None is a key use the value as a transformation rule for type_.
|
||||
|
||||
Otherwise, return type_.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
type_ : str
|
||||
Type to transform.
|
||||
trans : list of function or dict
|
||||
Type transformation rules.
|
||||
"""
|
||||
if len(trans) == 0:
|
||||
raise ValueError
|
||||
res = type_
|
||||
for t in trans:
|
||||
res = _transform_type(res, t)
|
||||
return res
|
||||
|
||||
|
||||
##################################################
|
||||
# tcg -> host
|
||||
|
||||
def _tcg_2_host(type_):
|
||||
if type_ == "TCGv":
|
||||
# force a fixed-size type (target-independent)
|
||||
return "uint64_t"
|
||||
else:
|
||||
return type_
|
||||
|
||||
TCG_2_HOST = {
|
||||
"TCGv_i32": "uint32_t",
|
||||
"TCGv_i64": "uint64_t",
|
||||
"TCGv_ptr": "void *",
|
||||
None: _tcg_2_host,
|
||||
}
|
||||
|
||||
|
||||
##################################################
|
||||
# host -> host compatible with tcg sizes
|
||||
|
||||
HOST_2_TCG_COMPAT = {
|
||||
"uint8_t": "uint32_t",
|
||||
"uint16_t": "uint32_t",
|
||||
}
|
||||
|
||||
|
||||
##################################################
|
||||
# host/tcg -> tcg
|
||||
|
||||
def _host_2_tcg(type_):
|
||||
if type_.startswith("TCGv"):
|
||||
return type_
|
||||
raise ValueError("Don't know how to translate '%s' into a TCG type\n" % type_)
|
||||
|
||||
HOST_2_TCG = {
|
||||
"uint32_t": "TCGv_i32",
|
||||
"uint64_t": "TCGv_i64",
|
||||
"void *" : "TCGv_ptr",
|
||||
"CPUArchState *": "TCGv_env",
|
||||
None: _host_2_tcg,
|
||||
}
|
||||
|
||||
|
||||
##################################################
|
||||
# tcg -> tcg helper definition
|
||||
|
||||
def _tcg_2_helper_def(type_):
|
||||
if type_ == "TCGv":
|
||||
return "target_ulong"
|
||||
else:
|
||||
return type_
|
||||
|
||||
TCG_2_TCG_HELPER_DEF = {
|
||||
"TCGv_i32": "uint32_t",
|
||||
"TCGv_i64": "uint64_t",
|
||||
"TCGv_ptr": "void *",
|
||||
None: _tcg_2_helper_def,
|
||||
}
|
||||
|
||||
|
||||
##################################################
|
||||
# tcg -> tcg helper declaration
|
||||
|
||||
def _tcg_2_tcg_helper_decl_error(type_):
|
||||
raise ValueError("Don't know how to translate type '%s' into a TCG helper declaration type\n" % type_)
|
||||
|
||||
TCG_2_TCG_HELPER_DECL = {
|
||||
"TCGv" : "tl",
|
||||
"TCGv_ptr": "ptr",
|
||||
"TCGv_i32": "i32",
|
||||
"TCGv_i64": "i64",
|
||||
"TCGv_env": "env",
|
||||
None: _tcg_2_tcg_helper_decl_error,
|
||||
}
|
||||
|
||||
|
||||
##################################################
|
||||
# host/tcg -> tcg temporal constant allocation
|
||||
|
||||
def _host_2_tcg_tmp_new(type_):
|
||||
if type_.startswith("TCGv"):
|
||||
return "tcg_temp_new_nop"
|
||||
raise ValueError("Don't know how to translate type '%s' into a TCG temporal allocation" % type_)
|
||||
|
||||
HOST_2_TCG_TMP_NEW = {
|
||||
"uint32_t": "tcg_const_i32",
|
||||
"uint64_t": "tcg_const_i64",
|
||||
"void *" : "tcg_const_ptr",
|
||||
None: _host_2_tcg_tmp_new,
|
||||
}
|
||||
|
||||
|
||||
##################################################
|
||||
# host/tcg -> tcg temporal constant deallocation
|
||||
|
||||
def _host_2_tcg_tmp_free(type_):
|
||||
if type_.startswith("TCGv"):
|
||||
return "tcg_temp_free_nop"
|
||||
raise ValueError("Don't know how to translate type '%s' into a TCG temporal deallocation" % type_)
|
||||
|
||||
HOST_2_TCG_TMP_FREE = {
|
||||
"uint32_t": "tcg_temp_free_i32",
|
||||
"uint64_t": "tcg_temp_free_i64",
|
||||
"void *" : "tcg_temp_free_ptr",
|
||||
None: _host_2_tcg_tmp_free,
|
||||
}
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/plugin.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "qom/object.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
|
||||
+10
-9
@@ -162,9 +162,12 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
|
||||
/* this is currently used only by ARM BE32 */
|
||||
addr = cc->tcg_ops->adjust_watchpoint_address(cpu, addr, len);
|
||||
}
|
||||
|
||||
assert((flags & ~BP_MEM_ACCESS) == 0);
|
||||
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
|
||||
if (watchpoint_address_matches(wp, addr, len)
|
||||
&& (wp->flags & flags)) {
|
||||
int hit_flags = wp->flags & flags;
|
||||
|
||||
if (hit_flags && watchpoint_address_matches(wp, addr, len)) {
|
||||
if (replay_running_debug()) {
|
||||
/*
|
||||
* replay_breakpoint reads icount.
|
||||
@@ -184,16 +187,14 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
|
||||
replay_breakpoint();
|
||||
return;
|
||||
}
|
||||
if (flags == BP_MEM_READ) {
|
||||
wp->flags |= BP_WATCHPOINT_HIT_READ;
|
||||
} else {
|
||||
wp->flags |= BP_WATCHPOINT_HIT_WRITE;
|
||||
}
|
||||
|
||||
wp->flags |= hit_flags << BP_HIT_SHIFT;
|
||||
wp->hitaddr = MAX(addr, wp->vaddr);
|
||||
wp->hitattrs = attrs;
|
||||
|
||||
if (wp->flags & BP_CPU && cc->tcg_ops->debug_check_watchpoint &&
|
||||
!cc->tcg_ops->debug_check_watchpoint(cpu, wp)) {
|
||||
if (wp->flags & BP_CPU
|
||||
&& cc->tcg_ops->debug_check_watchpoint
|
||||
&& !cc->tcg_ops->debug_check_watchpoint(cpu, wp)) {
|
||||
wp->flags &= ~BP_WATCHPOINT_HIT;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -179,7 +179,6 @@ static void free_context_temps(DisasContext *ctx)
|
||||
{
|
||||
if (ctx->sink) {
|
||||
tcg_gen_discard_i64(ctx->sink);
|
||||
tcg_temp_free(ctx->sink);
|
||||
ctx->sink = NULL;
|
||||
}
|
||||
}
|
||||
@@ -279,7 +278,6 @@ static void gen_ldf(DisasContext *ctx, TCGv dest, TCGv addr)
|
||||
TCGv_i32 tmp32 = tcg_temp_new_i32();
|
||||
tcg_gen_qemu_ld_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx));
|
||||
gen_helper_memory_to_f(dest, tmp32);
|
||||
tcg_temp_free_i32(tmp32);
|
||||
}
|
||||
|
||||
static void gen_ldg(DisasContext *ctx, TCGv dest, TCGv addr)
|
||||
@@ -287,7 +285,6 @@ static void gen_ldg(DisasContext *ctx, TCGv dest, TCGv addr)
|
||||
TCGv tmp = tcg_temp_new();
|
||||
tcg_gen_qemu_ld_i64(tmp, addr, ctx->mem_idx, MO_LEUQ | UNALIGN(ctx));
|
||||
gen_helper_memory_to_g(dest, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void gen_lds(DisasContext *ctx, TCGv dest, TCGv addr)
|
||||
@@ -295,7 +292,6 @@ static void gen_lds(DisasContext *ctx, TCGv dest, TCGv addr)
|
||||
TCGv_i32 tmp32 = tcg_temp_new_i32();
|
||||
tcg_gen_qemu_ld_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx));
|
||||
gen_helper_memory_to_s(dest, tmp32);
|
||||
tcg_temp_free_i32(tmp32);
|
||||
}
|
||||
|
||||
static void gen_ldt(DisasContext *ctx, TCGv dest, TCGv addr)
|
||||
@@ -311,7 +307,6 @@ static void gen_load_fp(DisasContext *ctx, int ra, int rb, int32_t disp16,
|
||||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16);
|
||||
func(ctx, cpu_fir[ra], addr);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,7 +337,6 @@ static void gen_load_int(DisasContext *ctx, int ra, int rb, int32_t disp16,
|
||||
tcg_gen_mov_i64(cpu_lock_addr, addr);
|
||||
tcg_gen_mov_i64(cpu_lock_value, dest);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void gen_stf(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
@@ -350,7 +344,6 @@ static void gen_stf(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
TCGv_i32 tmp32 = tcg_temp_new_i32();
|
||||
gen_helper_f_to_memory(tmp32, addr);
|
||||
tcg_gen_qemu_st_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx));
|
||||
tcg_temp_free_i32(tmp32);
|
||||
}
|
||||
|
||||
static void gen_stg(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
@@ -358,7 +351,6 @@ static void gen_stg(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
TCGv tmp = tcg_temp_new();
|
||||
gen_helper_g_to_memory(tmp, src);
|
||||
tcg_gen_qemu_st_i64(tmp, addr, ctx->mem_idx, MO_LEUQ | UNALIGN(ctx));
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void gen_sts(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
@@ -366,7 +358,6 @@ static void gen_sts(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
TCGv_i32 tmp32 = tcg_temp_new_i32();
|
||||
gen_helper_s_to_memory(tmp32, src);
|
||||
tcg_gen_qemu_st_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx));
|
||||
tcg_temp_free_i32(tmp32);
|
||||
}
|
||||
|
||||
static void gen_stt(DisasContext *ctx, TCGv src, TCGv addr)
|
||||
@@ -380,7 +371,6 @@ static void gen_store_fp(DisasContext *ctx, int ra, int rb, int32_t disp16,
|
||||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16);
|
||||
func(ctx, load_fpr(ctx, ra), addr);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void gen_store_int(DisasContext *ctx, int ra, int rb, int32_t disp16,
|
||||
@@ -398,8 +388,6 @@ static void gen_store_int(DisasContext *ctx, int ra, int rb, int32_t disp16,
|
||||
|
||||
src = load_gpr(ctx, ra);
|
||||
tcg_gen_qemu_st_i64(src, addr, ctx->mem_idx, op);
|
||||
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb,
|
||||
@@ -416,7 +404,6 @@ static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb,
|
||||
lab_fail = gen_new_label();
|
||||
lab_done = gen_new_label();
|
||||
tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_lock_addr, lab_fail);
|
||||
tcg_temp_free_i64(addr);
|
||||
|
||||
val = tcg_temp_new_i64();
|
||||
tcg_gen_atomic_cmpxchg_i64(val, cpu_lock_addr, cpu_lock_value,
|
||||
@@ -426,7 +413,6 @@ static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb,
|
||||
if (ra != 31) {
|
||||
tcg_gen_setcond_i64(TCG_COND_EQ, ctx->ir[ra], val, cpu_lock_value);
|
||||
}
|
||||
tcg_temp_free_i64(val);
|
||||
tcg_gen_br(lab_done);
|
||||
|
||||
gen_set_label(lab_fail);
|
||||
@@ -504,7 +490,6 @@ static DisasJumpType gen_bcond(DisasContext *ctx, TCGCond cond, int ra,
|
||||
|
||||
tcg_gen_andi_i64(tmp, load_gpr(ctx, ra), 1);
|
||||
ret = gen_bcond_internal(ctx, cond, tmp, disp);
|
||||
tcg_temp_free(tmp);
|
||||
return ret;
|
||||
}
|
||||
return gen_bcond_internal(ctx, cond, load_gpr(ctx, ra), disp);
|
||||
@@ -550,7 +535,6 @@ static DisasJumpType gen_fbcond(DisasContext *ctx, TCGCond cond, int ra,
|
||||
|
||||
gen_fold_mzero(cond, cmp_tmp, load_fpr(ctx, ra));
|
||||
ret = gen_bcond_internal(ctx, cond, cmp_tmp, disp);
|
||||
tcg_temp_free(cmp_tmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -564,8 +548,6 @@ static void gen_fcmov(DisasContext *ctx, TCGCond cond, int ra, int rb, int rc)
|
||||
gen_fold_mzero(cond, va, load_fpr(ctx, ra));
|
||||
|
||||
tcg_gen_movcond_i64(cond, dest_fpr(ctx, rc), va, z, vb, load_fpr(ctx, rc));
|
||||
|
||||
tcg_temp_free(va);
|
||||
}
|
||||
|
||||
#define QUAL_RM_N 0x080 /* Round mode nearest even */
|
||||
@@ -615,8 +597,6 @@ static void gen_qual_roundmode(DisasContext *ctx, int fn11)
|
||||
#else
|
||||
gen_helper_setroundmode(tmp);
|
||||
#endif
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_qual_flushzero(DisasContext *ctx, int fn11)
|
||||
@@ -645,8 +625,6 @@ static void gen_qual_flushzero(DisasContext *ctx, int fn11)
|
||||
#else
|
||||
gen_helper_setflushzero(tmp);
|
||||
#endif
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static TCGv gen_ieee_input(DisasContext *ctx, int reg, int fn11, int is_cmp)
|
||||
@@ -716,8 +694,6 @@ static void gen_cvtlq(TCGv vc, TCGv vb)
|
||||
tcg_gen_shri_i64(tmp, vb, 29);
|
||||
tcg_gen_sari_i64(vc, vb, 32);
|
||||
tcg_gen_deposit_i64(vc, vc, tmp, 0, 30);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void gen_ieee_arith2(DisasContext *ctx,
|
||||
@@ -808,8 +784,6 @@ static void gen_cpy_mask(TCGv vc, TCGv va, TCGv vb, bool inv_a, uint64_t mask)
|
||||
|
||||
tcg_gen_andc_i64(vc, vb, vmask);
|
||||
tcg_gen_or_i64(vc, vc, tmp);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void gen_ieee_arith3(DisasContext *ctx,
|
||||
@@ -927,7 +901,6 @@ static void gen_ext_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
||||
tcg_gen_neg_i64(tmp, tmp);
|
||||
tcg_gen_andi_i64(tmp, tmp, 0x3f);
|
||||
tcg_gen_shl_i64(vc, va, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
gen_zapnoti(vc, vc, byte_mask);
|
||||
}
|
||||
@@ -948,7 +921,6 @@ static void gen_ext_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
||||
tcg_gen_andi_i64(tmp, load_gpr(ctx, rb), 7);
|
||||
tcg_gen_shli_i64(tmp, tmp, 3);
|
||||
tcg_gen_shr_i64(vc, va, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
gen_zapnoti(vc, vc, byte_mask);
|
||||
}
|
||||
}
|
||||
@@ -986,8 +958,6 @@ static void gen_ins_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
||||
|
||||
tcg_gen_shr_i64(vc, tmp, shift);
|
||||
tcg_gen_shri_i64(vc, vc, 1);
|
||||
tcg_temp_free(shift);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1015,8 +985,6 @@ static void gen_ins_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
||||
tcg_gen_andi_i64(shift, load_gpr(ctx, rb), 7);
|
||||
tcg_gen_shli_i64(shift, shift, 3);
|
||||
tcg_gen_shl_i64(vc, tmp, shift);
|
||||
tcg_temp_free(shift);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1047,9 +1015,6 @@ static void gen_msk_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
||||
tcg_gen_shri_i64(mask, mask, 1);
|
||||
|
||||
tcg_gen_andc_i64(vc, va, mask);
|
||||
|
||||
tcg_temp_free(mask);
|
||||
tcg_temp_free(shift);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1069,9 +1034,6 @@ static void gen_msk_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
||||
tcg_gen_shl_i64(mask, mask, shift);
|
||||
|
||||
tcg_gen_andc_i64(vc, va, mask);
|
||||
|
||||
tcg_temp_free(mask);
|
||||
tcg_temp_free(shift);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1152,7 +1114,6 @@ static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode)
|
||||
TCGv tmp = tcg_temp_new();
|
||||
tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK);
|
||||
st_flag_byte(tmp, ENV_FLAG_PS_SHIFT);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
/* Allow interrupts to be recognized right away. */
|
||||
@@ -1215,7 +1176,6 @@ static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode)
|
||||
|
||||
tcg_gen_movi_i64(tmp, exc_addr);
|
||||
tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUAlphaState, exc_addr));
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
entry += (palcode & 0x80
|
||||
? 0x2000 + (palcode - 0x80) * 64
|
||||
@@ -1550,7 +1510,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_shli_i64(tmp, va, 2);
|
||||
tcg_gen_add_i64(tmp, tmp, vb);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x09:
|
||||
/* SUBL */
|
||||
@@ -1563,7 +1522,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_shli_i64(tmp, va, 2);
|
||||
tcg_gen_sub_i64(tmp, tmp, vb);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x0F:
|
||||
/* CMPBGE */
|
||||
@@ -1580,7 +1538,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_shli_i64(tmp, va, 3);
|
||||
tcg_gen_add_i64(tmp, tmp, vb);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x1B:
|
||||
/* S8SUBL */
|
||||
@@ -1588,7 +1545,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_shli_i64(tmp, va, 3);
|
||||
tcg_gen_sub_i64(tmp, tmp, vb);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x1D:
|
||||
/* CMPULT */
|
||||
@@ -1603,7 +1559,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_shli_i64(tmp, va, 2);
|
||||
tcg_gen_add_i64(vc, tmp, vb);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x29:
|
||||
/* SUBQ */
|
||||
@@ -1614,7 +1569,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_shli_i64(tmp, va, 2);
|
||||
tcg_gen_sub_i64(vc, tmp, vb);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x2D:
|
||||
/* CMPEQ */
|
||||
@@ -1625,14 +1579,12 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_shli_i64(tmp, va, 3);
|
||||
tcg_gen_add_i64(vc, tmp, vb);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x3B:
|
||||
/* S8SUBQ */
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_shli_i64(tmp, va, 3);
|
||||
tcg_gen_sub_i64(vc, tmp, vb);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x3D:
|
||||
/* CMPULE */
|
||||
@@ -1646,7 +1598,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_add_i64(tmp, tmp, vc);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
gen_helper_check_overflow(cpu_env, vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x49:
|
||||
/* SUBL/V */
|
||||
@@ -1656,7 +1607,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_sub_i64(tmp, tmp, vc);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
gen_helper_check_overflow(cpu_env, vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x4D:
|
||||
/* CMPLT */
|
||||
@@ -1674,8 +1624,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_shri_i64(tmp, tmp, 63);
|
||||
tcg_gen_movi_i64(tmp2, 0);
|
||||
gen_helper_check_overflow(cpu_env, tmp, tmp2);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_temp_free(tmp2);
|
||||
break;
|
||||
case 0x69:
|
||||
/* SUBQ/V */
|
||||
@@ -1689,8 +1637,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_shri_i64(tmp, tmp, 63);
|
||||
tcg_gen_movi_i64(tmp2, 0);
|
||||
gen_helper_check_overflow(cpu_env, tmp, tmp2);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_temp_free(tmp2);
|
||||
break;
|
||||
case 0x6D:
|
||||
/* CMPLE */
|
||||
@@ -1744,7 +1690,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_andi_i64(tmp, va, 1);
|
||||
tcg_gen_movcond_i64(TCG_COND_NE, vc, tmp, load_zero(ctx),
|
||||
vb, load_gpr(ctx, rc));
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x16:
|
||||
/* CMOVLBC */
|
||||
@@ -1752,7 +1697,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_andi_i64(tmp, va, 1);
|
||||
tcg_gen_movcond_i64(TCG_COND_EQ, vc, tmp, load_zero(ctx),
|
||||
vb, load_gpr(ctx, rc));
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x20:
|
||||
/* BIS */
|
||||
@@ -1884,7 +1828,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
vb = load_gpr(ctx, rb);
|
||||
tcg_gen_andi_i64(tmp, vb, 0x3f);
|
||||
tcg_gen_shr_i64(vc, va, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
break;
|
||||
case 0x36:
|
||||
@@ -1900,7 +1843,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
vb = load_gpr(ctx, rb);
|
||||
tcg_gen_andi_i64(tmp, vb, 0x3f);
|
||||
tcg_gen_shl_i64(vc, va, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
break;
|
||||
case 0x3B:
|
||||
@@ -1916,7 +1858,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
vb = load_gpr(ctx, rb);
|
||||
tcg_gen_andi_i64(tmp, vb, 0x3f);
|
||||
tcg_gen_sar_i64(vc, va, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
break;
|
||||
case 0x52:
|
||||
@@ -1978,7 +1919,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
/* UMULH */
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_mulu2_i64(tmp, vc, va, vb);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x40:
|
||||
/* MULL/V */
|
||||
@@ -1988,7 +1928,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_mul_i64(tmp, tmp, vc);
|
||||
tcg_gen_ext32s_i64(vc, tmp);
|
||||
gen_helper_check_overflow(cpu_env, vc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x60:
|
||||
/* MULQ/V */
|
||||
@@ -1997,8 +1936,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_muls2_i64(vc, tmp, va, vb);
|
||||
tcg_gen_sari_i64(tmp2, vc, 63);
|
||||
gen_helper_check_overflow(cpu_env, tmp, tmp2);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_temp_free(tmp2);
|
||||
break;
|
||||
default:
|
||||
goto invalid_opc;
|
||||
@@ -2017,7 +1954,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
va = load_gpr(ctx, ra);
|
||||
tcg_gen_extrl_i64_i32(t32, va);
|
||||
gen_helper_memory_to_s(vc, t32);
|
||||
tcg_temp_free_i32(t32);
|
||||
break;
|
||||
case 0x0A:
|
||||
/* SQRTF */
|
||||
@@ -2040,7 +1976,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
va = load_gpr(ctx, ra);
|
||||
tcg_gen_extrl_i64_i32(t32, va);
|
||||
gen_helper_memory_to_f(vc, t32);
|
||||
tcg_temp_free_i32(t32);
|
||||
break;
|
||||
case 0x24:
|
||||
/* ITOFT */
|
||||
@@ -2526,7 +2461,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tcg_gen_qemu_ld_i64(va, addr, MMU_USER_IDX, MO_LEUQ);
|
||||
break;
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
@@ -2550,7 +2484,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
va = load_fpr(ctx, ra);
|
||||
gen_helper_s_to_memory(t32, va);
|
||||
tcg_gen_ext_i32_i64(vc, t32);
|
||||
tcg_temp_free_i32(t32);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2706,7 +2639,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_andi_i64(tmp, vb, 1);
|
||||
st_flag_byte(tmp, ENV_FLAG_PAL_SHIFT);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_gen_andi_i64(cpu_pc, vb, ~3);
|
||||
/* Allow interrupts to be recognized right away. */
|
||||
ret = DISAS_PC_UPDATED_NOCHAIN;
|
||||
@@ -2728,7 +2660,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_addi_i64(tmp, vb, disp12);
|
||||
tcg_gen_qemu_st_i64(va, tmp, MMU_PHYS_IDX, MO_LESL);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x1:
|
||||
/* Quadword physical access */
|
||||
@@ -2737,7 +2668,6 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_addi_i64(tmp, vb, disp12);
|
||||
tcg_gen_qemu_st_i64(va, tmp, MMU_PHYS_IDX, MO_LEUQ);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
case 0x2:
|
||||
/* Longword physical access with lock */
|
||||
@@ -2996,7 +2926,6 @@ static void alpha_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
|
||||
ctx->base.is_jmp = translate_one(ctx, insn);
|
||||
|
||||
free_context_temps(ctx);
|
||||
translator_loop_temp_check(&ctx->base);
|
||||
}
|
||||
|
||||
static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
||||
|
||||
+52
-542
File diff suppressed because it is too large
Load Diff
@@ -18,8 +18,6 @@
|
||||
#ifndef TARGET_ARM_TRANSLATE_A64_H
|
||||
#define TARGET_ARM_TRANSLATE_A64_H
|
||||
|
||||
TCGv_i64 new_tmp_a64(DisasContext *s);
|
||||
TCGv_i64 new_tmp_a64_zero(DisasContext *s);
|
||||
TCGv_i64 cpu_reg(DisasContext *s, int reg);
|
||||
TCGv_i64 cpu_reg_sp(DisasContext *s, int reg);
|
||||
TCGv_i64 read_cpu_reg(DisasContext *s, int reg, int sf);
|
||||
|
||||
@@ -91,7 +91,6 @@ static bool trans_VLLDM_VLSTM(DisasContext *s, arg_VLLDM_VLSTM *a)
|
||||
} else {
|
||||
gen_helper_v7m_vlstm(cpu_env, fptr);
|
||||
}
|
||||
tcg_temp_free_i32(fptr);
|
||||
|
||||
clear_eci_state(s);
|
||||
|
||||
@@ -303,8 +302,6 @@ static void gen_branch_fpInactive(DisasContext *s, TCGCond cond,
|
||||
tcg_gen_andi_i32(fpca, fpca, R_V7M_CONTROL_FPCA_MASK);
|
||||
tcg_gen_or_i32(fpca, fpca, aspen);
|
||||
tcg_gen_brcondi_i32(tcg_invert_cond(cond), fpca, 0, label);
|
||||
tcg_temp_free_i32(aspen);
|
||||
tcg_temp_free_i32(fpca);
|
||||
}
|
||||
|
||||
static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
|
||||
@@ -328,7 +325,6 @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
|
||||
case ARM_VFP_FPSCR:
|
||||
tmp = loadfn(s, opaque, true);
|
||||
gen_helper_vfp_set_fpscr(cpu_env, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
gen_lookup_tb(s);
|
||||
break;
|
||||
case ARM_VFP_FPSCR_NZCVQC:
|
||||
@@ -351,7 +347,6 @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
|
||||
tcg_gen_andi_i32(fpscr, fpscr, ~FPCR_NZCV_MASK);
|
||||
tcg_gen_or_i32(fpscr, fpscr, tmp);
|
||||
store_cpu_field(fpscr, vfp.xregs[ARM_VFP_FPSCR]);
|
||||
tcg_temp_free_i32(tmp);
|
||||
break;
|
||||
}
|
||||
case ARM_VFP_FPCXT_NS:
|
||||
@@ -400,8 +395,6 @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
|
||||
tcg_gen_andi_i32(tmp, tmp, ~FPCR_NZCV_MASK);
|
||||
gen_helper_vfp_set_fpscr(cpu_env, tmp);
|
||||
s->base.is_jmp = DISAS_UPDATE_NOCHAIN;
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(sfpa);
|
||||
break;
|
||||
}
|
||||
case ARM_VFP_VPR:
|
||||
@@ -423,7 +416,6 @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
|
||||
R_V7M_VPR_P0_SHIFT, R_V7M_VPR_P0_LENGTH);
|
||||
store_cpu_field(vpr, v7m.vpr);
|
||||
s->base.is_jmp = DISAS_UPDATE_NOCHAIN;
|
||||
tcg_temp_free_i32(tmp);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -491,7 +483,6 @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno,
|
||||
tcg_gen_andi_i32(sfpa, control, R_V7M_CONTROL_SFPA_MASK);
|
||||
tcg_gen_shli_i32(sfpa, sfpa, 31 - R_V7M_CONTROL_SFPA_SHIFT);
|
||||
tcg_gen_or_i32(tmp, tmp, sfpa);
|
||||
tcg_temp_free_i32(sfpa);
|
||||
/*
|
||||
* Store result before updating FPSCR etc, in case
|
||||
* it is a memory write which causes an exception.
|
||||
@@ -505,7 +496,6 @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno,
|
||||
store_cpu_field(control, v7m.control[M_REG_S]);
|
||||
fpscr = load_cpu_field(v7m.fpdscr[M_REG_NS]);
|
||||
gen_helper_vfp_set_fpscr(cpu_env, fpscr);
|
||||
tcg_temp_free_i32(fpscr);
|
||||
lookup_tb = true;
|
||||
break;
|
||||
}
|
||||
@@ -546,7 +536,6 @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno,
|
||||
tcg_gen_andi_i32(sfpa, control, R_V7M_CONTROL_SFPA_MASK);
|
||||
tcg_gen_shli_i32(sfpa, sfpa, 31 - R_V7M_CONTROL_SFPA_SHIFT);
|
||||
tcg_gen_or_i32(tmp, tmp, sfpa);
|
||||
tcg_temp_free_i32(control);
|
||||
/* Store result before updating FPSCR, in case it faults */
|
||||
storefn(s, opaque, tmp, true);
|
||||
/* If SFPA is zero then set FPSCR from FPDSCR_NS */
|
||||
@@ -554,9 +543,6 @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno,
|
||||
tcg_gen_movcond_i32(TCG_COND_EQ, fpscr, sfpa, tcg_constant_i32(0),
|
||||
fpdscr, fpscr);
|
||||
gen_helper_vfp_set_fpscr(cpu_env, fpscr);
|
||||
tcg_temp_free_i32(sfpa);
|
||||
tcg_temp_free_i32(fpdscr);
|
||||
tcg_temp_free_i32(fpscr);
|
||||
break;
|
||||
}
|
||||
case ARM_VFP_VPR:
|
||||
@@ -598,7 +584,6 @@ static void fp_sysreg_to_gpr(DisasContext *s, void *opaque, TCGv_i32 value,
|
||||
if (a->rt == 15) {
|
||||
/* Set the 4 flag bits in the CPSR */
|
||||
gen_set_nzcv(value);
|
||||
tcg_temp_free_i32(value);
|
||||
} else {
|
||||
store_reg(s, a->rt, value);
|
||||
}
|
||||
@@ -666,7 +651,6 @@ static void fp_sysreg_to_memory(DisasContext *s, void *opaque, TCGv_i32 value,
|
||||
if (do_access) {
|
||||
gen_aa32_st_i32(s, value, addr, get_mem_index(s),
|
||||
MO_UL | MO_ALIGN | s->be_data);
|
||||
tcg_temp_free_i32(value);
|
||||
}
|
||||
|
||||
if (a->w) {
|
||||
@@ -675,8 +659,6 @@ static void fp_sysreg_to_memory(DisasContext *s, void *opaque, TCGv_i32 value,
|
||||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
store_reg(s, a->rn, addr);
|
||||
} else {
|
||||
tcg_temp_free_i32(addr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -717,8 +699,6 @@ static TCGv_i32 memory_to_fp_sysreg(DisasContext *s, void *opaque,
|
||||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
store_reg(s, a->rn, addr);
|
||||
} else {
|
||||
tcg_temp_free_i32(addr);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user