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----- 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:
commit
f003dd8d81
|
@ -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. */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
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;
|
||||
}
|
||||
|
|
|
@ -178,7 +178,6 @@ static bool do_ldst(DisasContext *s, arg_VLDR_VSTR *a, MVEGenLdStFn *fn,
|
|||
|
||||
qreg = mve_qreg_ptr(a->qd);
|
||||
fn(cpu_env, qreg, addr);
|
||||
tcg_temp_free_ptr(qreg);
|
||||
|
||||
/*
|
||||
* Writeback always happens after the last beat of the insn,
|
||||
|
@ -189,8 +188,6 @@ static bool do_ldst(DisasContext *s, arg_VLDR_VSTR *a, MVEGenLdStFn *fn,
|
|||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
store_reg(s, a->rn, addr);
|
||||
} else {
|
||||
tcg_temp_free_i32(addr);
|
||||
}
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -242,9 +239,6 @@ static bool do_ldst_sg(DisasContext *s, arg_vldst_sg *a, MVEGenLdStSGFn fn)
|
|||
qd = mve_qreg_ptr(a->qd);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qd, qm, addr);
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qm);
|
||||
tcg_temp_free_i32(addr);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -341,8 +335,6 @@ static bool do_ldst_sg_imm(DisasContext *s, arg_vldst_sg_imm *a,
|
|||
qd = mve_qreg_ptr(a->qd);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qd, qm, tcg_constant_i32(offset));
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qm);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -414,8 +406,6 @@ static bool do_vldst_il(DisasContext *s, arg_vldst_il *a, MVEGenLdStIlFn *fn,
|
|||
if (a->w) {
|
||||
tcg_gen_addi_i32(rn, rn, addrinc);
|
||||
store_reg(s, a->rn, rn);
|
||||
} else {
|
||||
tcg_temp_free_i32(rn);
|
||||
}
|
||||
mve_update_and_store_eci(s);
|
||||
return true;
|
||||
|
@ -506,9 +496,7 @@ static bool trans_VDUP(DisasContext *s, arg_VDUP *a)
|
|||
qd = mve_qreg_ptr(a->qd);
|
||||
tcg_gen_dup_i32(a->size, rt, rt);
|
||||
gen_helper_mve_vdup(cpu_env, qd, rt);
|
||||
tcg_temp_free_ptr(qd);
|
||||
}
|
||||
tcg_temp_free_i32(rt);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -534,8 +522,6 @@ static bool do_1op_vec(DisasContext *s, arg_1op *a, MVEGenOneOpFn fn,
|
|||
qd = mve_qreg_ptr(a->qd);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qd, qm);
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qm);
|
||||
}
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -631,8 +617,6 @@ static bool do_vcvt_rmode(DisasContext *s, arg_1op *a,
|
|||
qd = mve_qreg_ptr(a->qd);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qd, qm, tcg_constant_i32(arm_rmode_to_sf(rmode)));
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qm);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -821,9 +805,6 @@ static bool do_2op_vec(DisasContext *s, arg_2op *a, MVEGenTwoOpFn fn,
|
|||
qn = mve_qreg_ptr(a->qn);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qd, qn, qm);
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qn);
|
||||
tcg_temp_free_ptr(qm);
|
||||
}
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -1076,9 +1057,6 @@ static bool do_2op_scalar(DisasContext *s, arg_2scalar *a,
|
|||
qn = mve_qreg_ptr(a->qn);
|
||||
rm = load_reg(s, a->rm);
|
||||
fn(cpu_env, qd, qn, rm);
|
||||
tcg_temp_free_i32(rm);
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qn);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1204,15 +1182,11 @@ static bool do_long_dual_acc(DisasContext *s, arg_vmlaldav *a,
|
|||
rdalo = load_reg(s, a->rdalo);
|
||||
rdahi = load_reg(s, a->rdahi);
|
||||
tcg_gen_concat_i32_i64(rda, rdalo, rdahi);
|
||||
tcg_temp_free_i32(rdalo);
|
||||
tcg_temp_free_i32(rdahi);
|
||||
} else {
|
||||
rda = tcg_const_i64(0);
|
||||
}
|
||||
|
||||
fn(rda, cpu_env, qn, qm, rda);
|
||||
tcg_temp_free_ptr(qn);
|
||||
tcg_temp_free_ptr(qm);
|
||||
|
||||
rdalo = tcg_temp_new_i32();
|
||||
rdahi = tcg_temp_new_i32();
|
||||
|
@ -1220,7 +1194,6 @@ static bool do_long_dual_acc(DisasContext *s, arg_vmlaldav *a,
|
|||
tcg_gen_extrh_i64_i32(rdahi, rda);
|
||||
store_reg(s, a->rdalo, rdalo);
|
||||
store_reg(s, a->rdahi, rdahi);
|
||||
tcg_temp_free_i64(rda);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1312,8 +1285,6 @@ static bool do_dual_acc(DisasContext *s, arg_vmladav *a, MVEGenDualAccOpFn *fn)
|
|||
|
||||
fn(rda, cpu_env, qn, qm, rda);
|
||||
store_reg(s, a->rda, rda);
|
||||
tcg_temp_free_ptr(qn);
|
||||
tcg_temp_free_ptr(qm);
|
||||
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -1451,7 +1422,6 @@ static bool trans_VADDV(DisasContext *s, arg_VADDV *a)
|
|||
qm = mve_qreg_ptr(a->qm);
|
||||
fns[a->size][a->u](rda, cpu_env, qm, rda);
|
||||
store_reg(s, a->rda, rda);
|
||||
tcg_temp_free_ptr(qm);
|
||||
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -1494,8 +1464,6 @@ static bool trans_VADDLV(DisasContext *s, arg_VADDLV *a)
|
|||
rdalo = load_reg(s, a->rdalo);
|
||||
rdahi = load_reg(s, a->rdahi);
|
||||
tcg_gen_concat_i32_i64(rda, rdalo, rdahi);
|
||||
tcg_temp_free_i32(rdalo);
|
||||
tcg_temp_free_i32(rdahi);
|
||||
} else {
|
||||
/* Accumulate starting at zero */
|
||||
rda = tcg_const_i64(0);
|
||||
|
@ -1507,7 +1475,6 @@ static bool trans_VADDLV(DisasContext *s, arg_VADDLV *a)
|
|||
} else {
|
||||
gen_helper_mve_vaddlv_s(rda, cpu_env, qm, rda);
|
||||
}
|
||||
tcg_temp_free_ptr(qm);
|
||||
|
||||
rdalo = tcg_temp_new_i32();
|
||||
rdahi = tcg_temp_new_i32();
|
||||
|
@ -1515,7 +1482,6 @@ static bool trans_VADDLV(DisasContext *s, arg_VADDLV *a)
|
|||
tcg_gen_extrh_i64_i32(rdahi, rda);
|
||||
store_reg(s, a->rdalo, rdalo);
|
||||
store_reg(s, a->rdahi, rdahi);
|
||||
tcg_temp_free_i64(rda);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1543,7 +1509,6 @@ static bool do_1imm(DisasContext *s, arg_1imm *a, MVEGenOneOpImmFn *fn,
|
|||
} else {
|
||||
qd = mve_qreg_ptr(a->qd);
|
||||
fn(cpu_env, qd, tcg_constant_i64(imm));
|
||||
tcg_temp_free_ptr(qd);
|
||||
}
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -1616,8 +1581,6 @@ static bool do_2shift_vec(DisasContext *s, arg_2shift *a, MVEGenTwoOpShiftFn fn,
|
|||
qd = mve_qreg_ptr(a->qd);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qd, qm, tcg_constant_i32(shift));
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_ptr(qm);
|
||||
}
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
|
@ -1723,8 +1686,6 @@ static bool do_2shift_scalar(DisasContext *s, arg_shl_scalar *a,
|
|||
qda = mve_qreg_ptr(a->qda);
|
||||
rm = load_reg(s, a->rm);
|
||||
fn(cpu_env, qda, qda, rm);
|
||||
tcg_temp_free_ptr(qda);
|
||||
tcg_temp_free_i32(rm);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1868,7 +1829,6 @@ static bool trans_VSHLC(DisasContext *s, arg_VSHLC *a)
|
|||
rdm = load_reg(s, a->rdm);
|
||||
gen_helper_mve_vshlc(rdm, cpu_env, qd, rdm, tcg_constant_i32(a->imm));
|
||||
store_reg(s, a->rdm, rdm);
|
||||
tcg_temp_free_ptr(qd);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1898,7 +1858,6 @@ static bool do_vidup(DisasContext *s, arg_vidup *a, MVEGenVIDUPFn *fn)
|
|||
rn = load_reg(s, a->rn);
|
||||
fn(rn, cpu_env, qd, rn, tcg_constant_i32(a->imm));
|
||||
store_reg(s, a->rn, rn);
|
||||
tcg_temp_free_ptr(qd);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1934,8 +1893,6 @@ static bool do_viwdup(DisasContext *s, arg_viwdup *a, MVEGenVIWDUPFn *fn)
|
|||
rm = load_reg(s, a->rm);
|
||||
fn(rn, cpu_env, qd, rn, rm, tcg_constant_i32(a->imm));
|
||||
store_reg(s, a->rn, rn);
|
||||
tcg_temp_free_ptr(qd);
|
||||
tcg_temp_free_i32(rm);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -2001,8 +1958,6 @@ static bool do_vcmp(DisasContext *s, arg_vcmp *a, MVEGenCmpFn *fn)
|
|||
qn = mve_qreg_ptr(a->qn);
|
||||
qm = mve_qreg_ptr(a->qm);
|
||||
fn(cpu_env, qn, qm);
|
||||
tcg_temp_free_ptr(qn);
|
||||
tcg_temp_free_ptr(qm);
|
||||
if (a->mask) {
|
||||
/* VPT */
|
||||
gen_vpst(s, a->mask);
|
||||
|
@ -2034,8 +1989,6 @@ static bool do_vcmp_scalar(DisasContext *s, arg_vcmp_scalar *a,
|
|||
rm = load_reg(s, a->rm);
|
||||
}
|
||||
fn(cpu_env, qn, rm);
|
||||
tcg_temp_free_ptr(qn);
|
||||
tcg_temp_free_i32(rm);
|
||||
if (a->mask) {
|
||||
/* VPT */
|
||||
gen_vpst(s, a->mask);
|
||||
|
@ -2138,7 +2091,6 @@ static bool do_vmaxv(DisasContext *s, arg_vmaxv *a, MVEGenVADDVFn fn)
|
|||
rda = load_reg(s, a->rda);
|
||||
fn(rda, cpu_env, qm, rda);
|
||||
store_reg(s, a->rda, rda);
|
||||
tcg_temp_free_ptr(qm);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -2203,8 +2155,6 @@ static bool do_vabav(DisasContext *s, arg_vabav *a, MVEGenVABAVFn *fn)
|
|||
rda = load_reg(s, a->rda);
|
||||
fn(rda, cpu_env, qn, qm, rda);
|
||||
store_reg(s, a->rda, rda);
|
||||
tcg_temp_free_ptr(qm);
|
||||
tcg_temp_free_ptr(qn);
|
||||
mve_update_eci(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -2297,12 +2247,10 @@ static bool trans_VMOV_from_2gp(DisasContext *s, arg_VMOV_to_2gp *a)
|
|||
if (!mve_skip_vmov(s, vd, a->idx, MO_32)) {
|
||||
tmp = load_reg(s, a->rt);
|
||||
write_neon_element32(tmp, vd, a->idx, MO_32);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
if (!mve_skip_vmov(s, vd + 1, a->idx, MO_32)) {
|
||||
tmp = load_reg(s, a->rt2);
|
||||
write_neon_element32(tmp, vd + 1, a->idx, MO_32);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
mve_update_and_store_eci(s);
|
||||
|
|
|
@ -182,7 +182,6 @@ static bool do_neon_ddda_fpst(DisasContext *s, int q, int vd, int vn, int vm,
|
|||
vfp_reg_offset(1, vm),
|
||||
vfp_reg_offset(1, vd),
|
||||
fpst, opr_sz, opr_sz, data, fn_gvec_ptr);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -236,7 +235,6 @@ static bool trans_VCADD(DisasContext *s, arg_VCADD *a)
|
|||
vfp_reg_offset(1, a->vm),
|
||||
fpst, opr_sz, opr_sz, a->rot,
|
||||
fn_gvec_ptr);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -433,7 +431,6 @@ static void gen_neon_ldst_base_update(DisasContext *s, int rm, int rn,
|
|||
TCGv_i32 index;
|
||||
index = load_reg(s, rm);
|
||||
tcg_gen_add_i32(base, base, index);
|
||||
tcg_temp_free_i32(index);
|
||||
}
|
||||
store_reg(s, rn, base);
|
||||
}
|
||||
|
@ -536,8 +533,6 @@ static bool trans_VLDST_multiple(DisasContext *s, arg_VLDST_multiple *a)
|
|||
}
|
||||
}
|
||||
}
|
||||
tcg_temp_free_i32(addr);
|
||||
tcg_temp_free_i64(tmp64);
|
||||
|
||||
gen_neon_ldst_base_update(s, a->rm, a->rn, nregs * interleave * 8);
|
||||
return true;
|
||||
|
@ -630,8 +625,6 @@ static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
|
|||
/* Subsequent memory operations inherit alignment */
|
||||
mop &= ~MO_AMASK;
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << size) * nregs);
|
||||
|
||||
|
@ -751,8 +744,6 @@ static bool trans_VLDST_single(DisasContext *s, arg_VLDST_single *a)
|
|||
/* Subsequent memory operations inherit alignment */
|
||||
mop &= ~MO_AMASK;
|
||||
}
|
||||
tcg_temp_free_i32(addr);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << a->size) * nregs);
|
||||
|
||||
|
@ -1061,9 +1052,6 @@ static bool do_3same_pair(DisasContext *s, arg_3same *a, NeonGenTwoOpFn *fn)
|
|||
write_neon_element32(tmp, a->vd, 0, MO_32);
|
||||
write_neon_element32(tmp3, a->vd, 1, MO_32);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(tmp2);
|
||||
tcg_temp_free_i32(tmp3);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1126,7 +1114,6 @@ DO_3SAME_VQDMULH(VQRDMULH, qrdmulh)
|
|||
TCGv_ptr fpst = fpstatus_ptr(FPST); \
|
||||
tcg_gen_gvec_3_ptr(rd_ofs, rn_ofs, rm_ofs, fpst, \
|
||||
oprsz, maxsz, 0, FUNC); \
|
||||
tcg_temp_free_ptr(fpst); \
|
||||
}
|
||||
|
||||
#define DO_3S_FP_GVEC(INSN,SFUNC,HFUNC) \
|
||||
|
@ -1225,7 +1212,6 @@ static bool do_3same_fp_pair(DisasContext *s, arg_3same *a,
|
|||
vfp_reg_offset(1, a->vn),
|
||||
vfp_reg_offset(1, a->vm),
|
||||
fpstatus, 8, 8, 0, fn);
|
||||
tcg_temp_free_ptr(fpstatus);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1358,7 +1344,6 @@ static bool do_2shift_env_64(DisasContext *s, arg_2reg_shift *a,
|
|||
read_neon_element64(tmp, a->vm, pass, MO_64);
|
||||
fn(tmp, cpu_env, tmp, constimm);
|
||||
write_neon_element64(tmp, a->vd, pass, MO_64);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1403,7 +1388,6 @@ static bool do_2shift_env_32(DisasContext *s, arg_2reg_shift *a,
|
|||
fn(tmp, cpu_env, tmp, constimm);
|
||||
write_neon_element32(tmp, a->vd, pass, MO_32);
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1474,10 +1458,6 @@ static bool do_2shift_narrow_64(DisasContext *s, arg_2reg_shift *a,
|
|||
narrowfn(rd, cpu_env, rm2);
|
||||
write_neon_element32(rd, a->vd, 1, MO_32);
|
||||
|
||||
tcg_temp_free_i32(rd);
|
||||
tcg_temp_free_i64(rm1);
|
||||
tcg_temp_free_i64(rm2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1537,22 +1517,17 @@ static bool do_2shift_narrow_32(DisasContext *s, arg_2reg_shift *a,
|
|||
shiftfn(rm2, rm2, constimm);
|
||||
|
||||
tcg_gen_concat_i32_i64(rtmp, rm1, rm2);
|
||||
tcg_temp_free_i32(rm2);
|
||||
|
||||
narrowfn(rm1, cpu_env, rtmp);
|
||||
write_neon_element32(rm1, a->vd, 0, MO_32);
|
||||
tcg_temp_free_i32(rm1);
|
||||
|
||||
shiftfn(rm3, rm3, constimm);
|
||||
shiftfn(rm4, rm4, constimm);
|
||||
|
||||
tcg_gen_concat_i32_i64(rtmp, rm3, rm4);
|
||||
tcg_temp_free_i32(rm4);
|
||||
|
||||
narrowfn(rm3, cpu_env, rtmp);
|
||||
tcg_temp_free_i64(rtmp);
|
||||
write_neon_element32(rm3, a->vd, 1, MO_32);
|
||||
tcg_temp_free_i32(rm3);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1660,7 +1635,6 @@ static bool do_vshll_2sh(DisasContext *s, arg_2reg_shift *a,
|
|||
tmp = tcg_temp_new_i64();
|
||||
|
||||
widenfn(tmp, rm0);
|
||||
tcg_temp_free_i32(rm0);
|
||||
if (a->shift != 0) {
|
||||
tcg_gen_shli_i64(tmp, tmp, a->shift);
|
||||
tcg_gen_andi_i64(tmp, tmp, ~widen_mask);
|
||||
|
@ -1668,13 +1642,11 @@ static bool do_vshll_2sh(DisasContext *s, arg_2reg_shift *a,
|
|||
write_neon_element64(tmp, a->vd, 0, MO_64);
|
||||
|
||||
widenfn(tmp, rm1);
|
||||
tcg_temp_free_i32(rm1);
|
||||
if (a->shift != 0) {
|
||||
tcg_gen_shli_i64(tmp, tmp, a->shift);
|
||||
tcg_gen_andi_i64(tmp, tmp, ~widen_mask);
|
||||
}
|
||||
write_neon_element64(tmp, a->vd, 1, MO_64);
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1733,7 +1705,6 @@ static bool do_fp_2sh(DisasContext *s, arg_2reg_shift *a,
|
|||
|
||||
fpst = fpstatus_ptr(a->size == MO_16 ? FPST_STD_F16 : FPST_STD);
|
||||
tcg_gen_gvec_2_ptr(rd_ofs, rm_ofs, fpst, vec_size, vec_size, a->shift, fn);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1849,7 +1820,6 @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a,
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
read_neon_element32(tmp, a->vn, 0, MO_32);
|
||||
widenfn(rn0_64, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
if (src2_mop >= 0) {
|
||||
read_neon_element64(rm_64, a->vm, 0, src2_mop);
|
||||
|
@ -1857,7 +1827,6 @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a,
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
read_neon_element32(tmp, a->vm, 0, MO_32);
|
||||
widenfn(rm_64, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
opfn(rn0_64, rn0_64, rm_64);
|
||||
|
@ -1872,7 +1841,6 @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a,
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
read_neon_element32(tmp, a->vn, 1, MO_32);
|
||||
widenfn(rn1_64, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
if (src2_mop >= 0) {
|
||||
read_neon_element64(rm_64, a->vm, 1, src2_mop);
|
||||
|
@ -1880,7 +1848,6 @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a,
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
read_neon_element32(tmp, a->vm, 1, MO_32);
|
||||
widenfn(rm_64, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
write_neon_element64(rn0_64, a->vd, 0, MO_64);
|
||||
|
@ -1888,10 +1855,6 @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a,
|
|||
opfn(rn1_64, rn1_64, rm_64);
|
||||
write_neon_element64(rn1_64, a->vd, 1, MO_64);
|
||||
|
||||
tcg_temp_free_i64(rn0_64);
|
||||
tcg_temp_free_i64(rn1_64);
|
||||
tcg_temp_free_i64(rm_64);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1976,11 +1939,6 @@ static bool do_narrow_3d(DisasContext *s, arg_3diff *a,
|
|||
write_neon_element32(rd0, a->vd, 0, MO_32);
|
||||
write_neon_element32(rd1, a->vd, 1, MO_32);
|
||||
|
||||
tcg_temp_free_i32(rd0);
|
||||
tcg_temp_free_i32(rd1);
|
||||
tcg_temp_free_i64(rn_64);
|
||||
tcg_temp_free_i64(rm_64);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2061,8 +2019,6 @@ static bool do_long_3d(DisasContext *s, arg_3diff *a,
|
|||
read_neon_element32(rn, a->vn, 1, MO_32);
|
||||
read_neon_element32(rm, a->vm, 1, MO_32);
|
||||
opfn(rd1, rn, rm);
|
||||
tcg_temp_free_i32(rn);
|
||||
tcg_temp_free_i32(rm);
|
||||
|
||||
/* Don't store results until after all loads: they might overlap */
|
||||
if (accfn) {
|
||||
|
@ -2071,13 +2027,10 @@ static bool do_long_3d(DisasContext *s, arg_3diff *a,
|
|||
accfn(rd0, tmp, rd0);
|
||||
read_neon_element64(tmp, a->vd, 1, MO_64);
|
||||
accfn(rd1, tmp, rd1);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
write_neon_element64(rd0, a->vd, 0, MO_64);
|
||||
write_neon_element64(rd1, a->vd, 1, MO_64);
|
||||
tcg_temp_free_i64(rd0);
|
||||
tcg_temp_free_i64(rd1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -2149,9 +2102,6 @@ static void gen_mull_s32(TCGv_i64 rd, TCGv_i32 rn, TCGv_i32 rm)
|
|||
|
||||
tcg_gen_muls2_i32(lo, hi, rn, rm);
|
||||
tcg_gen_concat_i32_i64(rd, lo, hi);
|
||||
|
||||
tcg_temp_free_i32(lo);
|
||||
tcg_temp_free_i32(hi);
|
||||
}
|
||||
|
||||
static void gen_mull_u32(TCGv_i64 rd, TCGv_i32 rn, TCGv_i32 rm)
|
||||
|
@ -2161,9 +2111,6 @@ static void gen_mull_u32(TCGv_i64 rd, TCGv_i32 rn, TCGv_i32 rm)
|
|||
|
||||
tcg_gen_mulu2_i32(lo, hi, rn, rm);
|
||||
tcg_gen_concat_i32_i64(rd, lo, hi);
|
||||
|
||||
tcg_temp_free_i32(lo);
|
||||
tcg_temp_free_i32(hi);
|
||||
}
|
||||
|
||||
static bool trans_VMULL_S_3d(DisasContext *s, arg_3diff *a)
|
||||
|
@ -2344,7 +2291,6 @@ static void gen_neon_dup_low16(TCGv_i32 var)
|
|||
tcg_gen_ext16u_i32(var, var);
|
||||
tcg_gen_shli_i32(tmp, var, 16);
|
||||
tcg_gen_or_i32(var, var, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_neon_dup_high16(TCGv_i32 var)
|
||||
|
@ -2353,7 +2299,6 @@ static void gen_neon_dup_high16(TCGv_i32 var)
|
|||
tcg_gen_andi_i32(var, var, 0xffff0000);
|
||||
tcg_gen_shri_i32(tmp, var, 16);
|
||||
tcg_gen_or_i32(var, var, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static inline TCGv_i32 neon_get_scalar(int size, int reg)
|
||||
|
@ -2417,12 +2362,9 @@ static bool do_2scalar(DisasContext *s, arg_2scalar *a,
|
|||
TCGv_i32 rd = tcg_temp_new_i32();
|
||||
read_neon_element32(rd, a->vd, pass, MO_32);
|
||||
accfn(tmp, rd, tmp);
|
||||
tcg_temp_free_i32(rd);
|
||||
}
|
||||
write_neon_element32(tmp, a->vd, pass, MO_32);
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(scalar);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2516,7 +2458,6 @@ static bool do_2scalar_fp_vec(DisasContext *s, arg_2scalar *a,
|
|||
fpstatus = fpstatus_ptr(a->size == 1 ? FPST_STD_F16 : FPST_STD);
|
||||
tcg_gen_gvec_3_ptr(rd_ofs, rn_ofs, rm_ofs, fpstatus,
|
||||
vec_size, vec_size, idx, fn);
|
||||
tcg_temp_free_ptr(fpstatus);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2616,10 +2557,6 @@ static bool do_vqrdmlah_2sc(DisasContext *s, arg_2scalar *a,
|
|||
opfn(rd, cpu_env, rn, scalar, rd);
|
||||
write_neon_element32(rd, a->vd, pass, MO_32);
|
||||
}
|
||||
tcg_temp_free_i32(rn);
|
||||
tcg_temp_free_i32(rd);
|
||||
tcg_temp_free_i32(scalar);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2692,8 +2629,6 @@ static bool do_2scalar_long(DisasContext *s, arg_2scalar *a,
|
|||
read_neon_element32(rn, a->vn, 1, MO_32);
|
||||
rn1_64 = tcg_temp_new_i64();
|
||||
opfn(rn1_64, rn, scalar);
|
||||
tcg_temp_free_i32(rn);
|
||||
tcg_temp_free_i32(scalar);
|
||||
|
||||
if (accfn) {
|
||||
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||
|
@ -2701,13 +2636,10 @@ static bool do_2scalar_long(DisasContext *s, arg_2scalar *a,
|
|||
accfn(rn0_64, t64, rn0_64);
|
||||
read_neon_element64(t64, a->vd, 1, MO_64);
|
||||
accfn(rn1_64, t64, rn1_64);
|
||||
tcg_temp_free_i64(t64);
|
||||
}
|
||||
|
||||
write_neon_element64(rn0_64, a->vd, 0, MO_64);
|
||||
write_neon_element64(rn1_64, a->vd, 1, MO_64);
|
||||
tcg_temp_free_i64(rn0_64);
|
||||
tcg_temp_free_i64(rn1_64);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2842,10 +2774,6 @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a)
|
|||
read_neon_element64(left, a->vm, 0, MO_64);
|
||||
tcg_gen_extract2_i64(dest, right, left, a->imm * 8);
|
||||
write_neon_element64(dest, a->vd, 0, MO_64);
|
||||
|
||||
tcg_temp_free_i64(left);
|
||||
tcg_temp_free_i64(right);
|
||||
tcg_temp_free_i64(dest);
|
||||
} else {
|
||||
/* Extract 128 bits from <Vm+1:Vm:Vn+1:Vn> */
|
||||
TCGv_i64 left, middle, right, destleft, destright;
|
||||
|
@ -2872,12 +2800,6 @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a)
|
|||
|
||||
write_neon_element64(destright, a->vd, 0, MO_64);
|
||||
write_neon_element64(destleft, a->vd, 1, MO_64);
|
||||
|
||||
tcg_temp_free_i64(destright);
|
||||
tcg_temp_free_i64(destleft);
|
||||
tcg_temp_free_i64(right);
|
||||
tcg_temp_free_i64(middle);
|
||||
tcg_temp_free_i64(left);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2921,9 +2843,6 @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
|
|||
|
||||
gen_helper_neon_tbl(val, cpu_env, desc, val, def);
|
||||
write_neon_element64(val, a->vd, 0, MO_64);
|
||||
|
||||
tcg_temp_free_i64(def);
|
||||
tcg_temp_free_i64(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3002,9 +2921,6 @@ static bool trans_VREV64(DisasContext *s, arg_VREV64 *a)
|
|||
write_neon_element32(tmp[1], a->vd, pass * 2, MO_32);
|
||||
write_neon_element32(tmp[0], a->vd, pass * 2 + 1, MO_32);
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(tmp[0]);
|
||||
tcg_temp_free_i32(tmp[1]);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3055,20 +2971,15 @@ static bool do_2misc_pairwise(DisasContext *s, arg_2misc *a,
|
|||
widenfn(rm0_64, tmp);
|
||||
read_neon_element32(tmp, a->vm, pass * 2 + 1, MO_32);
|
||||
widenfn(rm1_64, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
opfn(rd_64, rm0_64, rm1_64);
|
||||
tcg_temp_free_i64(rm0_64);
|
||||
tcg_temp_free_i64(rm1_64);
|
||||
|
||||
if (accfn) {
|
||||
TCGv_i64 tmp64 = tcg_temp_new_i64();
|
||||
read_neon_element64(tmp64, a->vd, pass, MO_64);
|
||||
accfn(rd_64, tmp64, rd_64);
|
||||
tcg_temp_free_i64(tmp64);
|
||||
}
|
||||
write_neon_element64(rd_64, a->vd, pass, MO_64);
|
||||
tcg_temp_free_i64(rd_64);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -3192,8 +3103,6 @@ static bool do_zip_uzp(DisasContext *s, arg_2misc *a,
|
|||
pd = vfp_reg_ptr(true, a->vd);
|
||||
pm = vfp_reg_ptr(true, a->vm);
|
||||
fn(pd, pm);
|
||||
tcg_temp_free_ptr(pd);
|
||||
tcg_temp_free_ptr(pm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3271,9 +3180,6 @@ static bool do_vmovn(DisasContext *s, arg_2misc *a,
|
|||
narrowfn(rd1, cpu_env, rm);
|
||||
write_neon_element32(rd0, a->vd, 0, MO_32);
|
||||
write_neon_element32(rd1, a->vd, 1, MO_32);
|
||||
tcg_temp_free_i32(rd0);
|
||||
tcg_temp_free_i32(rd1);
|
||||
tcg_temp_free_i64(rm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3341,10 +3247,6 @@ static bool trans_VSHLL(DisasContext *s, arg_2misc *a)
|
|||
widenfn(rd, rm1);
|
||||
tcg_gen_shli_i64(rd, rd, 8 << a->size);
|
||||
write_neon_element64(rd, a->vd, 1, MO_64);
|
||||
|
||||
tcg_temp_free_i64(rd);
|
||||
tcg_temp_free_i32(rm0);
|
||||
tcg_temp_free_i32(rm1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3385,11 +3287,6 @@ static bool trans_VCVT_B16_F32(DisasContext *s, arg_2misc *a)
|
|||
|
||||
write_neon_element32(dst0, a->vd, 0, MO_32);
|
||||
write_neon_element32(dst1, a->vd, 1, MO_32);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i32(dst0);
|
||||
tcg_temp_free_i32(dst1);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3432,16 +3329,10 @@ static bool trans_VCVT_F16_F32(DisasContext *s, arg_2misc *a)
|
|||
tmp3 = tcg_temp_new_i32();
|
||||
read_neon_element32(tmp3, a->vm, 3, MO_32);
|
||||
write_neon_element32(tmp2, a->vd, 0, MO_32);
|
||||
tcg_temp_free_i32(tmp2);
|
||||
gen_helper_vfp_fcvt_f32_to_f16(tmp3, tmp3, fpst, ahp);
|
||||
tcg_gen_shli_i32(tmp3, tmp3, 16);
|
||||
tcg_gen_or_i32(tmp3, tmp3, tmp);
|
||||
write_neon_element32(tmp3, a->vd, 1, MO_32);
|
||||
tcg_temp_free_i32(tmp3);
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(ahp);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3482,18 +3373,12 @@ static bool trans_VCVT_F32_F16(DisasContext *s, arg_2misc *a)
|
|||
tcg_gen_shri_i32(tmp, tmp, 16);
|
||||
gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp);
|
||||
write_neon_element32(tmp, a->vd, 1, MO_32);
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_gen_ext16u_i32(tmp3, tmp2);
|
||||
gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
|
||||
write_neon_element32(tmp3, a->vd, 2, MO_32);
|
||||
tcg_temp_free_i32(tmp3);
|
||||
tcg_gen_shri_i32(tmp2, tmp2, 16);
|
||||
gen_helper_vfp_fcvt_f16_to_f32(tmp2, tmp2, fpst, ahp);
|
||||
write_neon_element32(tmp2, a->vd, 3, MO_32);
|
||||
tcg_temp_free_i32(tmp2);
|
||||
tcg_temp_free_i32(ahp);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3628,8 +3513,6 @@ static bool do_2misc(DisasContext *s, arg_2misc *a, NeonGenOneOpFn *fn)
|
|||
fn(tmp, tmp);
|
||||
write_neon_element32(tmp, a->vd, pass, MO_32);
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3790,7 +3673,6 @@ static bool trans_VQNEG(DisasContext *s, arg_2misc *a)
|
|||
fpst = fpstatus_ptr(vece == MO_16 ? FPST_STD_F16 : FPST_STD); \
|
||||
tcg_gen_gvec_2_ptr(rd_ofs, rm_ofs, fpst, oprsz, maxsz, 0, \
|
||||
fns[vece]); \
|
||||
tcg_temp_free_ptr(fpst); \
|
||||
} \
|
||||
static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
|
||||
{ \
|
||||
|
@ -3841,7 +3723,6 @@ static bool trans_VRINTX(DisasContext *s, arg_2misc *a)
|
|||
fpst = fpstatus_ptr(vece == 1 ? FPST_STD_F16 : FPST_STD); \
|
||||
tcg_gen_gvec_2_ptr(rd_ofs, rm_ofs, fpst, oprsz, maxsz, \
|
||||
arm_rmode_to_sf(RMODE), fns[vece]); \
|
||||
tcg_temp_free_ptr(fpst); \
|
||||
} \
|
||||
static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
|
||||
{ \
|
||||
|
@ -3908,11 +3789,9 @@ static bool trans_VSWP(DisasContext *s, arg_2misc *a)
|
|||
write_neon_element64(rm, a->vd, pass, MO_64);
|
||||
write_neon_element64(rd, a->vm, pass, MO_64);
|
||||
}
|
||||
tcg_temp_free_i64(rm);
|
||||
tcg_temp_free_i64(rd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1)
|
||||
{
|
||||
TCGv_i32 rd, tmp;
|
||||
|
@ -3930,9 +3809,6 @@ static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1)
|
|||
tcg_gen_andi_i32(tmp, t0, 0xff00ff00);
|
||||
tcg_gen_or_i32(t1, t1, tmp);
|
||||
tcg_gen_mov_i32(t0, rd);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(rd);
|
||||
}
|
||||
|
||||
static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
|
||||
|
@ -3949,9 +3825,6 @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
|
|||
tcg_gen_andi_i32(tmp, t0, 0xffff0000);
|
||||
tcg_gen_or_i32(t1, t1, tmp);
|
||||
tcg_gen_mov_i32(t0, rd);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(rd);
|
||||
}
|
||||
|
||||
static bool trans_VTRN(DisasContext *s, arg_2misc *a)
|
||||
|
@ -4003,8 +3876,6 @@ static bool trans_VTRN(DisasContext *s, arg_2misc *a)
|
|||
write_neon_element32(tmp, a->vd, pass, MO_32);
|
||||
}
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(tmp2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,7 +97,6 @@ static TCGv_ptr get_tile_rowcol(DisasContext *s, int esz, int rs,
|
|||
/* Add the byte offset to env to produce the final pointer. */
|
||||
addr = tcg_temp_new_ptr();
|
||||
tcg_gen_ext_i32_ptr(addr, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_gen_add_ptr(addr, addr, cpu_env);
|
||||
|
||||
return addr;
|
||||
|
@ -166,11 +165,6 @@ static bool trans_MOVA(DisasContext *s, arg_MOVA *a)
|
|||
h_fns[a->esz](t_za, t_zr, t_za, t_pg, t_desc);
|
||||
}
|
||||
}
|
||||
|
||||
tcg_temp_free_ptr(t_za);
|
||||
tcg_temp_free_ptr(t_zr);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -237,10 +231,6 @@ static bool trans_LDST1(DisasContext *s, arg_LDST1 *a)
|
|||
|
||||
fns[a->esz][be][a->v][mte][a->st](cpu_env, t_za, t_pg, addr,
|
||||
tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(t_za);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
tcg_temp_free_i64(addr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -260,8 +250,6 @@ static bool do_ldst_r(DisasContext *s, arg_ldstr *a, GenLdStR *fn)
|
|||
base = get_tile_rowcol(s, MO_8, a->rv, imm, false);
|
||||
|
||||
fn(s, base, 0, svl, a->rn, imm * svl);
|
||||
|
||||
tcg_temp_free_ptr(base);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -286,11 +274,6 @@ static bool do_adda(DisasContext *s, arg_adda *a, MemOp esz,
|
|||
pm = pred_full_reg_ptr(s, a->pm);
|
||||
|
||||
fn(za, zn, pn, pm, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(za);
|
||||
tcg_temp_free_ptr(zn);
|
||||
tcg_temp_free_ptr(pn);
|
||||
tcg_temp_free_ptr(pm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -318,11 +301,6 @@ static bool do_outprod(DisasContext *s, arg_op *a, MemOp esz,
|
|||
pm = pred_full_reg_ptr(s, a->pm);
|
||||
|
||||
fn(za, zn, zm, pn, pm, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(za);
|
||||
tcg_temp_free_ptr(zn);
|
||||
tcg_temp_free_ptr(pn);
|
||||
tcg_temp_free_ptr(pm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -346,12 +324,6 @@ static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz,
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
|
||||
fn(za, zn, zm, pn, pm, fpst, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(za);
|
||||
tcg_temp_free_ptr(zn);
|
||||
tcg_temp_free_ptr(pn);
|
||||
tcg_temp_free_ptr(pm);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -130,7 +130,6 @@ static bool gen_gvec_fpst_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
|
|||
tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd),
|
||||
vec_full_reg_offset(s, rn),
|
||||
status, vsz, vsz, data, fn);
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -181,8 +180,6 @@ static bool gen_gvec_fpst_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
|
|||
vec_full_reg_offset(s, rn),
|
||||
vec_full_reg_offset(s, rm),
|
||||
status, vsz, vsz, data, fn);
|
||||
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -249,7 +246,6 @@ static bool gen_gvec_fpst_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
|
|||
{
|
||||
TCGv_ptr status = fpstatus_ptr(flavour);
|
||||
bool ret = gen_gvec_ptr_zzzz(s, fn, rd, rn, rm, ra, data, status);
|
||||
tcg_temp_free_ptr(status);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -271,8 +267,6 @@ static bool gen_gvec_fpst_zzzzp(DisasContext *s, gen_helper_gvec_5_ptr *fn,
|
|||
vec_full_reg_offset(s, ra),
|
||||
pred_full_reg_offset(s, pg),
|
||||
status, vsz, vsz, data, fn);
|
||||
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -321,7 +315,6 @@ static bool gen_gvec_fpst_zzp(DisasContext *s, gen_helper_gvec_3_ptr *fn,
|
|||
vec_full_reg_offset(s, rn),
|
||||
pred_full_reg_offset(s, pg),
|
||||
status, vsz, vsz, data, fn);
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -374,7 +367,6 @@ static bool gen_gvec_fpst_zzzp(DisasContext *s, gen_helper_gvec_4_ptr *fn,
|
|||
vec_full_reg_offset(s, rm),
|
||||
pred_full_reg_offset(s, pg),
|
||||
status, vsz, vsz, data, fn);
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -508,7 +500,6 @@ static void do_predtest1(TCGv_i64 d, TCGv_i64 g)
|
|||
|
||||
gen_helper_sve_predtest1(t, d, g);
|
||||
do_pred_flags(t);
|
||||
tcg_temp_free_i32(t);
|
||||
}
|
||||
|
||||
static void do_predtest(DisasContext *s, int dofs, int gofs, int words)
|
||||
|
@ -521,11 +512,8 @@ static void do_predtest(DisasContext *s, int dofs, int gofs, int words)
|
|||
tcg_gen_addi_ptr(gptr, cpu_env, gofs);
|
||||
|
||||
gen_helper_sve_predtest(t, dptr, gptr, tcg_constant_i32(words));
|
||||
tcg_temp_free_ptr(dptr);
|
||||
tcg_temp_free_ptr(gptr);
|
||||
|
||||
do_pred_flags(t);
|
||||
tcg_temp_free_i32(t);
|
||||
}
|
||||
|
||||
/* For each element size, the bits within a predicate word that are active. */
|
||||
|
@ -561,7 +549,6 @@ static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
|
|||
tcg_gen_andi_i64(d, d, mask);
|
||||
tcg_gen_andi_i64(t, t, ~mask);
|
||||
tcg_gen_or_i64(d, d, t);
|
||||
tcg_temp_free_i64(t);
|
||||
}
|
||||
|
||||
static void gen_xar16_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
|
||||
|
@ -575,7 +562,6 @@ static void gen_xar16_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
|
|||
tcg_gen_andi_i64(d, d, mask);
|
||||
tcg_gen_andi_i64(t, t, ~mask);
|
||||
tcg_gen_or_i64(d, d, t);
|
||||
tcg_temp_free_i64(t);
|
||||
}
|
||||
|
||||
static void gen_xar_i32(TCGv_i32 d, TCGv_i32 n, TCGv_i32 m, int32_t sh)
|
||||
|
@ -984,11 +970,8 @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
|
|||
tcg_gen_addi_ptr(t_zn, cpu_env, vec_full_reg_offset(s, a->rn));
|
||||
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, a->pg));
|
||||
fn(temp, t_zn, t_pg, desc);
|
||||
tcg_temp_free_ptr(t_zn);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
|
||||
write_fp_dreg(s, a->rd, temp);
|
||||
tcg_temp_free_i64(temp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1253,11 +1236,7 @@ static bool do_index(DisasContext *s, int esz, int rd,
|
|||
tcg_gen_extrl_i64_i32(s32, start);
|
||||
tcg_gen_extrl_i64_i32(i32, incr);
|
||||
fns[esz](t_zd, s32, i32, desc);
|
||||
|
||||
tcg_temp_free_i32(s32);
|
||||
tcg_temp_free_i32(i32);
|
||||
}
|
||||
tcg_temp_free_ptr(t_zd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1419,11 +1398,6 @@ static bool do_pppp_flags(DisasContext *s, arg_rprr_s *a,
|
|||
tcg_gen_st_i64(pd, cpu_env, dofs);
|
||||
|
||||
do_predtest1(pd, pg);
|
||||
|
||||
tcg_temp_free_i64(pd);
|
||||
tcg_temp_free_i64(pn);
|
||||
tcg_temp_free_i64(pm);
|
||||
tcg_temp_free_i64(pg);
|
||||
} else {
|
||||
/* The operation and flags generation is large. The computation
|
||||
* of the flags depends on the original contents of the guarding
|
||||
|
@ -1694,9 +1668,6 @@ static bool trans_PTEST(DisasContext *s, arg_PTEST *a)
|
|||
tcg_gen_ld_i64(pn, cpu_env, nofs);
|
||||
tcg_gen_ld_i64(pg, cpu_env, gofs);
|
||||
do_predtest1(pn, pg);
|
||||
|
||||
tcg_temp_free_i64(pn);
|
||||
tcg_temp_free_i64(pg);
|
||||
} else {
|
||||
do_predtest(s, nofs, gofs, words);
|
||||
}
|
||||
|
@ -1810,8 +1781,6 @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag)
|
|||
}
|
||||
|
||||
done:
|
||||
tcg_temp_free_i64(t);
|
||||
|
||||
/* PTRUES */
|
||||
if (setflag) {
|
||||
tcg_gen_movi_i32(cpu_NF, -(word != 0));
|
||||
|
@ -1869,11 +1838,8 @@ static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
|
|||
t = tcg_temp_new_i32();
|
||||
|
||||
gen_fn(t, t_pd, t_pg, tcg_constant_i32(desc));
|
||||
tcg_temp_free_ptr(t_pd);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
|
||||
do_pred_flags(t);
|
||||
tcg_temp_free_i32(t);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1950,9 +1916,7 @@ static void do_sat_addsub_64(TCGv_i64 reg, TCGv_i64 val, bool u, bool d)
|
|||
t2 = tcg_constant_i64(0);
|
||||
tcg_gen_movcond_i64(TCG_COND_LT, reg, t0, t2, t1, reg);
|
||||
}
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* Similarly with a vector and a scalar operand. */
|
||||
|
@ -1982,7 +1946,6 @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
|
|||
} else {
|
||||
gen_helper_sve_sqaddi_b(dptr, nptr, t32, desc);
|
||||
}
|
||||
tcg_temp_free_i32(t32);
|
||||
break;
|
||||
|
||||
case MO_16:
|
||||
|
@ -1996,7 +1959,6 @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
|
|||
} else {
|
||||
gen_helper_sve_sqaddi_h(dptr, nptr, t32, desc);
|
||||
}
|
||||
tcg_temp_free_i32(t32);
|
||||
break;
|
||||
|
||||
case MO_32:
|
||||
|
@ -2011,7 +1973,6 @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
|
|||
} else {
|
||||
gen_helper_sve_sqaddi_s(dptr, nptr, t64, desc);
|
||||
}
|
||||
tcg_temp_free_i64(t64);
|
||||
break;
|
||||
|
||||
case MO_64:
|
||||
|
@ -2025,7 +1986,6 @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
|
|||
t64 = tcg_temp_new_i64();
|
||||
tcg_gen_neg_i64(t64, val);
|
||||
gen_helper_sve_sqaddi_d(dptr, nptr, t64, desc);
|
||||
tcg_temp_free_i64(t64);
|
||||
} else {
|
||||
gen_helper_sve_sqaddi_d(dptr, nptr, val, desc);
|
||||
}
|
||||
|
@ -2034,9 +1994,6 @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
|
|||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
tcg_temp_free_ptr(dptr);
|
||||
tcg_temp_free_ptr(nptr);
|
||||
}
|
||||
|
||||
static bool trans_CNT_r(DisasContext *s, arg_CNT_r *a)
|
||||
|
@ -2222,10 +2179,6 @@ static void do_cpy_m(DisasContext *s, int esz, int rd, int rn, int pg,
|
|||
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
|
||||
|
||||
fns[esz](t_zd, t_zn, t_pg, val, desc);
|
||||
|
||||
tcg_temp_free_ptr(t_zd);
|
||||
tcg_temp_free_ptr(t_zn);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
}
|
||||
|
||||
static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
|
||||
|
@ -2372,9 +2325,6 @@ static void do_insr_i64(DisasContext *s, arg_rrr_esz *a, TCGv_i64 val)
|
|||
tcg_gen_addi_ptr(t_zn, cpu_env, vec_full_reg_offset(s, a->rn));
|
||||
|
||||
fns[a->esz](t_zd, t_zn, val, desc);
|
||||
|
||||
tcg_temp_free_ptr(t_zd);
|
||||
tcg_temp_free_ptr(t_zn);
|
||||
}
|
||||
|
||||
static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a)
|
||||
|
@ -2386,7 +2336,6 @@ static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a)
|
|||
TCGv_i64 t = tcg_temp_new_i64();
|
||||
tcg_gen_ld_i64(t, cpu_env, vec_reg_offset(s, a->rm, 0, MO_64));
|
||||
do_insr_i64(s, a, t);
|
||||
tcg_temp_free_i64(t);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2476,10 +2425,6 @@ static bool do_perm_pred3(DisasContext *s, arg_rrr_esz *a, bool high_odd,
|
|||
tcg_gen_addi_ptr(t_m, cpu_env, pred_full_reg_offset(s, a->rm));
|
||||
|
||||
fn(t_d, t_n, t_m, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(t_d);
|
||||
tcg_temp_free_ptr(t_n);
|
||||
tcg_temp_free_ptr(t_m);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2503,9 +2448,6 @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
|
|||
desc = FIELD_DP32(desc, PREDDESC, DATA, high_odd);
|
||||
|
||||
fn(t_d, t_n, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(t_d);
|
||||
tcg_temp_free_ptr(t_n);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2597,8 +2539,6 @@ static void find_last_active(DisasContext *s, TCGv_i32 ret, int esz, int pg)
|
|||
tcg_gen_addi_ptr(t_p, cpu_env, pred_full_reg_offset(s, pg));
|
||||
|
||||
gen_helper_sve_last_active_element(ret, t_p, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(t_p);
|
||||
}
|
||||
|
||||
/* Increment LAST to the offset of the next element in the vector,
|
||||
|
@ -2661,7 +2601,6 @@ static TCGv_i64 load_last_active(DisasContext *s, TCGv_i32 last,
|
|||
int rm, int esz)
|
||||
{
|
||||
TCGv_ptr p = tcg_temp_new_ptr();
|
||||
TCGv_i64 r;
|
||||
|
||||
/* Convert offset into vector into offset into ENV.
|
||||
* The final adjustment for the vector register base
|
||||
|
@ -2676,10 +2615,7 @@ static TCGv_i64 load_last_active(DisasContext *s, TCGv_i32 last,
|
|||
tcg_gen_ext_i32_ptr(p, last);
|
||||
tcg_gen_add_ptr(p, p, cpu_env);
|
||||
|
||||
r = load_esz(p, vec_full_reg_offset(s, rm), esz);
|
||||
tcg_temp_free_ptr(p);
|
||||
|
||||
return r;
|
||||
return load_esz(p, vec_full_reg_offset(s, rm), esz);
|
||||
}
|
||||
|
||||
/* Compute CLAST for a Zreg. */
|
||||
|
@ -2709,11 +2645,9 @@ static bool do_clast_vector(DisasContext *s, arg_rprr_esz *a, bool before)
|
|||
}
|
||||
|
||||
ele = load_last_active(s, last, a->rm, esz);
|
||||
tcg_temp_free_i32(last);
|
||||
|
||||
vsz = vec_full_reg_size(s);
|
||||
tcg_gen_gvec_dup_i64(esz, vec_full_reg_offset(s, a->rd), vsz, vsz, ele);
|
||||
tcg_temp_free_i64(ele);
|
||||
|
||||
/* If this insn used MOVPRFX, we may need a second move. */
|
||||
if (a->rd != a->rn) {
|
||||
|
@ -2756,13 +2690,9 @@ static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
|
|||
* a conditional move.
|
||||
*/
|
||||
ele = load_last_active(s, last, rm, esz);
|
||||
tcg_temp_free_i32(last);
|
||||
|
||||
tcg_gen_movcond_i64(TCG_COND_GE, reg_val, cmp, tcg_constant_i64(0),
|
||||
ele, reg_val);
|
||||
|
||||
tcg_temp_free_i64(cmp);
|
||||
tcg_temp_free_i64(ele);
|
||||
}
|
||||
|
||||
/* Compute CLAST for a Vreg. */
|
||||
|
@ -2775,7 +2705,6 @@ static bool do_clast_fp(DisasContext *s, arg_rpr_esz *a, bool before)
|
|||
|
||||
do_clast_scalar(s, esz, a->pg, a->rn, before, reg);
|
||||
write_fp_dreg(s, a->rd, reg);
|
||||
tcg_temp_free_i64(reg);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2821,7 +2750,6 @@ static TCGv_i64 do_last_scalar(DisasContext *s, int esz,
|
|||
int pg, int rm, bool before)
|
||||
{
|
||||
TCGv_i32 last = tcg_temp_new_i32();
|
||||
TCGv_i64 ret;
|
||||
|
||||
find_last_active(s, last, esz, pg);
|
||||
if (before) {
|
||||
|
@ -2830,9 +2758,7 @@ static TCGv_i64 do_last_scalar(DisasContext *s, int esz,
|
|||
incr_last_active(s, last, esz);
|
||||
}
|
||||
|
||||
ret = load_last_active(s, last, rm, esz);
|
||||
tcg_temp_free_i32(last);
|
||||
return ret;
|
||||
return load_last_active(s, last, rm, esz);
|
||||
}
|
||||
|
||||
/* Compute LAST for a Vreg. */
|
||||
|
@ -2841,7 +2767,6 @@ static bool do_last_fp(DisasContext *s, arg_rpr_esz *a, bool before)
|
|||
if (sve_access_check(s)) {
|
||||
TCGv_i64 val = do_last_scalar(s, a->esz, a->pg, a->rn, before);
|
||||
write_fp_dreg(s, a->rd, val);
|
||||
tcg_temp_free_i64(val);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2855,7 +2780,6 @@ static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
|
|||
if (sve_access_check(s)) {
|
||||
TCGv_i64 val = do_last_scalar(s, a->esz, a->pg, a->rn, before);
|
||||
tcg_gen_mov_i64(cpu_reg(s, a->rd), val);
|
||||
tcg_temp_free_i64(val);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2883,7 +2807,6 @@ static bool trans_CPY_m_v(DisasContext *s, arg_rpr_esz *a)
|
|||
int ofs = vec_reg_offset(s, a->rn, 0, a->esz);
|
||||
TCGv_i64 t = load_esz(cpu_env, ofs, a->esz);
|
||||
do_cpy_m(s, a->esz, a->rd, a->rd, a->pg, t);
|
||||
tcg_temp_free_i64(t);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2942,14 +2865,7 @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
|
|||
|
||||
gen_fn(t, pd, zn, zm, pg, tcg_constant_i32(simd_desc(vsz, vsz, 0)));
|
||||
|
||||
tcg_temp_free_ptr(pd);
|
||||
tcg_temp_free_ptr(zn);
|
||||
tcg_temp_free_ptr(zm);
|
||||
tcg_temp_free_ptr(pg);
|
||||
|
||||
do_pred_flags(t);
|
||||
|
||||
tcg_temp_free_i32(t);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3021,13 +2937,7 @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
|
|||
|
||||
gen_fn(t, pd, zn, pg, tcg_constant_i32(simd_desc(vsz, vsz, a->imm)));
|
||||
|
||||
tcg_temp_free_ptr(pd);
|
||||
tcg_temp_free_ptr(zn);
|
||||
tcg_temp_free_ptr(pg);
|
||||
|
||||
do_pred_flags(t);
|
||||
|
||||
tcg_temp_free_i32(t);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3081,14 +2991,9 @@ static bool do_brk3(DisasContext *s, arg_rprr_s *a,
|
|||
TCGv_i32 t = tcg_temp_new_i32();
|
||||
fn_s(t, d, n, m, g, desc);
|
||||
do_pred_flags(t);
|
||||
tcg_temp_free_i32(t);
|
||||
} else {
|
||||
fn(d, n, m, g, desc);
|
||||
}
|
||||
tcg_temp_free_ptr(d);
|
||||
tcg_temp_free_ptr(n);
|
||||
tcg_temp_free_ptr(m);
|
||||
tcg_temp_free_ptr(g);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3115,13 +3020,9 @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a,
|
|||
TCGv_i32 t = tcg_temp_new_i32();
|
||||
fn_s(t, d, n, g, desc);
|
||||
do_pred_flags(t);
|
||||
tcg_temp_free_i32(t);
|
||||
} else {
|
||||
fn(d, n, g, desc);
|
||||
}
|
||||
tcg_temp_free_ptr(d);
|
||||
tcg_temp_free_ptr(n);
|
||||
tcg_temp_free_ptr(g);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3159,7 +3060,6 @@ static void do_cntp(DisasContext *s, TCGv_i64 val, int esz, int pn, int pg)
|
|||
TCGv_i64 g = tcg_temp_new_i64();
|
||||
tcg_gen_ld_i64(g, cpu_env, pred_full_reg_offset(s, pg));
|
||||
tcg_gen_and_i64(val, val, g);
|
||||
tcg_temp_free_i64(g);
|
||||
}
|
||||
|
||||
/* Reduce the pred_esz_masks value simply to reduce the
|
||||
|
@ -3181,8 +3081,6 @@ static void do_cntp(DisasContext *s, TCGv_i64 val, int esz, int pn, int pg)
|
|||
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
|
||||
|
||||
gen_helper_sve_cntp(val, t_pn, t_pg, tcg_constant_i32(desc));
|
||||
tcg_temp_free_ptr(t_pn);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3212,7 +3110,6 @@ static bool trans_INCDECP_r(DisasContext *s, arg_incdec_pred *a)
|
|||
} else {
|
||||
tcg_gen_add_i64(reg, reg, val);
|
||||
}
|
||||
tcg_temp_free_i64(val);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -3297,7 +3194,6 @@ static bool trans_CTERM(DisasContext *s, arg_CTERM *a)
|
|||
|
||||
tcg_gen_setcond_i64(cond, cmp, rn, rm);
|
||||
tcg_gen_extrl_i64_i32(cpu_NF, cmp);
|
||||
tcg_temp_free_i64(cmp);
|
||||
|
||||
/* VF = !NF & !CF. */
|
||||
tcg_gen_xori_i32(cpu_VF, cpu_NF, 1);
|
||||
|
@ -3394,12 +3290,10 @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
|
|||
/* Set the count to zero if the condition is false. */
|
||||
tcg_gen_movi_i64(t1, 0);
|
||||
tcg_gen_movcond_i64(cond, t0, op0, op1, t0, t1);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
/* Since we're bounded, pass as a 32-bit type. */
|
||||
t2 = tcg_temp_new_i32();
|
||||
tcg_gen_extrl_i64_i32(t2, t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
/* Scale elements to bits. */
|
||||
tcg_gen_shli_i32(t2, t2, a->esz);
|
||||
|
@ -3416,9 +3310,6 @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
|
|||
gen_helper_sve_whileg(t2, ptr, t2, tcg_constant_i32(desc));
|
||||
}
|
||||
do_pred_flags(t2);
|
||||
|
||||
tcg_temp_free_ptr(ptr);
|
||||
tcg_temp_free_i32(t2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3450,7 +3341,6 @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
|
|||
tcg_gen_sub_i64(diff, op0, op1);
|
||||
tcg_gen_sub_i64(t1, op1, op0);
|
||||
tcg_gen_movcond_i64(TCG_COND_GEU, diff, op0, op1, diff, t1);
|
||||
tcg_temp_free_i64(t1);
|
||||
/* Round down to a multiple of ESIZE. */
|
||||
tcg_gen_andi_i64(diff, diff, -1 << a->esz);
|
||||
/* If op1 == op0, diff == 0, and the condition is always true. */
|
||||
|
@ -3470,7 +3360,6 @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
|
|||
/* Since we're bounded, pass as a 32-bit type. */
|
||||
t2 = tcg_temp_new_i32();
|
||||
tcg_gen_extrl_i64_i32(t2, diff);
|
||||
tcg_temp_free_i64(diff);
|
||||
|
||||
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8);
|
||||
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
|
||||
|
@ -3480,9 +3369,6 @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
|
|||
|
||||
gen_helper_sve_whilel(t2, ptr, t2, tcg_constant_i32(desc));
|
||||
do_pred_flags(t2);
|
||||
|
||||
tcg_temp_free_ptr(ptr);
|
||||
tcg_temp_free_i32(t2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3814,12 +3700,8 @@ static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
|
|||
status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
|
||||
|
||||
fn(temp, t_zn, t_pg, status, t_desc);
|
||||
tcg_temp_free_ptr(t_zn);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
tcg_temp_free_ptr(status);
|
||||
|
||||
write_fp_dreg(s, a->rd, temp);
|
||||
tcg_temp_free_i64(temp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3873,7 +3755,6 @@ static bool do_ppz_fp(DisasContext *s, arg_rpr_esz *a,
|
|||
vec_full_reg_offset(s, a->rn),
|
||||
pred_full_reg_offset(s, a->pg),
|
||||
status, vsz, vsz, 0, fn);
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -3942,12 +3823,7 @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
|
|||
|
||||
fns[a->esz - 1](t_val, t_val, t_rm, t_pg, t_fpst, t_desc);
|
||||
|
||||
tcg_temp_free_ptr(t_fpst);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
tcg_temp_free_ptr(t_rm);
|
||||
|
||||
write_fp_dreg(s, a->rd, t_val);
|
||||
tcg_temp_free_i64(t_val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -4020,11 +3896,6 @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16,
|
|||
status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
|
||||
desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
|
||||
fn(t_zd, t_zn, t_pg, scalar, status, desc);
|
||||
|
||||
tcg_temp_free_ptr(status);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
tcg_temp_free_ptr(t_zn);
|
||||
tcg_temp_free_ptr(t_zd);
|
||||
}
|
||||
|
||||
static bool do_fp_imm(DisasContext *s, arg_rpri_esz *a, uint64_t imm,
|
||||
|
@ -4080,7 +3951,6 @@ static bool do_fp_cmp(DisasContext *s, arg_rprr_esz *a,
|
|||
vec_full_reg_offset(s, a->rm),
|
||||
pred_full_reg_offset(s, a->pg),
|
||||
status, vsz, vsz, 0, fn);
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -4237,8 +4107,6 @@ static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
|
|||
status, vsz, vsz, 0, fn);
|
||||
|
||||
gen_helper_set_rmode(tmode, tmode, status);
|
||||
tcg_temp_free_i32(tmode);
|
||||
tcg_temp_free_ptr(status);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -4321,7 +4189,6 @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
dirty_addr = tcg_temp_new_i64();
|
||||
tcg_gen_addi_i64(dirty_addr, cpu_reg_sp(s, rn), imm);
|
||||
clean_addr = gen_mte_checkN(s, dirty_addr, false, rn != 31, len);
|
||||
tcg_temp_free_i64(dirty_addr);
|
||||
|
||||
/*
|
||||
* Note that unpredicated load/store of vector/predicate registers
|
||||
|
@ -4339,7 +4206,6 @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
tcg_gen_st_i64(t0, base, vofs + i);
|
||||
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
} else {
|
||||
TCGLabel *loop = gen_new_label();
|
||||
TCGv_ptr tp, i = tcg_const_ptr(0);
|
||||
|
@ -4354,11 +4220,8 @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
tcg_gen_add_ptr(tp, base, i);
|
||||
tcg_gen_addi_ptr(i, i, 8);
|
||||
tcg_gen_st_i64(t0, tp, vofs);
|
||||
tcg_temp_free_ptr(tp);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
tcg_gen_brcondi_ptr(TCG_COND_LTU, i, len_align, loop);
|
||||
tcg_temp_free_ptr(i);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -4381,14 +4244,12 @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
tcg_gen_addi_i64(clean_addr, clean_addr, 4);
|
||||
tcg_gen_qemu_ld_i64(t1, clean_addr, midx, MO_LEUW);
|
||||
tcg_gen_deposit_i64(t0, t0, t1, 32, 32);
|
||||
tcg_temp_free_i64(t1);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
tcg_gen_st_i64(t0, base, vofs + len_align);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4405,7 +4266,6 @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
dirty_addr = tcg_temp_new_i64();
|
||||
tcg_gen_addi_i64(dirty_addr, cpu_reg_sp(s, rn), imm);
|
||||
clean_addr = gen_mte_checkN(s, dirty_addr, false, rn != 31, len);
|
||||
tcg_temp_free_i64(dirty_addr);
|
||||
|
||||
/* Note that unpredicated load/store of vector/predicate registers
|
||||
* are defined as a stream of bytes, which equates to little-endian
|
||||
|
@ -4424,7 +4284,6 @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEUQ);
|
||||
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
} else {
|
||||
TCGLabel *loop = gen_new_label();
|
||||
TCGv_ptr tp, i = tcg_const_ptr(0);
|
||||
|
@ -4436,14 +4295,11 @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
tcg_gen_add_ptr(tp, base, i);
|
||||
tcg_gen_ld_i64(t0, tp, vofs);
|
||||
tcg_gen_addi_ptr(i, i, 8);
|
||||
tcg_temp_free_ptr(tp);
|
||||
|
||||
tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEUQ);
|
||||
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
tcg_gen_brcondi_ptr(TCG_COND_LTU, i, len_align, loop);
|
||||
tcg_temp_free_ptr(i);
|
||||
}
|
||||
|
||||
/* Predicate register stores can be any multiple of 2. */
|
||||
|
@ -4469,7 +4325,6 @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs,
|
|||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4578,8 +4433,6 @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
|
|||
|
||||
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
|
||||
fn(cpu_env, t_pg, addr, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
}
|
||||
|
||||
/* Indexed by [mte][be][dtype][nreg] */
|
||||
|
@ -4721,7 +4574,7 @@ static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a)
|
|||
return false;
|
||||
}
|
||||
if (sve_access_check(s)) {
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
|
||||
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
|
||||
do_ld_zpa(s, a->rd, a->pg, addr, a->dtype, a->nreg);
|
||||
|
@ -4737,7 +4590,7 @@ static bool trans_LD_zpri(DisasContext *s, arg_rpri_load *a)
|
|||
if (sve_access_check(s)) {
|
||||
int vsz = vec_full_reg_size(s);
|
||||
int elements = vsz >> dtype_esz[a->dtype];
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
|
||||
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn),
|
||||
(a->imm * elements * (a->nreg + 1))
|
||||
|
@ -4840,7 +4693,7 @@ static bool trans_LDFF1_zprr(DisasContext *s, arg_rprr_load *a)
|
|||
}
|
||||
s->is_nonstreaming = true;
|
||||
if (sve_access_check(s)) {
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
|
||||
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
|
||||
do_mem_zpa(s, a->rd, a->pg, addr, a->dtype, 1, false,
|
||||
|
@ -4945,7 +4798,7 @@ static bool trans_LDNF1_zpri(DisasContext *s, arg_rpri_load *a)
|
|||
int vsz = vec_full_reg_size(s);
|
||||
int elements = vsz >> dtype_esz[a->dtype];
|
||||
int off = (a->imm * elements) << dtype_msz(a->dtype);
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
|
||||
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), off);
|
||||
do_mem_zpa(s, a->rd, a->pg, addr, a->dtype, 1, false,
|
||||
|
@ -4977,7 +4830,6 @@ static void do_ldrq(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype)
|
|||
|
||||
poff = offsetof(CPUARMState, vfp.preg_tmp);
|
||||
tcg_gen_st_i64(tmp, cpu_env, poff);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
t_pg = tcg_temp_new_ptr();
|
||||
|
@ -4987,8 +4839,6 @@ static void do_ldrq(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype)
|
|||
= ldr_fns[s->mte_active[0]][s->be_data == MO_BE][dtype][0];
|
||||
fn(cpu_env, t_pg, addr, tcg_constant_i32(simd_desc(16, 16, zt)));
|
||||
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
|
||||
/* Replicate that first quadword. */
|
||||
if (vsz > 16) {
|
||||
int doff = vec_full_reg_offset(s, zt);
|
||||
|
@ -5003,7 +4853,7 @@ static bool trans_LD1RQ_zprr(DisasContext *s, arg_rprr_load *a)
|
|||
}
|
||||
if (sve_access_check(s)) {
|
||||
int msz = dtype_msz(a->dtype);
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), msz);
|
||||
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
|
||||
do_ldrq(s, a->rd, a->pg, addr, a->dtype);
|
||||
|
@ -5017,7 +4867,7 @@ static bool trans_LD1RQ_zpri(DisasContext *s, arg_rpri_load *a)
|
|||
return false;
|
||||
}
|
||||
if (sve_access_check(s)) {
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), a->imm * 16);
|
||||
do_ldrq(s, a->rd, a->pg, addr, a->dtype);
|
||||
}
|
||||
|
@ -5059,7 +4909,6 @@ static void do_ldro(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype)
|
|||
|
||||
poff = offsetof(CPUARMState, vfp.preg_tmp);
|
||||
tcg_gen_st_i64(tmp, cpu_env, poff);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
t_pg = tcg_temp_new_ptr();
|
||||
|
@ -5069,8 +4918,6 @@ static void do_ldro(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype)
|
|||
= ldr_fns[s->mte_active[0]][s->be_data == MO_BE][dtype][0];
|
||||
fn(cpu_env, t_pg, addr, tcg_constant_i32(simd_desc(32, 32, zt)));
|
||||
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
|
||||
/*
|
||||
* Replicate that first octaword.
|
||||
* The replication happens in units of 32; if the full vector size
|
||||
|
@ -5097,7 +4944,7 @@ static bool trans_LD1RO_zprr(DisasContext *s, arg_rprr_load *a)
|
|||
}
|
||||
s->is_nonstreaming = true;
|
||||
if (sve_access_check(s)) {
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
|
||||
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
|
||||
do_ldro(s, a->rd, a->pg, addr, a->dtype);
|
||||
|
@ -5112,7 +4959,7 @@ static bool trans_LD1RO_zpri(DisasContext *s, arg_rpri_load *a)
|
|||
}
|
||||
s->is_nonstreaming = true;
|
||||
if (sve_access_check(s)) {
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), a->imm * 32);
|
||||
do_ldro(s, a->rd, a->pg, addr, a->dtype);
|
||||
}
|
||||
|
@ -5148,12 +4995,10 @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a)
|
|||
tcg_gen_ld_i64(temp, cpu_env, pred_full_reg_offset(s, a->pg));
|
||||
tcg_gen_andi_i64(temp, temp, pred_esz_masks[esz] & psz_mask);
|
||||
tcg_gen_brcondi_i64(TCG_COND_EQ, temp, 0, over);
|
||||
tcg_temp_free_i64(temp);
|
||||
} else {
|
||||
TCGv_i32 t32 = tcg_temp_new_i32();
|
||||
find_last_active(s, t32, esz, a->pg);
|
||||
tcg_gen_brcondi_i32(TCG_COND_LT, t32, 0, over);
|
||||
tcg_temp_free_i32(t32);
|
||||
}
|
||||
|
||||
/* Load the data. */
|
||||
|
@ -5167,7 +5012,6 @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a)
|
|||
/* Broadcast to *all* elements. */
|
||||
tcg_gen_gvec_dup_i64(esz, vec_full_reg_offset(s, a->rd),
|
||||
vsz, vsz, temp);
|
||||
tcg_temp_free_i64(temp);
|
||||
|
||||
/* Zero the inactive elements. */
|
||||
gen_set_label(over);
|
||||
|
@ -5307,7 +5151,7 @@ static bool trans_ST_zprr(DisasContext *s, arg_rprr_store *a)
|
|||
return false;
|
||||
}
|
||||
if (sve_access_check(s)) {
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), a->msz);
|
||||
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
|
||||
do_st_zpa(s, a->rd, a->pg, addr, a->msz, a->esz, a->nreg);
|
||||
|
@ -5326,7 +5170,7 @@ static bool trans_ST_zpri(DisasContext *s, arg_rpri_store *a)
|
|||
if (sve_access_check(s)) {
|
||||
int vsz = vec_full_reg_size(s);
|
||||
int elements = vsz >> a->esz;
|
||||
TCGv_i64 addr = new_tmp_a64(s);
|
||||
TCGv_i64 addr = tcg_temp_new_i64();
|
||||
|
||||
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn),
|
||||
(a->imm * elements * (a->nreg + 1)) << a->msz);
|
||||
|
@ -5363,10 +5207,6 @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm,
|
|||
tcg_gen_addi_ptr(t_zm, cpu_env, vec_full_reg_offset(s, zm));
|
||||
tcg_gen_addi_ptr(t_zt, cpu_env, vec_full_reg_offset(s, zt));
|
||||
fn(cpu_env, t_zt, t_pg, t_zm, scalar, tcg_constant_i32(desc));
|
||||
|
||||
tcg_temp_free_ptr(t_zt);
|
||||
tcg_temp_free_ptr(t_zm);
|
||||
tcg_temp_free_ptr(t_pg);
|
||||
}
|
||||
|
||||
/* Indexed by [mte][be][ff][xs][u][msz]. */
|
||||
|
@ -6301,7 +6141,6 @@ static void gen_sshll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm)
|
|||
TCGv_vec t = tcg_temp_new_vec_matching(d);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(halfbits, halfbits));
|
||||
tcg_gen_and_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
} else {
|
||||
tcg_gen_sari_vec(vece, d, n, halfbits);
|
||||
tcg_gen_shli_vec(vece, d, d, shl);
|
||||
|
@ -6359,7 +6198,6 @@ static void gen_ushll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm)
|
|||
TCGv_vec t = tcg_temp_new_vec_matching(d);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(halfbits, halfbits));
|
||||
tcg_gen_and_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
} else {
|
||||
tcg_gen_shri_vec(vece, d, n, halfbits);
|
||||
tcg_gen_shli_vec(vece, d, d, shl);
|
||||
|
@ -6369,7 +6207,6 @@ static void gen_ushll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm)
|
|||
TCGv_vec t = tcg_temp_new_vec_matching(d);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits));
|
||||
tcg_gen_and_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
} else {
|
||||
tcg_gen_shli_vec(vece, d, n, halfbits);
|
||||
tcg_gen_shri_vec(vece, d, d, halfbits - shl);
|
||||
|
@ -6549,7 +6386,6 @@ static void gen_sqxtnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
|
|||
tcg_gen_smin_vec(vece, d, d, t);
|
||||
tcg_gen_dupi_vec(vece, t, mask);
|
||||
tcg_gen_and_vec(vece, d, d, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const GVecGen2 sqxtnb_ops[3] = {
|
||||
|
@ -6583,7 +6419,6 @@ static void gen_sqxtnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
|
|||
tcg_gen_shli_vec(vece, n, n, halfbits);
|
||||
tcg_gen_dupi_vec(vece, t, mask);
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const GVecGen2 sqxtnt_ops[3] = {
|
||||
|
@ -6617,7 +6452,6 @@ static void gen_uqxtnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
|
|||
|
||||
tcg_gen_dupi_vec(vece, t, max);
|
||||
tcg_gen_umin_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const GVecGen2 uqxtnb_ops[3] = {
|
||||
|
@ -6646,7 +6480,6 @@ static void gen_uqxtnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
|
|||
tcg_gen_umin_vec(vece, n, n, t);
|
||||
tcg_gen_shli_vec(vece, n, n, halfbits);
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const GVecGen2 uqxtnt_ops[3] = {
|
||||
|
@ -6682,7 +6515,6 @@ static void gen_sqxtunb_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
|
|||
tcg_gen_smax_vec(vece, d, n, t);
|
||||
tcg_gen_dupi_vec(vece, t, max);
|
||||
tcg_gen_umin_vec(vece, d, d, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const GVecGen2 sqxtunb_ops[3] = {
|
||||
|
@ -6713,7 +6545,6 @@ static void gen_sqxtunt_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
|
|||
tcg_gen_umin_vec(vece, n, n, t);
|
||||
tcg_gen_shli_vec(vece, n, n, halfbits);
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const GVecGen2 sqxtunt_ops[3] = {
|
||||
|
@ -6784,7 +6615,6 @@ static void gen_shrnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t shr)
|
|||
tcg_gen_shri_vec(vece, n, n, shr);
|
||||
tcg_gen_dupi_vec(vece, t, mask);
|
||||
tcg_gen_and_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode shrnb_vec_list[] = { INDEX_op_shri_vec, 0 };
|
||||
|
@ -6843,7 +6673,6 @@ static void gen_shrnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t shr)
|
|||
tcg_gen_shli_vec(vece, n, n, halfbits - shr);
|
||||
tcg_gen_dupi_vec(vece, t, mask);
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode shrnt_vec_list[] = { INDEX_op_shli_vec, 0 };
|
||||
|
@ -6894,7 +6723,6 @@ static void gen_sqshrunb_vec(unsigned vece, TCGv_vec d,
|
|||
tcg_gen_smax_vec(vece, n, n, t);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits));
|
||||
tcg_gen_umin_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode sqshrunb_vec_list[] = {
|
||||
|
@ -6929,7 +6757,6 @@ static void gen_sqshrunt_vec(unsigned vece, TCGv_vec d,
|
|||
tcg_gen_umin_vec(vece, n, n, t);
|
||||
tcg_gen_shli_vec(vece, n, n, halfbits);
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode sqshrunt_vec_list[] = {
|
||||
|
@ -6984,7 +6811,6 @@ static void gen_sqshrnb_vec(unsigned vece, TCGv_vec d,
|
|||
tcg_gen_smin_vec(vece, n, n, t);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits));
|
||||
tcg_gen_and_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode sqshrnb_vec_list[] = {
|
||||
|
@ -7022,7 +6848,6 @@ static void gen_sqshrnt_vec(unsigned vece, TCGv_vec d,
|
|||
tcg_gen_shli_vec(vece, n, n, halfbits);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits));
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode sqshrnt_vec_list[] = {
|
||||
|
@ -7071,7 +6896,6 @@ static void gen_uqshrnb_vec(unsigned vece, TCGv_vec d,
|
|||
tcg_gen_shri_vec(vece, n, n, shr);
|
||||
tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits));
|
||||
tcg_gen_umin_vec(vece, d, n, t);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode uqshrnb_vec_list[] = {
|
||||
|
@ -7104,7 +6928,6 @@ static void gen_uqshrnt_vec(unsigned vece, TCGv_vec d,
|
|||
tcg_gen_umin_vec(vece, n, n, t);
|
||||
tcg_gen_shli_vec(vece, n, n, halfbits);
|
||||
tcg_gen_bitsel_vec(vece, d, t, d, n);
|
||||
tcg_temp_free_vec(t);
|
||||
}
|
||||
|
||||
static const TCGOpcode uqshrnt_vec_list[] = {
|
||||
|
@ -7440,11 +7263,6 @@ static bool trans_PSEL(DisasContext *s, arg_psel *a)
|
|||
/* Apply to either copy the source, or write zeros. */
|
||||
tcg_gen_gvec_ands(MO_64, pred_full_reg_offset(s, a->pd),
|
||||
pred_full_reg_offset(s, a->pn), tmp, pl, pl);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(dbit);
|
||||
tcg_temp_free_i64(didx);
|
||||
tcg_temp_free_ptr(ptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -178,7 +178,6 @@ static void gen_update_fp_context(DisasContext *s)
|
|||
|
||||
fpscr = load_cpu_field(v7m.fpdscr[s->v8m_secure]);
|
||||
gen_helper_vfp_set_fpscr(cpu_env, fpscr);
|
||||
tcg_temp_free_i32(fpscr);
|
||||
if (dc_isar_feature(aa32_mve, s)) {
|
||||
store_cpu_field(tcg_constant_i32(0), v7m.vpr);
|
||||
}
|
||||
|
@ -365,24 +364,15 @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
|
|||
tmp = tcg_temp_new_i64();
|
||||
tcg_gen_xor_i64(tmp, vf, nf);
|
||||
tcg_gen_movcond_i64(TCG_COND_GE, dest, tmp, zero, frn, frm);
|
||||
tcg_temp_free_i64(tmp);
|
||||
break;
|
||||
case 3: /* gt: !Z && N == V */
|
||||
tcg_gen_movcond_i64(TCG_COND_NE, dest, zf, zero, frn, frm);
|
||||
tmp = tcg_temp_new_i64();
|
||||
tcg_gen_xor_i64(tmp, vf, nf);
|
||||
tcg_gen_movcond_i64(TCG_COND_GE, dest, tmp, zero, dest, frm);
|
||||
tcg_temp_free_i64(tmp);
|
||||
break;
|
||||
}
|
||||
vfp_store_reg64(dest, rd);
|
||||
tcg_temp_free_i64(frn);
|
||||
tcg_temp_free_i64(frm);
|
||||
tcg_temp_free_i64(dest);
|
||||
|
||||
tcg_temp_free_i64(zf);
|
||||
tcg_temp_free_i64(nf);
|
||||
tcg_temp_free_i64(vf);
|
||||
} else {
|
||||
TCGv_i32 frn, frm, dest;
|
||||
TCGv_i32 tmp, zero;
|
||||
|
@ -405,14 +395,12 @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
|
|||
tmp = tcg_temp_new_i32();
|
||||
tcg_gen_xor_i32(tmp, cpu_VF, cpu_NF);
|
||||
tcg_gen_movcond_i32(TCG_COND_GE, dest, tmp, zero, frn, frm);
|
||||
tcg_temp_free_i32(tmp);
|
||||
break;
|
||||
case 3: /* gt: !Z && N == V */
|
||||
tcg_gen_movcond_i32(TCG_COND_NE, dest, cpu_ZF, zero, frn, frm);
|
||||
tmp = tcg_temp_new_i32();
|
||||
tcg_gen_xor_i32(tmp, cpu_VF, cpu_NF);
|
||||
tcg_gen_movcond_i32(TCG_COND_GE, dest, tmp, zero, dest, frm);
|
||||
tcg_temp_free_i32(tmp);
|
||||
break;
|
||||
}
|
||||
/* For fp16 the top half is always zeroes */
|
||||
|
@ -420,9 +408,6 @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
|
|||
tcg_gen_andi_i32(dest, dest, 0xffff);
|
||||
}
|
||||
vfp_store_reg32(dest, rd);
|
||||
tcg_temp_free_i32(frn);
|
||||
tcg_temp_free_i32(frm);
|
||||
tcg_temp_free_i32(dest);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -490,8 +475,6 @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a)
|
|||
vfp_load_reg64(tcg_op, rm);
|
||||
gen_helper_rintd(tcg_res, tcg_op, fpst);
|
||||
vfp_store_reg64(tcg_res, rd);
|
||||
tcg_temp_free_i64(tcg_op);
|
||||
tcg_temp_free_i64(tcg_res);
|
||||
} else {
|
||||
TCGv_i32 tcg_op;
|
||||
TCGv_i32 tcg_res;
|
||||
|
@ -504,14 +487,9 @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a)
|
|||
gen_helper_rints(tcg_res, tcg_op, fpst);
|
||||
}
|
||||
vfp_store_reg32(tcg_res, rd);
|
||||
tcg_temp_free_i32(tcg_op);
|
||||
tcg_temp_free_i32(tcg_res);
|
||||
}
|
||||
|
||||
gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst);
|
||||
tcg_temp_free_i32(tcg_rmode);
|
||||
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -573,9 +551,6 @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a)
|
|||
}
|
||||
tcg_gen_extrl_i64_i32(tcg_tmp, tcg_res);
|
||||
vfp_store_reg32(tcg_tmp, rd);
|
||||
tcg_temp_free_i32(tcg_tmp);
|
||||
tcg_temp_free_i64(tcg_res);
|
||||
tcg_temp_free_i64(tcg_double);
|
||||
} else {
|
||||
TCGv_i32 tcg_single, tcg_res;
|
||||
tcg_single = tcg_temp_new_i32();
|
||||
|
@ -595,15 +570,9 @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a)
|
|||
}
|
||||
}
|
||||
vfp_store_reg32(tcg_res, rd);
|
||||
tcg_temp_free_i32(tcg_res);
|
||||
tcg_temp_free_i32(tcg_single);
|
||||
}
|
||||
|
||||
gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst);
|
||||
tcg_temp_free_i32(tcg_rmode);
|
||||
|
||||
tcg_temp_free_ptr(fpst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -729,7 +698,6 @@ static bool trans_VMOV_from_gp(DisasContext *s, arg_VMOV_from_gp *a)
|
|||
if (!mve_skip_vmov(s, a->vn, a->index, a->size)) {
|
||||
tmp = load_reg(s, a->rt);
|
||||
write_neon_element32(tmp, a->vn, a->index, a->size);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
if (dc_isar_feature(aa32_mve, s)) {
|
||||
|
@ -777,8 +745,6 @@ static bool trans_VDUP(DisasContext *s, arg_VDUP *a)
|
|||
tmp = load_reg(s, a->rt);
|
||||
tcg_gen_gvec_dup_i32(size, neon_full_reg_offset(a->vn),
|
||||
vec_size, vec_size, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -883,7 +849,6 @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a)
|
|||
if (a->rt == 15) {
|
||||
/* Set the 4 flag bits in the CPSR. */
|
||||
gen_set_nzcv(tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
} else {
|
||||
store_reg(s, a->rt, tmp);
|
||||
}
|
||||
|
@ -899,7 +864,6 @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a)
|
|||
case ARM_VFP_FPSCR:
|
||||
tmp = load_reg(s, a->rt);
|
||||
gen_helper_vfp_set_fpscr(cpu_env, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
gen_lookup_tb(s);
|
||||
break;
|
||||
case ARM_VFP_FPEXC:
|
||||
|
@ -954,7 +918,6 @@ static bool trans_VMOV_half(DisasContext *s, arg_VMOV_single *a)
|
|||
tmp = load_reg(s, a->rt);
|
||||
tcg_gen_andi_i32(tmp, tmp, 0xffff);
|
||||
vfp_store_reg32(tmp, a->vn);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -979,7 +942,6 @@ static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a)
|
|||
if (a->rt == 15) {
|
||||
/* Set the 4 flag bits in the CPSR. */
|
||||
gen_set_nzcv(tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
} else {
|
||||
store_reg(s, a->rt, tmp);
|
||||
}
|
||||
|
@ -987,7 +949,6 @@ static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a)
|
|||
/* general purpose register to VFP */
|
||||
tmp = load_reg(s, a->rt);
|
||||
vfp_store_reg32(tmp, a->vn);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1021,10 +982,8 @@ static bool trans_VMOV_64_sp(DisasContext *s, arg_VMOV_64_sp *a)
|
|||
/* gpreg to fpreg */
|
||||
tmp = load_reg(s, a->rt);
|
||||
vfp_store_reg32(tmp, a->vm);
|
||||
tcg_temp_free_i32(tmp);
|
||||
tmp = load_reg(s, a->rt2);
|
||||
vfp_store_reg32(tmp, a->vm + 1);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1064,10 +1023,8 @@ static bool trans_VMOV_64_dp(DisasContext *s, arg_VMOV_64_dp *a)
|
|||
/* gpreg to fpreg */
|
||||
tmp = load_reg(s, a->rt);
|
||||
vfp_store_reg32(tmp, a->vm * 2);
|
||||
tcg_temp_free_i32(tmp);
|
||||
tmp = load_reg(s, a->rt2);
|
||||
vfp_store_reg32(tmp, a->vm * 2 + 1);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1102,9 +1059,6 @@ static bool trans_VLDR_VSTR_hp(DisasContext *s, arg_VLDR_VSTR_sp *a)
|
|||
vfp_load_reg32(tmp, a->vd);
|
||||
gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), MO_UW | MO_ALIGN);
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1136,9 +1090,6 @@ static bool trans_VLDR_VSTR_sp(DisasContext *s, arg_VLDR_VSTR_sp *a)
|
|||
vfp_load_reg32(tmp, a->vd);
|
||||
gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), MO_UL | MO_ALIGN);
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1177,9 +1128,6 @@ static bool trans_VLDR_VSTR_dp(DisasContext *s, arg_VLDR_VSTR_dp *a)
|
|||
vfp_load_reg64(tmp, a->vd);
|
||||
gen_aa32_st_i64(s, tmp, addr, get_mem_index(s), MO_UQ | MO_ALIGN_4);
|
||||
}
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1246,7 +1194,6 @@ static bool trans_VLDM_VSTM_sp(DisasContext *s, arg_VLDM_VSTM_sp *a)
|
|||
}
|
||||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
if (a->w) {
|
||||
/* writeback */
|
||||
if (a->p) {
|
||||
|
@ -1254,8 +1201,6 @@ static bool trans_VLDM_VSTM_sp(DisasContext *s, arg_VLDM_VSTM_sp *a)
|
|||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
store_reg(s, a->rn, addr);
|
||||
} else {
|
||||
tcg_temp_free_i32(addr);
|
||||
}
|
||||
|
||||
clear_eci_state(s);
|
||||
|
@ -1332,7 +1277,6 @@ static bool trans_VLDM_VSTM_dp(DisasContext *s, arg_VLDM_VSTM_dp *a)
|
|||
}
|
||||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
tcg_temp_free_i64(tmp);
|
||||
if (a->w) {
|
||||
/* writeback */
|
||||
if (a->p) {
|
||||
|
@ -1347,8 +1291,6 @@ static bool trans_VLDM_VSTM_dp(DisasContext *s, arg_VLDM_VSTM_dp *a)
|
|||
tcg_gen_addi_i32(addr, addr, offset);
|
||||
}
|
||||
store_reg(s, a->rn, addr);
|
||||
} else {
|
||||
tcg_temp_free_i32(addr);
|
||||
}
|
||||
|
||||
clear_eci_state(s);
|
||||
|
@ -1485,12 +1427,6 @@ static bool do_vfp_3op_sp(DisasContext *s, VFPGen3OpSPFn *fn,
|
|||
vfp_load_reg32(f1, vm);
|
||||
}
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(f0);
|
||||
tcg_temp_free_i32(f1);
|
||||
tcg_temp_free_i32(fd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1533,12 +1469,6 @@ static bool do_vfp_3op_hp(DisasContext *s, VFPGen3OpSPFn *fn,
|
|||
}
|
||||
fn(fd, f0, f1, fpst);
|
||||
vfp_store_reg32(fd, vd);
|
||||
|
||||
tcg_temp_free_i32(f0);
|
||||
tcg_temp_free_i32(f1);
|
||||
tcg_temp_free_i32(fd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1615,12 +1545,6 @@ static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn,
|
|||
vfp_load_reg64(f1, vm);
|
||||
}
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(f0);
|
||||
tcg_temp_free_i64(f1);
|
||||
tcg_temp_free_i64(fd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1688,10 +1612,6 @@ static bool do_vfp_2op_sp(DisasContext *s, VFPGen2OpSPFn *fn, int vd, int vm)
|
|||
vm = vfp_advance_sreg(vm, delta_m);
|
||||
vfp_load_reg32(f0, vm);
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(f0);
|
||||
tcg_temp_free_i32(fd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1724,7 +1644,6 @@ static bool do_vfp_2op_hp(DisasContext *s, VFPGen2OpSPFn *fn, int vd, int vm)
|
|||
vfp_load_reg32(f0, vm);
|
||||
fn(f0, f0);
|
||||
vfp_store_reg32(f0, vd);
|
||||
tcg_temp_free_i32(f0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1798,10 +1717,6 @@ static bool do_vfp_2op_dp(DisasContext *s, VFPGen2OpDPFn *fn, int vd, int vm)
|
|||
vd = vfp_advance_dreg(vm, delta_m);
|
||||
vfp_load_reg64(f0, vm);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(f0);
|
||||
tcg_temp_free_i64(fd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1812,7 +1727,6 @@ static void gen_VMLA_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
|
||||
gen_helper_vfp_mulh(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_addh(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VMLA_hp(DisasContext *s, arg_VMLA_sp *a)
|
||||
|
@ -1827,7 +1741,6 @@ static void gen_VMLA_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
|
||||
gen_helper_vfp_muls(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_adds(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VMLA_sp(DisasContext *s, arg_VMLA_sp *a)
|
||||
|
@ -1842,7 +1755,6 @@ static void gen_VMLA_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
|
|||
|
||||
gen_helper_vfp_muld(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_addd(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VMLA_dp(DisasContext *s, arg_VMLA_dp *a)
|
||||
|
@ -1861,7 +1773,6 @@ static void gen_VMLS_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_mulh(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_negh(tmp, tmp);
|
||||
gen_helper_vfp_addh(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VMLS_hp(DisasContext *s, arg_VMLS_sp *a)
|
||||
|
@ -1880,7 +1791,6 @@ static void gen_VMLS_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_muls(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_negs(tmp, tmp);
|
||||
gen_helper_vfp_adds(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VMLS_sp(DisasContext *s, arg_VMLS_sp *a)
|
||||
|
@ -1899,7 +1809,6 @@ static void gen_VMLS_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_muld(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_negd(tmp, tmp);
|
||||
gen_helper_vfp_addd(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VMLS_dp(DisasContext *s, arg_VMLS_dp *a)
|
||||
|
@ -1920,7 +1829,6 @@ static void gen_VNMLS_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_mulh(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_negh(vd, vd);
|
||||
gen_helper_vfp_addh(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VNMLS_hp(DisasContext *s, arg_VNMLS_sp *a)
|
||||
|
@ -1941,7 +1849,6 @@ static void gen_VNMLS_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_muls(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_negs(vd, vd);
|
||||
gen_helper_vfp_adds(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VNMLS_sp(DisasContext *s, arg_VNMLS_sp *a)
|
||||
|
@ -1962,7 +1869,6 @@ static void gen_VNMLS_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_muld(tmp, vn, vm, fpst);
|
||||
gen_helper_vfp_negd(vd, vd);
|
||||
gen_helper_vfp_addd(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VNMLS_dp(DisasContext *s, arg_VNMLS_dp *a)
|
||||
|
@ -1979,7 +1885,6 @@ static void gen_VNMLA_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_negh(tmp, tmp);
|
||||
gen_helper_vfp_negh(vd, vd);
|
||||
gen_helper_vfp_addh(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VNMLA_hp(DisasContext *s, arg_VNMLA_sp *a)
|
||||
|
@ -1996,7 +1901,6 @@ static void gen_VNMLA_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_negs(tmp, tmp);
|
||||
gen_helper_vfp_negs(vd, vd);
|
||||
gen_helper_vfp_adds(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VNMLA_sp(DisasContext *s, arg_VNMLA_sp *a)
|
||||
|
@ -2013,7 +1917,6 @@ static void gen_VNMLA_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
|
|||
gen_helper_vfp_negd(tmp, tmp);
|
||||
gen_helper_vfp_negd(vd, vd);
|
||||
gen_helper_vfp_addd(vd, vd, tmp, fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static bool trans_VNMLA_dp(DisasContext *s, arg_VNMLA_dp *a)
|
||||
|
@ -2225,12 +2128,6 @@ static bool do_vfm_hp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d)
|
|||
fpst = fpstatus_ptr(FPST_FPCR_F16);
|
||||
gen_helper_vfp_muladdh(vd, vn, vm, vd, fpst);
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(vn);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_i32(vd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2290,12 +2187,6 @@ static bool do_vfm_sp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d)
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
gen_helper_vfp_muladds(vd, vn, vm, vd, fpst);
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(vn);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_i32(vd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2361,12 +2252,6 @@ static bool do_vfm_dp(DisasContext *s, arg_VFMA_dp *a, bool neg_n, bool neg_d)
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
gen_helper_vfp_muladdd(vd, vn, vm, vd, fpst);
|
||||
vfp_store_reg64(vd, a->vd);
|
||||
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i64(vn);
|
||||
tcg_temp_free_i64(vm);
|
||||
tcg_temp_free_i64(vd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2591,10 +2476,6 @@ static bool trans_VCMP_hp(DisasContext *s, arg_VCMP_sp *a)
|
|||
} else {
|
||||
gen_helper_vfp_cmph(vd, vm, cpu_env);
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2630,10 +2511,6 @@ static bool trans_VCMP_sp(DisasContext *s, arg_VCMP_sp *a)
|
|||
} else {
|
||||
gen_helper_vfp_cmps(vd, vm, cpu_env);
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2674,10 +2551,6 @@ static bool trans_VCMP_dp(DisasContext *s, arg_VCMP_dp *a)
|
|||
} else {
|
||||
gen_helper_vfp_cmpd(vd, vm, cpu_env);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(vd);
|
||||
tcg_temp_free_i64(vm);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2702,9 +2575,6 @@ static bool trans_VCVT_f32_f16(DisasContext *s, arg_VCVT_f32_f16 *a)
|
|||
tcg_gen_ld16u_i32(tmp, cpu_env, vfp_f16_offset(a->vm, a->t));
|
||||
gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp_mode);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_i32(ahp_mode);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2740,10 +2610,6 @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a)
|
|||
vd = tcg_temp_new_i64();
|
||||
gen_helper_vfp_fcvt_f16_to_f64(vd, tmp, fpst, ahp_mode);
|
||||
vfp_store_reg64(vd, a->vd);
|
||||
tcg_temp_free_i32(ahp_mode);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i64(vd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2766,8 +2632,6 @@ static bool trans_VCVT_b16_f32(DisasContext *s, arg_VCVT_b16_f32 *a)
|
|||
vfp_load_reg32(tmp, a->vm);
|
||||
gen_helper_bfcvt(tmp, tmp, fpst);
|
||||
tcg_gen_st16_i32(tmp, cpu_env, vfp_f16_offset(a->vd, a->t));
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2792,9 +2656,6 @@ static bool trans_VCVT_f16_f32(DisasContext *s, arg_VCVT_f16_f32 *a)
|
|||
vfp_load_reg32(tmp, a->vm);
|
||||
gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp_mode);
|
||||
tcg_gen_st16_i32(tmp, cpu_env, vfp_f16_offset(a->vd, a->t));
|
||||
tcg_temp_free_i32(ahp_mode);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2829,11 +2690,7 @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a)
|
|||
|
||||
vfp_load_reg64(vm, a->vm);
|
||||
gen_helper_vfp_fcvt_f64_to_f16(tmp, vm, fpst, ahp_mode);
|
||||
tcg_temp_free_i64(vm);
|
||||
tcg_gen_st16_i32(tmp, cpu_env, vfp_f16_offset(a->vd, a->t));
|
||||
tcg_temp_free_i32(ahp_mode);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2855,8 +2712,6 @@ static bool trans_VRINTR_hp(DisasContext *s, arg_VRINTR_sp *a)
|
|||
fpst = fpstatus_ptr(FPST_FPCR_F16);
|
||||
gen_helper_rinth(tmp, tmp, fpst);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2878,8 +2733,6 @@ static bool trans_VRINTR_sp(DisasContext *s, arg_VRINTR_sp *a)
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
gen_helper_rints(tmp, tmp, fpst);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2910,8 +2763,6 @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
gen_helper_rintd(tmp, tmp, fpst);
|
||||
vfp_store_reg64(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2937,9 +2788,6 @@ static bool trans_VRINTZ_hp(DisasContext *s, arg_VRINTZ_sp *a)
|
|||
gen_helper_rinth(tmp, tmp, fpst);
|
||||
gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tcg_rmode);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2965,9 +2813,6 @@ static bool trans_VRINTZ_sp(DisasContext *s, arg_VRINTZ_sp *a)
|
|||
gen_helper_rints(tmp, tmp, fpst);
|
||||
gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tcg_rmode);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3002,9 +2847,6 @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
|
|||
gen_helper_rintd(tmp, tmp, fpst);
|
||||
gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst);
|
||||
vfp_store_reg64(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i32(tcg_rmode);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3026,8 +2868,6 @@ static bool trans_VRINTX_hp(DisasContext *s, arg_VRINTX_sp *a)
|
|||
fpst = fpstatus_ptr(FPST_FPCR_F16);
|
||||
gen_helper_rinth_exact(tmp, tmp, fpst);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3049,8 +2889,6 @@ static bool trans_VRINTX_sp(DisasContext *s, arg_VRINTX_sp *a)
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
gen_helper_rints_exact(tmp, tmp, fpst);
|
||||
vfp_store_reg32(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3081,8 +2919,6 @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a)
|
|||
fpst = fpstatus_ptr(FPST_FPCR);
|
||||
gen_helper_rintd_exact(tmp, tmp, fpst);
|
||||
vfp_store_reg64(tmp, a->vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3109,8 +2945,6 @@ static bool trans_VCVT_sp(DisasContext *s, arg_VCVT_sp *a)
|
|||
vfp_load_reg32(vm, a->vm);
|
||||
gen_helper_vfp_fcvtds(vd, vm, cpu_env);
|
||||
vfp_store_reg64(vd, a->vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_i64(vd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3137,8 +2971,6 @@ static bool trans_VCVT_dp(DisasContext *s, arg_VCVT_dp *a)
|
|||
vfp_load_reg64(vm, a->vm);
|
||||
gen_helper_vfp_fcvtsd(vd, vm, cpu_env);
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
tcg_temp_free_i32(vd);
|
||||
tcg_temp_free_i64(vm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3166,8 +2998,6 @@ static bool trans_VCVT_int_hp(DisasContext *s, arg_VCVT_int_sp *a)
|
|||
gen_helper_vfp_uitoh(vm, vm, fpst);
|
||||
}
|
||||
vfp_store_reg32(vm, a->vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3195,8 +3025,6 @@ static bool trans_VCVT_int_sp(DisasContext *s, arg_VCVT_int_sp *a)
|
|||
gen_helper_vfp_uitos(vm, vm, fpst);
|
||||
}
|
||||
vfp_store_reg32(vm, a->vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3231,9 +3059,6 @@ static bool trans_VCVT_int_dp(DisasContext *s, arg_VCVT_int_dp *a)
|
|||
gen_helper_vfp_uitod(vd, vm, fpst);
|
||||
}
|
||||
vfp_store_reg64(vd, a->vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_i64(vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3264,8 +3089,6 @@ static bool trans_VJCVT(DisasContext *s, arg_VJCVT *a)
|
|||
vfp_load_reg64(vm, a->vm);
|
||||
gen_helper_vjcvt(vd, vm, cpu_env);
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
tcg_temp_free_i64(vm);
|
||||
tcg_temp_free_i32(vd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3322,8 +3145,6 @@ static bool trans_VCVT_fix_hp(DisasContext *s, arg_VCVT_fix_sp *a)
|
|||
}
|
||||
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
tcg_temp_free_i32(vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3380,8 +3201,6 @@ static bool trans_VCVT_fix_sp(DisasContext *s, arg_VCVT_fix_sp *a)
|
|||
}
|
||||
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
tcg_temp_free_i32(vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3444,8 +3263,6 @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
|
|||
}
|
||||
|
||||
vfp_store_reg64(vd, a->vd);
|
||||
tcg_temp_free_i64(vd);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3480,8 +3297,6 @@ static bool trans_VCVT_hp_int(DisasContext *s, arg_VCVT_sp_int *a)
|
|||
}
|
||||
}
|
||||
vfp_store_reg32(vm, a->vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3516,8 +3331,6 @@ static bool trans_VCVT_sp_int(DisasContext *s, arg_VCVT_sp_int *a)
|
|||
}
|
||||
}
|
||||
vfp_store_reg32(vm, a->vd);
|
||||
tcg_temp_free_i32(vm);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3559,9 +3372,6 @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a)
|
|||
}
|
||||
}
|
||||
vfp_store_reg32(vd, a->vd);
|
||||
tcg_temp_free_i32(vd);
|
||||
tcg_temp_free_i64(vm);
|
||||
tcg_temp_free_ptr(fpst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3588,8 +3398,6 @@ static bool trans_VINS(DisasContext *s, arg_VINS *a)
|
|||
vfp_load_reg32(rd, a->vd);
|
||||
tcg_gen_deposit_i32(rd, rd, rm, 16, 16);
|
||||
vfp_store_reg32(rd, a->vd);
|
||||
tcg_temp_free_i32(rm);
|
||||
tcg_temp_free_i32(rd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3614,6 +3422,5 @@ static bool trans_VMOVX(DisasContext *s, arg_VINS *a)
|
|||
vfp_load_reg32(rm, a->vm);
|
||||
tcg_gen_shri_i32(rm, rm, 16);
|
||||
vfp_store_reg32(rm, a->vd);
|
||||
tcg_temp_free_i32(rm);
|
||||
return true;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -149,15 +149,11 @@ typedef struct DisasContext {
|
|||
int c15_cpar;
|
||||
/* TCG op of the current insn_start. */
|
||||
TCGOp *insn_start;
|
||||
#define TMP_A64_MAX 16
|
||||
int tmp_a64_count;
|
||||
TCGv_i64 tmp_a64[TMP_A64_MAX];
|
||||
} DisasContext;
|
||||
|
||||
typedef struct DisasCompare {
|
||||
TCGCond cond;
|
||||
TCGv_i32 value;
|
||||
bool value_global;
|
||||
} DisasCompare;
|
||||
|
||||
/* Share the TCG temporaries common between 32 and 64 bit modes. */
|
||||
|
@ -304,7 +300,6 @@ static inline void gen_a64_update_pc(DisasContext *s, target_long diff)
|
|||
#endif
|
||||
|
||||
void arm_test_cc(DisasCompare *cmp, int cc);
|
||||
void arm_free_cc(DisasCompare *cmp);
|
||||
void arm_jump_cc(DisasCompare *cmp, TCGLabel *label);
|
||||
void arm_gen_test_cc(int cc, TCGLabel *label);
|
||||
MemOp pow2_align(unsigned i);
|
||||
|
@ -336,7 +331,6 @@ static inline void set_pstate_bits(uint32_t bits)
|
|||
tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate));
|
||||
tcg_gen_ori_i32(p, p, bits);
|
||||
tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate));
|
||||
tcg_temp_free_i32(p);
|
||||
}
|
||||
|
||||
/* Clear bits within PSTATE. */
|
||||
|
@ -349,7 +343,6 @@ static inline void clear_pstate_bits(uint32_t bits)
|
|||
tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate));
|
||||
tcg_gen_andi_i32(p, p, ~bits);
|
||||
tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate));
|
||||
tcg_temp_free_i32(p);
|
||||
}
|
||||
|
||||
/* If the singlestep state is Active-not-pending, advance to Active-pending. */
|
||||
|
|
|
@ -107,11 +107,6 @@ struct DisasContext {
|
|||
* tcg_gen_brcond_tl(skip_cond, skip_var0, skip_var1, skip_label);
|
||||
* }
|
||||
*
|
||||
* if (free_skip_var0) {
|
||||
* tcg_temp_free(skip_var0);
|
||||
* free_skip_var0 = false;
|
||||
* }
|
||||
*
|
||||
* translate(ctx);
|
||||
*
|
||||
* if (skip_label) {
|
||||
|
@ -121,7 +116,6 @@ struct DisasContext {
|
|||
TCGv skip_var0;
|
||||
TCGv skip_var1;
|
||||
TCGCond skip_cond;
|
||||
bool free_skip_var0;
|
||||
};
|
||||
|
||||
void avr_cpu_tcg_init(void)
|
||||
|
@ -227,10 +221,6 @@ static void gen_add_CHf(TCGv R, TCGv Rd, TCGv Rr)
|
|||
tcg_gen_shri_tl(cpu_Cf, t1, 7); /* Cf = t1(7) */
|
||||
tcg_gen_shri_tl(cpu_Hf, t1, 3); /* Hf = t1(3) */
|
||||
tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1);
|
||||
|
||||
tcg_temp_free_i32(t3);
|
||||
tcg_temp_free_i32(t2);
|
||||
tcg_temp_free_i32(t1);
|
||||
}
|
||||
|
||||
static void gen_add_Vf(TCGv R, TCGv Rd, TCGv Rr)
|
||||
|
@ -245,9 +235,6 @@ static void gen_add_Vf(TCGv R, TCGv Rd, TCGv Rr)
|
|||
tcg_gen_andc_tl(t1, t1, t2);
|
||||
|
||||
tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */
|
||||
|
||||
tcg_temp_free_i32(t2);
|
||||
tcg_temp_free_i32(t1);
|
||||
}
|
||||
|
||||
static void gen_sub_CHf(TCGv R, TCGv Rd, TCGv Rr)
|
||||
|
@ -265,10 +252,6 @@ static void gen_sub_CHf(TCGv R, TCGv Rd, TCGv Rr)
|
|||
tcg_gen_shri_tl(cpu_Cf, t2, 7); /* Cf = t2(7) */
|
||||
tcg_gen_shri_tl(cpu_Hf, t2, 3); /* Hf = t2(3) */
|
||||
tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1);
|
||||
|
||||
tcg_temp_free_i32(t3);
|
||||
tcg_temp_free_i32(t2);
|
||||
tcg_temp_free_i32(t1);
|
||||
}
|
||||
|
||||
static void gen_sub_Vf(TCGv R, TCGv Rd, TCGv Rr)
|
||||
|
@ -283,9 +266,6 @@ static void gen_sub_Vf(TCGv R, TCGv Rd, TCGv Rr)
|
|||
tcg_gen_and_tl(t1, t1, t2);
|
||||
|
||||
tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */
|
||||
|
||||
tcg_temp_free_i32(t2);
|
||||
tcg_temp_free_i32(t1);
|
||||
}
|
||||
|
||||
static void gen_NSf(TCGv R)
|
||||
|
@ -323,9 +303,6 @@ static bool trans_ADD(DisasContext *ctx, arg_ADD *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -350,9 +327,6 @@ static bool trans_ADC(DisasContext *ctx, arg_ADC *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -391,10 +365,6 @@ static bool trans_ADIW(DisasContext *ctx, arg_ADIW *a)
|
|||
/* update output registers */
|
||||
tcg_gen_andi_tl(RdL, R, 0xff);
|
||||
tcg_gen_shri_tl(RdH, R, 8);
|
||||
|
||||
tcg_temp_free_i32(Rd);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -419,9 +389,6 @@ static bool trans_SUB(DisasContext *ctx, arg_SUB *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -446,10 +413,6 @@ static bool trans_SUBI(DisasContext *ctx, arg_SUBI *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
tcg_temp_free_i32(Rr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -481,10 +444,6 @@ static bool trans_SBC(DisasContext *ctx, arg_SBC *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(zero);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -515,11 +474,6 @@ static bool trans_SBCI(DisasContext *ctx, arg_SBCI *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(zero);
|
||||
tcg_temp_free_i32(R);
|
||||
tcg_temp_free_i32(Rr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -558,10 +512,6 @@ static bool trans_SBIW(DisasContext *ctx, arg_SBIW *a)
|
|||
/* update output registers */
|
||||
tcg_gen_andi_tl(RdL, R, 0xff);
|
||||
tcg_gen_shri_tl(RdH, R, 8);
|
||||
|
||||
tcg_temp_free_i32(Rd);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -584,9 +534,6 @@ static bool trans_AND(DisasContext *ctx, arg_AND *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -626,9 +573,6 @@ static bool trans_OR(DisasContext *ctx, arg_OR *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -676,7 +620,6 @@ static bool trans_EOR(DisasContext *ctx, arg_EOR *a)
|
|||
static bool trans_COM(DisasContext *ctx, arg_COM *a)
|
||||
{
|
||||
TCGv Rd = cpu_r[a->rd];
|
||||
TCGv R = tcg_temp_new_i32();
|
||||
|
||||
tcg_gen_xori_tl(Rd, Rd, 0xff);
|
||||
|
||||
|
@ -684,9 +627,6 @@ static bool trans_COM(DisasContext *ctx, arg_COM *a)
|
|||
tcg_gen_movi_tl(cpu_Cf, 1); /* Cf = 1 */
|
||||
tcg_gen_movi_tl(cpu_Vf, 0); /* Vf = 0 */
|
||||
gen_ZNSf(Rd);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -710,10 +650,6 @@ static bool trans_NEG(DisasContext *ctx, arg_NEG *a)
|
|||
|
||||
/* update output registers */
|
||||
tcg_gen_mov_tl(Rd, R);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -783,9 +719,6 @@ static bool trans_MUL(DisasContext *ctx, arg_MUL *a)
|
|||
/* update status register */
|
||||
tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
|
||||
tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -816,11 +749,6 @@ static bool trans_MULS(DisasContext *ctx, arg_MULS *a)
|
|||
/* update status register */
|
||||
tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
|
||||
tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -850,10 +778,6 @@ static bool trans_MULSU(DisasContext *ctx, arg_MULSU *a)
|
|||
/* update status register */
|
||||
tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
|
||||
tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -884,10 +808,6 @@ static bool trans_FMUL(DisasContext *ctx, arg_FMUL *a)
|
|||
tcg_gen_andi_tl(R0, R, 0xff);
|
||||
tcg_gen_shri_tl(R1, R, 8);
|
||||
tcg_gen_andi_tl(R1, R1, 0xff);
|
||||
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -923,11 +843,6 @@ static bool trans_FMULS(DisasContext *ctx, arg_FMULS *a)
|
|||
tcg_gen_andi_tl(R0, R, 0xff);
|
||||
tcg_gen_shri_tl(R1, R, 8);
|
||||
tcg_gen_andi_tl(R1, R1, 0xff);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -961,10 +876,6 @@ static bool trans_FMULSU(DisasContext *ctx, arg_FMULSU *a)
|
|||
tcg_gen_andi_tl(R0, R, 0xff);
|
||||
tcg_gen_shri_tl(R1, R, 8);
|
||||
tcg_gen_andi_tl(R1, R1, 0xff);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1019,25 +930,17 @@ static void gen_jmp_z(DisasContext *ctx)
|
|||
static void gen_push_ret(DisasContext *ctx, int ret)
|
||||
{
|
||||
if (avr_feature(ctx->env, AVR_FEATURE_1_BYTE_PC)) {
|
||||
|
||||
TCGv t0 = tcg_const_i32((ret & 0x0000ff));
|
||||
|
||||
tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_UB);
|
||||
tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
} else if (avr_feature(ctx->env, AVR_FEATURE_2_BYTE_PC)) {
|
||||
|
||||
TCGv t0 = tcg_const_i32((ret & 0x00ffff));
|
||||
|
||||
tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
|
||||
tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_BEUW);
|
||||
tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
|
||||
} else if (avr_feature(ctx->env, AVR_FEATURE_3_BYTE_PC)) {
|
||||
|
||||
TCGv lo = tcg_const_i32((ret & 0x0000ff));
|
||||
TCGv hi = tcg_const_i32((ret & 0xffff00) >> 8);
|
||||
|
||||
|
@ -1045,9 +948,6 @@ static void gen_push_ret(DisasContext *ctx, int ret)
|
|||
tcg_gen_subi_tl(cpu_sp, cpu_sp, 2);
|
||||
tcg_gen_qemu_st_tl(hi, cpu_sp, MMU_DATA_IDX, MO_BEUW);
|
||||
tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
|
||||
|
||||
tcg_temp_free_i32(lo);
|
||||
tcg_temp_free_i32(hi);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1071,9 +971,6 @@ static void gen_pop_ret(DisasContext *ctx, TCGv ret)
|
|||
tcg_gen_qemu_ld_tl(lo, cpu_sp, MMU_DATA_IDX, MO_UB);
|
||||
|
||||
tcg_gen_deposit_tl(ret, lo, hi, 8, 16);
|
||||
|
||||
tcg_temp_free_i32(lo);
|
||||
tcg_temp_free_i32(hi);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1301,9 +1198,6 @@ static bool trans_CP(DisasContext *ctx, arg_CP *a)
|
|||
gen_sub_CHf(R, Rd, Rr);
|
||||
gen_sub_Vf(R, Rd, Rr);
|
||||
gen_ZNSf(R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1332,10 +1226,6 @@ static bool trans_CPC(DisasContext *ctx, arg_CPC *a)
|
|||
* cleared otherwise.
|
||||
*/
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
|
||||
|
||||
tcg_temp_free_i32(zero);
|
||||
tcg_temp_free_i32(R);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1358,10 +1248,6 @@ static bool trans_CPI(DisasContext *ctx, arg_CPI *a)
|
|||
gen_sub_CHf(R, Rd, Rr);
|
||||
gen_sub_Vf(R, Rd, Rr);
|
||||
gen_ZNSf(R);
|
||||
|
||||
tcg_temp_free_i32(R);
|
||||
tcg_temp_free_i32(Rr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1375,7 +1261,6 @@ static bool trans_SBRC(DisasContext *ctx, arg_SBRC *a)
|
|||
|
||||
ctx->skip_cond = TCG_COND_EQ;
|
||||
ctx->skip_var0 = tcg_temp_new();
|
||||
ctx->free_skip_var0 = true;
|
||||
|
||||
tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit);
|
||||
return true;
|
||||
|
@ -1391,7 +1276,6 @@ static bool trans_SBRS(DisasContext *ctx, arg_SBRS *a)
|
|||
|
||||
ctx->skip_cond = TCG_COND_NE;
|
||||
ctx->skip_var0 = tcg_temp_new();
|
||||
ctx->free_skip_var0 = true;
|
||||
|
||||
tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit);
|
||||
return true;
|
||||
|
@ -1410,7 +1294,6 @@ static bool trans_SBIC(DisasContext *ctx, arg_SBIC *a)
|
|||
tcg_gen_andi_tl(temp, temp, 1 << a->bit);
|
||||
ctx->skip_cond = TCG_COND_EQ;
|
||||
ctx->skip_var0 = temp;
|
||||
ctx->free_skip_var0 = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1428,7 +1311,6 @@ static bool trans_SBIS(DisasContext *ctx, arg_SBIS *a)
|
|||
tcg_gen_andi_tl(temp, temp, 1 << a->bit);
|
||||
ctx->skip_cond = TCG_COND_NE;
|
||||
ctx->skip_var0 = temp;
|
||||
ctx->free_skip_var0 = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1697,9 +1579,6 @@ static bool trans_LDS(DisasContext *ctx, arg_LDS *a)
|
|||
tcg_gen_ori_tl(addr, addr, a->imm);
|
||||
|
||||
gen_data_load(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1734,9 +1613,6 @@ static bool trans_LDX1(DisasContext *ctx, arg_LDX1 *a)
|
|||
TCGv addr = gen_get_xaddr();
|
||||
|
||||
gen_data_load(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1749,9 +1625,6 @@ static bool trans_LDX2(DisasContext *ctx, arg_LDX2 *a)
|
|||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
|
||||
gen_set_xaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1763,9 +1636,6 @@ static bool trans_LDX3(DisasContext *ctx, arg_LDX3 *a)
|
|||
tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
|
||||
gen_data_load(ctx, Rd, addr);
|
||||
gen_set_xaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1803,9 +1673,6 @@ static bool trans_LDY2(DisasContext *ctx, arg_LDY2 *a)
|
|||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
|
||||
gen_set_yaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1817,9 +1684,6 @@ static bool trans_LDY3(DisasContext *ctx, arg_LDY3 *a)
|
|||
tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
|
||||
gen_data_load(ctx, Rd, addr);
|
||||
gen_set_yaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1830,9 +1694,6 @@ static bool trans_LDDY(DisasContext *ctx, arg_LDDY *a)
|
|||
|
||||
tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
|
||||
gen_data_load(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1874,9 +1735,6 @@ static bool trans_LDZ2(DisasContext *ctx, arg_LDZ2 *a)
|
|||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
|
||||
gen_set_zaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1889,9 +1747,6 @@ static bool trans_LDZ3(DisasContext *ctx, arg_LDZ3 *a)
|
|||
gen_data_load(ctx, Rd, addr);
|
||||
|
||||
gen_set_zaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1902,9 +1757,6 @@ static bool trans_LDDZ(DisasContext *ctx, arg_LDDZ *a)
|
|||
|
||||
tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
|
||||
gen_data_load(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1931,9 +1783,6 @@ static bool trans_STS(DisasContext *ctx, arg_STS *a)
|
|||
tcg_gen_shli_tl(addr, addr, 16);
|
||||
tcg_gen_ori_tl(addr, addr, a->imm);
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1964,9 +1813,6 @@ static bool trans_STX1(DisasContext *ctx, arg_STX1 *a)
|
|||
TCGv addr = gen_get_xaddr();
|
||||
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1978,9 +1824,6 @@ static bool trans_STX2(DisasContext *ctx, arg_STX2 *a)
|
|||
gen_data_store(ctx, Rd, addr);
|
||||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
gen_set_xaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1992,9 +1835,6 @@ static bool trans_STX3(DisasContext *ctx, arg_STX3 *a)
|
|||
tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
gen_set_xaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2029,9 +1869,6 @@ static bool trans_STY2(DisasContext *ctx, arg_STY2 *a)
|
|||
gen_data_store(ctx, Rd, addr);
|
||||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
gen_set_yaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2043,9 +1880,6 @@ static bool trans_STY3(DisasContext *ctx, arg_STY3 *a)
|
|||
tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
gen_set_yaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2056,9 +1890,6 @@ static bool trans_STDY(DisasContext *ctx, arg_STDY *a)
|
|||
|
||||
tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2094,9 +1925,6 @@ static bool trans_STZ2(DisasContext *ctx, arg_STZ2 *a)
|
|||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
|
||||
gen_set_zaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2109,9 +1937,6 @@ static bool trans_STZ3(DisasContext *ctx, arg_STZ3 *a)
|
|||
gen_data_store(ctx, Rd, addr);
|
||||
|
||||
gen_set_zaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2122,9 +1947,6 @@ static bool trans_STDZ(DisasContext *ctx, arg_STDZ *a)
|
|||
|
||||
tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2156,9 +1978,6 @@ static bool trans_LPM1(DisasContext *ctx, arg_LPM1 *a)
|
|||
tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
|
||||
tcg_gen_or_tl(addr, addr, L);
|
||||
tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2176,9 +1995,6 @@ static bool trans_LPM2(DisasContext *ctx, arg_LPM2 *a)
|
|||
tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
|
||||
tcg_gen_or_tl(addr, addr, L);
|
||||
tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2200,9 +2016,6 @@ static bool trans_LPMX(DisasContext *ctx, arg_LPMX *a)
|
|||
tcg_gen_andi_tl(L, addr, 0xff);
|
||||
tcg_gen_shri_tl(addr, addr, 8);
|
||||
tcg_gen_andi_tl(H, addr, 0xff);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2231,9 +2044,6 @@ static bool trans_ELPM1(DisasContext *ctx, arg_ELPM1 *a)
|
|||
TCGv addr = gen_get_zaddr();
|
||||
|
||||
tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2247,9 +2057,6 @@ static bool trans_ELPM2(DisasContext *ctx, arg_ELPM2 *a)
|
|||
TCGv addr = gen_get_zaddr();
|
||||
|
||||
tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2265,9 +2072,6 @@ static bool trans_ELPMX(DisasContext *ctx, arg_ELPMX *a)
|
|||
tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
|
||||
tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
|
||||
gen_set_zaddr(addr);
|
||||
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2321,9 +2125,6 @@ static bool trans_IN(DisasContext *ctx, arg_IN *a)
|
|||
TCGv port = tcg_const_i32(a->imm);
|
||||
|
||||
gen_helper_inb(Rd, cpu_env, port);
|
||||
|
||||
tcg_temp_free_i32(port);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2337,9 +2138,6 @@ static bool trans_OUT(DisasContext *ctx, arg_OUT *a)
|
|||
TCGv port = tcg_const_i32(a->imm);
|
||||
|
||||
gen_helper_outb(cpu_env, port, Rd);
|
||||
|
||||
tcg_temp_free_i32(port);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2407,10 +2205,6 @@ static bool trans_XCH(DisasContext *ctx, arg_XCH *a)
|
|||
gen_data_load(ctx, t0, addr);
|
||||
gen_data_store(ctx, Rd, addr);
|
||||
tcg_gen_mov_tl(Rd, t0);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2440,11 +2234,6 @@ static bool trans_LAS(DisasContext *ctx, arg_LAS *a)
|
|||
tcg_gen_or_tl(t1, t0, Rr);
|
||||
tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */
|
||||
gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2475,11 +2264,6 @@ static bool trans_LAC(DisasContext *ctx, arg_LAC *a)
|
|||
tcg_gen_andc_tl(t1, t0, Rr); /* t1 = t0 & (0xff - Rr) = t0 & ~Rr */
|
||||
tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */
|
||||
gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2510,11 +2294,6 @@ static bool trans_LAT(DisasContext *ctx, arg_LAT *a)
|
|||
tcg_gen_xor_tl(t1, t0, Rd);
|
||||
tcg_gen_mov_tl(Rd, t0); /* Rd = t0 */
|
||||
gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2573,9 +2352,6 @@ static bool trans_ROR(DisasContext *ctx, arg_ROR *a)
|
|||
|
||||
/* update status register */
|
||||
gen_rshift_ZNVSf(Rd);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2600,9 +2376,6 @@ static bool trans_ASR(DisasContext *ctx, arg_ASR *a)
|
|||
|
||||
/* update status register */
|
||||
gen_rshift_ZNVSf(Rd);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2620,10 +2393,6 @@ static bool trans_SWAP(DisasContext *ctx, arg_SWAP *a)
|
|||
tcg_gen_andi_tl(t1, Rd, 0xf0);
|
||||
tcg_gen_shri_tl(t1, t1, 4);
|
||||
tcg_gen_or_tl(Rd, t0, t1);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2639,10 +2408,6 @@ static bool trans_SBI(DisasContext *ctx, arg_SBI *a)
|
|||
gen_helper_inb(data, cpu_env, port);
|
||||
tcg_gen_ori_tl(data, data, 1 << a->bit);
|
||||
gen_helper_outb(cpu_env, port, data);
|
||||
|
||||
tcg_temp_free_i32(port);
|
||||
tcg_temp_free_i32(data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2658,10 +2423,6 @@ static bool trans_CBI(DisasContext *ctx, arg_CBI *a)
|
|||
gen_helper_inb(data, cpu_env, port);
|
||||
tcg_gen_andi_tl(data, data, ~(1 << a->bit));
|
||||
gen_helper_outb(cpu_env, port, data);
|
||||
|
||||
tcg_temp_free_i32(data);
|
||||
tcg_temp_free_i32(port);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2689,9 +2450,6 @@ static bool trans_BLD(DisasContext *ctx, arg_BLD *a)
|
|||
tcg_gen_andi_tl(Rd, Rd, ~(1u << a->bit)); /* clear bit */
|
||||
tcg_gen_shli_tl(t1, cpu_Tf, a->bit); /* create mask */
|
||||
tcg_gen_or_tl(Rd, Rd, t1);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2886,10 +2644,6 @@ static bool canonicalize_skip(DisasContext *ctx)
|
|||
ctx->skip_cond = TCG_COND_NE;
|
||||
break;
|
||||
}
|
||||
if (ctx->free_skip_var0) {
|
||||
tcg_temp_free(ctx->skip_var0);
|
||||
ctx->free_skip_var0 = false;
|
||||
}
|
||||
ctx->skip_var0 = cpu_skip;
|
||||
return true;
|
||||
}
|
||||
|
@ -2944,7 +2698,6 @@ static void avr_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
|
|||
* This ensures that cpu_skip is non-zero after the label
|
||||
* if and only if the skipped insn itself sets a skip.
|
||||
*/
|
||||
ctx->free_skip_var0 = true;
|
||||
ctx->skip_var0 = tcg_temp_new();
|
||||
tcg_gen_mov_tl(ctx->skip_var0, cpu_skip);
|
||||
tcg_gen_movi_tl(cpu_skip, 0);
|
||||
|
@ -2956,10 +2709,6 @@ static void avr_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
|
|||
ctx->skip_var1, skip_label);
|
||||
ctx->skip_var1 = NULL;
|
||||
}
|
||||
if (ctx->free_skip_var0) {
|
||||
tcg_temp_free(ctx->skip_var0);
|
||||
ctx->free_skip_var0 = false;
|
||||
}
|
||||
ctx->skip_cond = TCG_COND_NEVER;
|
||||
ctx->skip_var0 = NULL;
|
||||
}
|
||||
|
|
|
@ -178,7 +178,6 @@ static const int preg_sizes[] = {
|
|||
do { \
|
||||
TCGv tc = tcg_const_tl(c); \
|
||||
t_gen_mov_env_TN(member, tc); \
|
||||
tcg_temp_free(tc); \
|
||||
} while (0)
|
||||
|
||||
static inline void t_gen_mov_TN_preg(TCGv tn, int r)
|
||||
|
@ -271,7 +270,6 @@ static inline void t_gen_raise_exception(uint32_t index)
|
|||
{
|
||||
TCGv_i32 tmp = tcg_const_i32(index);
|
||||
gen_helper_raise_exception(cpu_env, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void t_gen_lsl(TCGv d, TCGv a, TCGv b)
|
||||
|
@ -286,8 +284,6 @@ static void t_gen_lsl(TCGv d, TCGv a, TCGv b)
|
|||
tcg_gen_sar_tl(t0, t0, t_31);
|
||||
tcg_gen_and_tl(t0, t0, d);
|
||||
tcg_gen_xor_tl(d, d, t0);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t_31);
|
||||
}
|
||||
|
||||
static void t_gen_lsr(TCGv d, TCGv a, TCGv b)
|
||||
|
@ -303,8 +299,6 @@ static void t_gen_lsr(TCGv d, TCGv a, TCGv b)
|
|||
tcg_gen_sar_tl(t0, t0, t_31);
|
||||
tcg_gen_and_tl(t0, t0, d);
|
||||
tcg_gen_xor_tl(d, d, t0);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t_31);
|
||||
}
|
||||
|
||||
static void t_gen_asr(TCGv d, TCGv a, TCGv b)
|
||||
|
@ -319,8 +313,6 @@ static void t_gen_asr(TCGv d, TCGv a, TCGv b)
|
|||
tcg_gen_sub_tl(t0, t_31, b);
|
||||
tcg_gen_sar_tl(t0, t0, t_31);
|
||||
tcg_gen_or_tl(d, d, t0);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t_31);
|
||||
}
|
||||
|
||||
static void t_gen_cris_dstep(TCGv d, TCGv a, TCGv b)
|
||||
|
@ -335,7 +327,6 @@ static void t_gen_cris_dstep(TCGv d, TCGv a, TCGv b)
|
|||
tcg_gen_shli_tl(d, a, 1);
|
||||
tcg_gen_sub_tl(t, d, b);
|
||||
tcg_gen_movcond_tl(TCG_COND_GEU, d, d, b, t, d);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void t_gen_cris_mstep(TCGv d, TCGv a, TCGv b, TCGv ccs)
|
||||
|
@ -353,7 +344,6 @@ static void t_gen_cris_mstep(TCGv d, TCGv a, TCGv b, TCGv ccs)
|
|||
tcg_gen_sari_tl(t, t, 31);
|
||||
tcg_gen_and_tl(t, t, b);
|
||||
tcg_gen_add_tl(d, d, t);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
/* Extended arithmetics on CRIS. */
|
||||
|
@ -369,7 +359,6 @@ static inline void t_gen_add_flag(TCGv d, int flag)
|
|||
tcg_gen_shri_tl(c, c, flag);
|
||||
}
|
||||
tcg_gen_add_tl(d, d, c);
|
||||
tcg_temp_free(c);
|
||||
}
|
||||
|
||||
static inline void t_gen_addx_carry(DisasContext *dc, TCGv d)
|
||||
|
@ -381,7 +370,6 @@ static inline void t_gen_addx_carry(DisasContext *dc, TCGv d)
|
|||
/* C flag is already at bit 0. */
|
||||
tcg_gen_andi_tl(c, c, C_FLAG);
|
||||
tcg_gen_add_tl(d, d, c);
|
||||
tcg_temp_free(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -394,7 +382,6 @@ static inline void t_gen_subx_carry(DisasContext *dc, TCGv d)
|
|||
/* C flag is already at bit 0. */
|
||||
tcg_gen_andi_tl(c, c, C_FLAG);
|
||||
tcg_gen_sub_tl(d, d, c);
|
||||
tcg_temp_free(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -414,8 +401,6 @@ static inline void t_gen_swapb(TCGv d, TCGv s)
|
|||
tcg_gen_shri_tl(t, org_s, 8);
|
||||
tcg_gen_andi_tl(t, t, 0x00ff00ff);
|
||||
tcg_gen_or_tl(d, d, t);
|
||||
tcg_temp_free(t);
|
||||
tcg_temp_free(org_s);
|
||||
}
|
||||
|
||||
/* Swap the halfwords of the s operand. */
|
||||
|
@ -428,7 +413,6 @@ static inline void t_gen_swapw(TCGv d, TCGv s)
|
|||
tcg_gen_shli_tl(d, t, 16);
|
||||
tcg_gen_shri_tl(t, t, 16);
|
||||
tcg_gen_or_tl(d, d, t);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
/* Reverse the within each byte.
|
||||
|
@ -475,8 +459,6 @@ static void t_gen_swapr(TCGv d, TCGv s)
|
|||
tcg_gen_andi_tl(t, t, bitrev[i].mask);
|
||||
tcg_gen_or_tl(d, d, t);
|
||||
}
|
||||
tcg_temp_free(t);
|
||||
tcg_temp_free(org_s);
|
||||
}
|
||||
|
||||
static bool use_goto_tb(DisasContext *dc, target_ulong dest)
|
||||
|
@ -778,9 +760,6 @@ static void cris_alu(DisasContext *dc, int op,
|
|||
}
|
||||
tcg_gen_or_tl(d, d, tmp);
|
||||
}
|
||||
if (tmp != d) {
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
static int arith_cc(DisasContext *dc)
|
||||
|
@ -919,8 +898,6 @@ static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond)
|
|||
tcg_gen_shli_tl(cc, tmp, 2);
|
||||
tcg_gen_and_tl(cc, tmp, cc);
|
||||
tcg_gen_andi_tl(cc, cc, Z_FLAG);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
break;
|
||||
case CC_GE:
|
||||
|
@ -959,9 +936,6 @@ static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond)
|
|||
tcg_gen_xori_tl(n, n, 2);
|
||||
tcg_gen_and_tl(cc, z, n);
|
||||
tcg_gen_andi_tl(cc, cc, 2);
|
||||
|
||||
tcg_temp_free(n);
|
||||
tcg_temp_free(z);
|
||||
}
|
||||
break;
|
||||
case CC_LE:
|
||||
|
@ -980,9 +954,6 @@ static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond)
|
|||
tcg_gen_xor_tl(n, n, cpu_PR[PR_CCS]);
|
||||
tcg_gen_or_tl(cc, z, n);
|
||||
tcg_gen_andi_tl(cc, cc, 2);
|
||||
|
||||
tcg_temp_free(n);
|
||||
tcg_temp_free(z);
|
||||
}
|
||||
break;
|
||||
case CC_P:
|
||||
|
@ -1282,7 +1253,6 @@ static int dec_addq(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(dc->op1);
|
||||
cris_alu(dc, CC_OP_ADD,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], c, 4);
|
||||
tcg_temp_free(c);
|
||||
return 2;
|
||||
}
|
||||
static int dec_moveq(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -1307,7 +1277,6 @@ static int dec_subq(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(dc->op1);
|
||||
cris_alu(dc, CC_OP_SUB,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], c, 4);
|
||||
tcg_temp_free(c);
|
||||
return 2;
|
||||
}
|
||||
static int dec_cmpq(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -1323,7 +1292,6 @@ static int dec_cmpq(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(imm);
|
||||
cris_alu(dc, CC_OP_CMP,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], c, 4);
|
||||
tcg_temp_free(c);
|
||||
return 2;
|
||||
}
|
||||
static int dec_andq(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -1339,7 +1307,6 @@ static int dec_andq(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(imm);
|
||||
cris_alu(dc, CC_OP_AND,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], c, 4);
|
||||
tcg_temp_free(c);
|
||||
return 2;
|
||||
}
|
||||
static int dec_orq(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -1354,7 +1321,6 @@ static int dec_orq(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(imm);
|
||||
cris_alu(dc, CC_OP_OR,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], c, 4);
|
||||
tcg_temp_free(c);
|
||||
return 2;
|
||||
}
|
||||
static int dec_btstq(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -1368,7 +1334,6 @@ static int dec_btstq(CPUCRISState *env, DisasContext *dc)
|
|||
cris_evaluate_flags(dc);
|
||||
gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->op2],
|
||||
c, cpu_PR[PR_CCS]);
|
||||
tcg_temp_free(c);
|
||||
cris_alu(dc, CC_OP_MOVE,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], cpu_R[dc->op2], 4);
|
||||
cris_update_cc_op(dc, CC_OP_FLAGS, 4);
|
||||
|
@ -1437,7 +1402,6 @@ static int dec_move_r(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu(dc, CC_OP_MOVE,
|
||||
cpu_R[dc->op2],
|
||||
cpu_R[dc->op2], t0, size);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
@ -1467,14 +1431,6 @@ static inline void cris_alu_alloc_temps(DisasContext *dc, int size, TCGv *t)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void cris_alu_free_temps(DisasContext *dc, int size, TCGv *t)
|
||||
{
|
||||
if (size != 4) {
|
||||
tcg_temp_free(t[0]);
|
||||
tcg_temp_free(t[1]);
|
||||
}
|
||||
}
|
||||
|
||||
static int dec_and_r(CPUCRISState *env, DisasContext *dc)
|
||||
{
|
||||
TCGv t[2];
|
||||
|
@ -1488,7 +1444,6 @@ static int dec_and_r(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu_alloc_temps(dc, size, t);
|
||||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
cris_alu(dc, CC_OP_AND, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1501,7 +1456,6 @@ static int dec_lz_r(CPUCRISState *env, DisasContext *dc)
|
|||
t0 = tcg_temp_new();
|
||||
dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0, cpu_R[dc->op2], t0);
|
||||
cris_alu(dc, CC_OP_LZ, cpu_R[dc->op2], cpu_R[dc->op2], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1518,7 +1472,6 @@ static int dec_lsl_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
tcg_gen_andi_tl(t[1], t[1], 63);
|
||||
cris_alu(dc, CC_OP_LSL, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1535,7 +1488,6 @@ static int dec_lsr_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
tcg_gen_andi_tl(t[1], t[1], 63);
|
||||
cris_alu(dc, CC_OP_LSR, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1552,7 +1504,6 @@ static int dec_asr_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1, t[0], t[1]);
|
||||
tcg_gen_andi_tl(t[1], t[1], 63);
|
||||
cris_alu(dc, CC_OP_ASR, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1568,7 +1519,6 @@ static int dec_muls_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1, t[0], t[1]);
|
||||
|
||||
cris_alu(dc, CC_OP_MULS, cpu_R[dc->op2], t[0], t[1], 4);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1584,7 +1534,6 @@ static int dec_mulu_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
|
||||
cris_alu(dc, CC_OP_MULU, cpu_R[dc->op2], t[0], t[1], 4);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1610,7 +1559,6 @@ static int dec_xor_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
|
||||
cris_alu(dc, CC_OP_XOR, cpu_R[dc->op2], t[0], t[1], 4);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1624,7 +1572,6 @@ static int dec_bound_r(CPUCRISState *env, DisasContext *dc)
|
|||
l0 = tcg_temp_new();
|
||||
dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, l0);
|
||||
cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], cpu_R[dc->op2], l0, 4);
|
||||
tcg_temp_free(l0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1639,7 +1586,6 @@ static int dec_cmp_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
|
||||
cris_alu(dc, CC_OP_CMP, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1666,7 +1612,6 @@ static int dec_add_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
|
||||
cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1741,7 +1686,6 @@ static int dec_swap_r(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_swapr(t0, t0);
|
||||
}
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op1], cpu_R[dc->op1], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1755,7 +1699,6 @@ static int dec_or_r(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu_alloc_temps(dc, size, t);
|
||||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
cris_alu(dc, CC_OP_OR, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1768,7 +1711,6 @@ static int dec_addi_r(CPUCRISState *env, DisasContext *dc)
|
|||
t0 = tcg_temp_new();
|
||||
tcg_gen_shli_tl(t0, cpu_R[dc->op2], dc->zzsize);
|
||||
tcg_gen_add_tl(cpu_R[dc->op1], cpu_R[dc->op1], t0);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1781,7 +1723,6 @@ static int dec_addi_acr(CPUCRISState *env, DisasContext *dc)
|
|||
t0 = tcg_temp_new();
|
||||
tcg_gen_shli_tl(t0, cpu_R[dc->op2], dc->zzsize);
|
||||
tcg_gen_add_tl(cpu_R[R_ACR], cpu_R[dc->op1], t0);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1796,7 +1737,6 @@ static int dec_neg_r(CPUCRISState *env, DisasContext *dc)
|
|||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
|
||||
cris_alu(dc, CC_OP_NEG, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1825,7 +1765,6 @@ static int dec_sub_r(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu_alloc_temps(dc, size, t);
|
||||
dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]);
|
||||
cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], t[0], t[1], size);
|
||||
cris_alu_free_temps(dc, size, t);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1842,7 +1781,6 @@ static int dec_movu_r(CPUCRISState *env, DisasContext *dc)
|
|||
t0 = tcg_temp_new();
|
||||
dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, t0);
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], cpu_R[dc->op2], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1861,7 +1799,6 @@ static int dec_movs_r(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_sext(t0, cpu_R[dc->op1], size);
|
||||
cris_alu(dc, CC_OP_MOVE,
|
||||
cpu_R[dc->op2], cpu_R[dc->op1], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1879,7 +1816,6 @@ static int dec_addu_r(CPUCRISState *env, DisasContext *dc)
|
|||
/* Size can only be qi or hi. */
|
||||
t_gen_zext(t0, cpu_R[dc->op1], size);
|
||||
cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], cpu_R[dc->op2], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1898,7 +1834,6 @@ static int dec_adds_r(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_sext(t0, cpu_R[dc->op1], size);
|
||||
cris_alu(dc, CC_OP_ADD,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1917,7 +1852,6 @@ static int dec_subu_r(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_zext(t0, cpu_R[dc->op1], size);
|
||||
cris_alu(dc, CC_OP_SUB,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -1936,7 +1870,6 @@ static int dec_subs_r(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_sext(t0, cpu_R[dc->op1], size);
|
||||
cris_alu(dc, CC_OP_SUB,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -2016,8 +1949,6 @@ static int dec_move_rs(CPUCRISState *env, DisasContext *dc)
|
|||
c2 = tcg_const_tl(dc->op2);
|
||||
cris_cc_mask(dc, 0);
|
||||
gen_helper_movl_sreg_reg(cpu_env, c2, c1);
|
||||
tcg_temp_free(c1);
|
||||
tcg_temp_free(c2);
|
||||
return 2;
|
||||
}
|
||||
static int dec_move_sr(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -2028,8 +1959,6 @@ static int dec_move_sr(CPUCRISState *env, DisasContext *dc)
|
|||
c2 = tcg_const_tl(dc->op2);
|
||||
cris_cc_mask(dc, 0);
|
||||
gen_helper_movl_reg_sreg(cpu_env, c1, c2);
|
||||
tcg_temp_free(c1);
|
||||
tcg_temp_free(c2);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -2049,7 +1978,6 @@ static int dec_move_rp(CPUCRISState *env, DisasContext *dc)
|
|||
tcg_gen_andi_tl(t[0], t[0], 0x39f);
|
||||
tcg_gen_andi_tl(t[1], cpu_PR[PR_CCS], ~0x39f);
|
||||
tcg_gen_or_tl(t[0], t[1], t[0]);
|
||||
tcg_temp_free(t[1]);
|
||||
}
|
||||
} else {
|
||||
tcg_gen_mov_tl(t[0], cpu_R[dc->op1]);
|
||||
|
@ -2060,7 +1988,6 @@ static int dec_move_rp(CPUCRISState *env, DisasContext *dc)
|
|||
cris_update_cc_op(dc, CC_OP_FLAGS, 4);
|
||||
dc->flags_uptodate = 1;
|
||||
}
|
||||
tcg_temp_free(t[0]);
|
||||
return 2;
|
||||
}
|
||||
static int dec_move_pr(CPUCRISState *env, DisasContext *dc)
|
||||
|
@ -2081,7 +2008,6 @@ static int dec_move_pr(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu(dc, CC_OP_MOVE,
|
||||
cpu_R[dc->op1], cpu_R[dc->op1], t0,
|
||||
preg_sizes[dc->op2]);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
@ -2109,7 +2035,6 @@ static int dec_move_mr(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZ);
|
||||
cris_alu(dc, CC_OP_MOVE,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], t0, memsize);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
do_postinc(dc, memsize);
|
||||
return insn_len;
|
||||
|
@ -2121,12 +2046,6 @@ static inline void cris_alu_m_alloc_temps(TCGv *t)
|
|||
t[1] = tcg_temp_new();
|
||||
}
|
||||
|
||||
static inline void cris_alu_m_free_temps(TCGv *t)
|
||||
{
|
||||
tcg_temp_free(t[0]);
|
||||
tcg_temp_free(t[1]);
|
||||
}
|
||||
|
||||
static int dec_movs_m(CPUCRISState *env, DisasContext *dc)
|
||||
{
|
||||
TCGv t[2];
|
||||
|
@ -2144,7 +2063,6 @@ static int dec_movs_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu(dc, CC_OP_MOVE,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2165,7 +2083,6 @@ static int dec_addu_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu(dc, CC_OP_ADD,
|
||||
cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2185,7 +2102,6 @@ static int dec_adds_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZVC);
|
||||
cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2205,7 +2121,6 @@ static int dec_subu_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZVC);
|
||||
cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2225,7 +2140,6 @@ static int dec_subs_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZVC);
|
||||
cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2245,7 +2159,6 @@ static int dec_movu_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZ);
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2264,7 +2177,6 @@ static int dec_cmpu_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZVC);
|
||||
cris_alu(dc, CC_OP_CMP, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2285,7 +2197,6 @@ static int dec_cmps_m(CPUCRISState *env, DisasContext *dc)
|
|||
cpu_R[dc->op2], cpu_R[dc->op2], t[1],
|
||||
memsize_zz(dc));
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2306,7 +2217,6 @@ static int dec_cmp_m(CPUCRISState *env, DisasContext *dc)
|
|||
cpu_R[dc->op2], cpu_R[dc->op2], t[1],
|
||||
memsize_zz(dc));
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2330,9 +2240,7 @@ static int dec_test_m(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(0);
|
||||
cris_alu(dc, CC_OP_CMP,
|
||||
cpu_R[dc->op2], t[1], c, memsize_zz(dc));
|
||||
tcg_temp_free(c);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2351,7 +2259,6 @@ static int dec_and_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZ);
|
||||
cris_alu(dc, CC_OP_AND, cpu_R[dc->op2], t[0], t[1], memsize_zz(dc));
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2371,7 +2278,6 @@ static int dec_add_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu(dc, CC_OP_ADD,
|
||||
cpu_R[dc->op2], t[0], t[1], memsize_zz(dc));
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2390,7 +2296,6 @@ static int dec_addo_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, 0);
|
||||
cris_alu(dc, CC_OP_ADD, cpu_R[R_ACR], t[0], t[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2410,8 +2315,6 @@ static int dec_bound_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZ);
|
||||
cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], l[0], l[1], 4);
|
||||
do_postinc(dc, memsize);
|
||||
tcg_temp_free(l[0]);
|
||||
tcg_temp_free(l[1]);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2433,7 +2336,6 @@ static int dec_addc_mr(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZVC);
|
||||
cris_alu(dc, CC_OP_ADDC, cpu_R[dc->op2], t[0], t[1], 4);
|
||||
do_postinc(dc, 4);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2452,7 +2354,6 @@ static int dec_sub_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_cc_mask(dc, CC_MASK_NZVC);
|
||||
cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], t[0], t[1], memsize);
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2472,7 +2373,6 @@ static int dec_or_m(CPUCRISState *env, DisasContext *dc)
|
|||
cris_alu(dc, CC_OP_OR,
|
||||
cpu_R[dc->op2], t[0], t[1], memsize_zz(dc));
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2504,7 +2404,6 @@ static int dec_move_mp(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_mov_preg_TN(dc, dc->op2, t[1]);
|
||||
|
||||
do_postinc(dc, memsize);
|
||||
cris_alu_m_free_temps(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -2527,7 +2426,6 @@ static int dec_move_pm(CPUCRISState *env, DisasContext *dc)
|
|||
t_gen_mov_TN_preg(t0, dc->op2);
|
||||
cris_flush_cc_state(dc);
|
||||
gen_store(dc, cpu_R[dc->op1], t0, memsize);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
cris_cc_mask(dc, 0);
|
||||
if (dc->postinc) {
|
||||
|
@ -2562,17 +2460,14 @@ static int dec_movem_mr(CPUCRISState *env, DisasContext *dc)
|
|||
} else {
|
||||
tmp32 = NULL;
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
|
||||
for (i = 0; i < (nr >> 1); i++) {
|
||||
tcg_gen_extrl_i64_i32(cpu_R[i * 2], tmp[i]);
|
||||
tcg_gen_shri_i64(tmp[i], tmp[i], 32);
|
||||
tcg_gen_extrl_i64_i32(cpu_R[i * 2 + 1], tmp[i]);
|
||||
tcg_temp_free_i64(tmp[i]);
|
||||
}
|
||||
if (nr & 1) {
|
||||
tcg_gen_mov_tl(cpu_R[dc->op2], tmp32);
|
||||
tcg_temp_free(tmp32);
|
||||
}
|
||||
|
||||
/* writeback the updated pointer value. */
|
||||
|
@ -2610,8 +2505,6 @@ static int dec_movem_rm(CPUCRISState *env, DisasContext *dc)
|
|||
tcg_gen_mov_tl(cpu_R[dc->op1], addr);
|
||||
}
|
||||
cris_cc_mask(dc, 0);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_temp_free(addr);
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -2691,7 +2584,6 @@ static int dec_jas_r(CPUCRISState *env, DisasContext *dc)
|
|||
}
|
||||
c = tcg_const_tl(dc->pc + 4);
|
||||
t_gen_mov_preg_TN(dc, dc->op2, c);
|
||||
tcg_temp_free(c);
|
||||
|
||||
cris_prepare_jmp(dc, JMP_INDIRECT);
|
||||
return 2;
|
||||
|
@ -2709,7 +2601,6 @@ static int dec_jas_im(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(dc->pc + 8);
|
||||
/* Store the return address in Pd. */
|
||||
t_gen_mov_preg_TN(dc, dc->op2, c);
|
||||
tcg_temp_free(c);
|
||||
|
||||
dc->jmp_pc = imm;
|
||||
cris_prepare_jmp(dc, JMP_DIRECT);
|
||||
|
@ -2728,7 +2619,6 @@ static int dec_jasc_im(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(dc->pc + 8 + 4);
|
||||
/* Store the return address in Pd. */
|
||||
t_gen_mov_preg_TN(dc, dc->op2, c);
|
||||
tcg_temp_free(c);
|
||||
|
||||
dc->jmp_pc = imm;
|
||||
cris_prepare_jmp(dc, JMP_DIRECT);
|
||||
|
@ -2744,7 +2634,6 @@ static int dec_jasc_r(CPUCRISState *env, DisasContext *dc)
|
|||
tcg_gen_mov_tl(env_btarget, cpu_R[dc->op1]);
|
||||
c = tcg_const_tl(dc->pc + 4 + 4);
|
||||
t_gen_mov_preg_TN(dc, dc->op2, c);
|
||||
tcg_temp_free(c);
|
||||
cris_prepare_jmp(dc, JMP_INDIRECT);
|
||||
return 2;
|
||||
}
|
||||
|
@ -2778,7 +2667,6 @@ static int dec_bas_im(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(dc->pc + 8);
|
||||
/* Store the return address in Pd. */
|
||||
t_gen_mov_preg_TN(dc, dc->op2, c);
|
||||
tcg_temp_free(c);
|
||||
|
||||
dc->jmp_pc = dc->pc + simm;
|
||||
cris_prepare_jmp(dc, JMP_DIRECT);
|
||||
|
@ -2796,7 +2684,6 @@ static int dec_basc_im(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(dc->pc + 12);
|
||||
/* Store the return address in Pd. */
|
||||
t_gen_mov_preg_TN(dc, dc->op2, c);
|
||||
tcg_temp_free(c);
|
||||
|
||||
dc->jmp_pc = dc->pc + simm;
|
||||
cris_prepare_jmp(dc, JMP_DIRECT);
|
||||
|
|
|
@ -90,9 +90,6 @@ static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val,
|
|||
gen_set_label(l1);
|
||||
tcg_gen_shri_tl(t1, t1, 1); /* shift F to P position */
|
||||
tcg_gen_or_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], t1); /*P=F*/
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(tval);
|
||||
tcg_temp_free(taddr);
|
||||
}
|
||||
|
||||
static void gen_store_v10(DisasContext *dc, TCGv addr, TCGv val,
|
||||
|
@ -215,7 +212,6 @@ static int dec10_prep_move_m(CPUCRISState *env, DisasContext *dc,
|
|||
else
|
||||
t_gen_zext(dst, dst, memsize);
|
||||
insn_len += crisv10_post_memaddr(dc, memsize);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
if (dc->mode == CRISV10_MODE_INDIRECT && (dc->tb_flags & PFIX_FLAG)) {
|
||||
|
@ -258,7 +254,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(simm);
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_CMPQ:
|
||||
LOG_DIS("cmpq %d, $r%d\n", simm, dc->dst);
|
||||
|
@ -267,7 +262,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(simm);
|
||||
cris_alu(dc, CC_OP_CMP, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_ADDQ:
|
||||
LOG_DIS("addq %d, $r%d\n", imm, dc->dst);
|
||||
|
@ -276,7 +270,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(imm);
|
||||
cris_alu(dc, CC_OP_ADD, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_ANDQ:
|
||||
LOG_DIS("andq %d, $r%d\n", simm, dc->dst);
|
||||
|
@ -285,7 +278,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(simm);
|
||||
cris_alu(dc, CC_OP_AND, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_ASHQ:
|
||||
LOG_DIS("ashq %d, $r%d\n", simm, dc->dst);
|
||||
|
@ -303,7 +295,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->dst],
|
||||
c, cpu_PR[PR_CCS]);
|
||||
}
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_LSHQ:
|
||||
LOG_DIS("lshq %d, $r%d\n", simm, dc->dst);
|
||||
|
@ -317,7 +308,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(imm);
|
||||
cris_alu(dc, op, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_SUBQ:
|
||||
LOG_DIS("subq %d, $r%d\n", imm, dc->dst);
|
||||
|
@ -326,7 +316,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(imm);
|
||||
cris_alu(dc, CC_OP_SUB, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
case CRISV10_QIMM_ORQ:
|
||||
LOG_DIS("andq %d, $r%d\n", simm, dc->dst);
|
||||
|
@ -335,7 +324,6 @@ static unsigned int dec10_quick_imm(DisasContext *dc)
|
|||
c = tcg_const_tl(simm);
|
||||
cris_alu(dc, CC_OP_OR, cpu_R[dc->dst],
|
||||
cpu_R[dc->dst], c, 4);
|
||||
tcg_temp_free(c);
|
||||
break;
|
||||
|
||||
case CRISV10_QIMM_BCC_R0:
|
||||
|
@ -426,8 +414,6 @@ static void dec10_reg_alu(DisasContext *dc, int op, int size, int sext)
|
|||
|
||||
assert(dc->dst != 15);
|
||||
cris_alu(dc, op, cpu_R[dc->dst], t[0], t[1], size);
|
||||
tcg_temp_free(t[0]);
|
||||
tcg_temp_free(t[1]);
|
||||
}
|
||||
|
||||
static void dec10_reg_bound(DisasContext *dc, int size)
|
||||
|
@ -437,7 +423,6 @@ static void dec10_reg_bound(DisasContext *dc, int size)
|
|||
t = tcg_temp_new();
|
||||
t_gen_zext(t, cpu_R[dc->src], size);
|
||||
cris_alu(dc, CC_OP_BOUND, cpu_R[dc->dst], cpu_R[dc->dst], t, 4);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void dec10_reg_mul(DisasContext *dc, int size, int sext)
|
||||
|
@ -451,9 +436,6 @@ static void dec10_reg_mul(DisasContext *dc, int size, int sext)
|
|||
t[0], t[1], cpu_R[dc->dst], cpu_R[dc->src]);
|
||||
|
||||
cris_alu(dc, op, cpu_R[dc->dst], t[0], t[1], 4);
|
||||
|
||||
tcg_temp_free(t[0]);
|
||||
tcg_temp_free(t[1]);
|
||||
}
|
||||
|
||||
|
||||
|
@ -472,7 +454,6 @@ static void dec10_reg_movs(DisasContext *dc)
|
|||
t_gen_zext(t, cpu_R[dc->src], size);
|
||||
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], cpu_R[dc->dst], t, 4);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void dec10_reg_alux(DisasContext *dc, int op)
|
||||
|
@ -490,7 +471,6 @@ static void dec10_reg_alux(DisasContext *dc, int op)
|
|||
t_gen_zext(t, cpu_R[dc->src], size);
|
||||
|
||||
cris_alu(dc, op, cpu_R[dc->dst], cpu_R[dc->dst], t, 4);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void dec10_reg_mov_pr(DisasContext *dc)
|
||||
|
@ -522,7 +502,6 @@ static void dec10_reg_abs(DisasContext *dc)
|
|||
tcg_gen_sub_tl(t0, cpu_R[dc->dst], t0);
|
||||
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], cpu_R[dc->dst], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void dec10_reg_swap(DisasContext *dc)
|
||||
|
@ -543,7 +522,6 @@ static void dec10_reg_swap(DisasContext *dc)
|
|||
if (dc->dst & 1)
|
||||
t_gen_swapr(t0, t0);
|
||||
cris_alu(dc, CC_OP_MOVE, cpu_R[dc->src], cpu_R[dc->src], t0, 4);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void dec10_reg_scc(DisasContext *dc)
|
||||
|
@ -623,7 +601,6 @@ static unsigned int dec10_reg(DisasContext *dc)
|
|||
LOG_DIS("addi r%d r%d size=%d\n", dc->src, dc->dst, dc->size);
|
||||
tcg_gen_shli_tl(t, cpu_R[dc->dst], dc->size & 3);
|
||||
tcg_gen_add_tl(cpu_R[dc->src], cpu_R[dc->src], t);
|
||||
tcg_temp_free(t);
|
||||
break;
|
||||
case CRISV10_REG_LSL:
|
||||
LOG_DIS("lsl $r%d, $r%d sz=%d\n", dc->src, dc->dst, size);
|
||||
|
@ -669,7 +646,6 @@ static unsigned int dec10_reg(DisasContext *dc)
|
|||
} else {
|
||||
tcg_gen_add_tl(cpu_PR[PR_PREFIX], cpu_R[dc->src], t);
|
||||
}
|
||||
tcg_temp_free(t);
|
||||
cris_set_prefix(dc);
|
||||
break;
|
||||
|
||||
|
@ -778,7 +754,6 @@ static unsigned int dec10_ind_move_m_r(CPUCRISState *env, DisasContext *dc,
|
|||
dc->delayed_branch = 1;
|
||||
}
|
||||
|
||||
tcg_temp_free(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -792,7 +767,6 @@ static unsigned int dec10_ind_move_r_m(DisasContext *dc, unsigned int size)
|
|||
crisv10_prepare_memaddr(dc, addr, size);
|
||||
gen_store_v10(dc, addr, cpu_R[dc->dst], size);
|
||||
insn_len += crisv10_post_memaddr(dc, size);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return insn_len;
|
||||
}
|
||||
|
@ -800,12 +774,11 @@ static unsigned int dec10_ind_move_r_m(DisasContext *dc, unsigned int size)
|
|||
static unsigned int dec10_ind_move_m_pr(CPUCRISState *env, DisasContext *dc)
|
||||
{
|
||||
unsigned int insn_len = 2, rd = dc->dst;
|
||||
TCGv t, addr;
|
||||
TCGv t;
|
||||
|
||||
LOG_DIS("move.%d $p%d, [$r%d]\n", dc->size, dc->dst, dc->src);
|
||||
cris_lock_irq(dc);
|
||||
|
||||
addr = tcg_temp_new();
|
||||
t = tcg_temp_new();
|
||||
insn_len += dec10_prep_move_m(env, dc, 0, 4, t);
|
||||
if (rd == 15) {
|
||||
|
@ -816,8 +789,6 @@ static unsigned int dec10_ind_move_m_pr(CPUCRISState *env, DisasContext *dc)
|
|||
tcg_gen_mov_tl(cpu_PR[rd], t);
|
||||
dc->cpustate_changed = 1;
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -835,12 +806,10 @@ static unsigned int dec10_ind_move_pr_m(DisasContext *dc)
|
|||
cris_evaluate_flags(dc);
|
||||
tcg_gen_andi_tl(t0, cpu_PR[PR_CCS], ~PFIX_FLAG);
|
||||
gen_store_v10(dc, addr, t0, size);
|
||||
tcg_temp_free(t0);
|
||||
} else {
|
||||
gen_store_v10(dc, addr, cpu_PR[dc->dst], size);
|
||||
}
|
||||
insn_len += crisv10_post_memaddr(dc, size);
|
||||
tcg_temp_free(addr);
|
||||
cris_lock_irq(dc);
|
||||
|
||||
return insn_len;
|
||||
|
@ -874,8 +843,6 @@ static void dec10_movem_r_m(DisasContext *dc)
|
|||
if (!pfix && dc->mode == CRISV10_MODE_AUTOINC) {
|
||||
tcg_gen_mov_tl(cpu_R[dc->src], addr);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void dec10_movem_m_r(DisasContext *dc)
|
||||
|
@ -902,8 +869,6 @@ static void dec10_movem_m_r(DisasContext *dc)
|
|||
if (!pfix && dc->mode == CRISV10_MODE_AUTOINC) {
|
||||
tcg_gen_mov_tl(cpu_R[dc->src], addr);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static int dec10_ind_alu(CPUCRISState *env, DisasContext *dc,
|
||||
|
@ -922,9 +887,6 @@ static int dec10_ind_alu(CPUCRISState *env, DisasContext *dc,
|
|||
dc->delayed_branch = 1;
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
cris_alu_m_free_temps(t);
|
||||
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -944,7 +906,6 @@ static int dec10_ind_bound(CPUCRISState *env, DisasContext *dc,
|
|||
dc->delayed_branch = 1;
|
||||
}
|
||||
|
||||
tcg_temp_free(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -969,7 +930,6 @@ static int dec10_alux_m(CPUCRISState *env, DisasContext *dc, int op)
|
|||
dc->delayed_branch = 1;
|
||||
}
|
||||
|
||||
tcg_temp_free(t);
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
|
@ -1057,8 +1017,6 @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
|
|||
c = tcg_const_tl(0);
|
||||
cris_alu(dc, CC_OP_CMP, cpu_R[dc->dst],
|
||||
t[0], c, size);
|
||||
tcg_temp_free(c);
|
||||
cris_alu_m_free_temps(t);
|
||||
break;
|
||||
case CRISV10_IND_ADD:
|
||||
LOG_DIS("add size=%d op=%d %d\n", size, dc->src, dc->dst);
|
||||
|
@ -1155,7 +1113,6 @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
|
|||
|
||||
c = tcg_const_tl(dc->pc + insn_len);
|
||||
t_gen_mov_preg_TN(dc, dc->dst, c);
|
||||
tcg_temp_free(c);
|
||||
dc->jmp_pc = imm;
|
||||
cris_prepare_jmp(dc, JMP_DIRECT);
|
||||
dc->delayed_branch--; /* v10 has no dslot here. */
|
||||
|
@ -1166,7 +1123,6 @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
|
|||
tcg_gen_movi_tl(env_pc, dc->pc + 2);
|
||||
c = tcg_const_tl(dc->src + 2);
|
||||
t_gen_mov_env_TN(trap_vector, c);
|
||||
tcg_temp_free(c);
|
||||
t_gen_raise_exception(EXCP_BREAK);
|
||||
dc->base.is_jmp = DISAS_NORETURN;
|
||||
return insn_len;
|
||||
|
@ -1176,13 +1132,11 @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
|
|||
t[0] = tcg_temp_new();
|
||||
c = tcg_const_tl(dc->pc + insn_len);
|
||||
t_gen_mov_preg_TN(dc, dc->dst, c);
|
||||
tcg_temp_free(c);
|
||||
crisv10_prepare_memaddr(dc, t[0], size);
|
||||
gen_load(dc, env_btarget, t[0], 4, 0);
|
||||
insn_len += crisv10_post_memaddr(dc, size);
|
||||
cris_prepare_jmp(dc, JMP_INDIRECT);
|
||||
dc->delayed_branch--; /* v10 has no dslot here. */
|
||||
tcg_temp_free(t[0]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1201,7 +1155,6 @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
|
|||
tcg_gen_mov_tl(env_btarget, cpu_R[dc->src]);
|
||||
c = tcg_const_tl(dc->pc + insn_len);
|
||||
t_gen_mov_preg_TN(dc, dc->dst, c);
|
||||
tcg_temp_free(c);
|
||||
cris_prepare_jmp(dc, JMP_INDIRECT);
|
||||
dc->delayed_branch--; /* v10 has no dslot here. */
|
||||
break;
|
||||
|
|
|
@ -88,7 +88,6 @@ tcg_funcs_generated.c.inc
|
|||
gen_helper_A2_add(RdV, cpu_env, RsV, RtV);
|
||||
gen_log_reg_write(RdN, RdV);
|
||||
ctx_log_reg_write(ctx, RdN);
|
||||
tcg_temp_free(RdV);
|
||||
}
|
||||
|
||||
helper_funcs_generated.c.inc
|
||||
|
@ -160,12 +159,8 @@ istruction.
|
|||
tcg_gen_addi_ptr(VvV, cpu_env, VvV_off);
|
||||
TCGv slot = tcg_constant_tl(insn->slot);
|
||||
gen_helper_V6_vaddw(cpu_env, VdV, VuV, VvV, slot);
|
||||
tcg_temp_free(slot);
|
||||
gen_log_vreg_write(ctx, VdV_off, VdN, EXT_DFL, insn->slot, false);
|
||||
ctx_log_vreg_write(ctx, VdN, EXT_DFL, false);
|
||||
tcg_temp_free_ptr(VdV);
|
||||
tcg_temp_free_ptr(VuV);
|
||||
tcg_temp_free_ptr(VvV);
|
||||
}
|
||||
|
||||
Notice that we also generate a variable named <operand>_off for each operand of
|
||||
|
|
|
@ -77,7 +77,6 @@
|
|||
tcg_gen_mov_tl(EA, RxV); \
|
||||
gen_read_ireg(ireg, MuV, (SHIFT)); \
|
||||
gen_helper_fcircadd(RxV, RxV, ireg, MuV, hex_gpr[HEX_REG_CS0 + MuN]); \
|
||||
tcg_temp_free(ireg); \
|
||||
} while (0)
|
||||
|
||||
/* Instructions with multiple definitions */
|
||||
|
@ -116,7 +115,6 @@
|
|||
gen_read_ireg(ireg, MuV, SHIFT); \
|
||||
gen_helper_fcircadd(RxV, RxV, ireg, MuV, hex_gpr[HEX_REG_CS0 + MuN]); \
|
||||
LOAD; \
|
||||
tcg_temp_free(ireg); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L2_loadrub_pcr(SHORTCODE) \
|
||||
|
@ -168,8 +166,6 @@
|
|||
for (int i = 0; i < 2; i++) { \
|
||||
gen_set_half(i, RdV, gen_get_byte(byte, i, tmp, (SIGN))); \
|
||||
} \
|
||||
tcg_temp_free(tmp); \
|
||||
tcg_temp_free(byte); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L2_loadbzw2_io(SHORTCODE) \
|
||||
|
@ -222,8 +218,6 @@
|
|||
for (int i = 0; i < 4; i++) { \
|
||||
gen_set_half_i64(i, RddV, gen_get_byte(byte, i, tmp, (SIGN))); \
|
||||
} \
|
||||
tcg_temp_free(tmp); \
|
||||
tcg_temp_free(byte); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L2_loadbzw4_io(SHORTCODE) \
|
||||
|
@ -273,8 +267,6 @@
|
|||
tcg_gen_extu_i32_i64(tmp_i64, tmp); \
|
||||
tcg_gen_shri_i64(RyyV, RyyV, 16); \
|
||||
tcg_gen_deposit_i64(RyyV, RyyV, tmp_i64, 48, 16); \
|
||||
tcg_temp_free(tmp); \
|
||||
tcg_temp_free_i64(tmp_i64); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L4_loadalignh_ur(SHORTCODE) \
|
||||
|
@ -304,8 +296,6 @@
|
|||
tcg_gen_extu_i32_i64(tmp_i64, tmp); \
|
||||
tcg_gen_shri_i64(RyyV, RyyV, 8); \
|
||||
tcg_gen_deposit_i64(RyyV, RyyV, tmp_i64, 56, 8); \
|
||||
tcg_temp_free(tmp); \
|
||||
tcg_temp_free_i64(tmp_i64); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L2_loadalignb_io(SHORTCODE) \
|
||||
|
@ -347,7 +337,6 @@
|
|||
tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, label); \
|
||||
fLOAD(1, SIZE, SIGN, EA, RdV); \
|
||||
gen_set_label(label); \
|
||||
tcg_temp_free(LSB); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L2_ploadrubt_pi(SHORTCODE) \
|
||||
|
@ -407,7 +396,6 @@
|
|||
tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, label); \
|
||||
fLOAD(1, 8, u, EA, RddV); \
|
||||
gen_set_label(label); \
|
||||
tcg_temp_free(LSB); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_L2_ploadrdt_pi(SHORTCODE) \
|
||||
|
@ -434,8 +422,6 @@
|
|||
TCGv HALF = tcg_temp_new(); \
|
||||
TCGv BYTE = tcg_temp_new(); \
|
||||
SHORTCODE; \
|
||||
tcg_temp_free(HALF); \
|
||||
tcg_temp_free(BYTE); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_STORE_pcr(SHIFT, STORE) \
|
||||
|
@ -447,9 +433,6 @@
|
|||
gen_read_ireg(ireg, MuV, SHIFT); \
|
||||
gen_helper_fcircadd(RxV, RxV, ireg, MuV, hex_gpr[HEX_REG_CS0 + MuN]); \
|
||||
STORE; \
|
||||
tcg_temp_free(ireg); \
|
||||
tcg_temp_free(HALF); \
|
||||
tcg_temp_free(BYTE); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_S2_storerb_pbr(SHORTCODE) \
|
||||
|
@ -531,7 +514,6 @@
|
|||
gen_helper_sfrecipa(tmp, cpu_env, RsV, RtV); \
|
||||
tcg_gen_extrh_i64_i32(RdV, tmp); \
|
||||
tcg_gen_extrl_i64_i32(PeV, tmp); \
|
||||
tcg_temp_free_i64(tmp); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
@ -547,7 +529,6 @@
|
|||
gen_helper_sfinvsqrta(tmp, cpu_env, RsV); \
|
||||
tcg_gen_extrh_i64_i32(RdV, tmp); \
|
||||
tcg_gen_extrl_i64_i32(PeV, tmp); \
|
||||
tcg_temp_free_i64(tmp); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
@ -565,7 +546,6 @@
|
|||
tcg_gen_add2_i64(RddV, carry, RddV, carry, RttV, zero); \
|
||||
tcg_gen_extrl_i64_i32(PxV, carry); \
|
||||
gen_8bitsof(PxV, PxV); \
|
||||
tcg_temp_free_i64(carry); \
|
||||
} while (0)
|
||||
|
||||
/* r5:4 = sub(r1:0, r3:2, p1):carry */
|
||||
|
@ -581,8 +561,6 @@
|
|||
tcg_gen_add2_i64(RddV, carry, RddV, carry, not_RttV, zero); \
|
||||
tcg_gen_extrl_i64_i32(PxV, carry); \
|
||||
gen_8bitsof(PxV, PxV); \
|
||||
tcg_temp_free_i64(carry); \
|
||||
tcg_temp_free_i64(not_RttV); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
@ -607,9 +585,6 @@
|
|||
tcg_gen_umin_tl(tmp, left, right); \
|
||||
gen_set_byte_i64(i, RddV, tmp); \
|
||||
} \
|
||||
tcg_temp_free(left); \
|
||||
tcg_temp_free(right); \
|
||||
tcg_temp_free(tmp); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_J2_call(SHORTCODE) \
|
||||
|
@ -815,14 +790,12 @@
|
|||
TCGv LSB = tcg_temp_new(); \
|
||||
COND; \
|
||||
gen_cond_jump(ctx, TCG_COND_EQ, LSB, riV); \
|
||||
tcg_temp_free(LSB); \
|
||||
} while (0)
|
||||
#define fGEN_TCG_cond_jumpf(COND) \
|
||||
do { \
|
||||
TCGv LSB = tcg_temp_new(); \
|
||||
COND; \
|
||||
gen_cond_jump(ctx, TCG_COND_NE, LSB, riV); \
|
||||
tcg_temp_free(LSB); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_J2_jumpt(SHORTCODE) \
|
||||
|
@ -863,14 +836,12 @@
|
|||
TCGv LSB = tcg_temp_new(); \
|
||||
COND; \
|
||||
gen_cond_jumpr(ctx, RsV, TCG_COND_EQ, LSB); \
|
||||
tcg_temp_free(LSB); \
|
||||
} while (0)
|
||||
#define fGEN_TCG_cond_jumprf(COND) \
|
||||
do { \
|
||||
TCGv LSB = tcg_temp_new(); \
|
||||
COND; \
|
||||
gen_cond_jumpr(ctx, RsV, TCG_COND_NE, LSB); \
|
||||
tcg_temp_free(LSB); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_J2_jumprt(SHORTCODE) \
|
||||
|
|
|
@ -26,10 +26,7 @@ import hex_common
|
|||
## Helpers for gen_tcg_func
|
||||
##
|
||||
def gen_decl_ea_tcg(f, tag):
|
||||
f.write(" TCGv EA = tcg_temp_new();\n")
|
||||
|
||||
def gen_free_ea_tcg(f):
|
||||
f.write(" tcg_temp_free(EA);\n")
|
||||
f.write(" TCGv EA G_GNUC_UNUSED = tcg_temp_new();\n")
|
||||
|
||||
def genptr_decl_pair_writable(f, tag, regtype, regid, regno):
|
||||
regN="%s%sN" % (regtype,regid)
|
||||
|
@ -269,73 +266,6 @@ def genptr_decl_imm(f,immlett):
|
|||
f.write(" int %s = insn->immed[%d];\n" % \
|
||||
(hex_common.imm_name(immlett), i))
|
||||
|
||||
def genptr_free(f, tag, regtype, regid, regno):
|
||||
if (regtype == "R"):
|
||||
if (regid in {"dd", "ss", "tt", "xx", "yy"}):
|
||||
f.write(" tcg_temp_free_i64(%s%sV);\n" % (regtype, regid))
|
||||
elif (regid in {"d", "e", "x", "y"}):
|
||||
f.write(" tcg_temp_free(%s%sV);\n" % (regtype, regid))
|
||||
elif (regid not in {"s", "t", "u", "v"}):
|
||||
print("Bad register parse: ",regtype,regid)
|
||||
elif (regtype == "P"):
|
||||
if (regid in {"d", "e", "x"}):
|
||||
f.write(" tcg_temp_free(%s%sV);\n" % (regtype, regid))
|
||||
elif (regid not in {"s", "t", "u", "v"}):
|
||||
print("Bad register parse: ",regtype,regid)
|
||||
elif (regtype == "C"):
|
||||
if (regid in {"dd", "ss"}):
|
||||
f.write(" tcg_temp_free_i64(%s%sV);\n" % (regtype, regid))
|
||||
elif (regid in {"d", "s"}):
|
||||
f.write(" tcg_temp_free(%s%sV);\n" % (regtype, regid))
|
||||
else:
|
||||
print("Bad register parse: ",regtype,regid)
|
||||
elif (regtype == "M"):
|
||||
if (regid != "u"):
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
elif (regtype == "V"):
|
||||
if (regid in {"dd", "uu", "vv", "xx", \
|
||||
"d", "s", "u", "v", "w", "x", "y"}):
|
||||
if (not hex_common.skip_qemu_helper(tag)):
|
||||
f.write(" tcg_temp_free_ptr(%s%sV);\n" % \
|
||||
(regtype, regid))
|
||||
else:
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
elif (regtype == "Q"):
|
||||
if (regid in {"d", "e", "s", "t", "u", "v", "x"}):
|
||||
if (not hex_common.skip_qemu_helper(tag)):
|
||||
f.write(" tcg_temp_free_ptr(%s%sV);\n" % \
|
||||
(regtype, regid))
|
||||
else:
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
else:
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
|
||||
def genptr_free_new(f, tag, regtype, regid, regno):
|
||||
if (regtype == "N"):
|
||||
if (regid not in {"s", "t"}):
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
elif (regtype == "P"):
|
||||
if (regid not in {"t", "u", "v"}):
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
elif (regtype == "O"):
|
||||
if (regid != "s"):
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
else:
|
||||
print("Bad register parse: ", regtype, regid)
|
||||
|
||||
def genptr_free_opn(f,regtype,regid,i,tag):
|
||||
if (hex_common.is_pair(regid)):
|
||||
genptr_free(f, tag, regtype, regid, i)
|
||||
elif (hex_common.is_single(regid)):
|
||||
if hex_common.is_old_val(regtype, regid, tag):
|
||||
genptr_free(f, tag, regtype, regid, i)
|
||||
elif hex_common.is_new_val(regtype, regid, tag):
|
||||
genptr_free_new(f, tag, regtype, regid, i)
|
||||
else:
|
||||
print("Bad register parse: ",regtype,regid,toss,numregs)
|
||||
else:
|
||||
print("Bad register parse: ",regtype,regid,toss,numregs)
|
||||
|
||||
def genptr_src_read(f, tag, regtype, regid):
|
||||
if (regtype == "R"):
|
||||
if (regid in {"ss", "tt", "xx", "yy"}):
|
||||
|
@ -578,7 +508,6 @@ def genptr_dst_write_opn(f,regtype, regid, tag):
|
|||
## <GEN>
|
||||
## gen_log_reg_write(RdN, RdV);
|
||||
## ctx_log_reg_write(ctx, RdN);
|
||||
## tcg_temp_free(RdV);
|
||||
## }
|
||||
##
|
||||
## where <GEN> depends on hex_common.skip_qemu_helper(tag)
|
||||
|
@ -692,12 +621,6 @@ def gen_tcg_func(f, tag, regs, imms):
|
|||
if (hex_common.is_written(regid)):
|
||||
genptr_dst_write_opn(f,regtype, regid, tag)
|
||||
|
||||
## Free all the operands (regs and immediates)
|
||||
if hex_common.need_ea(tag): gen_free_ea_tcg(f)
|
||||
for regtype,regid,toss,numregs in regs:
|
||||
genptr_free_opn(f,regtype,regid,i,tag)
|
||||
i += 1
|
||||
|
||||
f.write("}\n\n")
|
||||
|
||||
def gen_def_tcg_func(f, tag, tagregs, tagimms):
|
||||
|
|
|
@ -136,7 +136,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
TCGLabel *end_label = gen_new_label(); \
|
||||
tcg_gen_andi_tl(lsb, PsV, 1); \
|
||||
tcg_gen_brcondi_tl(TCG_COND_NE, lsb, PRED, false_label); \
|
||||
tcg_temp_free(lsb); \
|
||||
tcg_gen_gvec_mov(MO_64, VdV_off, VuV_off, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_gen_br(end_label); \
|
||||
|
@ -212,7 +211,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 15); \
|
||||
tcg_gen_gvec_sars(MO_16, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vasrh_acc(SHORTCODE) \
|
||||
|
@ -224,7 +222,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vasrw(SHORTCODE) \
|
||||
|
@ -233,7 +230,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 31); \
|
||||
tcg_gen_gvec_sars(MO_32, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vasrw_acc(SHORTCODE) \
|
||||
|
@ -245,7 +241,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vlsrb(SHORTCODE) \
|
||||
|
@ -254,7 +249,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 7); \
|
||||
tcg_gen_gvec_shrs(MO_8, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vlsrh(SHORTCODE) \
|
||||
|
@ -263,7 +257,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 15); \
|
||||
tcg_gen_gvec_shrs(MO_16, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vlsrw(SHORTCODE) \
|
||||
|
@ -272,7 +265,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 31); \
|
||||
tcg_gen_gvec_shrs(MO_32, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
/* Vector shift left - various forms */
|
||||
|
@ -282,7 +274,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 7); \
|
||||
tcg_gen_gvec_shls(MO_8, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vaslh(SHORTCODE) \
|
||||
|
@ -291,7 +282,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 15); \
|
||||
tcg_gen_gvec_shls(MO_16, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vaslh_acc(SHORTCODE) \
|
||||
|
@ -303,7 +293,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vaslw(SHORTCODE) \
|
||||
|
@ -312,7 +301,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
tcg_gen_andi_tl(shift, RtV, 31); \
|
||||
tcg_gen_gvec_shls(MO_32, VdV_off, VuV_off, shift, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
#define fGEN_TCG_V6_vaslw_acc(SHORTCODE) \
|
||||
|
@ -324,7 +312,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \
|
||||
sizeof(MMVector), sizeof(MMVector)); \
|
||||
tcg_temp_free(shift); \
|
||||
} while (0)
|
||||
|
||||
/* Vector max - various forms */
|
||||
|
@ -564,7 +551,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
GET_EA; \
|
||||
PRED; \
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \
|
||||
tcg_temp_free(LSB); \
|
||||
gen_vreg_load(ctx, DSTOFF, EA, true); \
|
||||
INC; \
|
||||
tcg_gen_br(end_label); \
|
||||
|
@ -735,7 +721,6 @@ static inline void assert_vhist_tmp(DisasContext *ctx)
|
|||
GET_EA; \
|
||||
PRED; \
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \
|
||||
tcg_temp_free(LSB); \
|
||||
gen_vreg_store(ctx, EA, SRCOFF, insn->slot, ALIGN); \
|
||||
INC; \
|
||||
tcg_gen_br(end_label); \
|
||||
|
|
|
@ -65,8 +65,6 @@ static inline void gen_masked_reg_write(TCGv new_val, TCGv cur_val,
|
|||
tcg_gen_andi_tl(new_val, new_val, ~reg_mask);
|
||||
tcg_gen_andi_tl(tmp, cur_val, reg_mask);
|
||||
tcg_gen_or_tl(new_val, new_val, tmp);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,8 +88,6 @@ static inline void gen_log_predicated_reg_write(int rnum, TCGv val,
|
|||
tcg_gen_setcond_tl(TCG_COND_EQ, slot_mask, slot_mask, zero);
|
||||
tcg_gen_or_tl(hex_reg_written[rnum], hex_reg_written[rnum], slot_mask);
|
||||
}
|
||||
|
||||
tcg_temp_free(slot_mask);
|
||||
}
|
||||
|
||||
void gen_log_reg_write(int rnum, TCGv val)
|
||||
|
@ -137,9 +133,6 @@ static void gen_log_predicated_reg_write_pair(int rnum, TCGv_i64 val,
|
|||
tcg_gen_or_tl(hex_reg_written[rnum + 1], hex_reg_written[rnum + 1],
|
||||
slot_mask);
|
||||
}
|
||||
|
||||
tcg_temp_free(val32);
|
||||
tcg_temp_free(slot_mask);
|
||||
}
|
||||
|
||||
static void gen_log_reg_write_pair(int rnum, TCGv_i64 val)
|
||||
|
@ -165,8 +158,6 @@ static void gen_log_reg_write_pair(int rnum, TCGv_i64 val)
|
|||
/* Do this so HELPER(debug_commit_end) will know */
|
||||
tcg_gen_movi_tl(hex_reg_written[rnum + 1], 1);
|
||||
}
|
||||
|
||||
tcg_temp_free(val32);
|
||||
}
|
||||
|
||||
void gen_log_pred_write(DisasContext *ctx, int pnum, TCGv val)
|
||||
|
@ -189,8 +180,6 @@ void gen_log_pred_write(DisasContext *ctx, int pnum, TCGv val)
|
|||
hex_new_pred_value[pnum], base_val);
|
||||
}
|
||||
tcg_gen_ori_tl(hex_pred_written, hex_pred_written, 1 << pnum);
|
||||
|
||||
tcg_temp_free(base_val);
|
||||
}
|
||||
|
||||
static inline void gen_read_p3_0(TCGv control_reg)
|
||||
|
@ -238,7 +227,6 @@ static inline void gen_read_ctrl_reg_pair(DisasContext *ctx, const int reg_num,
|
|||
TCGv p3_0 = tcg_temp_new();
|
||||
gen_read_p3_0(p3_0);
|
||||
tcg_gen_concat_i32_i64(dest, p3_0, hex_gpr[reg_num + 1]);
|
||||
tcg_temp_free(p3_0);
|
||||
} else if (reg_num == HEX_REG_PC - 1) {
|
||||
TCGv pc = tcg_constant_tl(ctx->base.pc_next);
|
||||
tcg_gen_concat_i32_i64(dest, hex_gpr[reg_num], pc);
|
||||
|
@ -250,14 +238,11 @@ static inline void gen_read_ctrl_reg_pair(DisasContext *ctx, const int reg_num,
|
|||
tcg_gen_addi_tl(insn_cnt, hex_gpr[HEX_REG_QEMU_INSN_CNT],
|
||||
ctx->num_insns);
|
||||
tcg_gen_concat_i32_i64(dest, pkt_cnt, insn_cnt);
|
||||
tcg_temp_free(pkt_cnt);
|
||||
tcg_temp_free(insn_cnt);
|
||||
} else if (reg_num == HEX_REG_QEMU_HVX_CNT) {
|
||||
TCGv hvx_cnt = tcg_temp_new();
|
||||
tcg_gen_addi_tl(hvx_cnt, hex_gpr[HEX_REG_QEMU_HVX_CNT],
|
||||
ctx->num_hvx_insns);
|
||||
tcg_gen_concat_i32_i64(dest, hvx_cnt, hex_gpr[reg_num + 1]);
|
||||
tcg_temp_free(hvx_cnt);
|
||||
} else {
|
||||
tcg_gen_concat_i32_i64(dest,
|
||||
hex_gpr[reg_num],
|
||||
|
@ -273,7 +258,6 @@ static void gen_write_p3_0(DisasContext *ctx, TCGv control_reg)
|
|||
gen_log_pred_write(ctx, i, hex_p8);
|
||||
ctx_log_pred_write(ctx, i);
|
||||
}
|
||||
tcg_temp_free(hex_p8);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -312,7 +296,6 @@ static inline void gen_write_ctrl_reg_pair(DisasContext *ctx, int reg_num,
|
|||
gen_write_p3_0(ctx, val32);
|
||||
tcg_gen_extrh_i64_i32(val32, val);
|
||||
gen_log_reg_write(reg_num + 1, val32);
|
||||
tcg_temp_free(val32);
|
||||
ctx_log_reg_write(ctx, reg_num + 1);
|
||||
} else {
|
||||
gen_log_reg_write_pair(reg_num, val);
|
||||
|
@ -346,7 +329,6 @@ TCGv gen_get_byte_i64(TCGv result, int N, TCGv_i64 src, bool sign)
|
|||
tcg_gen_extract_i64(res64, src, N * 8, 8);
|
||||
}
|
||||
tcg_gen_extrl_i64_i32(result, res64);
|
||||
tcg_temp_free_i64(res64);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -371,7 +353,6 @@ void gen_set_half_i64(int N, TCGv_i64 result, TCGv src)
|
|||
TCGv_i64 src64 = tcg_temp_new_i64();
|
||||
tcg_gen_extu_i32_i64(src64, src);
|
||||
tcg_gen_deposit_i64(result, result, src64, N * 16, 16);
|
||||
tcg_temp_free_i64(src64);
|
||||
}
|
||||
|
||||
void gen_set_byte_i64(int N, TCGv_i64 result, TCGv src)
|
||||
|
@ -379,7 +360,6 @@ void gen_set_byte_i64(int N, TCGv_i64 result, TCGv src)
|
|||
TCGv_i64 src64 = tcg_temp_new_i64();
|
||||
tcg_gen_extu_i32_i64(src64, src);
|
||||
tcg_gen_deposit_i64(result, result, src64, N * 8, 8);
|
||||
tcg_temp_free_i64(src64);
|
||||
}
|
||||
|
||||
static inline void gen_load_locked4u(TCGv dest, TCGv vaddr, int mem_index)
|
||||
|
@ -412,7 +392,6 @@ static inline void gen_store_conditional4(DisasContext *ctx,
|
|||
ctx->mem_idx, MO_32);
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, pred, tmp, hex_llsc_val,
|
||||
one, zero);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_gen_br(done);
|
||||
|
||||
gen_set_label(fail);
|
||||
|
@ -439,7 +418,6 @@ static inline void gen_store_conditional8(DisasContext *ctx,
|
|||
tcg_gen_movcond_i64(TCG_COND_EQ, tmp, tmp, hex_llsc_val_i64,
|
||||
one, zero);
|
||||
tcg_gen_extrl_i64_i32(pred, tmp);
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_gen_br(done);
|
||||
|
||||
gen_set_label(fail);
|
||||
|
@ -607,12 +585,10 @@ static void gen_cmpnd_cmp_jmp(DisasContext *ctx,
|
|||
TCGv pred = tcg_temp_new();
|
||||
gen_compare(cond1, pred, arg1, arg2);
|
||||
gen_log_pred_write(ctx, pnum, pred);
|
||||
tcg_temp_free(pred);
|
||||
} else {
|
||||
TCGv pred = tcg_temp_new();
|
||||
tcg_gen_mov_tl(pred, hex_new_pred_value[pnum]);
|
||||
gen_cond_jump(ctx, cond2, pred, pc_off);
|
||||
tcg_temp_free(pred);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -666,12 +642,10 @@ static void gen_cmpnd_tstbit0_jmp(DisasContext *ctx,
|
|||
tcg_gen_andi_tl(pred, arg, 1);
|
||||
gen_8bitsof(pred, pred);
|
||||
gen_log_pred_write(ctx, pnum, pred);
|
||||
tcg_temp_free(pred);
|
||||
} else {
|
||||
TCGv pred = tcg_temp_new();
|
||||
tcg_gen_mov_tl(pred, hex_new_pred_value[pnum]);
|
||||
gen_cond_jump(ctx, cond, pred, pc_off);
|
||||
tcg_temp_free(pred);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -681,7 +655,6 @@ static void gen_testbit0_jumpnv(DisasContext *ctx,
|
|||
TCGv pred = tcg_temp_new();
|
||||
tcg_gen_andi_tl(pred, arg, 1);
|
||||
gen_cond_jump(ctx, cond, pred, pc_off);
|
||||
tcg_temp_free(pred);
|
||||
}
|
||||
|
||||
static void gen_jump(DisasContext *ctx, int pc_off)
|
||||
|
@ -711,7 +684,6 @@ static void gen_cond_call(DisasContext *ctx, TCGv pred,
|
|||
tcg_gen_andi_tl(lsb, pred, 1);
|
||||
gen_write_new_pc_pcrel(ctx, pc_off, cond, lsb);
|
||||
tcg_gen_brcondi_tl(cond, lsb, 0, skip);
|
||||
tcg_temp_free(lsb);
|
||||
next_PC =
|
||||
tcg_constant_tl(ctx->pkt->pc + ctx->pkt->encod_pkt_size_in_bytes);
|
||||
gen_log_reg_write(HEX_REG_LR, next_PC);
|
||||
|
@ -771,8 +743,6 @@ static void gen_endloop0(DisasContext *ctx)
|
|||
}
|
||||
gen_set_label(label3);
|
||||
}
|
||||
|
||||
tcg_temp_free(lpcfg);
|
||||
}
|
||||
|
||||
static void gen_cmp_jumpnv(DisasContext *ctx,
|
||||
|
@ -781,7 +751,6 @@ static void gen_cmp_jumpnv(DisasContext *ctx,
|
|||
TCGv pred = tcg_temp_new();
|
||||
tcg_gen_setcond_tl(cond, pred, val, src);
|
||||
gen_cond_jump(ctx, TCG_COND_EQ, pred, pc_off);
|
||||
tcg_temp_free(pred);
|
||||
}
|
||||
|
||||
static void gen_cmpi_jumpnv(DisasContext *ctx,
|
||||
|
@ -790,7 +759,6 @@ static void gen_cmpi_jumpnv(DisasContext *ctx,
|
|||
TCGv pred = tcg_temp_new();
|
||||
tcg_gen_setcondi_tl(cond, pred, val, src);
|
||||
gen_cond_jump(ctx, TCG_COND_EQ, pred, pc_off);
|
||||
tcg_temp_free(pred);
|
||||
}
|
||||
|
||||
/* Shift left with saturation */
|
||||
|
@ -830,11 +798,6 @@ static void gen_shl_sat(TCGv dst, TCGv src, TCGv shift_amt)
|
|||
tcg_gen_or_tl(hex_new_value[HEX_REG_USR], hex_new_value[HEX_REG_USR], ovf);
|
||||
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, dst, dst_sar, src, dst, satval);
|
||||
|
||||
tcg_temp_free(sh32);
|
||||
tcg_temp_free(dst_sar);
|
||||
tcg_temp_free(ovf);
|
||||
tcg_temp_free(satval);
|
||||
}
|
||||
|
||||
static void gen_sar(TCGv dst, TCGv src, TCGv shift_amt)
|
||||
|
@ -846,7 +809,6 @@ static void gen_sar(TCGv dst, TCGv src, TCGv shift_amt)
|
|||
TCGv tmp = tcg_temp_new();
|
||||
tcg_gen_umin_tl(tmp, shift_amt, tcg_constant_tl(31));
|
||||
tcg_gen_sar_tl(dst, src, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
/* Bidirectional shift right with saturation */
|
||||
|
@ -869,8 +831,6 @@ static void gen_asr_r_r_sat(TCGv RdV, TCGv RsV, TCGv RtV)
|
|||
gen_sar(RdV, RsV, shift_amt);
|
||||
|
||||
gen_set_label(done);
|
||||
|
||||
tcg_temp_free(shift_amt);
|
||||
}
|
||||
|
||||
/* Bidirectional shift left with saturation */
|
||||
|
@ -893,8 +853,6 @@ static void gen_asl_r_r_sat(TCGv RdV, TCGv RsV, TCGv RtV)
|
|||
gen_shl_sat(RdV, RsV, shift_amt);
|
||||
|
||||
gen_set_label(done);
|
||||
|
||||
tcg_temp_free(shift_amt);
|
||||
}
|
||||
|
||||
static intptr_t vreg_src_off(DisasContext *ctx, int num)
|
||||
|
@ -924,7 +882,6 @@ static void gen_log_vreg_write(DisasContext *ctx, intptr_t srcoff, int num,
|
|||
/* Don't do anything if the slot was cancelled */
|
||||
tcg_gen_extract_tl(cancelled, hex_slot_cancelled, slot_num, 1);
|
||||
tcg_gen_brcondi_tl(TCG_COND_NE, cancelled, 0, label_end);
|
||||
tcg_temp_free(cancelled);
|
||||
}
|
||||
|
||||
if (type != EXT_TMP) {
|
||||
|
@ -965,7 +922,6 @@ static void gen_log_qreg_write(intptr_t srcoff, int num, int vnew,
|
|||
/* Don't do anything if the slot was cancelled */
|
||||
tcg_gen_extract_tl(cancelled, hex_slot_cancelled, slot_num, 1);
|
||||
tcg_gen_brcondi_tl(TCG_COND_NE, cancelled, 0, label_end);
|
||||
tcg_temp_free(cancelled);
|
||||
}
|
||||
|
||||
dstoff = offsetof(CPUHexagonState, future_QRegs[num]);
|
||||
|
@ -989,7 +945,6 @@ static void gen_vreg_load(DisasContext *ctx, intptr_t dstoff, TCGv src,
|
|||
tcg_gen_addi_tl(src, src, 8);
|
||||
tcg_gen_st_i64(tmp, cpu_env, dstoff + i * 8);
|
||||
}
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static void gen_vreg_store(DisasContext *ctx, TCGv EA, intptr_t srcoff,
|
||||
|
@ -1061,10 +1016,6 @@ static void vec_to_qvec(size_t size, intptr_t dstoff, intptr_t srcoff)
|
|||
|
||||
tcg_gen_st8_i64(mask, cpu_env, dstoff + i);
|
||||
}
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(word);
|
||||
tcg_temp_free_i64(bits);
|
||||
tcg_temp_free_i64(mask);
|
||||
}
|
||||
|
||||
void probe_noshuf_load(TCGv va, int s, int mi)
|
||||
|
@ -1088,7 +1039,6 @@ void gen_set_usr_field_if(int field, TCGv val)
|
|||
tcg_gen_or_tl(hex_new_value[HEX_REG_USR],
|
||||
hex_new_value[HEX_REG_USR],
|
||||
tmp);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
TCGLabel *skip_label = gen_new_label();
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, val, 0, skip_label);
|
||||
|
@ -1140,7 +1090,6 @@ void gen_sat_i64_ovfl(TCGv ovfl, TCGv_i64 dest, TCGv_i64 source, int width)
|
|||
ovfl_64 = tcg_temp_new_i64();
|
||||
tcg_gen_setcond_i64(TCG_COND_NE, ovfl_64, dest, source);
|
||||
tcg_gen_trunc_i64_tl(ovfl, ovfl_64);
|
||||
tcg_temp_free_i64(ovfl_64);
|
||||
}
|
||||
|
||||
void gen_satu_i64(TCGv_i64 dest, TCGv_i64 source, int width)
|
||||
|
@ -1158,7 +1107,6 @@ void gen_satu_i64_ovfl(TCGv ovfl, TCGv_i64 dest, TCGv_i64 source, int width)
|
|||
ovfl_64 = tcg_temp_new_i64();
|
||||
tcg_gen_setcond_i64(TCG_COND_NE, ovfl_64, dest, source);
|
||||
tcg_gen_trunc_i64_tl(ovfl, ovfl_64);
|
||||
tcg_temp_free_i64(ovfl_64);
|
||||
}
|
||||
|
||||
/* Implements the fADDSAT64 macro in TCG */
|
||||
|
@ -1182,15 +1130,12 @@ void gen_add_sat_i64(TCGv_i64 ret, TCGv_i64 a, TCGv_i64 b)
|
|||
|
||||
/* if (xor & mask) */
|
||||
tcg_gen_and_i64(cond1, xor, mask);
|
||||
tcg_temp_free_i64(xor);
|
||||
tcg_gen_brcondi_i64(TCG_COND_NE, cond1, 0, no_ovfl_label);
|
||||
tcg_temp_free_i64(cond1);
|
||||
|
||||
/* else if ((a ^ sum) & mask) */
|
||||
tcg_gen_xor_i64(cond2, a, sum);
|
||||
tcg_gen_and_i64(cond2, cond2, mask);
|
||||
tcg_gen_brcondi_i64(TCG_COND_NE, cond2, 0, ovfl_label);
|
||||
tcg_temp_free_i64(cond2);
|
||||
/* fallthrough to no_ovfl_label branch */
|
||||
|
||||
/* if branch */
|
||||
|
@ -1201,10 +1146,7 @@ void gen_add_sat_i64(TCGv_i64 ret, TCGv_i64 a, TCGv_i64 b)
|
|||
/* else if branch */
|
||||
gen_set_label(ovfl_label);
|
||||
tcg_gen_and_i64(cond3, sum, mask);
|
||||
tcg_temp_free_i64(mask);
|
||||
tcg_temp_free_i64(sum);
|
||||
tcg_gen_movcond_i64(TCG_COND_NE, ret, cond3, zero, max_pos, max_neg);
|
||||
tcg_temp_free_i64(cond3);
|
||||
SET_USR_FIELD(USR_OVF, 1);
|
||||
|
||||
gen_set_label(ret_label);
|
||||
|
|
|
@ -31,7 +31,6 @@ idef-parser will compile the above code into the following code:
|
|||
TCGv_i32 tmp_0 = tcg_temp_new_i32();
|
||||
tcg_gen_add_i32(tmp_0, RsV, RtV);
|
||||
tcg_gen_mov_i32(RdV, tmp_0);
|
||||
tcg_temp_free_i32(tmp_0);
|
||||
}
|
||||
|
||||
The output of the compilation process will be a function, containing the
|
||||
|
@ -102,12 +101,6 @@ The result of the addition is now stored in the temporary, we move it into the
|
|||
correct destination register. This code may seem inefficient, but QEMU will
|
||||
perform some optimizations on the tinycode, reducing the unnecessary copy.
|
||||
|
||||
::
|
||||
|
||||
tcg_temp_free_i32(tmp_0);
|
||||
|
||||
Finally, we free the temporary we used to hold the addition result.
|
||||
|
||||
Parser Input
|
||||
------------
|
||||
|
||||
|
@ -524,7 +517,6 @@ instruction,
|
|||
TCGv_i32 tmp_0 = tcg_temp_new_i32();
|
||||
tcg_gen_add_i32(tmp_0, RsV, RsV);
|
||||
tcg_gen_mov_i32(RdV, tmp_0);
|
||||
tcg_temp_free_i32(tmp_0);
|
||||
}
|
||||
|
||||
Here the bug, albeit hard to spot, is in ``tcg_gen_add_i32(tmp_0, RsV, RsV);``
|
||||
|
|
|
@ -185,7 +185,6 @@ typedef struct HexValue {
|
|||
unsigned bit_width; /**< Bit width of the rvalue */
|
||||
HexSignedness signedness; /**< Unsigned flag for the rvalue */
|
||||
bool is_dotnew; /**< rvalue of predicate type is dotnew? */
|
||||
bool is_manual; /**< Opt out of automatic freeing of params */
|
||||
} HexValue;
|
||||
|
||||
/**
|
||||
|
|
|
@ -269,9 +269,6 @@ statements : statements statement
|
|||
statement : control_statement
|
||||
| var_decl ';'
|
||||
| rvalue ';'
|
||||
{
|
||||
gen_rvalue_free(c, &@1, &$1);
|
||||
}
|
||||
| code_block
|
||||
| ';'
|
||||
;
|
||||
|
@ -347,7 +344,6 @@ assign_statement : lvalue '=' rvalue
|
|||
$3 = gen_rvalue_truncate(c, &@1, &$3);
|
||||
$3 = rvalue_materialize(c, &@1, &$3);
|
||||
OUT(c, &@1, "gen_write_new_pc(", &$3, ");\n");
|
||||
gen_rvalue_free(c, &@1, &$3); /* Free temporary value */
|
||||
}
|
||||
| LOAD '(' IMM ',' IMM ',' SIGN ',' var ',' lvalue ')'
|
||||
{
|
||||
|
@ -376,7 +372,6 @@ assign_statement : lvalue '=' rvalue
|
|||
$3 = gen_rvalue_truncate(c, &@1, &$3);
|
||||
$3 = rvalue_materialize(c, &@1, &$3);
|
||||
OUT(c, &@1, "SET_USR_FIELD(USR_LPCFG, ", &$3, ");\n");
|
||||
gen_rvalue_free(c, &@1, &$3);
|
||||
}
|
||||
| DEPOSIT '(' rvalue ',' rvalue ',' rvalue ')'
|
||||
{
|
||||
|
@ -421,10 +416,6 @@ control_statement : frame_check
|
|||
;
|
||||
|
||||
frame_check : FCHK '(' rvalue ',' rvalue ')' ';'
|
||||
{
|
||||
gen_rvalue_free(c, &@1, &$3);
|
||||
gen_rvalue_free(c, &@1, &$5);
|
||||
}
|
||||
;
|
||||
|
||||
cancel_statement : LOAD_CANCEL
|
||||
|
@ -543,7 +534,6 @@ rvalue : FAIL
|
|||
rvalue.imm.type = IMM_CONSTEXT;
|
||||
rvalue.signedness = UNSIGNED;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = false;
|
||||
$$ = rvalue;
|
||||
}
|
||||
| var
|
||||
|
@ -702,7 +692,6 @@ rvalue : FAIL
|
|||
}
|
||||
| rvalue '?'
|
||||
{
|
||||
$1.is_manual = true;
|
||||
Ternary t = { 0 };
|
||||
t.state = IN_LEFT;
|
||||
t.cond = $1;
|
||||
|
@ -774,7 +763,6 @@ rvalue : FAIL
|
|||
@1.last_column = @6.last_column;
|
||||
$$ = gen_tmp(c, &@1, 32, UNSIGNED);
|
||||
OUT(c, &@1, "gen_read_ireg(", &$$, ", ", &$3, ", ", &$6, ");\n");
|
||||
gen_rvalue_free(c, &@1, &$3);
|
||||
}
|
||||
| CIRCADD '(' rvalue ',' rvalue ',' rvalue ')'
|
||||
{
|
||||
|
@ -795,7 +783,7 @@ rvalue : FAIL
|
|||
}
|
||||
| LPCFG
|
||||
{
|
||||
$$ = gen_tmp_value(c, &@1, "0", 32, UNSIGNED);
|
||||
$$ = gen_tmp(c, &@1, 32, UNSIGNED);
|
||||
OUT(c, &@1, "GET_USR_FIELD(USR_LPCFG, ", &$$, ");\n");
|
||||
}
|
||||
| EXTRACT '(' rvalue ',' rvalue ')'
|
||||
|
|
|
@ -278,7 +278,6 @@ static HexValue gen_constant(Context *c,
|
|||
rvalue.bit_width = bit_width;
|
||||
rvalue.signedness = signedness;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = true;
|
||||
rvalue.tmp.index = c->inst.tmp_count;
|
||||
OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count,
|
||||
" = tcg_constant_i", &bit_width, "(", value, ");\n");
|
||||
|
@ -299,7 +298,6 @@ HexValue gen_tmp(Context *c,
|
|||
rvalue.bit_width = bit_width;
|
||||
rvalue.signedness = signedness;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = false;
|
||||
rvalue.tmp.index = c->inst.tmp_count;
|
||||
OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count,
|
||||
" = tcg_temp_new_i", &bit_width, "();\n");
|
||||
|
@ -307,30 +305,9 @@ HexValue gen_tmp(Context *c,
|
|||
return rvalue;
|
||||
}
|
||||
|
||||
HexValue gen_tmp_value(Context *c,
|
||||
YYLTYPE *locp,
|
||||
const char *value,
|
||||
unsigned bit_width,
|
||||
HexSignedness signedness)
|
||||
{
|
||||
HexValue rvalue;
|
||||
assert(bit_width == 32 || bit_width == 64);
|
||||
memset(&rvalue, 0, sizeof(HexValue));
|
||||
rvalue.type = TEMP;
|
||||
rvalue.bit_width = bit_width;
|
||||
rvalue.signedness = signedness;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = false;
|
||||
rvalue.tmp.index = c->inst.tmp_count;
|
||||
OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count,
|
||||
" = tcg_const_i", &bit_width, "(", value, ");\n");
|
||||
c->inst.tmp_count++;
|
||||
return rvalue;
|
||||
}
|
||||
|
||||
static HexValue gen_tmp_value_from_imm(Context *c,
|
||||
YYLTYPE *locp,
|
||||
HexValue *value)
|
||||
static HexValue gen_constant_from_imm(Context *c,
|
||||
YYLTYPE *locp,
|
||||
HexValue *value)
|
||||
{
|
||||
HexValue rvalue;
|
||||
assert(value->type == IMMEDIATE);
|
||||
|
@ -339,14 +316,13 @@ static HexValue gen_tmp_value_from_imm(Context *c,
|
|||
rvalue.bit_width = value->bit_width;
|
||||
rvalue.signedness = value->signedness;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = false;
|
||||
rvalue.tmp.index = c->inst.tmp_count;
|
||||
/*
|
||||
* Here we output the call to `tcg_const_i<width>` in
|
||||
* Here we output the call to `tcg_constant_i<width>` in
|
||||
* order to create the temporary value. Note, that we
|
||||
* add a cast
|
||||
*
|
||||
* `tcg_const_i<width>`((int<width>_t) ...)`
|
||||
* `tcg_constant_i<width>`((int<width>_t) ...)`
|
||||
*
|
||||
* This cast is required to avoid implicit integer
|
||||
* conversion warnings since all immediates are
|
||||
|
@ -354,7 +330,7 @@ static HexValue gen_tmp_value_from_imm(Context *c,
|
|||
* integer is 32-bit.
|
||||
*/
|
||||
OUT(c, locp, "TCGv_i", &rvalue.bit_width, " tmp_", &c->inst.tmp_count);
|
||||
OUT(c, locp, " = tcg_const_i", &rvalue.bit_width,
|
||||
OUT(c, locp, " = tcg_constant_i", &rvalue.bit_width,
|
||||
"((int", &rvalue.bit_width, "_t) (", value, "));\n");
|
||||
|
||||
c->inst.tmp_count++;
|
||||
|
@ -375,7 +351,6 @@ HexValue gen_imm_value(Context *c __attribute__((unused)),
|
|||
rvalue.bit_width = bit_width;
|
||||
rvalue.signedness = signedness;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = false;
|
||||
rvalue.imm.type = VALUE;
|
||||
rvalue.imm.value = value;
|
||||
return rvalue;
|
||||
|
@ -390,7 +365,6 @@ HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
memset(&rvalue, 0, sizeof(HexValue));
|
||||
rvalue.type = IMMEDIATE;
|
||||
rvalue.is_dotnew = false;
|
||||
rvalue.is_manual = false;
|
||||
rvalue.bit_width = bit_width;
|
||||
rvalue.signedness = signedness;
|
||||
rvalue.imm.type = QEMU_TMP;
|
||||
|
@ -398,26 +372,10 @@ HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
return rvalue;
|
||||
}
|
||||
|
||||
void gen_rvalue_free(Context *c, YYLTYPE *locp, HexValue *rvalue)
|
||||
{
|
||||
if (rvalue->type == TEMP && !rvalue->is_manual) {
|
||||
const char *bit_suffix = (rvalue->bit_width == 64) ? "i64" : "i32";
|
||||
OUT(c, locp, "tcg_temp_free_", bit_suffix, "(", rvalue, ");\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void gen_rvalue_free_manual(Context *c, YYLTYPE *locp, HexValue *rvalue)
|
||||
{
|
||||
rvalue->is_manual = false;
|
||||
gen_rvalue_free(c, locp, rvalue);
|
||||
}
|
||||
|
||||
HexValue rvalue_materialize(Context *c, YYLTYPE *locp, HexValue *rvalue)
|
||||
{
|
||||
if (rvalue->type == IMMEDIATE) {
|
||||
HexValue res = gen_tmp_value_from_imm(c, locp, rvalue);
|
||||
gen_rvalue_free(c, locp, rvalue);
|
||||
return res;
|
||||
return gen_constant_from_imm(c, locp, rvalue);
|
||||
}
|
||||
return *rvalue;
|
||||
}
|
||||
|
@ -445,7 +403,6 @@ HexValue gen_rvalue_extend(Context *c, YYLTYPE *locp, HexValue *rvalue)
|
|||
const char *sign_suffix = is_unsigned ? "u" : "";
|
||||
OUT(c, locp, "tcg_gen_ext", sign_suffix,
|
||||
"_i32_i64(", &res, ", ", rvalue, ");\n");
|
||||
gen_rvalue_free(c, locp, rvalue);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
@ -460,7 +417,6 @@ HexValue gen_rvalue_truncate(Context *c, YYLTYPE *locp, HexValue *rvalue)
|
|||
if (rvalue->bit_width == 64) {
|
||||
HexValue res = gen_tmp(c, locp, 32, rvalue->signedness);
|
||||
OUT(c, locp, "tcg_gen_trunc_i64_tl(", &res, ", ", rvalue, ");\n");
|
||||
gen_rvalue_free(c, locp, rvalue);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
@ -587,11 +543,6 @@ HexValue gen_bin_cmp(Context *c,
|
|||
fprintf(stderr, "Error in evalutating immediateness!");
|
||||
abort();
|
||||
}
|
||||
|
||||
/* Free operands */
|
||||
gen_rvalue_free(c, locp, &op1_m);
|
||||
gen_rvalue_free(c, locp, &op2_m);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -627,8 +578,6 @@ static void gen_simple_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
"(", res, ", ", op1, ", ", op2, ");\n");
|
||||
break;
|
||||
}
|
||||
gen_rvalue_free(c, locp, op1);
|
||||
gen_rvalue_free(c, locp, op2);
|
||||
}
|
||||
|
||||
static void gen_sub_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
||||
|
@ -658,8 +607,6 @@ static void gen_sub_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
"(", res, ", ", op1, ", ", op2, ");\n");
|
||||
} break;
|
||||
}
|
||||
gen_rvalue_free(c, locp, op1);
|
||||
gen_rvalue_free(c, locp, op2);
|
||||
}
|
||||
|
||||
static void gen_asl_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
||||
|
@ -711,10 +658,7 @@ static void gen_asl_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
OUT(c, locp, "tcg_gen_movcond_i", &bit_width);
|
||||
OUT(c, locp, "(TCG_COND_GEU, ", res, ", ", &op2_m, ", ", &edge);
|
||||
OUT(c, locp, ", ", &zero, ", ", res, ");\n");
|
||||
gen_rvalue_free(c, locp, &edge);
|
||||
}
|
||||
gen_rvalue_free(c, locp, &op1_m);
|
||||
gen_rvalue_free(c, locp, &op2_m);
|
||||
}
|
||||
|
||||
static void gen_asr_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
||||
|
@ -769,11 +713,7 @@ static void gen_asr_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
OUT(c, locp, "tcg_gen_movcond_i", &bit_width);
|
||||
OUT(c, locp, "(TCG_COND_GEU, ", res, ", ", &op2_m, ", ", &edge);
|
||||
OUT(c, locp, ", ", &tmp, ", ", res, ");\n");
|
||||
gen_rvalue_free(c, locp, &edge);
|
||||
gen_rvalue_free(c, locp, &tmp);
|
||||
}
|
||||
gen_rvalue_free(c, locp, &op1_m);
|
||||
gen_rvalue_free(c, locp, &op2_m);
|
||||
}
|
||||
|
||||
static void gen_lsr_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
||||
|
@ -815,10 +755,7 @@ static void gen_lsr_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
OUT(c, locp, "tcg_gen_movcond_i", &bit_width);
|
||||
OUT(c, locp, "(TCG_COND_GEU, ", res, ", ", &op2_m, ", ", &edge);
|
||||
OUT(c, locp, ", ", &zero, ", ", res, ");\n");
|
||||
gen_rvalue_free(c, locp, &edge);
|
||||
}
|
||||
gen_rvalue_free(c, locp, &op1_m);
|
||||
gen_rvalue_free(c, locp, &op2_m);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -847,9 +784,6 @@ static void gen_andl_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
tmp2 = gen_bin_cmp(c, locp, TCG_COND_NE, op2, &zero);
|
||||
OUT(c, locp, "tcg_gen_and_", bit_suffix,
|
||||
"(", res, ", ", &tmp1, ", ", &tmp2, ");\n");
|
||||
gen_rvalue_free_manual(c, locp, &zero);
|
||||
gen_rvalue_free(c, locp, &tmp1);
|
||||
gen_rvalue_free(c, locp, &tmp2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -892,8 +826,6 @@ static void gen_minmax_op(Context *c, YYLTYPE *locp, unsigned bit_width,
|
|||
OUT(c, locp, res, ", ", op1, ", ", &op2_m, ");\n");
|
||||
break;
|
||||
}
|
||||
gen_rvalue_free(c, locp, &op1_m);
|
||||
gen_rvalue_free(c, locp, &op2_m);
|
||||
}
|
||||
|
||||
/* Code generation functions */
|
||||
|
@ -1055,7 +987,6 @@ HexValue gen_cast_op(Context *c,
|
|||
&res, ", ", src, ");\n");
|
||||
}
|
||||
}
|
||||
gen_rvalue_free(c, locp, src);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
@ -1115,8 +1046,6 @@ static HexValue gen_extend_imm_width_op(Context *c,
|
|||
if (need_guarding) {
|
||||
OUT(c, locp, "}\n");
|
||||
}
|
||||
|
||||
gen_rvalue_free(c, locp, value);
|
||||
return res;
|
||||
} else {
|
||||
/*
|
||||
|
@ -1141,8 +1070,6 @@ static HexValue gen_extend_imm_width_op(Context *c,
|
|||
", 0);\n");
|
||||
OUT(c, locp, "}\n");
|
||||
}
|
||||
|
||||
gen_rvalue_free(c, locp, value);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
@ -1173,16 +1100,11 @@ static HexValue gen_extend_tcg_width_op(Context *c,
|
|||
OUT(c, locp, "tcg_gen_subfi_i", &dst_width);
|
||||
OUT(c, locp, "(", &shift, ", ", &dst_width, ", ", &src_width_m, ");\n");
|
||||
if (signedness == UNSIGNED) {
|
||||
const char *mask_str = (dst_width == 32)
|
||||
? "0xffffffff"
|
||||
: "0xffffffffffffffff";
|
||||
HexValue mask = gen_tmp_value(c, locp, mask_str,
|
||||
dst_width, UNSIGNED);
|
||||
HexValue mask = gen_constant(c, locp, "-1", dst_width, UNSIGNED);
|
||||
OUT(c, locp, "tcg_gen_shr_i", &dst_width, "(",
|
||||
&mask, ", ", &mask, ", ", &shift, ");\n");
|
||||
&res, ", ", &mask, ", ", &shift, ");\n");
|
||||
OUT(c, locp, "tcg_gen_and_i", &dst_width, "(",
|
||||
&res, ", ", value, ", ", &mask, ");\n");
|
||||
gen_rvalue_free(c, locp, &mask);
|
||||
&res, ", ", &res, ", ", value, ");\n");
|
||||
} else {
|
||||
OUT(c, locp, "tcg_gen_shl_i", &dst_width, "(",
|
||||
&res, ", ", value, ", ", &shift, ");\n");
|
||||
|
@ -1194,10 +1116,6 @@ static HexValue gen_extend_tcg_width_op(Context *c,
|
|||
OUT(c, locp, &src_width_m, ", ", &zero, ", ", &zero, ", ", &res,
|
||||
");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &src_width_m);
|
||||
gen_rvalue_free(c, locp, value);
|
||||
gen_rvalue_free(c, locp, &shift);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1293,15 +1211,12 @@ void gen_rdeposit_op(Context *c,
|
|||
*/
|
||||
k64 = gen_bin_op(c, locp, SUB_OP, &k64, &width_m);
|
||||
mask = gen_bin_op(c, locp, LSR_OP, &mask, &k64);
|
||||
begin_m.is_manual = true;
|
||||
mask = gen_bin_op(c, locp, ASL_OP, &mask, &begin_m);
|
||||
mask.is_manual = true;
|
||||
value_m = gen_bin_op(c, locp, ASL_OP, &value_m, &begin_m);
|
||||
value_m = gen_bin_op(c, locp, ANDB_OP, &value_m, &mask);
|
||||
|
||||
OUT(c, locp, "tcg_gen_not_i", &dst->bit_width, "(", &mask, ", ",
|
||||
&mask, ");\n");
|
||||
mask.is_manual = false;
|
||||
res = gen_bin_op(c, locp, ANDB_OP, dst, &mask);
|
||||
res = gen_bin_op(c, locp, ORB_OP, &res, &value_m);
|
||||
|
||||
|
@ -1316,9 +1231,6 @@ void gen_rdeposit_op(Context *c,
|
|||
dst);
|
||||
OUT(c, locp, ", ", &width_m, ", ", &zero, ", ", &res, ", ", dst,
|
||||
");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, width);
|
||||
gen_rvalue_free(c, locp, &res);
|
||||
}
|
||||
|
||||
void gen_deposit_op(Context *c,
|
||||
|
@ -1352,8 +1264,6 @@ void gen_deposit_op(Context *c,
|
|||
value_m = rvalue_materialize(c, locp, &value_m);
|
||||
OUT(c, locp, "tcg_gen_deposit_i", &bit_width, "(", dst, ", ", dst, ", ");
|
||||
OUT(c, locp, &value_m, ", ", index, " * ", &width, ", ", &width, ");\n");
|
||||
gen_rvalue_free(c, locp, index);
|
||||
gen_rvalue_free(c, locp, &value_m);
|
||||
}
|
||||
|
||||
HexValue gen_rextract_op(Context *c,
|
||||
|
@ -1366,7 +1276,6 @@ HexValue gen_rextract_op(Context *c,
|
|||
HexValue res = gen_tmp(c, locp, bit_width, UNSIGNED);
|
||||
OUT(c, locp, "tcg_gen_extract_i", &bit_width, "(", &res);
|
||||
OUT(c, locp, ", ", src, ", ", &begin, ", ", &width, ");\n");
|
||||
gen_rvalue_free(c, locp, src);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1399,12 +1308,8 @@ HexValue gen_extract_op(Context *c,
|
|||
const char *sign_suffix = (extract->signedness == UNSIGNED) ? "u" : "";
|
||||
OUT(c, locp, "tcg_gen_ext", sign_suffix, "_i32_i64(",
|
||||
&tmp, ", ", &res, ");\n");
|
||||
gen_rvalue_free(c, locp, &res);
|
||||
res = tmp;
|
||||
}
|
||||
|
||||
gen_rvalue_free(c, locp, src);
|
||||
gen_rvalue_free(c, locp, index);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1422,8 +1327,6 @@ void gen_write_reg(Context *c, YYLTYPE *locp, HexValue *reg, HexValue *value)
|
|||
locp,
|
||||
"ctx_log_reg_write(ctx, ", ®->reg.id,
|
||||
");\n");
|
||||
gen_rvalue_free(c, locp, reg);
|
||||
gen_rvalue_free(c, locp, &value_m);
|
||||
}
|
||||
|
||||
void gen_assign(Context *c,
|
||||
|
@ -1458,8 +1361,6 @@ void gen_assign(Context *c,
|
|||
const char *imm_suffix = (value_m.type == IMMEDIATE) ? "i" : "";
|
||||
OUT(c, locp, "tcg_gen_mov", imm_suffix, "_i", &bit_width,
|
||||
"(", dst, ", ", &value_m, ");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &value_m);
|
||||
}
|
||||
|
||||
HexValue gen_convround(Context *c,
|
||||
|
@ -1475,8 +1376,6 @@ HexValue gen_convround(Context *c,
|
|||
HexValue and;
|
||||
HexValue src_p1;
|
||||
|
||||
src_m.is_manual = true;
|
||||
|
||||
and = gen_bin_op(c, locp, ANDB_OP, &src_m, &mask);
|
||||
src_p1 = gen_bin_op(c, locp, ADD_OP, &src_m, &one);
|
||||
|
||||
|
@ -1484,12 +1383,6 @@ HexValue gen_convround(Context *c,
|
|||
OUT(c, locp, ", ", &and, ", ", &mask, ", ");
|
||||
OUT(c, locp, &src_p1, ", ", &src_m, ");\n");
|
||||
|
||||
/* Free src but use the original `is_manual` value */
|
||||
gen_rvalue_free(c, locp, src);
|
||||
|
||||
/* Free the rest of the values */
|
||||
gen_rvalue_free(c, locp, &src_p1);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1515,9 +1408,6 @@ static HexValue gen_convround_n_b(Context *c,
|
|||
OUT(c, locp, "tcg_gen_add_i64(", &res);
|
||||
OUT(c, locp, ", ", &res, ", ", &tmp_64, ");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &tmp);
|
||||
gen_rvalue_free(c, locp, &tmp_64);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1540,10 +1430,6 @@ static HexValue gen_convround_n_c(Context *c,
|
|||
OUT(c, locp, "tcg_gen_add_i64(", &res);
|
||||
OUT(c, locp, ", ", &res, ", ", &tmp_64, ");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &one);
|
||||
gen_rvalue_free(c, locp, &tmp);
|
||||
gen_rvalue_free(c, locp, &tmp_64);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1614,18 +1500,6 @@ HexValue gen_convround_n(Context *c,
|
|||
OUT(c, locp, "tcg_gen_shr_i64(", &res);
|
||||
OUT(c, locp, ", ", &res, ", ", &n_64, ");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &src_casted);
|
||||
gen_rvalue_free(c, locp, &pos_casted);
|
||||
|
||||
gen_rvalue_free(c, locp, &r1);
|
||||
gen_rvalue_free(c, locp, &r2);
|
||||
gen_rvalue_free(c, locp, &r3);
|
||||
|
||||
gen_rvalue_free(c, locp, &cond);
|
||||
gen_rvalue_free(c, locp, &cond_64);
|
||||
gen_rvalue_free(c, locp, &mask);
|
||||
gen_rvalue_free(c, locp, &n_64);
|
||||
|
||||
res = gen_rvalue_truncate(c, locp, &res);
|
||||
return res;
|
||||
}
|
||||
|
@ -1659,10 +1533,6 @@ HexValue gen_round(Context *c,
|
|||
b = gen_extend_op(c, locp, &src_width, 64, pos, UNSIGNED);
|
||||
b = rvalue_materialize(c, locp, &b);
|
||||
|
||||
/* Disable auto-free of values used more than once */
|
||||
a.is_manual = true;
|
||||
b.is_manual = true;
|
||||
|
||||
n_m1 = gen_bin_op(c, locp, SUB_OP, &b, &one);
|
||||
shifted = gen_bin_op(c, locp, ASL_OP, &one, &n_m1);
|
||||
sum = gen_bin_op(c, locp, ADD_OP, &shifted, &a);
|
||||
|
@ -1671,10 +1541,6 @@ HexValue gen_round(Context *c,
|
|||
OUT(c, locp, "(TCG_COND_EQ, ", &res, ", ", &b, ", ", &zero);
|
||||
OUT(c, locp, ", ", &a, ", ", &sum, ");\n");
|
||||
|
||||
gen_rvalue_free_manual(c, locp, &a);
|
||||
gen_rvalue_free_manual(c, locp, &b);
|
||||
gen_rvalue_free(c, locp, &sum);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1700,9 +1566,6 @@ void gen_circ_op(Context *c,
|
|||
", ",
|
||||
modifier);
|
||||
OUT(c, locp, ", ", &cs, ");\n");
|
||||
gen_rvalue_free(c, locp, &increment_m);
|
||||
gen_rvalue_free(c, locp, modifier);
|
||||
gen_rvalue_free(c, locp, &cs);
|
||||
}
|
||||
|
||||
HexValue gen_locnt_op(Context *c, YYLTYPE *locp, HexValue *src)
|
||||
|
@ -1718,7 +1581,6 @@ HexValue gen_locnt_op(Context *c, YYLTYPE *locp, HexValue *src)
|
|||
&res, ", ", &src_m, ");\n");
|
||||
OUT(c, locp, "tcg_gen_clzi_i", bit_suffix, "(", &res, ", ", &res, ", ");
|
||||
OUT(c, locp, bit_suffix, ");\n");
|
||||
gen_rvalue_free(c, locp, &src_m);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1732,7 +1594,6 @@ HexValue gen_ctpop_op(Context *c, YYLTYPE *locp, HexValue *src)
|
|||
src_m = rvalue_materialize(c, locp, &src_m);
|
||||
OUT(c, locp, "tcg_gen_ctpop_i", bit_suffix,
|
||||
"(", &res, ", ", &src_m, ");\n");
|
||||
gen_rvalue_free(c, locp, &src_m);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1751,8 +1612,6 @@ HexValue gen_rotl(Context *c, YYLTYPE *locp, HexValue *src, HexValue *width)
|
|||
amount = rvalue_materialize(c, locp, &amount);
|
||||
OUT(c, locp, "tcg_gen_rotl_", suffix, "(",
|
||||
&res, ", ", src, ", ", &amount, ");\n");
|
||||
gen_rvalue_free(c, locp, src);
|
||||
gen_rvalue_free(c, locp, &amount);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -1777,10 +1636,6 @@ HexValue gen_carry_from_add(Context *c,
|
|||
OUT(c, locp, "tcg_gen_add2_i64(", &res, ", ", &cf, ", ", &res, ", ", &cf);
|
||||
OUT(c, locp, ", ", &op2_m, ", ", &zero, ");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &op1_m);
|
||||
gen_rvalue_free(c, locp, &op2_m);
|
||||
gen_rvalue_free(c, locp, &op3_m);
|
||||
gen_rvalue_free(c, locp, &res);
|
||||
return cf;
|
||||
}
|
||||
|
||||
|
@ -1845,7 +1700,6 @@ void gen_inst_code(Context *c, YYLTYPE *locp)
|
|||
c->inst.name->str,
|
||||
c->inst.error_count);
|
||||
} else {
|
||||
free_variables(c, locp);
|
||||
c->implemented_insn++;
|
||||
fprintf(c->enabled_file, "%s\n", c->inst.name->str);
|
||||
emit_footer(c);
|
||||
|
@ -1865,7 +1719,7 @@ void gen_pred_assign(Context *c, YYLTYPE *locp, HexValue *left_pred,
|
|||
"Predicate assign not allowed in ternary!");
|
||||
/* Extract predicate TCGv */
|
||||
if (is_direct) {
|
||||
*left_pred = gen_tmp_value(c, locp, "0", 32, UNSIGNED);
|
||||
*left_pred = gen_tmp(c, locp, 32, UNSIGNED);
|
||||
}
|
||||
/* Extract first 8 bits, and store new predicate value */
|
||||
OUT(c, locp, "tcg_gen_mov_i32(", left_pred, ", ", &r, ");\n");
|
||||
|
@ -1875,10 +1729,7 @@ void gen_pred_assign(Context *c, YYLTYPE *locp, HexValue *left_pred,
|
|||
OUT(c, locp, "gen_log_pred_write(ctx, ", pred_id, ", ", left_pred,
|
||||
");\n");
|
||||
OUT(c, locp, "ctx_log_pred_write(ctx, ", pred_id, ");\n");
|
||||
gen_rvalue_free(c, locp, left_pred);
|
||||
}
|
||||
/* Free temporary value */
|
||||
gen_rvalue_free(c, locp, &r);
|
||||
}
|
||||
|
||||
void gen_cancel(Context *c, YYLTYPE *locp)
|
||||
|
@ -1928,8 +1779,6 @@ void gen_load(Context *c, YYLTYPE *locp, HexValue *width,
|
|||
OUT(c, locp, "(TCGv) ");
|
||||
}
|
||||
OUT(c, locp, dst, ", ", ea, ", ctx->mem_idx);\n");
|
||||
/* If the var in EA was truncated it is now a tmp HexValue, so free it. */
|
||||
gen_rvalue_free(c, locp, ea);
|
||||
}
|
||||
|
||||
void gen_store(Context *c, YYLTYPE *locp, HexValue *width, HexValue *ea,
|
||||
|
@ -1943,9 +1792,6 @@ void gen_store(Context *c, YYLTYPE *locp, HexValue *width, HexValue *ea,
|
|||
src_m = rvalue_materialize(c, locp, &src_m);
|
||||
OUT(c, locp, "gen_store", &mem_width, "(cpu_env, ", ea, ", ", &src_m);
|
||||
OUT(c, locp, ", insn->slot);\n");
|
||||
gen_rvalue_free(c, locp, &src_m);
|
||||
/* If the var in ea was truncated it is now a tmp HexValue, so free it. */
|
||||
gen_rvalue_free(c, locp, ea);
|
||||
}
|
||||
|
||||
void gen_sethalf(Context *c, YYLTYPE *locp, HexCast *sh, HexValue *n,
|
||||
|
@ -1982,11 +1828,6 @@ void gen_setbits(Context *c, YYLTYPE *locp, HexValue *hi, HexValue *lo,
|
|||
OUT(c, locp, "tcg_gen_deposit_i32(", dst, ", ", dst,
|
||||
", ", &tmp, ", ");
|
||||
OUT(c, locp, lo, ", ", &len, ");\n");
|
||||
|
||||
gen_rvalue_free(c, locp, &tmp);
|
||||
gen_rvalue_free(c, locp, hi);
|
||||
gen_rvalue_free(c, locp, lo);
|
||||
gen_rvalue_free(c, locp, value);
|
||||
}
|
||||
|
||||
unsigned gen_if_cond(Context *c, YYLTYPE *locp, HexValue *cond)
|
||||
|
@ -1999,7 +1840,6 @@ unsigned gen_if_cond(Context *c, YYLTYPE *locp, HexValue *cond)
|
|||
bit_suffix = (cond->bit_width == 64) ? "i64" : "i32";
|
||||
OUT(c, locp, "tcg_gen_brcondi_", bit_suffix, "(TCG_COND_EQ, ", cond,
|
||||
", 0, if_label_", &c->inst.if_count, ");\n");
|
||||
gen_rvalue_free(c, locp, cond);
|
||||
return c->inst.if_count++;
|
||||
}
|
||||
|
||||
|
@ -2025,7 +1865,7 @@ HexValue gen_rvalue_pred(Context *c, YYLTYPE *locp, HexValue *pred)
|
|||
bool is_dotnew = pred->is_dotnew;
|
||||
char predicate_id[2] = { pred->pred.id, '\0' };
|
||||
char *pred_str = (char *) &predicate_id;
|
||||
*pred = gen_tmp_value(c, locp, "0", 32, UNSIGNED);
|
||||
*pred = gen_tmp(c, locp, 32, UNSIGNED);
|
||||
if (is_dotnew) {
|
||||
OUT(c, locp, "tcg_gen_mov_i32(", pred,
|
||||
", hex_new_pred_value[");
|
||||
|
@ -2090,7 +1930,6 @@ static inline HexValue gen_rvalue_simple_unary(Context *c, YYLTYPE *locp,
|
|||
res = gen_tmp(c, locp, bit_width, value->signedness);
|
||||
OUT(c, locp, tcg_code, "_i", &bit_width, "(", &res, ", ", value,
|
||||
");\n");
|
||||
gen_rvalue_free(c, locp, value);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -2116,7 +1955,6 @@ HexValue gen_rvalue_notl(Context *c, YYLTYPE *locp, HexValue *value)
|
|||
OUT(c, locp, "tcg_gen_movcond_i", &bit_width);
|
||||
OUT(c, locp, "(TCG_COND_EQ, ", &res, ", ", value, ", ", &zero);
|
||||
OUT(c, locp, ", ", &one, ", ", &zero, ");\n");
|
||||
gen_rvalue_free(c, locp, value);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -2147,7 +1985,6 @@ HexValue gen_rvalue_sat(Context *c, YYLTYPE *locp, HexSat *sat,
|
|||
OUT(c, locp, &ovfl, ", ", &res, ", ", value, ", ", &width->imm.value,
|
||||
");\n");
|
||||
OUT(c, locp, "gen_set_usr_field_if(USR_OVF,", &ovfl, ");\n");
|
||||
gen_rvalue_free(c, locp, value);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -2162,9 +1999,6 @@ HexValue gen_rvalue_fscr(Context *c, YYLTYPE *locp, HexValue *value)
|
|||
OUT(c, locp, "tcg_gen_concat_i32_i64(",
|
||||
&key, ", ", &frame_key, ", ", &frame_key, ");\n");
|
||||
OUT(c, locp, "tcg_gen_xor_i64(", &res, ", ", value, ", ", &key, ");\n");
|
||||
gen_rvalue_free(c, locp, &key);
|
||||
gen_rvalue_free(c, locp, &frame_key);
|
||||
gen_rvalue_free(c, locp, value);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -2186,7 +2020,6 @@ HexValue gen_rvalue_brev(Context *c, YYLTYPE *locp, HexValue *value)
|
|||
res = gen_tmp(c, locp, value->bit_width, value->signedness);
|
||||
*value = rvalue_materialize(c, locp, value);
|
||||
OUT(c, locp, "gen_helper_fbrev(", &res, ", ", value, ");\n");
|
||||
gen_rvalue_free(c, locp, value);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -2198,7 +2031,6 @@ HexValue gen_rvalue_ternary(Context *c, YYLTYPE *locp, HexValue *cond,
|
|||
unsigned bit_width = (is_64bit) ? 64 : 32;
|
||||
HexValue zero = gen_constant(c, locp, "0", bit_width, UNSIGNED);
|
||||
HexValue res = gen_tmp(c, locp, bit_width, UNSIGNED);
|
||||
Ternary *ternary = NULL;
|
||||
|
||||
if (is_64bit) {
|
||||
*cond = gen_rvalue_extend(c, locp, cond);
|
||||
|
@ -2216,13 +2048,8 @@ HexValue gen_rvalue_ternary(Context *c, YYLTYPE *locp, HexValue *cond,
|
|||
OUT(c, locp, ", ", true_branch, ", ", false_branch, ");\n");
|
||||
|
||||
assert(c->ternary->len > 0);
|
||||
ternary = &g_array_index(c->ternary, Ternary, c->ternary->len - 1);
|
||||
gen_rvalue_free_manual(c, locp, &ternary->cond);
|
||||
g_array_remove_index(c->ternary, c->ternary->len - 1);
|
||||
|
||||
gen_rvalue_free(c, locp, cond);
|
||||
gen_rvalue_free(c, locp, true_branch);
|
||||
gen_rvalue_free(c, locp, false_branch);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -2301,15 +2128,6 @@ void track_string(Context *c, GString *s)
|
|||
g_array_append_val(c->inst.strings, s);
|
||||
}
|
||||
|
||||
void free_variables(Context *c, YYLTYPE *locp)
|
||||
{
|
||||
for (unsigned i = 0; i < c->inst.allocated->len; ++i) {
|
||||
Var *var = &g_array_index(c->inst.allocated, Var, i);
|
||||
const char *suffix = var->bit_width == 64 ? "i64" : "i32";
|
||||
OUT(c, locp, "tcg_temp_free_", suffix, "(", var->name->str, ");\n");
|
||||
}
|
||||
}
|
||||
|
||||
void free_instruction(Context *c)
|
||||
{
|
||||
assert(!is_inside_ternary(c));
|
||||
|
|
|
@ -154,12 +154,6 @@ HexValue gen_tmp(Context *c,
|
|||
unsigned bit_width,
|
||||
HexSignedness signedness);
|
||||
|
||||
HexValue gen_tmp_value(Context *c,
|
||||
YYLTYPE *locp,
|
||||
const char *value,
|
||||
unsigned bit_width,
|
||||
HexSignedness signedness);
|
||||
|
||||
HexValue gen_imm_value(Context *c __attribute__((unused)),
|
||||
YYLTYPE *locp,
|
||||
int value,
|
||||
|
@ -169,8 +163,6 @@ HexValue gen_imm_value(Context *c __attribute__((unused)),
|
|||
HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width,
|
||||
HexSignedness signedness);
|
||||
|
||||
void gen_rvalue_free(Context *c, YYLTYPE *locp, HexValue *rvalue);
|
||||
|
||||
HexValue rvalue_materialize(Context *c, YYLTYPE *locp, HexValue *rvalue);
|
||||
|
||||
HexValue gen_rvalue_extend(Context *c, YYLTYPE *locp, HexValue *rvalue);
|
||||
|
@ -365,8 +357,6 @@ void emit_footer(Context *c);
|
|||
|
||||
void track_string(Context *c, GString *s);
|
||||
|
||||
void free_variables(Context *c, YYLTYPE *locp);
|
||||
|
||||
void free_instruction(Context *c);
|
||||
|
||||
void assert_signedness(Context *c,
|
||||
|
|
|
@ -220,8 +220,6 @@ static inline void gen_pred_cancel(TCGv pred, uint32_t slot_num)
|
|||
tcg_gen_andi_tl(tmp, pred, 1);
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, hex_slot_cancelled, tmp, zero,
|
||||
slot_mask, hex_slot_cancelled);
|
||||
tcg_temp_free(slot_mask);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
#define PRED_LOAD_CANCEL(PRED, EA) \
|
||||
gen_pred_cancel(PRED, insn->is_endloop ? 4 : insn->slot)
|
||||
|
@ -376,10 +374,6 @@ static inline TCGv gen_read_ireg(TCGv result, TCGv val, int shift)
|
|||
tcg_gen_deposit_tl(result, msb, lsb, 0, 7);
|
||||
|
||||
tcg_gen_shli_tl(result, result, shift);
|
||||
|
||||
tcg_temp_free(msb);
|
||||
tcg_temp_free(lsb);
|
||||
|
||||
return result;
|
||||
}
|
||||
#define fREAD_IREG(VAL, SHIFT) gen_read_ireg(ireg, (VAL), (SHIFT))
|
||||
|
@ -512,7 +506,6 @@ static inline TCGv gen_read_ireg(TCGv result, TCGv val, int shift)
|
|||
TCGv tmp = tcg_temp_new(); \
|
||||
tcg_gen_shli_tl(tmp, REG2, SCALE); \
|
||||
tcg_gen_add_tl(EA, REG, tmp); \
|
||||
tcg_temp_free(tmp); \
|
||||
} while (0)
|
||||
#define fEA_IRs(IMM, REG, SCALE) \
|
||||
do { \
|
||||
|
|
|
@ -481,7 +481,6 @@ static void gen_pred_writes(DisasContext *ctx)
|
|||
hex_new_pred_value[pred_num],
|
||||
hex_pred[pred_num]);
|
||||
}
|
||||
tcg_temp_free(pred_written);
|
||||
} else {
|
||||
for (i = 0; i < ctx->preg_log_idx; i++) {
|
||||
int pred_num = ctx->preg_log[i];
|
||||
|
@ -536,7 +535,6 @@ void process_store(DisasContext *ctx, int slot_num)
|
|||
/* Don't do anything if the slot was cancelled */
|
||||
tcg_gen_extract_tl(cancelled, hex_slot_cancelled, slot_num, 1);
|
||||
tcg_gen_brcondi_tl(TCG_COND_NE, cancelled, 0, label_end);
|
||||
tcg_temp_free(cancelled);
|
||||
}
|
||||
{
|
||||
TCGv address = tcg_temp_new();
|
||||
|
@ -586,7 +584,6 @@ void process_store(DisasContext *ctx, int slot_num)
|
|||
gen_helper_commit_store(cpu_env, slot);
|
||||
}
|
||||
}
|
||||
tcg_temp_free(address);
|
||||
}
|
||||
if (is_predicated) {
|
||||
gen_set_label(label_end);
|
||||
|
@ -627,8 +624,6 @@ static void process_dczeroa(DisasContext *ctx)
|
|||
tcg_gen_qemu_st64(zero, addr, ctx->mem_idx);
|
||||
tcg_gen_addi_tl(addr, addr, 8);
|
||||
tcg_gen_qemu_st64(zero, addr, ctx->mem_idx);
|
||||
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -673,7 +668,6 @@ static void gen_commit_hvx(DisasContext *ctx)
|
|||
|
||||
tcg_gen_andi_tl(cmp, hex_VRegs_updated, 1 << rnum);
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, cmp, 0, label_skip);
|
||||
tcg_temp_free(cmp);
|
||||
tcg_gen_gvec_mov(MO_64, dstoff, srcoff, size, size);
|
||||
gen_set_label(label_skip);
|
||||
} else {
|
||||
|
@ -706,7 +700,6 @@ static void gen_commit_hvx(DisasContext *ctx)
|
|||
|
||||
tcg_gen_andi_tl(cmp, hex_QRegs_updated, 1 << rnum);
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, cmp, 0, label_skip);
|
||||
tcg_temp_free(cmp);
|
||||
tcg_gen_gvec_mov(MO_64, dstoff, srcoff, size, size);
|
||||
gen_set_label(label_skip);
|
||||
} else {
|
||||
|
|
|
@ -35,12 +35,10 @@
|
|||
#undef TCGv
|
||||
#undef tcg_temp_new
|
||||
#undef tcg_global_mem_new
|
||||
#undef tcg_temp_free
|
||||
|
||||
#if TARGET_LONG_BITS == 64
|
||||
#define TCGv_tl TCGv_i64
|
||||
#define tcg_temp_new_tl tcg_temp_new_i64
|
||||
#define tcg_temp_free_tl tcg_temp_free_i64
|
||||
#if TARGET_REGISTER_BITS == 64
|
||||
#define tcg_gen_extu_reg_tl tcg_gen_mov_i64
|
||||
#else
|
||||
|
@ -49,7 +47,6 @@
|
|||
#else
|
||||
#define TCGv_tl TCGv_i32
|
||||
#define tcg_temp_new_tl tcg_temp_new_i32
|
||||
#define tcg_temp_free_tl tcg_temp_free_i32
|
||||
#define tcg_gen_extu_reg_tl tcg_gen_mov_i32
|
||||
#endif
|
||||
|
||||
|
@ -58,7 +55,6 @@
|
|||
|
||||
#define tcg_temp_new tcg_temp_new_i64
|
||||
#define tcg_global_mem_new tcg_global_mem_new_i64
|
||||
#define tcg_temp_free tcg_temp_free_i64
|
||||
|
||||
#define tcg_gen_movi_reg tcg_gen_movi_i64
|
||||
#define tcg_gen_mov_reg tcg_gen_mov_i64
|
||||
|
@ -153,7 +149,6 @@
|
|||
#define TCGv_reg TCGv_i32
|
||||
#define tcg_temp_new tcg_temp_new_i32
|
||||
#define tcg_global_mem_new tcg_global_mem_new_i32
|
||||
#define tcg_temp_free tcg_temp_free_i32
|
||||
|
||||
#define tcg_gen_movi_reg tcg_gen_movi_i32
|
||||
#define tcg_gen_mov_reg tcg_gen_mov_i32
|
||||
|
@ -488,10 +483,6 @@ static void cond_free(DisasCond *cond)
|
|||
{
|
||||
switch (cond->c) {
|
||||
default:
|
||||
if (cond->a0 != cpu_psw_n) {
|
||||
tcg_temp_free(cond->a0);
|
||||
}
|
||||
tcg_temp_free(cond->a1);
|
||||
cond->a0 = NULL;
|
||||
cond->a1 = NULL;
|
||||
/* fallthru */
|
||||
|
@ -1021,7 +1012,6 @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res,
|
|||
tcg_gen_and_reg(tmp, in1, in2);
|
||||
tcg_gen_andc_reg(cb, cb, res);
|
||||
tcg_gen_or_reg(cb, cb, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
switch (cf >> 1) {
|
||||
|
@ -1040,7 +1030,6 @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res,
|
|||
tcg_gen_andc_reg(tmp, tmp, res);
|
||||
tcg_gen_andi_reg(tmp, tmp, 0x80808080u);
|
||||
cond = cond_make_0(TCG_COND_NE, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
|
||||
case 3: /* SHZ / NHZ */
|
||||
|
@ -1049,7 +1038,6 @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res,
|
|||
tcg_gen_andc_reg(tmp, tmp, res);
|
||||
tcg_gen_andi_reg(tmp, tmp, 0x80008000u);
|
||||
cond = cond_make_0(TCG_COND_NE, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
break;
|
||||
|
||||
case 4: /* SDC / NDC */
|
||||
|
@ -1070,9 +1058,6 @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res,
|
|||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
if (cf & 8) {
|
||||
tcg_temp_free(cb);
|
||||
}
|
||||
if (cf & 1) {
|
||||
cond.c = tcg_invert_cond(cond.c);
|
||||
}
|
||||
|
@ -1090,7 +1075,6 @@ static TCGv_reg do_add_sv(DisasContext *ctx, TCGv_reg res,
|
|||
tcg_gen_xor_reg(sv, res, in1);
|
||||
tcg_gen_xor_reg(tmp, in1, in2);
|
||||
tcg_gen_andc_reg(sv, sv, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
return sv;
|
||||
}
|
||||
|
@ -1105,7 +1089,6 @@ static TCGv_reg do_sub_sv(DisasContext *ctx, TCGv_reg res,
|
|||
tcg_gen_xor_reg(sv, res, in1);
|
||||
tcg_gen_xor_reg(tmp, in1, in2);
|
||||
tcg_gen_and_reg(sv, sv, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
return sv;
|
||||
}
|
||||
|
@ -1163,7 +1146,6 @@ static void do_add(DisasContext *ctx, unsigned rt, TCGv_reg in1,
|
|||
tmp = tcg_temp_new();
|
||||
tcg_gen_setcond_reg(cond.c, tmp, cond.a0, cond.a1);
|
||||
gen_helper_tcond(cpu_env, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
/* Write back the result. */
|
||||
|
@ -1172,7 +1154,6 @@ static void do_add(DisasContext *ctx, unsigned rt, TCGv_reg in1,
|
|||
save_or_nullify(ctx, cpu_psw_cb_msb, cb_msb);
|
||||
}
|
||||
save_gpr(ctx, rt, dest);
|
||||
tcg_temp_free(dest);
|
||||
|
||||
/* Install the new nullification. */
|
||||
cond_free(&ctx->null_cond);
|
||||
|
@ -1257,16 +1238,12 @@ static void do_sub(DisasContext *ctx, unsigned rt, TCGv_reg in1,
|
|||
tmp = tcg_temp_new();
|
||||
tcg_gen_setcond_reg(cond.c, tmp, cond.a0, cond.a1);
|
||||
gen_helper_tcond(cpu_env, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
/* Write back the result. */
|
||||
save_or_nullify(ctx, cpu_psw_cb, cb);
|
||||
save_or_nullify(ctx, cpu_psw_cb_msb, cb_msb);
|
||||
save_gpr(ctx, rt, dest);
|
||||
tcg_temp_free(dest);
|
||||
tcg_temp_free(cb);
|
||||
tcg_temp_free(cb_msb);
|
||||
|
||||
/* Install the new nullification. */
|
||||
cond_free(&ctx->null_cond);
|
||||
|
@ -1321,7 +1298,6 @@ static void do_cmpclr(DisasContext *ctx, unsigned rt, TCGv_reg in1,
|
|||
/* Clear. */
|
||||
tcg_gen_movi_reg(dest, 0);
|
||||
save_gpr(ctx, rt, dest);
|
||||
tcg_temp_free(dest);
|
||||
|
||||
/* Install the new nullification. */
|
||||
cond_free(&ctx->null_cond);
|
||||
|
@ -1381,7 +1357,6 @@ static void do_unit(DisasContext *ctx, unsigned rt, TCGv_reg in1,
|
|||
TCGv_reg tmp = tcg_temp_new();
|
||||
tcg_gen_setcond_reg(cond.c, tmp, cond.a0, cond.a1);
|
||||
gen_helper_tcond(cpu_env, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
save_gpr(ctx, rt, dest);
|
||||
|
||||
|
@ -1420,11 +1395,9 @@ static TCGv_i64 space_select(DisasContext *ctx, int sp, TCGv_reg base)
|
|||
tcg_gen_shri_reg(tmp, base, TARGET_REGISTER_BITS - 5);
|
||||
tcg_gen_andi_reg(tmp, tmp, 030);
|
||||
tcg_gen_trunc_reg_ptr(ptr, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
tcg_gen_add_ptr(ptr, ptr, cpu_env);
|
||||
tcg_gen_ld_i64(spc, ptr, offsetof(CPUHPPAState, sr[4]));
|
||||
tcg_temp_free_ptr(ptr);
|
||||
|
||||
return spc;
|
||||
}
|
||||
|
@ -1582,7 +1555,6 @@ static bool do_floadw(DisasContext *ctx, unsigned rt, unsigned rb,
|
|||
tmp = tcg_temp_new_i32();
|
||||
do_load_32(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUL);
|
||||
save_frw_i32(rt, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
if (rt == 0) {
|
||||
gen_helper_loaded_fr0(cpu_env);
|
||||
|
@ -1608,7 +1580,6 @@ static bool do_floadd(DisasContext *ctx, unsigned rt, unsigned rb,
|
|||
tmp = tcg_temp_new_i64();
|
||||
do_load_64(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUQ);
|
||||
save_frd(rt, tmp);
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
if (rt == 0) {
|
||||
gen_helper_loaded_fr0(cpu_env);
|
||||
|
@ -1642,7 +1613,6 @@ static bool do_fstorew(DisasContext *ctx, unsigned rt, unsigned rb,
|
|||
|
||||
tmp = load_frw_i32(rt);
|
||||
do_store_32(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUL);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
@ -1663,7 +1633,6 @@ static bool do_fstored(DisasContext *ctx, unsigned rt, unsigned rb,
|
|||
|
||||
tmp = load_frd(rt);
|
||||
do_store_64(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUQ);
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
@ -1685,7 +1654,6 @@ static bool do_fop_wew(DisasContext *ctx, unsigned rt, unsigned ra,
|
|||
func(tmp, cpu_env, tmp);
|
||||
|
||||
save_frw_i32(rt, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -1701,9 +1669,7 @@ static bool do_fop_wed(DisasContext *ctx, unsigned rt, unsigned ra,
|
|||
|
||||
func(dst, cpu_env, src);
|
||||
|
||||
tcg_temp_free_i64(src);
|
||||
save_frw_i32(rt, dst);
|
||||
tcg_temp_free_i32(dst);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -1718,7 +1684,6 @@ static bool do_fop_ded(DisasContext *ctx, unsigned rt, unsigned ra,
|
|||
func(tmp, cpu_env, tmp);
|
||||
|
||||
save_frd(rt, tmp);
|
||||
tcg_temp_free_i64(tmp);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -1734,9 +1699,7 @@ static bool do_fop_dew(DisasContext *ctx, unsigned rt, unsigned ra,
|
|||
|
||||
func(dst, cpu_env, src);
|
||||
|
||||
tcg_temp_free_i32(src);
|
||||
save_frd(rt, dst);
|
||||
tcg_temp_free_i64(dst);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -1752,9 +1715,7 @@ static bool do_fop_weww(DisasContext *ctx, unsigned rt,
|
|||
|
||||
func(a, cpu_env, a, b);
|
||||
|
||||
tcg_temp_free_i32(b);
|
||||
save_frw_i32(rt, a);
|
||||
tcg_temp_free_i32(a);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -1770,9 +1731,7 @@ static bool do_fop_dedd(DisasContext *ctx, unsigned rt,
|
|||
|
||||
func(a, cpu_env, a, b);
|
||||
|
||||
tcg_temp_free_i64(b);
|
||||
save_frd(rt, a);
|
||||
tcg_temp_free_i64(a);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -2098,8 +2057,6 @@ static bool trans_mfsp(DisasContext *ctx, arg_mfsp *a)
|
|||
tcg_gen_trunc_i64_reg(t1, t0);
|
||||
|
||||
save_gpr(ctx, rt, t1);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
cond_free(&ctx->null_cond);
|
||||
return true;
|
||||
|
@ -2176,7 +2133,6 @@ static bool trans_mtsp(DisasContext *ctx, arg_mtsp *a)
|
|||
} else {
|
||||
tcg_gen_mov_i64(cpu_sr[rs], t64);
|
||||
}
|
||||
tcg_temp_free_i64(t64);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
@ -2192,7 +2148,6 @@ static bool trans_mtctl(DisasContext *ctx, arg_mtctl *a)
|
|||
tmp = tcg_temp_new();
|
||||
tcg_gen_andi_reg(tmp, reg, TARGET_REGISTER_BITS - 1);
|
||||
save_or_nullify(ctx, cpu_sar, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
cond_free(&ctx->null_cond);
|
||||
return true;
|
||||
|
@ -2254,7 +2209,6 @@ static bool trans_mtsarcm(DisasContext *ctx, arg_mtsarcm *a)
|
|||
tcg_gen_not_reg(tmp, load_gpr(ctx, a->r));
|
||||
tcg_gen_andi_reg(tmp, tmp, TARGET_REGISTER_BITS - 1);
|
||||
save_or_nullify(ctx, cpu_sar, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
cond_free(&ctx->null_cond);
|
||||
return true;
|
||||
|
@ -2273,8 +2227,6 @@ static bool trans_ldsid(DisasContext *ctx, arg_ldsid *a)
|
|||
tcg_gen_mov_i64(t0, space_select(ctx, a->sp, load_gpr(ctx, a->b)));
|
||||
tcg_gen_shri_i64(t0, t0, 32);
|
||||
tcg_gen_trunc_i64_reg(dest, t0);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
#endif
|
||||
save_gpr(ctx, a->t, dest);
|
||||
|
||||
|
@ -2437,8 +2389,6 @@ static bool trans_probe(DisasContext *ctx, arg_probe *a)
|
|||
|
||||
gen_helper_probe(dest, cpu_env, addr, level, want);
|
||||
|
||||
tcg_temp_free_i32(level);
|
||||
|
||||
save_gpr(ctx, a->t, dest);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
@ -2530,8 +2480,6 @@ static bool trans_ixtlbxf(DisasContext *ctx, arg_ixtlbxf *a)
|
|||
: offsetof(CPUHPPAState, cr[CR_IIAOQ]));
|
||||
tcg_gen_shli_i64(stl, stl, 32);
|
||||
tcg_gen_or_tl(addr, atl, stl);
|
||||
tcg_temp_free_tl(atl);
|
||||
tcg_temp_free_tl(stl);
|
||||
|
||||
reg = load_gpr(ctx, a->r);
|
||||
if (a->addr) {
|
||||
|
@ -2539,7 +2487,6 @@ static bool trans_ixtlbxf(DisasContext *ctx, arg_ixtlbxf *a)
|
|||
} else {
|
||||
gen_helper_itlbp(cpu_env, addr, reg);
|
||||
}
|
||||
tcg_temp_free_tl(addr);
|
||||
|
||||
/* Exit TB for TLB change if mmu is enabled. */
|
||||
if (ctx->tb_flags & PSW_C) {
|
||||
|
@ -2568,7 +2515,6 @@ static bool trans_lpa(DisasContext *ctx, arg_ldst *a)
|
|||
save_gpr(ctx, a->b, ofs);
|
||||
}
|
||||
save_gpr(ctx, a->t, paddr);
|
||||
tcg_temp_free(paddr);
|
||||
|
||||
return nullify_end(ctx);
|
||||
#endif
|
||||
|
@ -2819,8 +2765,6 @@ static bool trans_ds(DisasContext *ctx, arg_rrr_cf *a)
|
|||
tcg_gen_add2_i32(dest, cpu_psw_cb_msb, add1, zero, add2, zero);
|
||||
tcg_gen_add2_i32(dest, cpu_psw_cb_msb, dest, cpu_psw_cb_msb, addc, zero);
|
||||
|
||||
tcg_temp_free(addc);
|
||||
|
||||
/* Write back the result register. */
|
||||
save_gpr(ctx, a->t, dest);
|
||||
|
||||
|
@ -2842,10 +2786,6 @@ static bool trans_ds(DisasContext *ctx, arg_rrr_cf *a)
|
|||
ctx->null_cond = do_cond(a->cf, dest, cpu_psw_cb_msb, sv);
|
||||
}
|
||||
|
||||
tcg_temp_free(add1);
|
||||
tcg_temp_free(add2);
|
||||
tcg_temp_free(dest);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -3100,7 +3040,6 @@ static bool do_addb(DisasContext *ctx, unsigned r, TCGv_reg in1,
|
|||
|
||||
cond = do_cond(c * 2 + f, dest, cb_msb, sv);
|
||||
save_gpr(ctx, r, dest);
|
||||
tcg_temp_free(dest);
|
||||
return do_cbranch(ctx, disp, n, &cond);
|
||||
}
|
||||
|
||||
|
@ -3128,7 +3067,6 @@ static bool trans_bb_sar(DisasContext *ctx, arg_bb_sar *a)
|
|||
tcg_gen_shl_reg(tmp, tcg_r, cpu_sar);
|
||||
|
||||
cond = cond_make_0(a->c ? TCG_COND_GE : TCG_COND_LT, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
return do_cbranch(ctx, a->disp, a->n, &cond);
|
||||
}
|
||||
|
||||
|
@ -3144,7 +3082,6 @@ static bool trans_bb_imm(DisasContext *ctx, arg_bb_imm *a)
|
|||
tcg_gen_shli_reg(tmp, tcg_r, a->p);
|
||||
|
||||
cond = cond_make_0(a->c ? TCG_COND_GE : TCG_COND_LT, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
return do_cbranch(ctx, a->disp, a->n, &cond);
|
||||
}
|
||||
|
||||
|
@ -3197,7 +3134,6 @@ static bool trans_shrpw_sar(DisasContext *ctx, arg_shrpw_sar *a)
|
|||
tcg_gen_trunc_reg_i32(t32, load_gpr(ctx, a->r2));
|
||||
tcg_gen_rotr_i32(t32, t32, cpu_sar);
|
||||
tcg_gen_extu_i32_reg(dest, t32);
|
||||
tcg_temp_free_i32(t32);
|
||||
} else {
|
||||
TCGv_i64 t = tcg_temp_new_i64();
|
||||
TCGv_i64 s = tcg_temp_new_i64();
|
||||
|
@ -3206,9 +3142,6 @@ static bool trans_shrpw_sar(DisasContext *ctx, arg_shrpw_sar *a)
|
|||
tcg_gen_extu_reg_i64(s, cpu_sar);
|
||||
tcg_gen_shr_i64(t, t, s);
|
||||
tcg_gen_trunc_i64_reg(dest, t);
|
||||
|
||||
tcg_temp_free_i64(t);
|
||||
tcg_temp_free_i64(s);
|
||||
}
|
||||
save_gpr(ctx, a->t, dest);
|
||||
|
||||
|
@ -3240,13 +3173,11 @@ static bool trans_shrpw_imm(DisasContext *ctx, arg_shrpw_imm *a)
|
|||
tcg_gen_trunc_reg_i32(t32, t2);
|
||||
tcg_gen_rotri_i32(t32, t32, sa);
|
||||
tcg_gen_extu_i32_reg(dest, t32);
|
||||
tcg_temp_free_i32(t32);
|
||||
} else {
|
||||
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||
tcg_gen_concat_reg_i64(t64, t2, cpu_gr[a->r1]);
|
||||
tcg_gen_shri_i64(t64, t64, sa);
|
||||
tcg_gen_trunc_i64_reg(dest, t64);
|
||||
tcg_temp_free_i64(t64);
|
||||
}
|
||||
save_gpr(ctx, a->t, dest);
|
||||
|
||||
|
@ -3280,7 +3211,6 @@ static bool trans_extrw_sar(DisasContext *ctx, arg_extrw_sar *a)
|
|||
tcg_gen_shr_reg(dest, src, tmp);
|
||||
tcg_gen_extract_reg(dest, dest, 0, len);
|
||||
}
|
||||
tcg_temp_free(tmp);
|
||||
save_gpr(ctx, a->t, dest);
|
||||
|
||||
/* Install the new nullification. */
|
||||
|
@ -3410,9 +3340,6 @@ static bool do_depw_sar(DisasContext *ctx, unsigned rt, unsigned c,
|
|||
} else {
|
||||
tcg_gen_shl_reg(dest, tmp, shift);
|
||||
}
|
||||
tcg_temp_free(shift);
|
||||
tcg_temp_free(mask);
|
||||
tcg_temp_free(tmp);
|
||||
save_gpr(ctx, rt, dest);
|
||||
|
||||
/* Install the new nullification. */
|
||||
|
@ -3487,7 +3414,6 @@ static bool trans_be(DisasContext *ctx, arg_be *a)
|
|||
tcg_gen_mov_i64(cpu_iasq_b, new_spc);
|
||||
nullify_set(ctx, a->n);
|
||||
}
|
||||
tcg_temp_free_i64(new_spc);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
ctx->base.is_jmp = DISAS_NORETURN;
|
||||
return nullify_end(ctx);
|
||||
|
@ -3876,9 +3802,6 @@ static bool trans_fcmp_f(DisasContext *ctx, arg_fclass2 *a)
|
|||
|
||||
gen_helper_fcmp_s(cpu_env, ta, tb, ty, tc);
|
||||
|
||||
tcg_temp_free_i32(ta);
|
||||
tcg_temp_free_i32(tb);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -3896,9 +3819,6 @@ static bool trans_fcmp_d(DisasContext *ctx, arg_fclass2 *a)
|
|||
|
||||
gen_helper_fcmp_d(cpu_env, ta, tb, ty, tc);
|
||||
|
||||
tcg_temp_free_i64(ta);
|
||||
tcg_temp_free_i64(tb);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -3958,7 +3878,6 @@ static bool trans_ftest(DisasContext *ctx, arg_ftest *a)
|
|||
|
||||
tcg_gen_extract_reg(t, t, 21 - cbit, 1);
|
||||
ctx->null_cond = cond_make_0(TCG_COND_NE, t);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -4019,8 +3938,6 @@ static bool trans_xmpyu(DisasContext *ctx, arg_xmpyu *a)
|
|||
y = load_frw0_i64(a->r2);
|
||||
tcg_gen_mul_i64(x, x, y);
|
||||
save_frd(a->t, x);
|
||||
tcg_temp_free_i64(x);
|
||||
tcg_temp_free_i64(y);
|
||||
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
@ -4094,10 +4011,7 @@ static bool trans_fmpyfadd_f(DisasContext *ctx, arg_fmpyfadd_f *a)
|
|||
gen_helper_fmpyfadd_s(x, cpu_env, x, y, z);
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(y);
|
||||
tcg_temp_free_i32(z);
|
||||
save_frw_i32(a->t, x);
|
||||
tcg_temp_free_i32(x);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -4116,10 +4030,7 @@ static bool trans_fmpyfadd_d(DisasContext *ctx, arg_fmpyfadd_d *a)
|
|||
gen_helper_fmpyfadd_d(x, cpu_env, x, y, z);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(y);
|
||||
tcg_temp_free_i64(z);
|
||||
save_frd(a->t, x);
|
||||
tcg_temp_free_i64(x);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
|
||||
|
@ -4234,13 +4145,11 @@ static void hppa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
/* Free any temporaries allocated. */
|
||||
/* Forget any temporaries allocated. */
|
||||
for (i = 0, n = ctx->ntempr; i < n; ++i) {
|
||||
tcg_temp_free(ctx->tempr[i]);
|
||||
ctx->tempr[i] = NULL;
|
||||
}
|
||||
for (i = 0, n = ctx->ntempl; i < n; ++i) {
|
||||
tcg_temp_free_tl(ctx->templ[i]);
|
||||
ctx->templ[i] = NULL;
|
||||
}
|
||||
ctx->ntempr = 0;
|
||||
|
|
|
@ -1567,20 +1567,6 @@ illegal:
|
|||
return false;
|
||||
}
|
||||
|
||||
static void decode_temp_free(X86DecodedOp *op)
|
||||
{
|
||||
if (op->v_ptr) {
|
||||
tcg_temp_free_ptr(op->v_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void decode_temps_free(X86DecodedInsn *decode)
|
||||
{
|
||||
decode_temp_free(&decode->op[0]);
|
||||
decode_temp_free(&decode->op[1]);
|
||||
decode_temp_free(&decode->op[2]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert one instruction. s->base.is_jmp is set if the translation must
|
||||
* be stopped.
|
||||
|
@ -1835,7 +1821,6 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
|
|||
decode.e.gen(s, env, &decode);
|
||||
gen_writeback(s, &decode, 0, s->T0);
|
||||
}
|
||||
decode_temps_free(&decode);
|
||||
return;
|
||||
illegal_op:
|
||||
gen_illegal_opcode(s);
|
||||
|
|
|
@ -629,7 +629,6 @@ static inline void gen_ternary_sse(DisasContext *s, CPUX86State *env, X86Decoded
|
|||
/* The format of the fourth input is Lx */
|
||||
tcg_gen_addi_ptr(ptr3, cpu_env, ZMM_OFFSET(op3));
|
||||
fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, ptr3);
|
||||
tcg_temp_free_ptr(ptr3);
|
||||
}
|
||||
#define TERNARY_SSE(uname, uvname, lname) \
|
||||
static void gen_##uvname(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) \
|
||||
|
@ -1001,7 +1000,6 @@ static inline void gen_vsib_avx(DisasContext *s, CPUX86State *env, X86DecodedIns
|
|||
int ymmh_ofs = vector_elem_offset(&decode->op[1], MO_128, 1);
|
||||
tcg_gen_gvec_dup_imm(MO_64, ymmh_ofs, 16, 16, 0);
|
||||
}
|
||||
tcg_temp_free_ptr(index);
|
||||
}
|
||||
#define VSIB_AVX(uname, lname) \
|
||||
static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) \
|
||||
|
@ -1627,7 +1625,6 @@ static void gen_PMOVMSKB(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco
|
|||
tcg_gen_deposit_tl(s->T0, t, s->T0, 8, TARGET_LONG_BITS - 8);
|
||||
}
|
||||
}
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void gen_PSHUFW(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
|
@ -1762,7 +1759,6 @@ static void gen_PSRLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco
|
|||
} else {
|
||||
gen_helper_psrldq_xmm(cpu_env, OP_PTR0, OP_PTR1, imm_vec);
|
||||
}
|
||||
tcg_temp_free_ptr(imm_vec);
|
||||
}
|
||||
|
||||
static void gen_PSLLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
|
@ -1775,7 +1771,6 @@ static void gen_PSLLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco
|
|||
} else {
|
||||
gen_helper_pslldq_xmm(cpu_env, OP_PTR0, OP_PTR1, imm_vec);
|
||||
}
|
||||
tcg_temp_free_ptr(imm_vec);
|
||||
}
|
||||
|
||||
static void gen_RORX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
|
@ -2293,7 +2288,6 @@ static void gen_VZEROALL(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco
|
|||
tcg_gen_addi_ptr(ptr, cpu_env, offsetof(CPUX86State, xmm_t0));
|
||||
gen_helper_memset(ptr, ptr, tcg_constant_i32(0),
|
||||
tcg_constant_ptr(CPU_NB_REGS * sizeof(ZMMReg)));
|
||||
tcg_temp_free_ptr(ptr);
|
||||
}
|
||||
|
||||
static void gen_VZEROUPPER(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
|
|
|
@ -899,10 +899,6 @@ static void gen_compute_eflags(DisasContext *s)
|
|||
gen_update_cc_op(s);
|
||||
gen_helper_cc_compute_all(cpu_cc_src, dst, src1, src2, cpu_cc_op);
|
||||
set_cc_op(s, CC_OP_EFLAGS);
|
||||
|
||||
if (dead) {
|
||||
tcg_temp_free(zero);
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct CCPrepare {
|
||||
|
@ -1650,7 +1646,6 @@ static void gen_shift_flags(DisasContext *s, MemOp ot, TCGv result,
|
|||
} else {
|
||||
tcg_gen_mov_tl(cpu_cc_src, shm1);
|
||||
}
|
||||
tcg_temp_free(z_tl);
|
||||
|
||||
/* Get the two potential CC_OP values into temporaries. */
|
||||
tcg_gen_movi_i32(s->tmp2_i32, (is_right ? CC_OP_SARB : CC_OP_SHLB) + ot);
|
||||
|
@ -1666,8 +1661,6 @@ static void gen_shift_flags(DisasContext *s, MemOp ot, TCGv result,
|
|||
s32 = tcg_temp_new_i32();
|
||||
tcg_gen_trunc_tl_i32(s32, count);
|
||||
tcg_gen_movcond_i32(TCG_COND_NE, cpu_cc_op, s32, z32, s->tmp2_i32, oldop);
|
||||
tcg_temp_free_i32(z32);
|
||||
tcg_temp_free_i32(s32);
|
||||
|
||||
/* The CC_OP value is no longer predictable. */
|
||||
set_cc_op(s, CC_OP_DYNAMIC);
|
||||
|
@ -1827,8 +1820,6 @@ static void gen_rot_rm_T1(DisasContext *s, MemOp ot, int op1, int is_right)
|
|||
tcg_gen_movi_i32(s->tmp3_i32, CC_OP_EFLAGS);
|
||||
tcg_gen_movcond_i32(TCG_COND_NE, cpu_cc_op, t1, t0,
|
||||
s->tmp2_i32, s->tmp3_i32);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(t1);
|
||||
|
||||
/* The CC_OP value is no longer predictable. */
|
||||
set_cc_op(s, CC_OP_DYNAMIC);
|
||||
|
@ -2049,7 +2040,6 @@ static void gen_shiftd_rm_T1(DisasContext *s, MemOp ot, int op1,
|
|||
gen_op_st_rm_T0_A0(s, ot, op1);
|
||||
|
||||
gen_shift_flags(s, ot, s->T0, s->tmp0, count, is_right);
|
||||
tcg_temp_free(count);
|
||||
}
|
||||
|
||||
static void gen_shift(DisasContext *s1, int op, MemOp ot, int d, int s)
|
||||
|
@ -2513,13 +2503,6 @@ static void gen_cmovcc1(CPUX86State *env, DisasContext *s, MemOp ot, int b,
|
|||
tcg_gen_movcond_tl(cc.cond, s->T0, cc.reg, cc.reg2,
|
||||
s->T0, cpu_regs[reg]);
|
||||
gen_op_mov_reg_v(s, ot, reg, s->T0);
|
||||
|
||||
if (cc.mask != -1) {
|
||||
tcg_temp_free(cc.reg);
|
||||
}
|
||||
if (!cc.use_reg2) {
|
||||
tcg_temp_free(cc.reg2);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void gen_op_movl_T0_seg(DisasContext *s, X86Seg seg_reg)
|
||||
|
@ -2748,7 +2731,6 @@ static void gen_set_hflag(DisasContext *s, uint32_t mask)
|
|||
tcg_gen_ld_i32(t, cpu_env, offsetof(CPUX86State, hflags));
|
||||
tcg_gen_ori_i32(t, t, mask);
|
||||
tcg_gen_st_i32(t, cpu_env, offsetof(CPUX86State, hflags));
|
||||
tcg_temp_free_i32(t);
|
||||
s->flags |= mask;
|
||||
}
|
||||
}
|
||||
|
@ -2760,7 +2742,6 @@ static void gen_reset_hflag(DisasContext *s, uint32_t mask)
|
|||
tcg_gen_ld_i32(t, cpu_env, offsetof(CPUX86State, hflags));
|
||||
tcg_gen_andi_i32(t, t, ~mask);
|
||||
tcg_gen_st_i32(t, cpu_env, offsetof(CPUX86State, hflags));
|
||||
tcg_temp_free_i32(t);
|
||||
s->flags &= ~mask;
|
||||
}
|
||||
}
|
||||
|
@ -2772,7 +2753,6 @@ static void gen_set_eflags(DisasContext *s, target_ulong mask)
|
|||
tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_gen_ori_tl(t, t, mask);
|
||||
tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void gen_reset_eflags(DisasContext *s, target_ulong mask)
|
||||
|
@ -2782,7 +2762,6 @@ static void gen_reset_eflags(DisasContext *s, target_ulong mask)
|
|||
tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_gen_andi_tl(t, t, ~mask);
|
||||
tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
/* Clear BND registers during legacy branches. */
|
||||
|
@ -3015,13 +2994,11 @@ static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm)
|
|||
tcg_gen_nonatomic_cmpxchg_i64(old, s->A0, cmp, val,
|
||||
s->mem_index, MO_TEUQ);
|
||||
}
|
||||
tcg_temp_free_i64(val);
|
||||
|
||||
/* Set tmp0 to match the required value of Z. */
|
||||
tcg_gen_setcond_i64(TCG_COND_EQ, cmp, old, cmp);
|
||||
Z = tcg_temp_new();
|
||||
tcg_gen_trunc_i64_tl(Z, cmp);
|
||||
tcg_temp_free_i64(cmp);
|
||||
|
||||
/*
|
||||
* Extract the result values for the register pair.
|
||||
|
@ -3042,12 +3019,10 @@ static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm)
|
|||
tcg_gen_movcond_tl(TCG_COND_EQ, cpu_regs[R_EDX], Z, zero,
|
||||
s->T1, cpu_regs[R_EDX]);
|
||||
}
|
||||
tcg_temp_free_i64(old);
|
||||
|
||||
/* Update Z. */
|
||||
gen_compute_eflags(s);
|
||||
tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, Z, ctz32(CC_Z), 1);
|
||||
tcg_temp_free(Z);
|
||||
}
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
|
@ -3072,8 +3047,6 @@ static void gen_cmpxchg16b(DisasContext *s, CPUX86State *env, int modrm)
|
|||
}
|
||||
|
||||
tcg_gen_extr_i128_i64(s->T0, s->T1, val);
|
||||
tcg_temp_free_i128(cmp);
|
||||
tcg_temp_free_i128(val);
|
||||
|
||||
/* Determine success after the fact. */
|
||||
t0 = tcg_temp_new_i64();
|
||||
|
@ -3081,13 +3054,11 @@ static void gen_cmpxchg16b(DisasContext *s, CPUX86State *env, int modrm)
|
|||
tcg_gen_xor_i64(t0, s->T0, cpu_regs[R_EAX]);
|
||||
tcg_gen_xor_i64(t1, s->T1, cpu_regs[R_EDX]);
|
||||
tcg_gen_or_i64(t0, t0, t1);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
/* Update Z. */
|
||||
gen_compute_eflags(s);
|
||||
tcg_gen_setcondi_i64(TCG_COND_EQ, t0, t0, 0);
|
||||
tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, t0, ctz32(CC_Z), 1);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
/*
|
||||
* Extract the result values for the register pair. We may do this
|
||||
|
@ -3437,10 +3408,8 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
tcg_gen_neg_tl(t1, t0);
|
||||
tcg_gen_atomic_cmpxchg_tl(t0, a0, t0, t1,
|
||||
s->mem_index, ot | MO_LE);
|
||||
tcg_temp_free(t1);
|
||||
tcg_gen_brcond_tl(TCG_COND_NE, t0, t2, label1);
|
||||
|
||||
tcg_temp_free(t2);
|
||||
tcg_gen_neg_tl(s->T0, t0);
|
||||
} else {
|
||||
tcg_gen_neg_tl(s->T0, s->T0);
|
||||
|
@ -3927,9 +3896,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
tcg_gen_mov_tl(s->cc_srcT, cmpv);
|
||||
tcg_gen_sub_tl(cpu_cc_dst, cmpv, oldv);
|
||||
set_cc_op(s, CC_OP_SUBB + ot);
|
||||
tcg_temp_free(oldv);
|
||||
tcg_temp_free(newv);
|
||||
tcg_temp_free(cmpv);
|
||||
}
|
||||
break;
|
||||
case 0x1c7: /* cmpxchg8b */
|
||||
|
@ -4380,7 +4346,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
if (shift) {
|
||||
TCGv imm = tcg_const_tl(x86_ldub_code(env, s));
|
||||
gen_shiftd_rm_T1(s, ot, opreg, op, imm);
|
||||
tcg_temp_free(imm);
|
||||
} else {
|
||||
gen_shiftd_rm_T1(s, ot, opreg, op, cpu_regs[R_ECX]);
|
||||
}
|
||||
|
@ -4614,7 +4579,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
tcg_gen_st_tl(last_addr, cpu_env,
|
||||
offsetof(CPUX86State, fpdp));
|
||||
}
|
||||
tcg_temp_free(last_addr);
|
||||
} else {
|
||||
/* register float ops */
|
||||
opreg = rm;
|
||||
|
@ -5262,52 +5226,19 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
case 0x9d: /* popf */
|
||||
gen_svm_check_intercept(s, SVM_EXIT_POPF);
|
||||
if (check_vm86_iopl(s)) {
|
||||
ot = gen_pop_T0(s);
|
||||
int mask = TF_MASK | AC_MASK | ID_MASK | NT_MASK;
|
||||
|
||||
if (CPL(s) == 0) {
|
||||
if (dflag != MO_16) {
|
||||
gen_helper_write_eflags(cpu_env, s->T0,
|
||||
tcg_const_i32((TF_MASK | AC_MASK |
|
||||
ID_MASK | NT_MASK |
|
||||
IF_MASK |
|
||||
IOPL_MASK)));
|
||||
} else {
|
||||
gen_helper_write_eflags(cpu_env, s->T0,
|
||||
tcg_const_i32((TF_MASK | AC_MASK |
|
||||
ID_MASK | NT_MASK |
|
||||
IF_MASK | IOPL_MASK)
|
||||
& 0xffff));
|
||||
}
|
||||
} else {
|
||||
if (CPL(s) <= IOPL(s)) {
|
||||
if (dflag != MO_16) {
|
||||
gen_helper_write_eflags(cpu_env, s->T0,
|
||||
tcg_const_i32((TF_MASK |
|
||||
AC_MASK |
|
||||
ID_MASK |
|
||||
NT_MASK |
|
||||
IF_MASK)));
|
||||
} else {
|
||||
gen_helper_write_eflags(cpu_env, s->T0,
|
||||
tcg_const_i32((TF_MASK |
|
||||
AC_MASK |
|
||||
ID_MASK |
|
||||
NT_MASK |
|
||||
IF_MASK)
|
||||
& 0xffff));
|
||||
}
|
||||
} else {
|
||||
if (dflag != MO_16) {
|
||||
gen_helper_write_eflags(cpu_env, s->T0,
|
||||
tcg_const_i32((TF_MASK | AC_MASK |
|
||||
ID_MASK | NT_MASK)));
|
||||
} else {
|
||||
gen_helper_write_eflags(cpu_env, s->T0,
|
||||
tcg_const_i32((TF_MASK | AC_MASK |
|
||||
ID_MASK | NT_MASK)
|
||||
& 0xffff));
|
||||
}
|
||||
}
|
||||
mask |= IF_MASK | IOPL_MASK;
|
||||
} else if (CPL(s) <= IOPL(s)) {
|
||||
mask |= IF_MASK;
|
||||
}
|
||||
if (dflag == MO_16) {
|
||||
mask &= 0xffff;
|
||||
}
|
||||
|
||||
ot = gen_pop_T0(s);
|
||||
gen_helper_write_eflags(cpu_env, s->T0, tcg_constant_i32(mask));
|
||||
gen_pop_update(s, ot);
|
||||
set_cc_op(s, CC_OP_EFLAGS);
|
||||
/* abort translation because TF/AC flag may change */
|
||||
|
@ -6279,9 +6210,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
gen_compute_eflags(s);
|
||||
tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~CC_Z);
|
||||
tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, t2);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
}
|
||||
break;
|
||||
case 0x102: /* lar */
|
||||
|
@ -6308,7 +6236,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
gen_op_mov_reg_v(s, ot, reg, t0);
|
||||
gen_set_label(label1);
|
||||
set_cc_op(s, CC_OP_EFLAGS);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
break;
|
||||
case 0x118:
|
||||
|
@ -6353,7 +6280,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
TCGv_i64 notu = tcg_temp_new_i64();
|
||||
tcg_gen_not_i64(notu, cpu_bndu[reg]);
|
||||
gen_bndck(env, s, modrm, TCG_COND_GTU, notu);
|
||||
tcg_temp_free_i64(notu);
|
||||
} else if (prefixes & PREFIX_DATA) {
|
||||
/* bndmov -- from reg/mem */
|
||||
if (reg >= 4 || s->aflag == MO_16) {
|
||||
|
|
|
@ -100,14 +100,12 @@ static void gen_mulh_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
{
|
||||
TCGv discard = tcg_temp_new();
|
||||
tcg_gen_muls2_tl(discard, dest, src1, src2);
|
||||
tcg_temp_free(discard);
|
||||
}
|
||||
|
||||
static void gen_mulh_du(TCGv dest, TCGv src1, TCGv src2)
|
||||
{
|
||||
TCGv discard = tcg_temp_new();
|
||||
tcg_gen_mulu2_tl(discard, dest, src1, src2);
|
||||
tcg_temp_free(discard);
|
||||
}
|
||||
|
||||
static void prep_divisor_d(TCGv ret, TCGv src1, TCGv src2)
|
||||
|
@ -129,9 +127,6 @@ static void prep_divisor_d(TCGv ret, TCGv src1, TCGv src2)
|
|||
tcg_gen_and_tl(ret, ret, t0);
|
||||
tcg_gen_or_tl(ret, ret, t1);
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, ret, ret, zero, ret, src2);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
}
|
||||
|
||||
static void prep_divisor_du(TCGv ret, TCGv src2)
|
||||
|
@ -152,7 +147,6 @@ static void gen_div_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
prep_divisor_d(t0, src1, src2);
|
||||
tcg_gen_div_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_rem_d(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -160,7 +154,6 @@ static void gen_rem_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
prep_divisor_d(t0, src1, src2);
|
||||
tcg_gen_rem_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_div_du(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -168,7 +161,6 @@ static void gen_div_du(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
prep_divisor_du(t0, src2);
|
||||
tcg_gen_divu_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_rem_du(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -176,7 +168,6 @@ static void gen_rem_du(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
prep_divisor_du(t0, src2);
|
||||
tcg_gen_remu_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_div_w(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -185,7 +176,6 @@ static void gen_div_w(TCGv dest, TCGv src1, TCGv src2)
|
|||
/* We need not check for integer overflow for div_w. */
|
||||
prep_divisor_du(t0, src2);
|
||||
tcg_gen_div_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_rem_w(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -194,7 +184,6 @@ static void gen_rem_w(TCGv dest, TCGv src1, TCGv src2)
|
|||
/* We need not check for integer overflow for rem_w. */
|
||||
prep_divisor_du(t0, src2);
|
||||
tcg_gen_rem_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_alsl(TCGv dest, TCGv src1, TCGv src2, target_long sa)
|
||||
|
@ -202,7 +191,6 @@ static void gen_alsl(TCGv dest, TCGv src1, TCGv src2, target_long sa)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_shli_tl(t0, src1, sa);
|
||||
tcg_gen_add_tl(dest, t0, src2);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static bool trans_lu32i_d(DisasContext *ctx, arg_lu32i_d *a)
|
||||
|
|
|
@ -14,7 +14,6 @@ static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop)
|
|||
tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
|
||||
tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
|
||||
gen_set_gpr(a->rd, dest, EXT_NONE);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -43,8 +42,6 @@ static bool gen_sc(DisasContext *ctx, arg_rr_i *a, MemOp mop)
|
|||
tcg_gen_setcond_tl(TCG_COND_EQ, dest, t0, cpu_llval);
|
||||
gen_set_label(done);
|
||||
gen_set_gpr(a->rd, dest, EXT_NONE);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(val);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -122,9 +122,6 @@ static void gen_revb_2h(TCGv dest, TCGv src1)
|
|||
tcg_gen_and_tl(t1, src1, mask);
|
||||
tcg_gen_shli_tl(t1, t1, 8);
|
||||
tcg_gen_or_tl(dest, t0, t1);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
}
|
||||
|
||||
static void gen_revb_4h(TCGv dest, TCGv src1)
|
||||
|
@ -138,9 +135,6 @@ static void gen_revb_4h(TCGv dest, TCGv src1)
|
|||
tcg_gen_and_tl(t1, src1, mask);
|
||||
tcg_gen_shli_tl(t1, t1, 8);
|
||||
tcg_gen_or_tl(dest, t0, t1);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
}
|
||||
|
||||
static void gen_revh_2w(TCGv dest, TCGv src1)
|
||||
|
@ -154,9 +148,6 @@ static void gen_revh_2w(TCGv dest, TCGv src1)
|
|||
tcg_gen_and_i64(t0, t0, mask);
|
||||
tcg_gen_shli_i64(t1, t1, 16);
|
||||
tcg_gen_or_i64(dest, t1, t0);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static void gen_revh_d(TCGv dest, TCGv src1)
|
||||
|
@ -171,9 +162,6 @@ static void gen_revh_d(TCGv dest, TCGv src1)
|
|||
tcg_gen_shli_tl(t0, t0, 16);
|
||||
tcg_gen_or_tl(t0, t0, t1);
|
||||
tcg_gen_rotri_tl(dest, t0, 32);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
}
|
||||
|
||||
static void gen_maskeqz(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
|
|
@ -38,7 +38,6 @@ static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a)
|
|||
fn(var, cpu_env, cpu_fpr[a->fj], cpu_fpr[a->fk], tcg_constant_i32(flags));
|
||||
|
||||
tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
|
||||
tcg_temp_free(var);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -57,7 +56,5 @@ static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a)
|
|||
fn(var, cpu_env, cpu_fpr[a->fj], cpu_fpr[a->fk], tcg_constant_i32(flags));
|
||||
|
||||
tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
|
||||
|
||||
tcg_temp_free(var);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -13,12 +13,11 @@ static void maybe_nanbox_load(TCGv freg, MemOp mop)
|
|||
static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
|
||||
{
|
||||
TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
|
||||
TCGv temp = NULL;
|
||||
|
||||
CHECK_FPE;
|
||||
|
||||
if (a->imm) {
|
||||
temp = tcg_temp_new();
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, addr, a->imm);
|
||||
addr = temp;
|
||||
}
|
||||
|
@ -26,31 +25,22 @@ static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
|
|||
tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
maybe_nanbox_load(cpu_fpr[a->fd], mop);
|
||||
|
||||
if (temp) {
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
|
||||
{
|
||||
TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
|
||||
TCGv temp = NULL;
|
||||
|
||||
CHECK_FPE;
|
||||
|
||||
if (a->imm) {
|
||||
temp = tcg_temp_new();
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, addr, a->imm);
|
||||
addr = temp;
|
||||
}
|
||||
|
||||
tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
|
||||
if (temp) {
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -66,7 +56,6 @@ static bool gen_floadx(DisasContext *ctx, arg_frr *a, MemOp mop)
|
|||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
maybe_nanbox_load(cpu_fpr[a->fd], mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -82,7 +71,6 @@ static bool gen_fstorex(DisasContext *ctx, arg_frr *a, MemOp mop)
|
|||
addr = tcg_temp_new();
|
||||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -100,7 +88,6 @@ static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
|
|||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
maybe_nanbox_load(cpu_fpr[a->fd], mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -117,7 +104,6 @@ static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
|
|||
gen_helper_asrtgt_d(cpu_env, src1, src2);
|
||||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -135,7 +121,6 @@ static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop)
|
|||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
maybe_nanbox_load(cpu_fpr[a->fd], mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -152,7 +137,6 @@ static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop)
|
|||
gen_helper_asrtle_d(cpu_env, src1, src2);
|
||||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,6 @@ static bool trans_fsel(DisasContext *ctx, arg_fsel *a)
|
|||
tcg_gen_ld8u_tl(cond, cpu_env, offsetof(CPULoongArchState, cf[a->ca]));
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, cpu_fpr[a->fd], cond, zero,
|
||||
cpu_fpr[a->fj], cpu_fpr[a->fk]);
|
||||
tcg_temp_free(cond);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -82,9 +81,6 @@ static bool trans_movgr2fcsr(DisasContext *ctx, arg_movgr2fcsr *a)
|
|||
tcg_gen_andi_i32(fcsr0, fcsr0, ~mask);
|
||||
tcg_gen_or_i32(fcsr0, fcsr0, temp);
|
||||
tcg_gen_st_i32(fcsr0, cpu_env, offsetof(CPULoongArchState, fcsr0));
|
||||
|
||||
tcg_temp_free_i32(temp);
|
||||
tcg_temp_free_i32(fcsr0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -134,7 +130,6 @@ static bool trans_movfr2cf(DisasContext *ctx, arg_movfr2cf *a)
|
|||
t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, cpu_fpr[a->fj], 0x1);
|
||||
tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7]));
|
||||
tcg_temp_free(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -157,7 +152,6 @@ static bool trans_movgr2cf(DisasContext *ctx, arg_movgr2cf *a)
|
|||
t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, gpr_src(ctx, a->rj, EXT_NONE), 0x1);
|
||||
tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7]));
|
||||
tcg_temp_free(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -7,21 +7,15 @@ static bool gen_load(DisasContext *ctx, arg_rr_i *a, MemOp mop)
|
|||
{
|
||||
TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
|
||||
TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
|
||||
TCGv temp = NULL;
|
||||
|
||||
if (a->imm) {
|
||||
temp = tcg_temp_new();
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, addr, a->imm);
|
||||
addr = temp;
|
||||
}
|
||||
|
||||
tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
|
||||
gen_set_gpr(a->rd, dest, EXT_NONE);
|
||||
|
||||
if (temp) {
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -29,20 +23,14 @@ static bool gen_store(DisasContext *ctx, arg_rr_i *a, MemOp mop)
|
|||
{
|
||||
TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
|
||||
TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
|
||||
TCGv temp = NULL;
|
||||
|
||||
if (a->imm) {
|
||||
temp = tcg_temp_new();
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, addr, a->imm);
|
||||
addr = temp;
|
||||
}
|
||||
|
||||
tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
|
||||
|
||||
if (temp) {
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -56,7 +44,6 @@ static bool gen_loadx(DisasContext *ctx, arg_rrr *a, MemOp mop)
|
|||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
|
||||
gen_set_gpr(a->rd, dest, EXT_NONE);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -70,7 +57,6 @@ static bool gen_storex(DisasContext *ctx, arg_rrr *a, MemOp mop)
|
|||
|
||||
tcg_gen_add_tl(addr, src1, src2);
|
||||
tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -146,21 +132,15 @@ static bool gen_ldptr(DisasContext *ctx, arg_rr_i *a, MemOp mop)
|
|||
{
|
||||
TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
|
||||
TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
|
||||
TCGv temp = NULL;
|
||||
|
||||
if (a->imm) {
|
||||
temp = tcg_temp_new();
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, addr, a->imm);
|
||||
addr = temp;
|
||||
}
|
||||
|
||||
tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
|
||||
gen_set_gpr(a->rd, dest, EXT_NONE);
|
||||
|
||||
if (temp) {
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -168,20 +148,14 @@ static bool gen_stptr(DisasContext *ctx, arg_rr_i *a, MemOp mop)
|
|||
{
|
||||
TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
|
||||
TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
|
||||
TCGv temp = NULL;
|
||||
|
||||
if (a->imm) {
|
||||
temp = tcg_temp_new();
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, addr, a->imm);
|
||||
addr = temp;
|
||||
}
|
||||
|
||||
tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
|
||||
|
||||
if (temp) {
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -243,7 +243,7 @@ static bool trans_csrwr(DisasContext *ctx, arg_csrwr *a)
|
|||
dest = gpr_dst(ctx, a->rd, EXT_NONE);
|
||||
csr->writefn(dest, cpu_env, src1);
|
||||
} else {
|
||||
dest = temp_new(ctx);
|
||||
dest = tcg_temp_new();
|
||||
tcg_gen_ld_tl(dest, cpu_env, csr->offset);
|
||||
tcg_gen_st_tl(src1, cpu_env, csr->offset);
|
||||
}
|
||||
|
@ -291,10 +291,6 @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a)
|
|||
tcg_gen_st_tl(newv, cpu_env, csr->offset);
|
||||
}
|
||||
gen_set_gpr(a->rd, oldv, EXT_NONE);
|
||||
|
||||
tcg_temp_free(temp);
|
||||
tcg_temp_free(newv);
|
||||
tcg_temp_free(oldv);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ static void gen_sll_w(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x1f);
|
||||
tcg_gen_shl_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_srl_w(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -16,7 +15,6 @@ static void gen_srl_w(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x1f);
|
||||
tcg_gen_shr_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_sra_w(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -24,7 +22,6 @@ static void gen_sra_w(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x1f);
|
||||
tcg_gen_sar_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_sll_d(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -32,7 +29,6 @@ static void gen_sll_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x3f);
|
||||
tcg_gen_shl_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_srl_d(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -40,7 +36,6 @@ static void gen_srl_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x3f);
|
||||
tcg_gen_shr_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_sra_d(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -48,7 +43,6 @@ static void gen_sra_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x3f);
|
||||
tcg_gen_sar_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_rotr_w(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -64,10 +58,6 @@ static void gen_rotr_w(TCGv dest, TCGv src1, TCGv src2)
|
|||
|
||||
tcg_gen_rotr_i32(t1, t1, t2);
|
||||
tcg_gen_ext_i32_tl(dest, t1);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t2);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void gen_rotr_d(TCGv dest, TCGv src1, TCGv src2)
|
||||
|
@ -75,7 +65,6 @@ static void gen_rotr_d(TCGv dest, TCGv src1, TCGv src2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, src2, 0x3f);
|
||||
tcg_gen_rotr_tl(dest, src1, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static bool trans_srai_w(DisasContext *ctx, arg_srai_w *a)
|
||||
|
|
|
@ -85,9 +85,6 @@ static void loongarch_tr_init_disas_context(DisasContextBase *dcbase,
|
|||
bound = -(ctx->base.pc_first | TARGET_PAGE_MASK) / 4;
|
||||
ctx->base.max_insns = MIN(ctx->base.max_insns, bound);
|
||||
|
||||
ctx->ntemp = 0;
|
||||
memset(ctx->temp, 0, sizeof(ctx->temp));
|
||||
|
||||
ctx->zero = tcg_constant_tl(0);
|
||||
}
|
||||
|
||||
|
@ -110,12 +107,6 @@ static void loongarch_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
|
|||
*
|
||||
* Further, we may provide an extension for word operations.
|
||||
*/
|
||||
static TCGv temp_new(DisasContext *ctx)
|
||||
{
|
||||
assert(ctx->ntemp < ARRAY_SIZE(ctx->temp));
|
||||
return ctx->temp[ctx->ntemp++] = tcg_temp_new();
|
||||
}
|
||||
|
||||
static TCGv gpr_src(DisasContext *ctx, int reg_num, DisasExtend src_ext)
|
||||
{
|
||||
TCGv t;
|
||||
|
@ -128,11 +119,11 @@ static TCGv gpr_src(DisasContext *ctx, int reg_num, DisasExtend src_ext)
|
|||
case EXT_NONE:
|
||||
return cpu_gpr[reg_num];
|
||||
case EXT_SIGN:
|
||||
t = temp_new(ctx);
|
||||
t = tcg_temp_new();
|
||||
tcg_gen_ext32s_tl(t, cpu_gpr[reg_num]);
|
||||
return t;
|
||||
case EXT_ZERO:
|
||||
t = temp_new(ctx);
|
||||
t = tcg_temp_new();
|
||||
tcg_gen_ext32u_tl(t, cpu_gpr[reg_num]);
|
||||
return t;
|
||||
}
|
||||
|
@ -142,7 +133,7 @@ static TCGv gpr_src(DisasContext *ctx, int reg_num, DisasExtend src_ext)
|
|||
static TCGv gpr_dst(DisasContext *ctx, int reg_num, DisasExtend dst_ext)
|
||||
{
|
||||
if (reg_num == 0 || dst_ext) {
|
||||
return temp_new(ctx);
|
||||
return tcg_temp_new();
|
||||
}
|
||||
return cpu_gpr[reg_num];
|
||||
}
|
||||
|
@ -195,12 +186,6 @@ static void loongarch_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
|
|||
generate_exception(ctx, EXCCODE_INE);
|
||||
}
|
||||
|
||||
for (int i = ctx->ntemp - 1; i >= 0; --i) {
|
||||
tcg_temp_free(ctx->temp[i]);
|
||||
ctx->temp[i] = NULL;
|
||||
}
|
||||
ctx->ntemp = 0;
|
||||
|
||||
ctx->base.pc_next += 4;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,9 +32,6 @@ typedef struct DisasContext {
|
|||
uint16_t mem_idx;
|
||||
uint16_t plv;
|
||||
TCGv zero;
|
||||
/* Space for 3 operands plus 1 extra for address computation. */
|
||||
TCGv temp[4];
|
||||
uint8_t ntemp;
|
||||
} DisasContext;
|
||||
|
||||
void generate_exception(DisasContext *ctx, int excp);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -101,10 +101,7 @@ static void t_sync_flags(DisasContext *dc)
|
|||
|
||||
static void gen_raise_exception(DisasContext *dc, uint32_t index)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_const_i32(index);
|
||||
|
||||
gen_helper_raise_exception(cpu_env, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
gen_helper_raise_exception(cpu_env, tcg_constant_i32(index));
|
||||
dc->base.is_jmp = DISAS_NORETURN;
|
||||
}
|
||||
|
||||
|
@ -117,9 +114,8 @@ static void gen_raise_exception_sync(DisasContext *dc, uint32_t index)
|
|||
|
||||
static void gen_raise_hw_excp(DisasContext *dc, uint32_t esr_ec)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_const_i32(esr_ec);
|
||||
TCGv_i32 tmp = tcg_constant_i32(esr_ec);
|
||||
tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUMBState, esr));
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
gen_raise_exception_sync(dc, EXCP_HW_EXCP);
|
||||
}
|
||||
|
@ -262,11 +258,9 @@ static bool do_typeb_val(DisasContext *dc, arg_typeb *arg, bool side_effects,
|
|||
|
||||
rd = reg_for_write(dc, arg->rd);
|
||||
ra = reg_for_read(dc, arg->ra);
|
||||
imm = tcg_const_i32(arg->imm);
|
||||
imm = tcg_constant_i32(arg->imm);
|
||||
|
||||
fn(rd, ra, imm);
|
||||
|
||||
tcg_temp_free_i32(imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -309,24 +303,19 @@ static bool do_typeb_val(DisasContext *dc, arg_typeb *arg, bool side_effects,
|
|||
/* No input carry, but output carry. */
|
||||
static void gen_add(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
{
|
||||
TCGv_i32 zero = tcg_const_i32(0);
|
||||
TCGv_i32 zero = tcg_constant_i32(0);
|
||||
|
||||
tcg_gen_add2_i32(out, cpu_msr_c, ina, zero, inb, zero);
|
||||
|
||||
tcg_temp_free_i32(zero);
|
||||
}
|
||||
|
||||
/* Input and output carry. */
|
||||
static void gen_addc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
{
|
||||
TCGv_i32 zero = tcg_const_i32(0);
|
||||
TCGv_i32 zero = tcg_constant_i32(0);
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
|
||||
tcg_gen_add2_i32(tmp, cpu_msr_c, ina, zero, cpu_msr_c, zero);
|
||||
tcg_gen_add2_i32(out, cpu_msr_c, tmp, cpu_msr_c, inb, zero);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(zero);
|
||||
}
|
||||
|
||||
/* Input carry, but no output carry. */
|
||||
|
@ -361,7 +350,6 @@ static void gen_bsra(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_andi_i32(tmp, inb, 31);
|
||||
tcg_gen_sar_i32(out, ina, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_bsrl(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
|
@ -369,7 +357,6 @@ static void gen_bsrl(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_andi_i32(tmp, inb, 31);
|
||||
tcg_gen_shr_i32(out, ina, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_bsll(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
|
@ -377,7 +364,6 @@ static void gen_bsll(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_andi_i32(tmp, inb, 31);
|
||||
tcg_gen_shl_i32(out, ina, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_bsefi(TCGv_i32 out, TCGv_i32 ina, int32_t imm)
|
||||
|
@ -436,7 +422,6 @@ static void gen_cmp(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
tcg_gen_setcond_i32(TCG_COND_LT, lt, inb, ina);
|
||||
tcg_gen_sub_i32(out, inb, ina);
|
||||
tcg_gen_deposit_i32(out, out, lt, 31, 1);
|
||||
tcg_temp_free_i32(lt);
|
||||
}
|
||||
|
||||
static void gen_cmpu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
|
@ -446,7 +431,6 @@ static void gen_cmpu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
tcg_gen_setcond_i32(TCG_COND_LTU, lt, inb, ina);
|
||||
tcg_gen_sub_i32(out, inb, ina);
|
||||
tcg_gen_deposit_i32(out, out, lt, 31, 1);
|
||||
tcg_temp_free_i32(lt);
|
||||
}
|
||||
|
||||
DO_TYPEA(cmp, false, gen_cmp)
|
||||
|
@ -513,21 +497,18 @@ static void gen_mulh(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
{
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_muls2_i32(tmp, out, ina, inb);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_mulhu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_mulu2_i32(tmp, out, ina, inb);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_mulhsu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_mulsu2_i32(tmp, out, ina, inb);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
DO_TYPEA_CFG(mul, use_hw_mul, false, tcg_gen_mul_i32)
|
||||
|
@ -563,15 +544,12 @@ static void gen_rsub(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
/* Input and output carry. */
|
||||
static void gen_rsubc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||
{
|
||||
TCGv_i32 zero = tcg_const_i32(0);
|
||||
TCGv_i32 zero = tcg_constant_i32(0);
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
|
||||
tcg_gen_not_i32(tmp, ina);
|
||||
tcg_gen_add2_i32(tmp, cpu_msr_c, tmp, zero, cpu_msr_c, zero);
|
||||
tcg_gen_add2_i32(out, cpu_msr_c, tmp, cpu_msr_c, inb, zero);
|
||||
|
||||
tcg_temp_free_i32(zero);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
/* No input or output carry. */
|
||||
|
@ -588,8 +566,6 @@ static void gen_rsubkc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
|||
tcg_gen_not_i32(nota, ina);
|
||||
tcg_gen_add_i32(out, inb, nota);
|
||||
tcg_gen_add_i32(out, out, cpu_msr_c);
|
||||
|
||||
tcg_temp_free_i32(nota);
|
||||
}
|
||||
|
||||
DO_TYPEA(rsub, true, gen_rsub)
|
||||
|
@ -618,8 +594,6 @@ static void gen_src(TCGv_i32 out, TCGv_i32 ina)
|
|||
tcg_gen_mov_i32(tmp, cpu_msr_c);
|
||||
tcg_gen_andi_i32(cpu_msr_c, ina, 1);
|
||||
tcg_gen_extract2_i32(out, ina, tmp, 1);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void gen_srl(TCGv_i32 out, TCGv_i32 ina)
|
||||
|
@ -659,7 +633,6 @@ static TCGv compute_ldst_addr_typea(DisasContext *dc, int ra, int rb)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_add_i32(tmp, cpu_R[ra], cpu_R[rb]);
|
||||
tcg_gen_extu_i32_tl(ret, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
} else if (ra) {
|
||||
tcg_gen_extu_i32_tl(ret, cpu_R[ra]);
|
||||
} else if (rb) {
|
||||
|
@ -683,7 +656,6 @@ static TCGv compute_ldst_addr_typeb(DisasContext *dc, int ra, int imm)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_addi_i32(tmp, cpu_R[ra], imm);
|
||||
tcg_gen_extu_i32_tl(ret, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
} else {
|
||||
tcg_gen_movi_tl(ret, (uint32_t)imm);
|
||||
}
|
||||
|
@ -772,8 +744,6 @@ static bool do_load(DisasContext *dc, int rd, TCGv addr, MemOp mop,
|
|||
#endif
|
||||
|
||||
tcg_gen_qemu_ld_i32(reg_for_write(dc, rd), addr, mem_index, mop);
|
||||
|
||||
tcg_temp_free(addr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -879,7 +849,6 @@ static bool trans_lwx(DisasContext *dc, arg_typea *arg)
|
|||
|
||||
tcg_gen_qemu_ld_i32(cpu_res_val, addr, dc->mem_index, MO_TEUL);
|
||||
tcg_gen_mov_tl(cpu_res_addr, addr);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
if (arg->rd) {
|
||||
tcg_gen_mov_i32(cpu_R[arg->rd], cpu_res_val);
|
||||
|
@ -925,8 +894,6 @@ static bool do_store(DisasContext *dc, int rd, TCGv addr, MemOp mop,
|
|||
#endif
|
||||
|
||||
tcg_gen_qemu_st_i32(reg_for_read(dc, rd), addr, mem_index, mop);
|
||||
|
||||
tcg_temp_free(addr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1040,7 +1007,6 @@ static bool trans_swx(DisasContext *dc, arg_typea *arg)
|
|||
* In either case, addr is no longer needed.
|
||||
*/
|
||||
tcg_gen_brcond_tl(TCG_COND_NE, cpu_res_addr, addr, swx_fail);
|
||||
tcg_temp_free(addr);
|
||||
|
||||
/*
|
||||
* Compare the value loaded during lwx with current contents of
|
||||
|
@ -1053,7 +1019,6 @@ static bool trans_swx(DisasContext *dc, arg_typea *arg)
|
|||
dc->mem_index, MO_TEUL);
|
||||
|
||||
tcg_gen_brcond_i32(TCG_COND_NE, cpu_res_val, tval, swx_fail);
|
||||
tcg_temp_free_i32(tval);
|
||||
|
||||
/* Success */
|
||||
tcg_gen_movi_i32(cpu_msr_c, 0);
|
||||
|
@ -1150,13 +1115,11 @@ static bool do_bcc(DisasContext *dc, int dest_rb, int dest_imm,
|
|||
}
|
||||
|
||||
/* Compute the final destination into btarget. */
|
||||
zero = tcg_const_i32(0);
|
||||
next = tcg_const_i32(dc->base.pc_next + (delay + 1) * 4);
|
||||
zero = tcg_constant_i32(0);
|
||||
next = tcg_constant_i32(dc->base.pc_next + (delay + 1) * 4);
|
||||
tcg_gen_movcond_i32(dc->jmp_cond, cpu_btarget,
|
||||
reg_for_read(dc, ra), zero,
|
||||
cpu_btarget, next);
|
||||
tcg_temp_free_i32(zero);
|
||||
tcg_temp_free_i32(next);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1261,8 +1224,6 @@ static bool trans_mbar(DisasContext *dc, arg_mbar *arg)
|
|||
|
||||
/* Sleep. */
|
||||
if (mbar_imm & 16) {
|
||||
TCGv_i32 tmp_1;
|
||||
|
||||
if (trap_userspace(dc, true)) {
|
||||
/* Sleep is a privileged instruction. */
|
||||
return true;
|
||||
|
@ -1270,11 +1231,9 @@ static bool trans_mbar(DisasContext *dc, arg_mbar *arg)
|
|||
|
||||
t_sync_flags(dc);
|
||||
|
||||
tmp_1 = tcg_const_i32(1);
|
||||
tcg_gen_st_i32(tmp_1, cpu_env,
|
||||
tcg_gen_st_i32(tcg_constant_i32(1), cpu_env,
|
||||
-offsetof(MicroBlazeCPU, env)
|
||||
+offsetof(CPUState, halted));
|
||||
tcg_temp_free_i32(tmp_1);
|
||||
|
||||
tcg_gen_movi_i32(cpu_pc, dc->base.pc_next + 4);
|
||||
|
||||
|
@ -1345,7 +1304,6 @@ static void msr_read(DisasContext *dc, TCGv_i32 d)
|
|||
t = tcg_temp_new_i32();
|
||||
tcg_gen_muli_i32(t, cpu_msr_c, MSR_C | MSR_CC);
|
||||
tcg_gen_or_i32(d, cpu_msr, t);
|
||||
tcg_temp_free_i32(t);
|
||||
}
|
||||
|
||||
static bool do_msrclrset(DisasContext *dc, arg_type_msr *arg, bool set)
|
||||
|
@ -1438,12 +1396,10 @@ static bool trans_mts(DisasContext *dc, arg_mts *arg)
|
|||
case 0x1004: /* TLBHI */
|
||||
case 0x1005: /* TLBSX */
|
||||
{
|
||||
TCGv_i32 tmp_ext = tcg_const_i32(arg->e);
|
||||
TCGv_i32 tmp_reg = tcg_const_i32(arg->rs & 7);
|
||||
TCGv_i32 tmp_ext = tcg_constant_i32(arg->e);
|
||||
TCGv_i32 tmp_reg = tcg_constant_i32(arg->rs & 7);
|
||||
|
||||
gen_helper_mmu_write(cpu_env, tmp_ext, tmp_reg, src);
|
||||
tcg_temp_free_i32(tmp_reg);
|
||||
tcg_temp_free_i32(tmp_ext);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1467,7 +1423,6 @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg)
|
|||
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||
tcg_gen_ld_i64(t64, cpu_env, offsetof(CPUMBState, ear));
|
||||
tcg_gen_extrh_i64_i32(dest, t64);
|
||||
tcg_temp_free_i64(t64);
|
||||
}
|
||||
return true;
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
@ -1498,7 +1453,6 @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg)
|
|||
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||
tcg_gen_ld_i64(t64, cpu_env, offsetof(CPUMBState, ear));
|
||||
tcg_gen_extrl_i64_i32(dest, t64);
|
||||
tcg_temp_free_i64(t64);
|
||||
}
|
||||
break;
|
||||
case SR_ESR:
|
||||
|
@ -1528,12 +1482,10 @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg)
|
|||
case 0x1004: /* TLBHI */
|
||||
case 0x1005: /* TLBSX */
|
||||
{
|
||||
TCGv_i32 tmp_ext = tcg_const_i32(arg->e);
|
||||
TCGv_i32 tmp_reg = tcg_const_i32(arg->rs & 7);
|
||||
TCGv_i32 tmp_ext = tcg_constant_i32(arg->e);
|
||||
TCGv_i32 tmp_reg = tcg_constant_i32(arg->rs & 7);
|
||||
|
||||
gen_helper_mmu_read(dest, cpu_env, tmp_ext, tmp_reg);
|
||||
tcg_temp_free_i32(tmp_reg);
|
||||
tcg_temp_free_i32(tmp_ext);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
@ -1559,8 +1511,6 @@ static void do_rti(DisasContext *dc)
|
|||
tcg_gen_andi_i32(tmp, tmp, MSR_VM | MSR_UM);
|
||||
tcg_gen_andi_i32(cpu_msr, cpu_msr, ~(MSR_VM | MSR_UM));
|
||||
tcg_gen_or_i32(cpu_msr, cpu_msr, tmp);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void do_rtb(DisasContext *dc)
|
||||
|
@ -1571,8 +1521,6 @@ static void do_rtb(DisasContext *dc)
|
|||
tcg_gen_andi_i32(cpu_msr, cpu_msr, ~(MSR_VM | MSR_UM | MSR_BIP));
|
||||
tcg_gen_andi_i32(tmp, tmp, (MSR_VM | MSR_UM));
|
||||
tcg_gen_or_i32(cpu_msr, cpu_msr, tmp);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
static void do_rte(DisasContext *dc)
|
||||
|
@ -1584,8 +1532,6 @@ static void do_rte(DisasContext *dc)
|
|||
tcg_gen_andi_i32(tmp, tmp, (MSR_VM | MSR_UM));
|
||||
tcg_gen_andi_i32(cpu_msr, cpu_msr, ~(MSR_VM | MSR_UM | MSR_EIP));
|
||||
tcg_gen_or_i32(cpu_msr, cpu_msr, tmp);
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
/* Insns connected to FSL or AXI stream attached devices. */
|
||||
|
@ -1604,10 +1550,8 @@ static bool do_get(DisasContext *dc, int rd, int rb, int imm, int ctrl)
|
|||
tcg_gen_movi_i32(t_id, imm);
|
||||
}
|
||||
|
||||
t_ctrl = tcg_const_i32(ctrl);
|
||||
t_ctrl = tcg_constant_i32(ctrl);
|
||||
gen_helper_get(reg_for_write(dc, rd), t_id, t_ctrl);
|
||||
tcg_temp_free_i32(t_id);
|
||||
tcg_temp_free_i32(t_ctrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1636,10 +1580,8 @@ static bool do_put(DisasContext *dc, int ra, int rb, int imm, int ctrl)
|
|||
tcg_gen_movi_i32(t_id, imm);
|
||||
}
|
||||
|
||||
t_ctrl = tcg_const_i32(ctrl);
|
||||
t_ctrl = tcg_constant_i32(ctrl);
|
||||
gen_helper_put(t_id, t_ctrl, reg_for_read(dc, ra));
|
||||
tcg_temp_free_i32(t_id);
|
||||
tcg_temp_free_i32(t_ctrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1704,7 +1646,6 @@ static void mb_tr_translate_insn(DisasContextBase *dcb, CPUState *cs)
|
|||
}
|
||||
|
||||
if (dc->r0) {
|
||||
tcg_temp_free_i32(dc->r0);
|
||||
dc->r0 = NULL;
|
||||
dc->r0_set = false;
|
||||
}
|
||||
|
|
|
@ -280,9 +280,6 @@ static void gen_mips16_save(DisasContext *ctx,
|
|||
|
||||
tcg_gen_movi_tl(t2, -framesize);
|
||||
gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
}
|
||||
|
||||
static void gen_mips16_restore(DisasContext *ctx,
|
||||
|
@ -386,9 +383,6 @@ static void gen_mips16_restore(DisasContext *ctx,
|
|||
|
||||
tcg_gen_movi_tl(t2, framesize);
|
||||
gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
}
|
||||
|
||||
#if defined(TARGET_MIPS64)
|
||||
|
|
|
@ -53,7 +53,7 @@ static bool trans_mult_acc(DisasContext *ctx, arg_r *a,
|
|||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
TRANS(MACC, trans_mult_acc, gen_helper_macc);
|
||||
|
|
|
@ -233,7 +233,6 @@ static void gen_jumpr(DisasContext *dc, int regno, bool is_call)
|
|||
|
||||
tcg_gen_andi_tl(test, dest, 3);
|
||||
tcg_gen_brcondi_tl(TCG_COND_NE, test, 0, l);
|
||||
tcg_temp_free(test);
|
||||
|
||||
tcg_gen_mov_tl(cpu_pc, dest);
|
||||
if (is_call) {
|
||||
|
@ -300,7 +299,6 @@ static void gen_ldx(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
|
||||
tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s);
|
||||
tcg_gen_qemu_ld_tl(data, addr, dc->mem_idx, flags);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
/* Store instructions */
|
||||
|
@ -312,7 +310,6 @@ static void gen_stx(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s);
|
||||
tcg_gen_qemu_st_tl(val, addr, dc->mem_idx, flags);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
/* Branch instructions */
|
||||
|
@ -500,7 +497,6 @@ static void eret(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
TCGv tmp = tcg_temp_new();
|
||||
tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPUNios2State, ctrl[CR_ESTATUS]));
|
||||
gen_helper_eret(cpu_env, tmp, load_gpr(dc, R_EA));
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
gen_helper_eret(cpu_env, load_gpr(dc, R_SSTATUS), load_gpr(dc, R_EA));
|
||||
}
|
||||
|
@ -530,7 +526,6 @@ static void bret(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
TCGv tmp = tcg_temp_new();
|
||||
tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPUNios2State, ctrl[CR_BSTATUS]));
|
||||
gen_helper_eret(cpu_env, tmp, load_gpr(dc, R_BA));
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
dc->base.is_jmp = DISAS_NORETURN;
|
||||
#endif
|
||||
|
@ -597,8 +592,6 @@ static void rdctl(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
tcg_gen_ld_tl(t1, cpu_env, offsetof(CPUNios2State, ctrl[CR_IPENDING]));
|
||||
tcg_gen_ld_tl(t2, cpu_env, offsetof(CPUNios2State, ctrl[CR_IENABLE]));
|
||||
tcg_gen_and_tl(dest, t1, t2);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
break;
|
||||
default:
|
||||
tcg_gen_ld_tl(dest, cpu_env,
|
||||
|
@ -662,11 +655,9 @@ static void wrctl(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
tcg_gen_ld_tl(o, cpu_env, ofs);
|
||||
tcg_gen_andi_tl(o, o, ro);
|
||||
tcg_gen_or_tl(n, n, o);
|
||||
tcg_temp_free(o);
|
||||
}
|
||||
|
||||
tcg_gen_st_tl(n, cpu_env, ofs);
|
||||
tcg_temp_free(n);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -753,7 +744,6 @@ static void do_rr_mul_high(DisasContext *dc, uint32_t insn, GenFn4 *fn)
|
|||
|
||||
fn(discard, dest_gpr(dc, instr.c),
|
||||
load_gpr(dc, instr.a), load_gpr(dc, instr.b));
|
||||
tcg_temp_free(discard);
|
||||
}
|
||||
|
||||
#define gen_rr_mul_high(fname, insn) \
|
||||
|
@ -771,7 +761,6 @@ static void do_rr_shift(DisasContext *dc, uint32_t insn, GenFn3 *fn)
|
|||
|
||||
tcg_gen_andi_tl(sh, load_gpr(dc, instr.b), 31);
|
||||
fn(dest_gpr(dc, instr.c), load_gpr(dc, instr.a), sh);
|
||||
tcg_temp_free(sh);
|
||||
}
|
||||
|
||||
#define gen_rr_shift(fname, insn) \
|
||||
|
@ -990,10 +979,6 @@ static void nios2_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
|
|||
|
||||
instr = &i_type_instructions[op];
|
||||
instr->handler(dc, code, instr->flags);
|
||||
|
||||
if (dc->sink) {
|
||||
tcg_temp_free(dc->sink);
|
||||
}
|
||||
}
|
||||
|
||||
static void nios2_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
||||
|
|
|
@ -206,10 +206,8 @@ static void gen_add(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb)
|
|||
tcg_gen_xor_tl(cpu_sr_ov, srca, srcb);
|
||||
tcg_gen_xor_tl(t0, res, srcb);
|
||||
tcg_gen_andc_tl(cpu_sr_ov, t0, cpu_sr_ov);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
tcg_gen_mov_tl(dest, res);
|
||||
tcg_temp_free(res);
|
||||
|
||||
gen_ove_cyov(dc);
|
||||
}
|
||||
|
@ -224,10 +222,8 @@ static void gen_addc(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb)
|
|||
tcg_gen_xor_tl(cpu_sr_ov, srca, srcb);
|
||||
tcg_gen_xor_tl(t0, res, srcb);
|
||||
tcg_gen_andc_tl(cpu_sr_ov, t0, cpu_sr_ov);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
tcg_gen_mov_tl(dest, res);
|
||||
tcg_temp_free(res);
|
||||
|
||||
gen_ove_cyov(dc);
|
||||
}
|
||||
|
@ -243,7 +239,6 @@ static void gen_sub(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb)
|
|||
tcg_gen_setcond_tl(TCG_COND_LTU, cpu_sr_cy, srca, srcb);
|
||||
|
||||
tcg_gen_mov_tl(dest, res);
|
||||
tcg_temp_free(res);
|
||||
|
||||
gen_ove_cyov(dc);
|
||||
}
|
||||
|
@ -255,7 +250,6 @@ static void gen_mul(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb)
|
|||
tcg_gen_muls2_tl(dest, cpu_sr_ov, srca, srcb);
|
||||
tcg_gen_sari_tl(t0, dest, TARGET_LONG_BITS - 1);
|
||||
tcg_gen_setcond_tl(TCG_COND_NE, cpu_sr_ov, cpu_sr_ov, t0);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov);
|
||||
gen_ove_ov(dc);
|
||||
|
@ -278,7 +272,6 @@ static void gen_div(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb)
|
|||
Supress the host-side exception by dividing by 1. */
|
||||
tcg_gen_or_tl(t0, srcb, cpu_sr_ov);
|
||||
tcg_gen_div_tl(dest, srca, t0);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov);
|
||||
gen_ove_ov(dc);
|
||||
|
@ -293,7 +286,6 @@ static void gen_divu(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb)
|
|||
Supress the host-side exception by dividing by 1. */
|
||||
tcg_gen_or_tl(t0, srcb, cpu_sr_cy);
|
||||
tcg_gen_divu_tl(dest, srca, t0);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
gen_ove_cy(dc);
|
||||
}
|
||||
|
@ -314,14 +306,11 @@ static void gen_muld(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
tcg_gen_muls2_i64(cpu_mac, high, t1, t2);
|
||||
tcg_gen_sari_i64(t1, cpu_mac, 63);
|
||||
tcg_gen_setcond_i64(TCG_COND_NE, t1, t1, high);
|
||||
tcg_temp_free_i64(high);
|
||||
tcg_gen_trunc_i64_tl(cpu_sr_ov, t1);
|
||||
tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov);
|
||||
|
||||
gen_ove_ov(dc);
|
||||
}
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
}
|
||||
|
||||
static void gen_muldu(DisasContext *dc, TCGv srca, TCGv srcb)
|
||||
|
@ -340,12 +329,9 @@ static void gen_muldu(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
tcg_gen_mulu2_i64(cpu_mac, high, t1, t2);
|
||||
tcg_gen_setcondi_i64(TCG_COND_NE, high, high, 0);
|
||||
tcg_gen_trunc_i64_tl(cpu_sr_cy, high);
|
||||
tcg_temp_free_i64(high);
|
||||
|
||||
gen_ove_cy(dc);
|
||||
}
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
}
|
||||
|
||||
static void gen_mac(DisasContext *dc, TCGv srca, TCGv srcb)
|
||||
|
@ -362,14 +348,12 @@ static void gen_mac(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
tcg_gen_add_i64(cpu_mac, cpu_mac, t1);
|
||||
tcg_gen_xor_i64(t1, t1, cpu_mac);
|
||||
tcg_gen_andc_i64(t1, t1, t2);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
#if TARGET_LONG_BITS == 32
|
||||
tcg_gen_extrh_i64_i32(cpu_sr_ov, t1);
|
||||
#else
|
||||
tcg_gen_mov_i64(cpu_sr_ov, t1);
|
||||
#endif
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
gen_ove_ov(dc);
|
||||
}
|
||||
|
@ -382,13 +366,11 @@ static void gen_macu(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
tcg_gen_extu_tl_i64(t1, srca);
|
||||
tcg_gen_extu_tl_i64(t2, srcb);
|
||||
tcg_gen_mul_i64(t1, t1, t2);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
/* Note that overflow is only computed during addition stage. */
|
||||
tcg_gen_add_i64(cpu_mac, cpu_mac, t1);
|
||||
tcg_gen_setcond_i64(TCG_COND_LTU, t1, cpu_mac, t1);
|
||||
tcg_gen_trunc_i64_tl(cpu_sr_cy, t1);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
gen_ove_cy(dc);
|
||||
}
|
||||
|
@ -407,14 +389,12 @@ static void gen_msb(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
tcg_gen_sub_i64(cpu_mac, cpu_mac, t1);
|
||||
tcg_gen_xor_i64(t1, t1, cpu_mac);
|
||||
tcg_gen_and_i64(t1, t1, t2);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
#if TARGET_LONG_BITS == 32
|
||||
tcg_gen_extrh_i64_i32(cpu_sr_ov, t1);
|
||||
#else
|
||||
tcg_gen_mov_i64(cpu_sr_ov, t1);
|
||||
#endif
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
gen_ove_ov(dc);
|
||||
}
|
||||
|
@ -432,8 +412,6 @@ static void gen_msbu(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
tcg_gen_setcond_i64(TCG_COND_LTU, t2, cpu_mac, t1);
|
||||
tcg_gen_sub_i64(cpu_mac, cpu_mac, t1);
|
||||
tcg_gen_trunc_i64_tl(cpu_sr_cy, t2);
|
||||
tcg_temp_free_i64(t2);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
gen_ove_cy(dc);
|
||||
}
|
||||
|
@ -672,7 +650,6 @@ static bool trans_l_lwa(DisasContext *dc, arg_load *a)
|
|||
tcg_gen_qemu_ld_tl(cpu_R(dc, a->d), ea, dc->mem_idx, MO_TEUL);
|
||||
tcg_gen_mov_tl(cpu_lock_addr, ea);
|
||||
tcg_gen_mov_tl(cpu_lock_value, cpu_R(dc, a->d));
|
||||
tcg_temp_free(ea);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -684,7 +661,6 @@ static void do_load(DisasContext *dc, arg_load *a, MemOp mop)
|
|||
ea = tcg_temp_new();
|
||||
tcg_gen_addi_tl(ea, cpu_R(dc, a->a), a->i);
|
||||
tcg_gen_qemu_ld_tl(cpu_R(dc, a->d), ea, dc->mem_idx, mop);
|
||||
tcg_temp_free(ea);
|
||||
}
|
||||
|
||||
static bool trans_l_lwz(DisasContext *dc, arg_load *a)
|
||||
|
@ -734,13 +710,11 @@ static bool trans_l_swa(DisasContext *dc, arg_store *a)
|
|||
lab_fail = gen_new_label();
|
||||
lab_done = gen_new_label();
|
||||
tcg_gen_brcond_tl(TCG_COND_NE, ea, cpu_lock_addr, lab_fail);
|
||||
tcg_temp_free(ea);
|
||||
|
||||
val = tcg_temp_new();
|
||||
tcg_gen_atomic_cmpxchg_tl(val, cpu_lock_addr, cpu_lock_value,
|
||||
cpu_R(dc, a->b), dc->mem_idx, MO_TEUL);
|
||||
tcg_gen_setcond_tl(TCG_COND_EQ, cpu_sr_f, val, cpu_lock_value);
|
||||
tcg_temp_free(val);
|
||||
|
||||
tcg_gen_br(lab_done);
|
||||
|
||||
|
@ -757,7 +731,6 @@ static void do_store(DisasContext *dc, arg_store *a, MemOp mop)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_addi_tl(t0, cpu_R(dc, a->a), a->i);
|
||||
tcg_gen_qemu_st_tl(cpu_R(dc, a->b), t0, dc->mem_idx, mop);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static bool trans_l_sw(DisasContext *dc, arg_store *a)
|
||||
|
@ -866,7 +839,6 @@ static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a)
|
|||
|
||||
tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k);
|
||||
gen_helper_mfspr(cpu_R(dc, a->d), cpu_env, cpu_R(dc, a->d), spr);
|
||||
tcg_temp_free(spr);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -897,7 +869,6 @@ static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a)
|
|||
spr = tcg_temp_new();
|
||||
tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k);
|
||||
gen_helper_mtspr(cpu_env, spr, cpu_R(dc, a->b));
|
||||
tcg_temp_free(spr);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1349,8 +1320,6 @@ static bool do_dp3(DisasContext *dc, arg_dab_pair *a,
|
|||
load_pair(dc, t1, a->b, a->bp);
|
||||
fn(t0, cpu_env, t0, t1);
|
||||
save_pair(dc, t0, a->d, a->dp);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
gen_helper_update_fpcsr(cpu_env);
|
||||
return true;
|
||||
|
@ -1372,7 +1341,6 @@ static bool do_dp2(DisasContext *dc, arg_da_pair *a,
|
|||
load_pair(dc, t0, a->a, a->ap);
|
||||
fn(t0, cpu_env, t0);
|
||||
save_pair(dc, t0, a->d, a->dp);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
gen_helper_update_fpcsr(cpu_env);
|
||||
return true;
|
||||
|
@ -1399,8 +1367,6 @@ static bool do_dpcmp(DisasContext *dc, arg_ab_pair *a,
|
|||
} else {
|
||||
fn(cpu_sr_f, cpu_env, t0, t1);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
if (inv) {
|
||||
tcg_gen_xori_tl(cpu_sr_f, cpu_sr_f, 1);
|
||||
|
@ -1457,7 +1423,6 @@ static bool trans_lf_stod_d(DisasContext *dc, arg_lf_stod_d *a)
|
|||
t0 = tcg_temp_new_i64();
|
||||
gen_helper_stod(t0, cpu_env, cpu_R(dc, a->a));
|
||||
save_pair(dc, t0, a->d, a->dp);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
gen_helper_update_fpcsr(cpu_env);
|
||||
return true;
|
||||
|
@ -1476,7 +1441,6 @@ static bool trans_lf_dtos_d(DisasContext *dc, arg_lf_dtos_d *a)
|
|||
t0 = tcg_temp_new_i64();
|
||||
load_pair(dc, t0, a->a, a->ap);
|
||||
gen_helper_dtos(cpu_R(dc, a->d), cpu_env, t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
gen_helper_update_fpcsr(cpu_env);
|
||||
return true;
|
||||
|
@ -1502,9 +1466,6 @@ static bool trans_lf_madd_d(DisasContext *dc, arg_dab_pair *a)
|
|||
load_pair(dc, t2, a->b, a->bp);
|
||||
gen_helper_float_madd_d(t0, cpu_env, t0, t1, t2);
|
||||
save_pair(dc, t0, a->d, a->dp);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
gen_helper_update_fpcsr(cpu_env);
|
||||
return true;
|
||||
|
|
|
@ -58,8 +58,6 @@ static bool spr_groupA_write_allowed(DisasContext *ctx)
|
|||
/*
|
||||
* Helper function to avoid code repetition between MMCR0 and
|
||||
* MMCR2 problem state write functions.
|
||||
*
|
||||
* 'ret' must be tcg_temp_freed() by the caller.
|
||||
*/
|
||||
static TCGv masked_gprn_for_spr_write(int gprn, int sprn,
|
||||
uint64_t spr_mask)
|
||||
|
@ -77,8 +75,6 @@ static TCGv masked_gprn_for_spr_write(int gprn, int sprn,
|
|||
/* Add the masked gprn bits into 'ret' */
|
||||
tcg_gen_or_tl(ret, ret, t0);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -100,8 +96,6 @@ void spr_read_MMCR0_ureg(DisasContext *ctx, int gprn, int sprn)
|
|||
gen_load_spr(t0, SPR_POWER_MMCR0);
|
||||
tcg_gen_andi_tl(t0, t0, MMCR0_UREG_MASK);
|
||||
tcg_gen_mov_tl(cpu_gpr[gprn], t0);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static void write_MMCR0_common(DisasContext *ctx, TCGv val)
|
||||
|
@ -137,8 +131,6 @@ void spr_write_MMCR0_ureg(DisasContext *ctx, int sprn, int gprn)
|
|||
masked_gprn = masked_gprn_for_spr_write(gprn, SPR_POWER_MMCR0,
|
||||
MMCR0_UREG_MASK);
|
||||
write_MMCR0_common(ctx, masked_gprn);
|
||||
|
||||
tcg_temp_free(masked_gprn);
|
||||
}
|
||||
|
||||
void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn)
|
||||
|
@ -164,8 +156,6 @@ void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn)
|
|||
gen_load_spr(t0, SPR_POWER_MMCR2);
|
||||
tcg_gen_andi_tl(t0, t0, MMCR2_UREG_MASK);
|
||||
tcg_gen_mov_tl(cpu_gpr[gprn], t0);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn)
|
||||
|
@ -183,8 +173,6 @@ void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn)
|
|||
masked_gprn = masked_gprn_for_spr_write(gprn, SPR_POWER_MMCR2,
|
||||
MMCR2_UREG_MASK);
|
||||
gen_store_spr(SPR_POWER_MMCR2, masked_gprn);
|
||||
|
||||
tcg_temp_free(masked_gprn);
|
||||
}
|
||||
|
||||
void spr_read_PMC(DisasContext *ctx, int gprn, int sprn)
|
||||
|
@ -193,8 +181,6 @@ void spr_read_PMC(DisasContext *ctx, int gprn, int sprn)
|
|||
|
||||
gen_icount_io_start(ctx);
|
||||
gen_helper_read_pmc(cpu_gpr[gprn], cpu_env, t_sprn);
|
||||
|
||||
tcg_temp_free_i32(t_sprn);
|
||||
}
|
||||
|
||||
void spr_read_PMC14_ureg(DisasContext *ctx, int gprn, int sprn)
|
||||
|
@ -228,8 +214,6 @@ void spr_write_PMC(DisasContext *ctx, int sprn, int gprn)
|
|||
|
||||
gen_icount_io_start(ctx);
|
||||
gen_helper_store_pmc(cpu_env, t_sprn, cpu_gpr[gprn]);
|
||||
|
||||
tcg_temp_free_i32(t_sprn);
|
||||
}
|
||||
|
||||
void spr_write_PMC14_ureg(DisasContext *ctx, int sprn, int gprn)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -20,9 +20,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
if (unlikely(a->rc)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_ptr(rt); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -36,8 +33,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
rb = gen_fprp_ptr(a->rb); \
|
||||
gen_helper_##NAME(cpu_crf[a->bf], \
|
||||
cpu_env, ra, rb); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -50,7 +45,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
rb = gen_fprp_ptr(a->rb); \
|
||||
gen_helper_##NAME(cpu_crf[a->bf], \
|
||||
cpu_env, tcg_constant_i32(a->uim), rb);\
|
||||
tcg_temp_free_ptr(rb); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -63,7 +57,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
ra = gen_fprp_ptr(a->fra); \
|
||||
gen_helper_##NAME(cpu_crf[a->bf], \
|
||||
cpu_env, ra, tcg_constant_i32(a->dm)); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -81,8 +74,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
if (unlikely(a->rc)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_ptr(rt); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -100,9 +91,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
if (unlikely(a->rc)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_ptr(rt); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -118,8 +106,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
if (unlikely(a->rc)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_ptr(rt); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -136,8 +122,6 @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
|
|||
if (unlikely(a->rc)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_ptr(rt); \
|
||||
tcg_temp_free_ptr(rx); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -205,8 +189,6 @@ static bool trans_DCFFIXQQ(DisasContext *ctx, arg_DCFFIXQQ *a)
|
|||
rt = gen_fprp_ptr(a->frtp);
|
||||
rb = gen_avr_ptr(a->vrb);
|
||||
gen_helper_DCFFIXQQ(cpu_env, rt, rb);
|
||||
tcg_temp_free_ptr(rt);
|
||||
tcg_temp_free_ptr(rb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -222,8 +204,6 @@ static bool trans_DCTFIXQQ(DisasContext *ctx, arg_DCTFIXQQ *a)
|
|||
rt = gen_avr_ptr(a->vrt);
|
||||
rb = gen_fprp_ptr(a->frbp);
|
||||
gen_helper_DCTFIXQQ(cpu_env, rt, rb);
|
||||
tcg_temp_free_ptr(rt);
|
||||
tcg_temp_free_ptr(rb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -42,8 +42,6 @@ static bool do_ldst(DisasContext *ctx, int rt, int ra, TCGv displ, bool update,
|
|||
if (update) {
|
||||
tcg_gen_mov_tl(cpu_gpr[ra], ea);
|
||||
}
|
||||
tcg_temp_free(ea);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -149,7 +147,6 @@ static bool do_ldst_quad(DisasContext *ctx, arg_D *a, bool store, bool prefixed)
|
|||
tcg_gen_qemu_ld_i64(high_addr_gpr, ea, ctx->mem_idx, mop);
|
||||
}
|
||||
}
|
||||
tcg_temp_free(ea);
|
||||
#else
|
||||
qemu_build_not_reached();
|
||||
#endif
|
||||
|
@ -389,8 +386,6 @@ static bool do_set_bool_cond(DisasContext *ctx, arg_X_bi *a, bool neg, bool rev)
|
|||
if (neg) {
|
||||
tcg_gen_neg_tl(cpu_gpr[a->rt], cpu_gpr[a->rt]);
|
||||
}
|
||||
tcg_temp_free(temp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -437,9 +432,6 @@ static void do_cntzdm(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 mask, int64_t trail)
|
|||
}
|
||||
|
||||
tcg_gen_ctpop_i64(dst, t0);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static bool trans_CNTLZDM(DisasContext *ctx, arg_X *a)
|
||||
|
@ -519,11 +511,6 @@ static bool trans_ADDG6S(DisasContext *ctx, arg_X *a)
|
|||
|
||||
tcg_gen_xori_tl(carry, carry, (target_long)carry_bits);
|
||||
tcg_gen_muli_tl(cpu_gpr[a->rt], carry, 6);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(carry);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -564,9 +551,6 @@ static bool do_hash(DisasContext *ctx, arg_X *a, bool priv,
|
|||
|
||||
ea = do_ea_calc(ctx, a->ra, tcg_constant_tl(a->rt));
|
||||
helper(cpu_env, ea, cpu_gpr[a->ra], cpu_gpr[a->rb]);
|
||||
|
||||
tcg_temp_free(ea);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ static void gen_set_cr1_from_fpscr(DisasContext *ctx)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_trunc_tl_i32(tmp, cpu_fpscr);
|
||||
tcg_gen_shri_i32(cpu_crf[1], tmp, 28);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
#else
|
||||
static void gen_set_cr1_from_fpscr(DisasContext *ctx)
|
||||
|
@ -58,10 +57,6 @@ static void gen_f##name(DisasContext *ctx) \
|
|||
if (unlikely(Rc(ctx->opcode) != 0)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
tcg_temp_free_i64(t2); \
|
||||
tcg_temp_free_i64(t3); \
|
||||
}
|
||||
|
||||
#define GEN_FLOAT_ACB(name, op2, set_fprf, type) \
|
||||
|
@ -92,9 +87,6 @@ static void gen_f##name(DisasContext *ctx) \
|
|||
if (unlikely(Rc(ctx->opcode) != 0)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
tcg_temp_free_i64(t2); \
|
||||
}
|
||||
#define GEN_FLOAT_AB(name, op2, inval, set_fprf, type) \
|
||||
_GEN_FLOAT_AB(name, 0x3F, op2, inval, set_fprf, type); \
|
||||
|
@ -124,9 +116,6 @@ static void gen_f##name(DisasContext *ctx) \
|
|||
if (unlikely(Rc(ctx->opcode) != 0)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
tcg_temp_free_i64(t2); \
|
||||
}
|
||||
#define GEN_FLOAT_AC(name, op2, inval, set_fprf, type) \
|
||||
_GEN_FLOAT_AC(name, 0x3F, op2, inval, set_fprf, type); \
|
||||
|
@ -154,8 +143,6 @@ static void gen_f##name(DisasContext *ctx) \
|
|||
if (unlikely(Rc(ctx->opcode) != 0)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
}
|
||||
|
||||
#define GEN_FLOAT_BS(name, op1, op2, set_fprf, type) \
|
||||
|
@ -179,8 +166,6 @@ static void gen_f##name(DisasContext *ctx) \
|
|||
if (unlikely(Rc(ctx->opcode) != 0)) { \
|
||||
gen_set_cr1_from_fpscr(ctx); \
|
||||
} \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
}
|
||||
|
||||
/* fadd - fadds */
|
||||
|
@ -218,8 +203,6 @@ static void gen_frsqrtes(DisasContext *ctx)
|
|||
if (unlikely(Rc(ctx->opcode) != 0)) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static bool trans_FSEL(DisasContext *ctx, arg_A *a)
|
||||
|
@ -242,11 +225,6 @@ static bool trans_FSEL(DisasContext *ctx, arg_A *a)
|
|||
if (a->rc) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -273,10 +251,6 @@ static bool do_helper_fsqrt(DisasContext *ctx, arg_A_tb *a,
|
|||
if (unlikely(a->rc != 0)) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -343,8 +317,6 @@ static void gen_ftdiv(DisasContext *ctx)
|
|||
get_fpr(t0, rA(ctx->opcode));
|
||||
get_fpr(t1, rB(ctx->opcode));
|
||||
gen_helper_ftdiv(cpu_crf[crfD(ctx->opcode)], t0, t1);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static void gen_ftsqrt(DisasContext *ctx)
|
||||
|
@ -357,7 +329,6 @@ static void gen_ftsqrt(DisasContext *ctx)
|
|||
t0 = tcg_temp_new_i64();
|
||||
get_fpr(t0, rB(ctx->opcode));
|
||||
gen_helper_ftsqrt(cpu_crf[crfD(ctx->opcode)], t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -381,10 +352,7 @@ static void gen_fcmpo(DisasContext *ctx)
|
|||
get_fpr(t0, rA(ctx->opcode));
|
||||
get_fpr(t1, rB(ctx->opcode));
|
||||
gen_helper_fcmpo(cpu_env, t0, t1, crf);
|
||||
tcg_temp_free_i32(crf);
|
||||
gen_helper_float_check_status(cpu_env);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* fcmpu */
|
||||
|
@ -404,10 +372,7 @@ static void gen_fcmpu(DisasContext *ctx)
|
|||
get_fpr(t0, rA(ctx->opcode));
|
||||
get_fpr(t1, rB(ctx->opcode));
|
||||
gen_helper_fcmpu(cpu_env, t0, t1, crf);
|
||||
tcg_temp_free_i32(crf);
|
||||
gen_helper_float_check_status(cpu_env);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/*** Floating-point move ***/
|
||||
|
@ -429,8 +394,6 @@ static void gen_fabs(DisasContext *ctx)
|
|||
if (unlikely(Rc(ctx->opcode))) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* fmr - fmr. */
|
||||
|
@ -448,7 +411,6 @@ static void gen_fmr(DisasContext *ctx)
|
|||
if (unlikely(Rc(ctx->opcode))) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* fnabs */
|
||||
|
@ -469,8 +431,6 @@ static void gen_fnabs(DisasContext *ctx)
|
|||
if (unlikely(Rc(ctx->opcode))) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* fneg */
|
||||
|
@ -491,8 +451,6 @@ static void gen_fneg(DisasContext *ctx)
|
|||
if (unlikely(Rc(ctx->opcode))) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* fcpsgn: PowerPC 2.05 specification */
|
||||
|
@ -516,9 +474,6 @@ static void gen_fcpsgn(DisasContext *ctx)
|
|||
if (unlikely(Rc(ctx->opcode))) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
}
|
||||
|
||||
static void gen_fmrgew(DisasContext *ctx)
|
||||
|
@ -538,9 +493,6 @@ static void gen_fmrgew(DisasContext *ctx)
|
|||
get_fpr(t0, rA(ctx->opcode));
|
||||
tcg_gen_deposit_i64(t1, t0, b0, 0, 32);
|
||||
set_fpr(rD(ctx->opcode), t1);
|
||||
tcg_temp_free_i64(b0);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static void gen_fmrgow(DisasContext *ctx)
|
||||
|
@ -559,9 +511,6 @@ static void gen_fmrgow(DisasContext *ctx)
|
|||
get_fpr(t1, rA(ctx->opcode));
|
||||
tcg_gen_deposit_i64(t2, t0, t1, 32, 32);
|
||||
set_fpr(rD(ctx->opcode), t2);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
}
|
||||
|
||||
/*** Floating-Point status & ctrl register ***/
|
||||
|
@ -587,7 +536,6 @@ static void gen_mcrfs(DisasContext *ctx)
|
|||
tcg_gen_trunc_tl_i32(cpu_crf[crfD(ctx->opcode)], tmp);
|
||||
tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_crf[crfD(ctx->opcode)],
|
||||
0xf);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_gen_extu_tl_i64(tnew_fpscr, cpu_fpscr);
|
||||
/* Only the exception bits (including FX) should be cleared if read */
|
||||
tcg_gen_andi_i64(tnew_fpscr, tnew_fpscr,
|
||||
|
@ -595,8 +543,6 @@ static void gen_mcrfs(DisasContext *ctx)
|
|||
/* FEX and VX need to be updated, so don't set fpscr directly */
|
||||
tmask = tcg_const_i32(1 << nibble);
|
||||
gen_helper_store_fpscr(cpu_env, tnew_fpscr, tmask);
|
||||
tcg_temp_free_i32(tmask);
|
||||
tcg_temp_free_i64(tnew_fpscr);
|
||||
}
|
||||
|
||||
static TCGv_i64 place_from_fpscr(int rt, uint64_t mask)
|
||||
|
@ -608,8 +554,6 @@ static TCGv_i64 place_from_fpscr(int rt, uint64_t mask)
|
|||
tcg_gen_andi_i64(fpscr_masked, fpscr, mask);
|
||||
set_fpr(rt, fpscr_masked);
|
||||
|
||||
tcg_temp_free_i64(fpscr_masked);
|
||||
|
||||
return fpscr;
|
||||
}
|
||||
|
||||
|
@ -622,24 +566,17 @@ static void store_fpscr_masked(TCGv_i64 fpscr, uint64_t clear_mask,
|
|||
tcg_gen_andi_i64(fpscr_masked, fpscr, ~clear_mask);
|
||||
tcg_gen_or_i64(fpscr_masked, fpscr_masked, set_mask);
|
||||
gen_helper_store_fpscr(cpu_env, fpscr_masked, st_mask);
|
||||
|
||||
tcg_temp_free_i64(fpscr_masked);
|
||||
}
|
||||
|
||||
static bool trans_MFFS(DisasContext *ctx, arg_X_t_rc *a)
|
||||
{
|
||||
TCGv_i64 fpscr;
|
||||
|
||||
REQUIRE_FPU(ctx);
|
||||
|
||||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt, UINT64_MAX);
|
||||
place_from_fpscr(a->rt, UINT64_MAX);
|
||||
if (a->rc) {
|
||||
gen_set_cr1_from_fpscr(ctx);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -653,9 +590,6 @@ static bool trans_MFFSCE(DisasContext *ctx, arg_X_t *a)
|
|||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt, UINT64_MAX);
|
||||
store_fpscr_masked(fpscr, FP_ENABLES, tcg_constant_i64(0), 0x0003);
|
||||
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -673,10 +607,6 @@ static bool trans_MFFSCRN(DisasContext *ctx, arg_X_tb *a)
|
|||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN);
|
||||
store_fpscr_masked(fpscr, FP_RN, t1, 0x0001);
|
||||
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -694,10 +624,6 @@ static bool trans_MFFSCDRN(DisasContext *ctx, arg_X_tb *a)
|
|||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN);
|
||||
store_fpscr_masked(fpscr, FP_DRN, t1, 0x0100);
|
||||
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -714,10 +640,6 @@ static bool trans_MFFSCRNI(DisasContext *ctx, arg_X_imm2 *a)
|
|||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN);
|
||||
store_fpscr_masked(fpscr, FP_RN, t1, 0x0001);
|
||||
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -734,26 +656,16 @@ static bool trans_MFFSCDRNI(DisasContext *ctx, arg_X_imm3 *a)
|
|||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN);
|
||||
store_fpscr_masked(fpscr, FP_DRN, t1, 0x0100);
|
||||
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_MFFSL(DisasContext *ctx, arg_X_t *a)
|
||||
{
|
||||
TCGv_i64 fpscr;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_FPU(ctx);
|
||||
|
||||
gen_reset_fpstatus();
|
||||
fpscr = place_from_fpscr(a->rt,
|
||||
FP_DRN | FP_STATUS | FP_ENABLES | FP_NI | FP_RN);
|
||||
|
||||
tcg_temp_free_i64(fpscr);
|
||||
|
||||
place_from_fpscr(a->rt, FP_DRN | FP_STATUS | FP_ENABLES | FP_NI | FP_RN);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -772,7 +684,6 @@ static void gen_mtfsb0(DisasContext *ctx)
|
|||
TCGv_i32 t0;
|
||||
t0 = tcg_const_i32(crb);
|
||||
gen_helper_fpscr_clrbit(cpu_env, t0);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
if (unlikely(Rc(ctx->opcode) != 0)) {
|
||||
tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr);
|
||||
|
@ -795,7 +706,6 @@ static void gen_mtfsb1(DisasContext *ctx)
|
|||
TCGv_i32 t0;
|
||||
t0 = tcg_const_i32(crb);
|
||||
gen_helper_fpscr_setbit(cpu_env, t0);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
if (unlikely(Rc(ctx->opcode) != 0)) {
|
||||
tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr);
|
||||
|
@ -831,14 +741,12 @@ static void gen_mtfsf(DisasContext *ctx)
|
|||
t1 = tcg_temp_new_i64();
|
||||
get_fpr(t1, rB(ctx->opcode));
|
||||
gen_helper_store_fpscr(cpu_env, t1, t0);
|
||||
tcg_temp_free_i32(t0);
|
||||
if (unlikely(Rc(ctx->opcode) != 0)) {
|
||||
tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr);
|
||||
tcg_gen_shri_i32(cpu_crf[1], cpu_crf[1], FPSCR_OX);
|
||||
}
|
||||
/* We can raise a deferred exception */
|
||||
gen_helper_fpscr_check_status(cpu_env);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* mtfsfi */
|
||||
|
@ -862,8 +770,6 @@ static void gen_mtfsfi(DisasContext *ctx)
|
|||
t0 = tcg_const_i64(((uint64_t)FPIMM(ctx->opcode)) << (4 * sh));
|
||||
t1 = tcg_const_i32(1 << sh);
|
||||
gen_helper_store_fpscr(cpu_env, t0, t1);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i32(t1);
|
||||
if (unlikely(Rc(ctx->opcode) != 0)) {
|
||||
tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr);
|
||||
tcg_gen_shri_i32(cpu_crf[1], cpu_crf[1], FPSCR_OX);
|
||||
|
@ -877,7 +783,6 @@ static void gen_qemu_ld32fs(DisasContext *ctx, TCGv_i64 dest, TCGv addr)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_qemu_ld_i32(tmp, addr, ctx->mem_idx, DEF_MEMOP(MO_UL));
|
||||
gen_helper_todouble(dest, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
/* lfdepx (external PID lfdx) */
|
||||
|
@ -896,8 +801,6 @@ static void gen_lfdepx(DisasContext *ctx)
|
|||
gen_addr_reg_index(ctx, EA);
|
||||
tcg_gen_qemu_ld_i64(t0, EA, PPC_TLB_EPID_LOAD, DEF_MEMOP(MO_UQ));
|
||||
set_fpr(rD(ctx->opcode), t0);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* lfdp */
|
||||
|
@ -930,8 +833,6 @@ static void gen_lfdp(DisasContext *ctx)
|
|||
gen_qemu_ld64_i64(ctx, t0, EA);
|
||||
set_fpr(rD(ctx->opcode) + 1, t0);
|
||||
}
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* lfdpx */
|
||||
|
@ -964,8 +865,6 @@ static void gen_lfdpx(DisasContext *ctx)
|
|||
gen_qemu_ld64_i64(ctx, t0, EA);
|
||||
set_fpr(rD(ctx->opcode) + 1, t0);
|
||||
}
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* lfiwax */
|
||||
|
@ -986,9 +885,6 @@ static void gen_lfiwax(DisasContext *ctx)
|
|||
gen_qemu_ld32s(ctx, t0, EA);
|
||||
tcg_gen_ext_tl_i64(t1, t0);
|
||||
set_fpr(rD(ctx->opcode), t1);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* lfiwzx */
|
||||
|
@ -1006,8 +902,6 @@ static void gen_lfiwzx(DisasContext *ctx)
|
|||
gen_addr_reg_index(ctx, EA);
|
||||
gen_qemu_ld32u_i64(ctx, t0, EA);
|
||||
set_fpr(rD(ctx->opcode), t0);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
#define GEN_STXF(name, stop, opc2, opc3, type) \
|
||||
|
@ -1025,8 +919,6 @@ static void glue(gen_, name##x)(DisasContext *ctx) \
|
|||
gen_addr_reg_index(ctx, EA); \
|
||||
get_fpr(t0, rS(ctx->opcode)); \
|
||||
gen_qemu_##stop(ctx, t0, EA); \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
}
|
||||
|
||||
static void gen_qemu_st32fs(DisasContext *ctx, TCGv_i64 src, TCGv addr)
|
||||
|
@ -1034,7 +926,6 @@ static void gen_qemu_st32fs(DisasContext *ctx, TCGv_i64 src, TCGv addr)
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
gen_helper_tosingle(tmp, src);
|
||||
tcg_gen_qemu_st_i32(tmp, addr, ctx->mem_idx, DEF_MEMOP(MO_UL));
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
/* stfdepx (external PID lfdx) */
|
||||
|
@ -1053,8 +944,6 @@ static void gen_stfdepx(DisasContext *ctx)
|
|||
gen_addr_reg_index(ctx, EA);
|
||||
get_fpr(t0, rD(ctx->opcode));
|
||||
tcg_gen_qemu_st_i64(t0, EA, PPC_TLB_EPID_STORE, DEF_MEMOP(MO_UQ));
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* stfdp */
|
||||
|
@ -1087,8 +976,6 @@ static void gen_stfdp(DisasContext *ctx)
|
|||
get_fpr(t0, rD(ctx->opcode) + 1);
|
||||
gen_qemu_st64_i64(ctx, t0, EA);
|
||||
}
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* stfdpx */
|
||||
|
@ -1121,8 +1008,6 @@ static void gen_stfdpx(DisasContext *ctx)
|
|||
get_fpr(t0, rD(ctx->opcode) + 1);
|
||||
gen_qemu_st64_i64(ctx, t0, EA);
|
||||
}
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
/* Optional: */
|
||||
|
@ -1131,7 +1016,6 @@ static inline void gen_qemu_st32fiw(DisasContext *ctx, TCGv_i64 arg1, TCGv arg2)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_trunc_i64_tl(t0, arg1),
|
||||
gen_qemu_st32(ctx, t0, arg2);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
/* stfiwx */
|
||||
GEN_STXF(stfiw, st32fiw, 0x17, 0x1E, PPC_FLOAT_STFIWX);
|
||||
|
@ -1169,8 +1053,6 @@ static bool do_lsfpsd(DisasContext *ctx, int rt, int ra, TCGv displ,
|
|||
if (update) {
|
||||
tcg_gen_mov_tl(cpu_gpr[ra], ea);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free(ea);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ static inline void gen_evmra(DisasContext *ctx)
|
|||
|
||||
/* spe_acc := tmp */
|
||||
tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUPPCState, spe_acc));
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
/* rD := rA */
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
|
||||
|
@ -96,8 +95,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t0, cpu_gprh[rA(ctx->opcode)]); \
|
||||
tcg_opi(t0, t0, rB(ctx->opcode)); \
|
||||
tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \
|
||||
\
|
||||
tcg_temp_free_i32(t0); \
|
||||
}
|
||||
GEN_SPEOP_TCG_LOGIC_IMM2(evslwi, tcg_gen_shli_i32);
|
||||
GEN_SPEOP_TCG_LOGIC_IMM2(evsrwiu, tcg_gen_shri_i32);
|
||||
|
@ -122,8 +119,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t0, cpu_gprh[rA(ctx->opcode)]); \
|
||||
tcg_op(t0, t0); \
|
||||
tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \
|
||||
\
|
||||
tcg_temp_free_i32(t0); \
|
||||
}
|
||||
|
||||
GEN_SPEOP_ARITH1(evabs, tcg_gen_abs_i32);
|
||||
|
@ -159,9 +154,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t1, cpu_gprh[rB(ctx->opcode)]); \
|
||||
tcg_op(t0, t0, t1); \
|
||||
tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \
|
||||
\
|
||||
tcg_temp_free_i32(t0); \
|
||||
tcg_temp_free_i32(t1); \
|
||||
}
|
||||
|
||||
static inline void gen_op_evsrwu(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
||||
|
@ -178,7 +170,6 @@ static inline void gen_op_evsrwu(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
|||
gen_set_label(l1);
|
||||
tcg_gen_movi_i32(ret, 0);
|
||||
gen_set_label(l2);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
GEN_SPEOP_ARITH2(evsrwu, gen_op_evsrwu);
|
||||
static inline void gen_op_evsrws(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
||||
|
@ -195,7 +186,6 @@ static inline void gen_op_evsrws(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
|||
gen_set_label(l1);
|
||||
tcg_gen_movi_i32(ret, 0);
|
||||
gen_set_label(l2);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
GEN_SPEOP_ARITH2(evsrws, gen_op_evsrws);
|
||||
static inline void gen_op_evslw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
||||
|
@ -212,7 +202,6 @@ static inline void gen_op_evslw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
|||
gen_set_label(l1);
|
||||
tcg_gen_movi_i32(ret, 0);
|
||||
gen_set_label(l2);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
GEN_SPEOP_ARITH2(evslw, gen_op_evslw);
|
||||
static inline void gen_op_evrlw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
||||
|
@ -220,7 +209,6 @@ static inline void gen_op_evrlw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
|
|||
TCGv_i32 t0 = tcg_temp_new_i32();
|
||||
tcg_gen_andi_i32(t0, arg2, 0x1F);
|
||||
tcg_gen_rotl_i32(ret, arg1, t0);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
GEN_SPEOP_ARITH2(evrlw, gen_op_evrlw);
|
||||
static inline void gen_evmergehi(DisasContext *ctx)
|
||||
|
@ -257,8 +245,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t0, cpu_gprh[rB(ctx->opcode)]); \
|
||||
tcg_op(t0, t0, rA(ctx->opcode)); \
|
||||
tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \
|
||||
\
|
||||
tcg_temp_free_i32(t0); \
|
||||
}
|
||||
GEN_SPEOP_ARITH_IMM2(evaddiw, tcg_gen_addi_i32);
|
||||
GEN_SPEOP_ARITH_IMM2(evsubifw, tcg_gen_subi_i32);
|
||||
|
@ -341,7 +327,6 @@ static inline void gen_evmergelohi(DisasContext *ctx)
|
|||
tcg_gen_mov_tl(tmp, cpu_gpr[rA(ctx->opcode)]);
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gprh[rB(ctx->opcode)]);
|
||||
tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], tmp);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gprh[rB(ctx->opcode)]);
|
||||
tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
|
||||
|
@ -394,7 +379,6 @@ static inline void gen_evsel(DisasContext *ctx)
|
|||
gen_set_label(l3);
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
|
||||
gen_set_label(l4);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
|
||||
static void gen_evsel0(DisasContext *ctx)
|
||||
|
@ -456,9 +440,6 @@ static inline void gen_evmwumi(DisasContext *ctx)
|
|||
tcg_gen_mul_i64(t0, t0, t1); /* t0 := rA * rB */
|
||||
|
||||
gen_store_gpr64(rD(ctx->opcode), t0); /* rD := t0 */
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static inline void gen_evmwumia(DisasContext *ctx)
|
||||
|
@ -477,7 +458,6 @@ static inline void gen_evmwumia(DisasContext *ctx)
|
|||
/* acc := rD */
|
||||
gen_load_gpr64(tmp, rD(ctx->opcode));
|
||||
tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUPPCState, spe_acc));
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static inline void gen_evmwumiaa(DisasContext *ctx)
|
||||
|
@ -509,9 +489,6 @@ static inline void gen_evmwumiaa(DisasContext *ctx)
|
|||
|
||||
/* rD := acc */
|
||||
gen_store_gpr64(rD(ctx->opcode), acc);
|
||||
|
||||
tcg_temp_free_i64(acc);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static inline void gen_evmwsmi(DisasContext *ctx)
|
||||
|
@ -535,9 +512,6 @@ static inline void gen_evmwsmi(DisasContext *ctx)
|
|||
tcg_gen_mul_i64(t0, t0, t1); /* t0 := rA * rB */
|
||||
|
||||
gen_store_gpr64(rD(ctx->opcode), t0); /* rD := t0 */
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static inline void gen_evmwsmia(DisasContext *ctx)
|
||||
|
@ -556,8 +530,6 @@ static inline void gen_evmwsmia(DisasContext *ctx)
|
|||
/* acc := rD */
|
||||
gen_load_gpr64(tmp, rD(ctx->opcode));
|
||||
tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUPPCState, spe_acc));
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
static inline void gen_evmwsmiaa(DisasContext *ctx)
|
||||
|
@ -589,9 +561,6 @@ static inline void gen_evmwsmiaa(DisasContext *ctx)
|
|||
|
||||
/* rD := acc */
|
||||
gen_store_gpr64(rD(ctx->opcode), acc);
|
||||
|
||||
tcg_temp_free_i64(acc);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
GEN_SPE(evaddw, speundef, 0x00, 0x08, 0x00000000, 0xFFFFFFFF, PPC_SPE); ////
|
||||
|
@ -644,7 +613,6 @@ static inline void gen_op_evldd(DisasContext *ctx, TCGv addr)
|
|||
TCGv_i64 t0 = tcg_temp_new_i64();
|
||||
gen_qemu_ld64_i64(ctx, t0, addr);
|
||||
gen_store_gpr64(rD(ctx->opcode), t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evldw(DisasContext *ctx, TCGv addr)
|
||||
|
@ -668,7 +636,6 @@ static inline void gen_op_evldh(DisasContext *ctx, TCGv addr)
|
|||
gen_addr_add(ctx, addr, addr, 2);
|
||||
gen_qemu_ld16u(ctx, t0, addr);
|
||||
tcg_gen_or_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rD(ctx->opcode)], t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evlhhesplat(DisasContext *ctx, TCGv addr)
|
||||
|
@ -678,7 +645,6 @@ static inline void gen_op_evlhhesplat(DisasContext *ctx, TCGv addr)
|
|||
tcg_gen_shli_tl(t0, t0, 16);
|
||||
tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0);
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evlhhousplat(DisasContext *ctx, TCGv addr)
|
||||
|
@ -687,7 +653,6 @@ static inline void gen_op_evlhhousplat(DisasContext *ctx, TCGv addr)
|
|||
gen_qemu_ld16u(ctx, t0, addr);
|
||||
tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0);
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evlhhossplat(DisasContext *ctx, TCGv addr)
|
||||
|
@ -696,7 +661,6 @@ static inline void gen_op_evlhhossplat(DisasContext *ctx, TCGv addr)
|
|||
gen_qemu_ld16s(ctx, t0, addr);
|
||||
tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0);
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evlwhe(DisasContext *ctx, TCGv addr)
|
||||
|
@ -707,7 +671,6 @@ static inline void gen_op_evlwhe(DisasContext *ctx, TCGv addr)
|
|||
gen_addr_add(ctx, addr, addr, 2);
|
||||
gen_qemu_ld16u(ctx, t0, addr);
|
||||
tcg_gen_shli_tl(cpu_gpr[rD(ctx->opcode)], t0, 16);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evlwhou(DisasContext *ctx, TCGv addr)
|
||||
|
@ -730,7 +693,6 @@ static inline void gen_op_evlwwsplat(DisasContext *ctx, TCGv addr)
|
|||
gen_qemu_ld32u(ctx, t0, addr);
|
||||
tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0);
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evlwhsplat(DisasContext *ctx, TCGv addr)
|
||||
|
@ -743,7 +705,6 @@ static inline void gen_op_evlwhsplat(DisasContext *ctx, TCGv addr)
|
|||
gen_qemu_ld16u(ctx, t0, addr);
|
||||
tcg_gen_shli_tl(cpu_gpr[rD(ctx->opcode)], t0, 16);
|
||||
tcg_gen_or_tl(cpu_gpr[rD(ctx->opcode)], cpu_gprh[rD(ctx->opcode)], t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evstdd(DisasContext *ctx, TCGv addr)
|
||||
|
@ -751,7 +712,6 @@ static inline void gen_op_evstdd(DisasContext *ctx, TCGv addr)
|
|||
TCGv_i64 t0 = tcg_temp_new_i64();
|
||||
gen_load_gpr64(t0, rS(ctx->opcode));
|
||||
gen_qemu_st64_i64(ctx, t0, addr);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evstdw(DisasContext *ctx, TCGv addr)
|
||||
|
@ -771,7 +731,6 @@ static inline void gen_op_evstdh(DisasContext *ctx, TCGv addr)
|
|||
gen_addr_add(ctx, addr, addr, 2);
|
||||
tcg_gen_shri_tl(t0, cpu_gpr[rS(ctx->opcode)], 16);
|
||||
gen_qemu_st16(ctx, t0, addr);
|
||||
tcg_temp_free(t0);
|
||||
gen_addr_add(ctx, addr, addr, 2);
|
||||
gen_qemu_st16(ctx, cpu_gpr[rS(ctx->opcode)], addr);
|
||||
}
|
||||
|
@ -784,7 +743,6 @@ static inline void gen_op_evstwhe(DisasContext *ctx, TCGv addr)
|
|||
gen_addr_add(ctx, addr, addr, 2);
|
||||
tcg_gen_shri_tl(t0, cpu_gpr[rS(ctx->opcode)], 16);
|
||||
gen_qemu_st16(ctx, t0, addr);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void gen_op_evstwho(DisasContext *ctx, TCGv addr)
|
||||
|
@ -820,7 +778,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
gen_addr_reg_index(ctx, t0); \
|
||||
} \
|
||||
gen_op_##name(ctx, t0); \
|
||||
tcg_temp_free(t0); \
|
||||
}
|
||||
|
||||
GEN_SPEOP_LDST(evldd, 0x00, 3);
|
||||
|
@ -923,7 +880,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t0, cpu_gpr[rB(ctx->opcode)]); \
|
||||
gen_helper_##name(t0, cpu_env, t0); \
|
||||
tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t0); \
|
||||
tcg_temp_free_i32(t0); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_CONV_32_64(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -939,8 +895,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
gen_load_gpr64(t0, rB(ctx->opcode)); \
|
||||
gen_helper_##name(t1, cpu_env, t0); \
|
||||
tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t1); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i32(t1); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_CONV_64_32(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -956,8 +910,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); \
|
||||
gen_helper_##name(t0, cpu_env, t1); \
|
||||
gen_store_gpr64(rD(ctx->opcode), t0); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i32(t1); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_CONV_64_64(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -971,7 +923,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
gen_load_gpr64(t0, rB(ctx->opcode)); \
|
||||
gen_helper_##name(t0, cpu_env, t0); \
|
||||
gen_store_gpr64(rD(ctx->opcode), t0); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_ARITH2_32_32(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -982,9 +933,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); \
|
||||
gen_helper_##name(t0, cpu_env, t0, t1); \
|
||||
tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t0); \
|
||||
\
|
||||
tcg_temp_free_i32(t0); \
|
||||
tcg_temp_free_i32(t1); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_ARITH2_64_64(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -1000,8 +948,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
gen_load_gpr64(t1, rB(ctx->opcode)); \
|
||||
gen_helper_##name(t0, cpu_env, t0, t1); \
|
||||
gen_store_gpr64(rD(ctx->opcode), t0); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_COMP_32(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -1012,9 +958,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
tcg_gen_trunc_tl_i32(t0, cpu_gpr[rA(ctx->opcode)]); \
|
||||
tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); \
|
||||
gen_helper_##name(cpu_crf[crfD(ctx->opcode)], cpu_env, t0, t1); \
|
||||
\
|
||||
tcg_temp_free_i32(t0); \
|
||||
tcg_temp_free_i32(t1); \
|
||||
}
|
||||
#define GEN_SPEFPUOP_COMP_64(name) \
|
||||
static inline void gen_##name(DisasContext *ctx) \
|
||||
|
@ -1029,8 +972,6 @@ static inline void gen_##name(DisasContext *ctx) \
|
|||
gen_load_gpr64(t0, rA(ctx->opcode)); \
|
||||
gen_load_gpr64(t1, rB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_crf[crfD(ctx->opcode)], cpu_env, t0, t1); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
}
|
||||
|
||||
/* Single precision floating-point vectors operations */
|
||||
|
|
|
@ -212,7 +212,6 @@ static bool do_tlbie(DisasContext *ctx, arg_X_tlbie *a, bool local)
|
|||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_ext32u_tl(t0, cpu_gpr[rb]);
|
||||
gen_helper_tlbie(cpu_env, t0);
|
||||
tcg_temp_free(t0);
|
||||
|
||||
#if defined(TARGET_PPC64)
|
||||
/*
|
||||
|
@ -240,7 +239,6 @@ static bool do_tlbie(DisasContext *ctx, arg_X_tlbie *a, bool local)
|
|||
tcg_gen_ld_i32(t1, cpu_env, offsetof(CPUPPCState, tlb_need_flush));
|
||||
tcg_gen_ori_i32(t1, t1, TLB_NEED_GLOBAL_FLUSH);
|
||||
tcg_gen_st_i32(t1, cpu_env, offsetof(CPUPPCState, tlb_need_flush));
|
||||
tcg_temp_free_i32(t1);
|
||||
|
||||
return true;
|
||||
#endif
|
||||
|
|
|
@ -45,8 +45,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
gen_qemu_ld64_i64(ctx, avr, EA); \
|
||||
set_avr64(rD(ctx->opcode), avr, false); \
|
||||
} \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_i64(avr); \
|
||||
}
|
||||
|
||||
#define GEN_VR_STX(name, opc2, opc3) \
|
||||
|
@ -80,8 +78,6 @@ static void gen_st##name(DisasContext *ctx) \
|
|||
get_avr64(avr, rD(ctx->opcode), false); \
|
||||
gen_qemu_st64_i64(ctx, avr, EA); \
|
||||
} \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_i64(avr); \
|
||||
}
|
||||
|
||||
#define GEN_VR_LVE(name, opc2, opc3, size) \
|
||||
|
@ -101,8 +97,6 @@ static void gen_lve##name(DisasContext *ctx) \
|
|||
} \
|
||||
rs = gen_avr_ptr(rS(ctx->opcode)); \
|
||||
gen_helper_lve##name(cpu_env, rs, EA); \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_ptr(rs); \
|
||||
}
|
||||
|
||||
#define GEN_VR_STVE(name, opc2, opc3, size) \
|
||||
|
@ -122,8 +116,6 @@ static void gen_stve##name(DisasContext *ctx) \
|
|||
} \
|
||||
rs = gen_avr_ptr(rS(ctx->opcode)); \
|
||||
gen_helper_stve##name(cpu_env, rs, EA); \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_ptr(rs); \
|
||||
}
|
||||
|
||||
GEN_VR_LDX(lvx, 0x07, 0x03);
|
||||
|
@ -157,8 +149,6 @@ static void gen_mfvscr(DisasContext *ctx)
|
|||
gen_helper_mfvscr(t, cpu_env);
|
||||
tcg_gen_extu_i32_i64(avr, t);
|
||||
set_avr64(rD(ctx->opcode), avr, false);
|
||||
tcg_temp_free_i32(t);
|
||||
tcg_temp_free_i64(avr);
|
||||
}
|
||||
|
||||
static void gen_mtvscr(DisasContext *ctx)
|
||||
|
@ -179,7 +169,6 @@ static void gen_mtvscr(DisasContext *ctx)
|
|||
|
||||
tcg_gen_ld_i32(val, cpu_env, bofs);
|
||||
gen_helper_mtvscr(cpu_env, val);
|
||||
tcg_temp_free_i32(val);
|
||||
}
|
||||
|
||||
#define GEN_VX_VMUL10(name, add_cin, ret_carry) \
|
||||
|
@ -228,13 +217,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
tcg_gen_add_i64(avr, t0, t2); \
|
||||
set_avr64(rD(ctx->opcode), avr, true); \
|
||||
} \
|
||||
\
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
tcg_temp_free_i64(t2); \
|
||||
tcg_temp_free_i64(avr); \
|
||||
tcg_temp_free_i64(ten); \
|
||||
tcg_temp_free_i64(z); \
|
||||
} \
|
||||
|
||||
GEN_VX_VMUL10(vmul10uq, 0, 0);
|
||||
|
@ -279,9 +261,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(rd, ra, rb); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXFORM_TRANS(name, opc2, opc3) \
|
||||
|
@ -306,9 +285,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, rd, ra, rb); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXFORM3(name, opc2, opc3) \
|
||||
|
@ -324,10 +300,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rc = gen_avr_ptr(rC(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(rd, ra, rb, rc); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rc); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -400,7 +372,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
} \
|
||||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], rb); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
}
|
||||
|
||||
GEN_VXFORM_V(vaddubm, MO_8, tcg_gen_gvec_add, 0, 0);
|
||||
|
@ -457,9 +428,6 @@ static void trans_vmrgew(DisasContext *ctx)
|
|||
get_avr64(avr, VA, false);
|
||||
tcg_gen_deposit_i64(avr, avr, tmp, 0, 32);
|
||||
set_avr64(VT, avr, false);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(avr);
|
||||
}
|
||||
|
||||
static void trans_vmrgow(DisasContext *ctx)
|
||||
|
@ -480,10 +448,6 @@ static void trans_vmrgow(DisasContext *ctx)
|
|||
get_avr64(t1, VA, false);
|
||||
tcg_gen_deposit_i64(avr, t0, t1, 32, 32);
|
||||
set_avr64(VT, avr, false);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(avr);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -518,10 +482,6 @@ static void trans_lvsl(DisasContext *ctx)
|
|||
*/
|
||||
tcg_gen_addi_i64(result, sh, 0x08090a0b0c0d0e0fULL);
|
||||
set_avr64(VT, result, false);
|
||||
|
||||
tcg_temp_free_i64(result);
|
||||
tcg_temp_free_i64(sh);
|
||||
tcg_temp_free(EA);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -557,10 +517,6 @@ static void trans_lvsr(DisasContext *ctx)
|
|||
*/
|
||||
tcg_gen_subfi_i64(result, 0x18191a1b1c1d1e1fULL, sh);
|
||||
set_avr64(VT, result, false);
|
||||
|
||||
tcg_temp_free_i64(result);
|
||||
tcg_temp_free_i64(sh);
|
||||
tcg_temp_free(EA);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -603,11 +559,6 @@ static void trans_vsl(DisasContext *ctx)
|
|||
tcg_gen_shl_i64(avr, avr, sh);
|
||||
tcg_gen_or_i64(avr, avr, carry);
|
||||
set_avr64(VT, avr, true);
|
||||
|
||||
tcg_temp_free_i64(avr);
|
||||
tcg_temp_free_i64(sh);
|
||||
tcg_temp_free_i64(carry);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -649,11 +600,6 @@ static void trans_vsr(DisasContext *ctx)
|
|||
tcg_gen_shr_i64(avr, avr, sh);
|
||||
tcg_gen_or_i64(avr, avr, carry);
|
||||
set_avr64(VT, avr, false);
|
||||
|
||||
tcg_temp_free_i64(avr);
|
||||
tcg_temp_free_i64(sh);
|
||||
tcg_temp_free_i64(carry);
|
||||
tcg_temp_free_i64(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -722,13 +668,6 @@ static void trans_vgbbd(DisasContext *ctx)
|
|||
for (j = 0; j < 2; j++) {
|
||||
set_avr64(VT, result[j], j);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(tcg_mask);
|
||||
tcg_temp_free_i64(result[0]);
|
||||
tcg_temp_free_i64(result[1]);
|
||||
tcg_temp_free_i64(avr[0]);
|
||||
tcg_temp_free_i64(avr[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -753,8 +692,6 @@ static void trans_vclzw(DisasContext *ctx)
|
|||
tcg_gen_st_i32(tmp, cpu_env,
|
||||
offsetof(CPUPPCState, vsr[32 + VT].u64[0]) + i * 4);
|
||||
}
|
||||
|
||||
tcg_temp_free_i32(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -779,8 +716,6 @@ static void trans_vclzd(DisasContext *ctx)
|
|||
get_avr64(avr, VB, false);
|
||||
tcg_gen_clzi_i64(avr, avr, 64);
|
||||
set_avr64(VT, avr, false);
|
||||
|
||||
tcg_temp_free_i64(avr);
|
||||
}
|
||||
|
||||
GEN_VXFORM_V(vmuluwm, MO_32, tcg_gen_gvec_mul, 4, 2);
|
||||
|
@ -849,9 +784,6 @@ static TCGv_vec do_vrl_mask_vec(unsigned vece, TCGv_vec vrb)
|
|||
/* negate the mask */
|
||||
tcg_gen_xor_vec(vece, t0, t0, t2);
|
||||
|
||||
tcg_temp_free_vec(t1);
|
||||
tcg_temp_free_vec(t2);
|
||||
|
||||
return t0;
|
||||
}
|
||||
|
||||
|
@ -870,9 +802,6 @@ static void gen_vrlnm_vec(unsigned vece, TCGv_vec vrt, TCGv_vec vra,
|
|||
/* Rotate and mask */
|
||||
tcg_gen_rotlv_vec(vece, vrt, vra, n);
|
||||
tcg_gen_and_vec(vece, vrt, vrt, mask);
|
||||
|
||||
tcg_temp_free_vec(n);
|
||||
tcg_temp_free_vec(mask);
|
||||
}
|
||||
|
||||
static bool do_vrlnm(DisasContext *ctx, arg_VX *a, int vece)
|
||||
|
@ -926,10 +855,6 @@ static void gen_vrlmi_vec(unsigned vece, TCGv_vec vrt, TCGv_vec vra,
|
|||
/* Rotate and insert */
|
||||
tcg_gen_rotlv_vec(vece, tmp, vra, n);
|
||||
tcg_gen_bitsel_vec(vece, vrt, mask, tmp, vrt);
|
||||
|
||||
tcg_temp_free_vec(n);
|
||||
tcg_temp_free_vec(tmp);
|
||||
tcg_temp_free_vec(mask);
|
||||
}
|
||||
|
||||
static bool do_vrlmi(DisasContext *ctx, arg_VX *a, int vece)
|
||||
|
@ -1024,13 +949,6 @@ static bool do_vector_shift_quad(DisasContext *ctx, arg_VX *a, bool right,
|
|||
}
|
||||
tcg_gen_or_i64(hi, hi, lo);
|
||||
set_avr64(a->vrt, hi, !right);
|
||||
|
||||
tcg_temp_free_i64(hi);
|
||||
tcg_temp_free_i64(lo);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(n);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1083,11 +1001,6 @@ static void do_vrlq_mask(TCGv_i64 mh, TCGv_i64 ml, TCGv_i64 b, TCGv_i64 e)
|
|||
|
||||
tcg_gen_xor_i64(mh, mh, t0);
|
||||
tcg_gen_xor_i64(ml, ml, t0);
|
||||
|
||||
tcg_temp_free_i64(th);
|
||||
tcg_temp_free_i64(tl);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
static bool do_vector_rotl_quad(DisasContext *ctx, arg_VX *a, bool mask,
|
||||
|
@ -1149,14 +1062,6 @@ static bool do_vector_rotl_quad(DisasContext *ctx, arg_VX *a, bool mask,
|
|||
|
||||
set_avr64(a->vrt, t0, true);
|
||||
set_avr64(a->vrt, t1, false);
|
||||
|
||||
tcg_temp_free_i64(ah);
|
||||
tcg_temp_free_i64(al);
|
||||
tcg_temp_free_i64(vrb);
|
||||
tcg_temp_free_i64(n);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1174,7 +1079,6 @@ static void glue(glue(gen_, NAME), _vec)(unsigned vece, TCGv_vec t, \
|
|||
glue(glue(tcg_gen_, SAT), _vec)(VECE, t, a, b); \
|
||||
tcg_gen_cmp_vec(TCG_COND_NE, VECE, x, x, t); \
|
||||
tcg_gen_or_vec(VECE, sat, sat, x); \
|
||||
tcg_temp_free_vec(x); \
|
||||
} \
|
||||
static void glue(gen_, NAME)(DisasContext *ctx) \
|
||||
{ \
|
||||
|
@ -1266,9 +1170,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##opname(cpu_env, rd, ra, rb); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXRFORM(name, opc2, opc3) \
|
||||
|
@ -1325,10 +1226,6 @@ static void do_vcmp_rc(int vrt)
|
|||
|
||||
tcg_gen_or_i64(tmp, set, clr);
|
||||
tcg_gen_extrl_i64_i32(cpu_crf[6], tmp);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(set);
|
||||
tcg_temp_free_i64(clr);
|
||||
}
|
||||
|
||||
static bool do_vcmp(DisasContext *ctx, arg_VC *a, TCGCond cond, int vece)
|
||||
|
@ -1377,9 +1274,6 @@ static void gen_vcmpnez_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
|
|||
|
||||
tcg_gen_or_vec(vece, t, t, t0);
|
||||
tcg_gen_or_vec(vece, t, t, t1);
|
||||
|
||||
tcg_temp_free_vec(t0);
|
||||
tcg_temp_free_vec(t1);
|
||||
}
|
||||
|
||||
static bool do_vcmpnez(DisasContext *ctx, arg_VC *a, int vece)
|
||||
|
@ -1453,11 +1347,6 @@ static bool trans_VCMPEQUQ(DisasContext *ctx, arg_VC *a)
|
|||
tcg_gen_andi_i32(cpu_crf[6], cpu_crf[6], 0xa);
|
||||
tcg_gen_xori_i32(cpu_crf[6], cpu_crf[6], 0x2);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1489,11 +1378,6 @@ static bool do_vcmpgtq(DisasContext *ctx, arg_VC *a, bool sign)
|
|||
tcg_gen_andi_i32(cpu_crf[6], cpu_crf[6], 0xa);
|
||||
tcg_gen_xori_i32(cpu_crf[6], cpu_crf[6], 0x2);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1536,9 +1420,6 @@ static bool do_vcmpq(DisasContext *ctx, arg_VX_bf *a, bool sign)
|
|||
tcg_gen_br(done);
|
||||
|
||||
gen_set_label(done);
|
||||
tcg_temp_free_i64(vra);
|
||||
tcg_temp_free_i64(vrb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1581,8 +1462,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(rd, rb); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXFORM_NOA_ENV(name, opc2, opc3) \
|
||||
|
@ -1597,8 +1476,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, rd, rb); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXFORM_NOA_2(name, opc2, opc3, opc4) \
|
||||
|
@ -1612,8 +1489,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(rd, rb); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXFORM_NOA_3(name, opc2, opc3, opc4) \
|
||||
|
@ -1626,7 +1501,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
} \
|
||||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_gpr[rD(ctx->opcode)], rb); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
}
|
||||
GEN_VXFORM_NOA(vupkhsb, 7, 8);
|
||||
GEN_VXFORM_NOA(vupkhsh, 7, 9);
|
||||
|
@ -1655,7 +1529,6 @@ static void gen_vprtyb_vec(unsigned vece, TCGv_vec t, TCGv_vec b)
|
|||
tcg_gen_xor_vec(vece, b, tmp, b);
|
||||
}
|
||||
tcg_gen_and_vec(vece, t, b, tcg_constant_vec_matching(t, vece, 1));
|
||||
tcg_temp_free_vec(tmp);
|
||||
}
|
||||
|
||||
/* vprtybw */
|
||||
|
@ -1750,9 +1623,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, rd, rb, uimm); \
|
||||
tcg_temp_free_i32(uimm); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
#define GEN_VXFORM_UIMM_SPLAT(name, opc2, opc3, splat_max) \
|
||||
|
@ -1773,9 +1643,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
rb = gen_avr_ptr(rB(ctx->opcode)); \
|
||||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
gen_helper_##name(rd, rb, t0); \
|
||||
tcg_temp_free_i32(t0); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
GEN_VXFORM_VSPLT(vspltb, MO_8, 6, 8);
|
||||
|
@ -1922,12 +1789,6 @@ static bool trans_VGNB(DisasContext *ctx, arg_VX_n *a)
|
|||
tcg_gen_shri_i64(lo, lo, nbits);
|
||||
tcg_gen_or_i64(hi, hi, lo);
|
||||
tcg_gen_trunc_i64_tl(cpu_gpr[a->rt], hi);
|
||||
|
||||
tcg_temp_free_i64(hi);
|
||||
tcg_temp_free_i64(lo);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1950,11 +1811,6 @@ static bool do_vextdx(DisasContext *ctx, arg_VA *a, int size, bool right,
|
|||
tcg_gen_subfi_tl(rc, 32 - size, rc);
|
||||
}
|
||||
gen_helper(cpu_env, vrt, vra, vrb, rc);
|
||||
|
||||
tcg_temp_free_ptr(vrt);
|
||||
tcg_temp_free_ptr(vra);
|
||||
tcg_temp_free_ptr(vrb);
|
||||
tcg_temp_free(rc);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1983,31 +1839,22 @@ static bool do_vinsx(DisasContext *ctx, int vrt, int size, bool right, TCGv ra,
|
|||
}
|
||||
|
||||
gen_helper(cpu_env, t, rb, idx);
|
||||
|
||||
tcg_temp_free_ptr(t);
|
||||
tcg_temp_free(idx);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool do_vinsvx(DisasContext *ctx, int vrt, int size, bool right, TCGv ra,
|
||||
int vrb, void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv))
|
||||
{
|
||||
bool ok;
|
||||
TCGv_i64 val;
|
||||
|
||||
val = tcg_temp_new_i64();
|
||||
get_avr64(val, vrb, true);
|
||||
ok = do_vinsx(ctx, vrt, size, right, ra, val, gen_helper);
|
||||
|
||||
tcg_temp_free_i64(val);
|
||||
return ok;
|
||||
return do_vinsx(ctx, vrt, size, right, ra, val, gen_helper);
|
||||
}
|
||||
|
||||
static bool do_vinsx_VX(DisasContext *ctx, arg_VX *a, int size, bool right,
|
||||
void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv))
|
||||
{
|
||||
bool ok;
|
||||
TCGv_i64 val;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
|
@ -2016,10 +1863,7 @@ static bool do_vinsx_VX(DisasContext *ctx, arg_VX *a, int size, bool right,
|
|||
val = tcg_temp_new_i64();
|
||||
tcg_gen_extu_tl_i64(val, cpu_gpr[a->vrb]);
|
||||
|
||||
ok = do_vinsx(ctx, a->vrt, size, right, cpu_gpr[a->vra], val, gen_helper);
|
||||
|
||||
tcg_temp_free_i64(val);
|
||||
return ok;
|
||||
return do_vinsx(ctx, a->vrt, size, right, cpu_gpr[a->vra], val, gen_helper);
|
||||
}
|
||||
|
||||
static bool do_vinsvx_VX(DisasContext *ctx, arg_VX *a, int size, bool right,
|
||||
|
@ -2035,7 +1879,6 @@ static bool do_vinsvx_VX(DisasContext *ctx, arg_VX *a, int size, bool right,
|
|||
static bool do_vins_VX_uim4(DisasContext *ctx, arg_VX_uim4 *a, int size,
|
||||
void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv))
|
||||
{
|
||||
bool ok;
|
||||
TCGv_i64 val;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
|
@ -2059,11 +1902,8 @@ static bool do_vins_VX_uim4(DisasContext *ctx, arg_VX_uim4 *a, int size,
|
|||
val = tcg_temp_new_i64();
|
||||
tcg_gen_extu_tl_i64(val, cpu_gpr[a->vrb]);
|
||||
|
||||
ok = do_vinsx(ctx, a->vrt, size, false, tcg_constant_tl(a->uim), val,
|
||||
gen_helper);
|
||||
|
||||
tcg_temp_free_i64(val);
|
||||
return ok;
|
||||
return do_vinsx(ctx, a->vrt, size, false, tcg_constant_tl(a->uim), val,
|
||||
gen_helper);
|
||||
}
|
||||
|
||||
static bool do_vinsert_VX_uim4(DisasContext *ctx, arg_VX_uim4 *a, int size,
|
||||
|
@ -2122,10 +1962,6 @@ static void gen_vsldoi(DisasContext *ctx)
|
|||
rd = gen_avr_ptr(rD(ctx->opcode));
|
||||
sh = tcg_const_i32(VSH(ctx->opcode));
|
||||
gen_helper_vsldoi(rd, ra, rb, sh);
|
||||
tcg_temp_free_ptr(ra);
|
||||
tcg_temp_free_ptr(rb);
|
||||
tcg_temp_free_ptr(rd);
|
||||
tcg_temp_free_i32(sh);
|
||||
}
|
||||
|
||||
static bool trans_VSLDBI(DisasContext *ctx, arg_VN *a)
|
||||
|
@ -2148,16 +1984,10 @@ static bool trans_VSLDBI(DisasContext *ctx, arg_VN *a)
|
|||
|
||||
tcg_gen_extract2_i64(t0, t1, t0, 64 - a->sh);
|
||||
tcg_gen_extract2_i64(t1, t2, t1, 64 - a->sh);
|
||||
|
||||
tcg_temp_free_i64(t2);
|
||||
}
|
||||
|
||||
set_avr64(a->vrt, t0, true);
|
||||
set_avr64(a->vrt, t1, false);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2181,16 +2011,10 @@ static bool trans_VSRDBI(DisasContext *ctx, arg_VN *a)
|
|||
|
||||
tcg_gen_extract2_i64(t0, t0, t1, a->sh);
|
||||
tcg_gen_extract2_i64(t1, t1, t2, a->sh);
|
||||
|
||||
tcg_temp_free_i64(t2);
|
||||
}
|
||||
|
||||
set_avr64(a->vrt, t0, false);
|
||||
set_avr64(a->vrt, t1, true);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2223,8 +2047,6 @@ static bool trans_VEXPANDQM(DisasContext *ctx, arg_VX_tb *a)
|
|||
tcg_gen_sari_i64(tmp, tmp, 63);
|
||||
set_avr64(a->vrt, tmp, false);
|
||||
set_avr64(a->vrt, tmp, true);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2278,12 +2100,6 @@ static bool do_vextractm(DisasContext *ctx, arg_VX_tb *a, unsigned vece)
|
|||
tcg_gen_shri_i64(hi, hi, 64 - elem_count_half);
|
||||
tcg_gen_extract2_i64(lo, lo, hi, 64 - elem_count_half);
|
||||
tcg_gen_trunc_i64_tl(cpu_gpr[a->vrt], lo);
|
||||
|
||||
tcg_temp_free_i64(hi);
|
||||
tcg_temp_free_i64(lo);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2304,9 +2120,6 @@ static bool trans_VEXTRACTQM(DisasContext *ctx, arg_VX_tb *a)
|
|||
get_avr64(tmp, a->vrb, true);
|
||||
tcg_gen_shri_i64(tmp, tmp, 63);
|
||||
tcg_gen_trunc_i64_tl(cpu_gpr[a->vrt], tmp);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2367,12 +2180,6 @@ static bool do_mtvsrm(DisasContext *ctx, arg_VX_tb *a, unsigned vece)
|
|||
|
||||
set_avr64(a->vrt, lo, false);
|
||||
set_avr64(a->vrt, hi, true);
|
||||
|
||||
tcg_temp_free_i64(hi);
|
||||
tcg_temp_free_i64(lo);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2394,9 +2201,6 @@ static bool trans_MTVSRQM(DisasContext *ctx, arg_VX_tb *a)
|
|||
tcg_gen_sextract_i64(tmp, tmp, 0, 1);
|
||||
set_avr64(a->vrt, tmp, false);
|
||||
set_avr64(a->vrt, tmp, true);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2445,10 +2249,6 @@ static bool do_vcntmb(DisasContext *ctx, arg_VX_mp *a, int vece)
|
|||
|
||||
tcg_gen_shli_i64(rt, rt, TARGET_LONG_BITS - 8 + vece);
|
||||
tcg_gen_trunc_i64_tl(cpu_gpr[a->rt], rt);
|
||||
|
||||
tcg_temp_free_i64(vrb);
|
||||
tcg_temp_free_i64(rt);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2473,12 +2273,7 @@ static bool do_vstri(DisasContext *ctx, arg_VX_tb_rc *a,
|
|||
} else {
|
||||
TCGv_i32 discard = tcg_temp_new_i32();
|
||||
gen_helper(discard, vrt, vrb);
|
||||
tcg_temp_free_i32(discard);
|
||||
}
|
||||
|
||||
tcg_temp_free_ptr(vrt);
|
||||
tcg_temp_free_ptr(vrb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2531,12 +2326,6 @@ static bool do_vclrb(DisasContext *ctx, arg_VX *a, bool right)
|
|||
get_avr64(tmp, a->vra, false);
|
||||
tcg_gen_and_i64(tmp, tmp, ml);
|
||||
set_avr64(a->vrt, tmp, false);
|
||||
|
||||
tcg_temp_free_i64(rb);
|
||||
tcg_temp_free_i64(mh);
|
||||
tcg_temp_free_i64(ml);
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2560,10 +2349,6 @@ static void glue(gen_, name0##_##name1)(DisasContext *ctx) \
|
|||
} else { \
|
||||
gen_helper_##name0(cpu_env, rd, ra, rb, rc); \
|
||||
} \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rc); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
}
|
||||
|
||||
GEN_VAFORM_PAIRED(vmaddfp, vnmsubfp, 23)
|
||||
|
@ -2579,11 +2364,6 @@ static bool do_va_helper(DisasContext *ctx, arg_VA *a,
|
|||
vrb = gen_avr_ptr(a->vrb);
|
||||
vrc = gen_avr_ptr(a->rc);
|
||||
gen_helper(vrt, vra, vrb, vrc);
|
||||
tcg_temp_free_ptr(vrt);
|
||||
tcg_temp_free_ptr(vra);
|
||||
tcg_temp_free_ptr(vrb);
|
||||
tcg_temp_free_ptr(vrc);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2654,11 +2434,6 @@ static bool do_va_env_helper(DisasContext *ctx, arg_VA *a,
|
|||
vrb = gen_avr_ptr(a->vrb);
|
||||
vrc = gen_avr_ptr(a->rc);
|
||||
gen_helper(cpu_env, vrt, vra, vrb, vrc);
|
||||
tcg_temp_free_ptr(vrt);
|
||||
tcg_temp_free_ptr(vra);
|
||||
tcg_temp_free_ptr(vrb);
|
||||
tcg_temp_free_ptr(vrc);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2751,8 +2526,6 @@ static bool trans_VEXTSD2Q(DisasContext *ctx, arg_VX_tb *a)
|
|||
set_avr64(a->vrt, tmp, false);
|
||||
tcg_gen_sari_i64(tmp, tmp, 63);
|
||||
set_avr64(a->vrt, tmp, true);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2799,11 +2572,6 @@ static void gen_##op(DisasContext *ctx) \
|
|||
ps = tcg_const_i32((ctx->opcode & 0x200) != 0); \
|
||||
\
|
||||
gen_helper_##op(cpu_crf[6], rd, ra, rb, ps); \
|
||||
\
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
tcg_temp_free_i32(ps); \
|
||||
}
|
||||
|
||||
#define GEN_BCD2(op) \
|
||||
|
@ -2823,10 +2591,6 @@ static void gen_##op(DisasContext *ctx) \
|
|||
ps = tcg_const_i32((ctx->opcode & 0x200) != 0); \
|
||||
\
|
||||
gen_helper_##op(cpu_crf[6], rd, rb, ps); \
|
||||
\
|
||||
tcg_temp_free_ptr(rb); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
tcg_temp_free_i32(ps); \
|
||||
}
|
||||
|
||||
GEN_BCD(bcdadd)
|
||||
|
@ -2933,8 +2697,6 @@ static void gen_vsbox(DisasContext *ctx)
|
|||
ra = gen_avr_ptr(rA(ctx->opcode));
|
||||
rd = gen_avr_ptr(rD(ctx->opcode));
|
||||
gen_helper_vsbox(rd, ra);
|
||||
tcg_temp_free_ptr(ra);
|
||||
tcg_temp_free_ptr(rd);
|
||||
}
|
||||
|
||||
GEN_VXFORM(vcipher, 4, 20)
|
||||
|
@ -2960,9 +2722,6 @@ static void gen_##op(DisasContext *ctx) \
|
|||
rd = gen_avr_ptr(rD(ctx->opcode)); \
|
||||
st_six = tcg_const_i32(rB(ctx->opcode)); \
|
||||
gen_helper_##op(rd, ra, st_six); \
|
||||
tcg_temp_free_ptr(ra); \
|
||||
tcg_temp_free_ptr(rd); \
|
||||
tcg_temp_free_i32(st_six); \
|
||||
}
|
||||
|
||||
VSHASIGMA(vshasigmaw)
|
||||
|
@ -3077,12 +2836,6 @@ static bool trans_VMSUMUDM(DisasContext *ctx, arg_VA *a)
|
|||
|
||||
set_avr64(a->vrt, rl, false);
|
||||
set_avr64(a->vrt, rh, true);
|
||||
|
||||
tcg_temp_free_i64(rl);
|
||||
tcg_temp_free_i64(rh);
|
||||
tcg_temp_free_i64(src1);
|
||||
tcg_temp_free_i64(src2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3128,14 +2881,6 @@ static bool trans_VMSUMCUD(DisasContext *ctx, arg_VA *a)
|
|||
/* Discard 64 more bits to complete the CHOP128(temp >> 128) */
|
||||
set_avr64(a->vrt, tmp0, false);
|
||||
set_avr64(a->vrt, zero, true);
|
||||
|
||||
tcg_temp_free_i64(tmp0);
|
||||
tcg_temp_free_i64(tmp1);
|
||||
tcg_temp_free_i64(prod1h);
|
||||
tcg_temp_free_i64(prod1l);
|
||||
tcg_temp_free_i64(prod0h);
|
||||
tcg_temp_free_i64(prod0l);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3149,10 +2894,6 @@ static bool do_vx_helper(DisasContext *ctx, arg_VX *a,
|
|||
rb = gen_avr_ptr(a->vrb);
|
||||
rd = gen_avr_ptr(a->vrt);
|
||||
gen_helper(rd, ra, rb);
|
||||
tcg_temp_free_ptr(ra);
|
||||
tcg_temp_free_ptr(rb);
|
||||
tcg_temp_free_ptr(rd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3237,12 +2978,6 @@ static bool do_vx_vmuleo(DisasContext *ctx, arg_VX *a, bool even,
|
|||
gen_mul(vrt0, vrt1, vra, vrb);
|
||||
set_avr64(a->vrt, vrt0, false);
|
||||
set_avr64(a->vrt, vrt1, true);
|
||||
|
||||
tcg_temp_free_i64(vra);
|
||||
tcg_temp_free_i64(vrb);
|
||||
tcg_temp_free_i64(vrt0);
|
||||
tcg_temp_free_i64(vrt1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3302,10 +3037,6 @@ static void do_vx_vmulhw_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, bool sign)
|
|||
|
||||
tcg_gen_shri_i64(lh, lh, 32);
|
||||
tcg_gen_deposit_i64(t, hh, lh, 0, 32);
|
||||
|
||||
tcg_temp_free_i64(hh);
|
||||
tcg_temp_free_i64(lh);
|
||||
tcg_temp_free_i64(temp);
|
||||
}
|
||||
|
||||
static void do_vx_vmulhd_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, bool sign)
|
||||
|
@ -3318,8 +3049,6 @@ static void do_vx_vmulhd_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, bool sign)
|
|||
} else {
|
||||
tcg_gen_mulu2_i64(tlow, t, a, b);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(tlow);
|
||||
}
|
||||
|
||||
static bool do_vx_mulh(DisasContext *ctx, arg_VX *a, bool sign,
|
||||
|
@ -3344,13 +3073,7 @@ static bool do_vx_mulh(DisasContext *ctx, arg_VX *a, bool sign,
|
|||
|
||||
set_avr64(a->vrt, vrt, i);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(vra);
|
||||
tcg_temp_free_i64(vrb);
|
||||
tcg_temp_free_i64(vrt);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
TRANS(VMULHSW, do_vx_mulh, true , do_vx_vmulhw_i64)
|
||||
|
@ -3368,7 +3091,6 @@ static void do_vavg(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b,
|
|||
gen_shr_vec(vece, b, b, 1);
|
||||
tcg_gen_add_vec(vece, t, a, b);
|
||||
tcg_gen_add_vec(vece, t, t, tmp);
|
||||
tcg_temp_free_vec(tmp);
|
||||
}
|
||||
|
||||
QEMU_FLATTEN
|
||||
|
@ -3538,8 +3260,6 @@ static void NAME(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b) \
|
|||
tcg_gen_movi_i32(t1, 0); \
|
||||
tcg_gen_movcond_i32(TCG_COND_NE, b, t0, t1, t0, b); \
|
||||
DIV(t, a, b); \
|
||||
tcg_temp_free_i32(t0); \
|
||||
tcg_temp_free_i32(t1); \
|
||||
}
|
||||
|
||||
#define DIVU64(NAME, DIV) \
|
||||
|
@ -3564,8 +3284,6 @@ static void NAME(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b) \
|
|||
tcg_gen_movi_i64(t1, 0); \
|
||||
tcg_gen_movcond_i64(TCG_COND_NE, b, t0, t1, t0, b); \
|
||||
DIV(t, a, b); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
}
|
||||
|
||||
DIVS32(do_divsw, tcg_gen_div_i32)
|
||||
|
@ -3596,9 +3314,6 @@ static void do_dives_i32(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
|
|||
|
||||
/* if quotient doesn't fit in 32 bits the result is undefined */
|
||||
tcg_gen_extrl_i64_i32(t, val1);
|
||||
|
||||
tcg_temp_free_i64(val1);
|
||||
tcg_temp_free_i64(val2);
|
||||
}
|
||||
|
||||
static void do_diveu_i32(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
|
||||
|
@ -3617,9 +3332,6 @@ static void do_diveu_i32(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
|
|||
|
||||
/* if quotient doesn't fit in 32 bits the result is undefined */
|
||||
tcg_gen_extrl_i64_i32(t, val1);
|
||||
|
||||
tcg_temp_free_i64(val1);
|
||||
tcg_temp_free_i64(val2);
|
||||
}
|
||||
|
||||
DIVS32(do_divesw, do_dives_i32)
|
||||
|
|
|
@ -40,8 +40,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
gen_qemu_##operation(ctx, t0, EA); \
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, true); \
|
||||
/* NOTE: cpu_vsrl is undefined */ \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
}
|
||||
|
||||
VSX_LOAD_SCALAR(lxsdx, ld64_i64)
|
||||
|
@ -68,8 +66,6 @@ static void gen_lxvd2x(DisasContext *ctx)
|
|||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
gen_qemu_ld64_i64(ctx, t0, EA);
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, false);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_lxvw4x(DisasContext *ctx)
|
||||
|
@ -99,8 +95,6 @@ static void gen_lxvw4x(DisasContext *ctx)
|
|||
tcg_gen_qemu_ld_i64(t0, EA, ctx->mem_idx, MO_LEUQ);
|
||||
tcg_gen_shri_i64(t1, t0, 32);
|
||||
tcg_gen_deposit_i64(xtl, t1, t0, 32, 32);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i64(xth, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
|
@ -108,9 +102,6 @@ static void gen_lxvw4x(DisasContext *ctx)
|
|||
}
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
}
|
||||
|
||||
static void gen_lxvwsx(DisasContext *ctx)
|
||||
|
@ -138,9 +129,6 @@ static void gen_lxvwsx(DisasContext *ctx)
|
|||
data = tcg_temp_new_i32();
|
||||
tcg_gen_qemu_ld_i32(data, EA, ctx->mem_idx, DEF_MEMOP(MO_UL));
|
||||
tcg_gen_gvec_dup_i32(MO_UL, vsr_full_offset(xT(ctx->opcode)), 16, 16, data);
|
||||
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i32(data);
|
||||
}
|
||||
|
||||
static void gen_lxvdsx(DisasContext *ctx)
|
||||
|
@ -161,9 +149,6 @@ static void gen_lxvdsx(DisasContext *ctx)
|
|||
data = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld_i64(data, EA, ctx->mem_idx, DEF_MEMOP(MO_UQ));
|
||||
tcg_gen_gvec_dup_i64(MO_UQ, vsr_full_offset(xT(ctx->opcode)), 16, 16, data);
|
||||
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(data);
|
||||
}
|
||||
|
||||
static void gen_bswap16x8(TCGv_i64 outh, TCGv_i64 outl,
|
||||
|
@ -186,10 +171,6 @@ static void gen_bswap16x8(TCGv_i64 outh, TCGv_i64 outl,
|
|||
tcg_gen_shri_i64(t1, inl, 8);
|
||||
tcg_gen_and_i64(t1, t1, mask);
|
||||
tcg_gen_or_i64(outl, t0, t1);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(mask);
|
||||
}
|
||||
|
||||
static void gen_bswap32x4(TCGv_i64 outh, TCGv_i64 outl,
|
||||
|
@ -204,10 +185,8 @@ static void gen_bswap32x4(TCGv_i64 outh, TCGv_i64 outl,
|
|||
tcg_gen_deposit_i64(outh, outh, hi, 32, 32);
|
||||
tcg_gen_shri_i64(outl, lo, 32);
|
||||
tcg_gen_deposit_i64(outl, outl, lo, 32, 32);
|
||||
|
||||
tcg_temp_free_i64(hi);
|
||||
tcg_temp_free_i64(lo);
|
||||
}
|
||||
|
||||
static void gen_lxvh8x(DisasContext *ctx)
|
||||
{
|
||||
TCGv EA;
|
||||
|
@ -232,9 +211,6 @@ static void gen_lxvh8x(DisasContext *ctx)
|
|||
}
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
}
|
||||
|
||||
static void gen_lxvb16x(DisasContext *ctx)
|
||||
|
@ -257,9 +233,6 @@ static void gen_lxvb16x(DisasContext *ctx)
|
|||
tcg_gen_qemu_ld_i64(xtl, EA, ctx->mem_idx, MO_BEUQ);
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
}
|
||||
|
||||
#ifdef TARGET_PPC64
|
||||
|
@ -285,8 +258,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
gen_set_access_type(ctx, ACCESS_INT); \
|
||||
gen_addr_register(ctx, EA); \
|
||||
gen_helper_##name(cpu_env, EA, xt, cpu_gpr[rB(ctx->opcode)]); \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
}
|
||||
|
||||
VSX_VECTOR_LOAD_STORE_LENGTH(lxvl)
|
||||
|
@ -310,8 +281,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
gen_addr_reg_index(ctx, EA); \
|
||||
get_cpu_vsr(t0, xS(ctx->opcode), true); \
|
||||
gen_qemu_##operation(ctx, t0, EA); \
|
||||
tcg_temp_free(EA); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
}
|
||||
|
||||
VSX_STORE_SCALAR(stxsdx, st64_i64)
|
||||
|
@ -338,8 +307,6 @@ static void gen_stxvd2x(DisasContext *ctx)
|
|||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
get_cpu_vsr(t0, xS(ctx->opcode), false);
|
||||
gen_qemu_st64_i64(ctx, t0, EA);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_stxvw4x(DisasContext *ctx)
|
||||
|
@ -370,16 +337,11 @@ static void gen_stxvw4x(DisasContext *ctx)
|
|||
tcg_gen_shri_i64(t0, xsl, 32);
|
||||
tcg_gen_deposit_i64(t1, t0, xsl, 32, 32);
|
||||
tcg_gen_qemu_st_i64(t1, EA, ctx->mem_idx, MO_LEUQ);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
} else {
|
||||
tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ);
|
||||
}
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(xsh);
|
||||
tcg_temp_free_i64(xsl);
|
||||
}
|
||||
|
||||
static void gen_stxvh8x(DisasContext *ctx)
|
||||
|
@ -407,16 +369,11 @@ static void gen_stxvh8x(DisasContext *ctx)
|
|||
tcg_gen_qemu_st_i64(outh, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
tcg_gen_qemu_st_i64(outl, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_temp_free_i64(outh);
|
||||
tcg_temp_free_i64(outl);
|
||||
} else {
|
||||
tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ);
|
||||
}
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(xsh);
|
||||
tcg_temp_free_i64(xsl);
|
||||
}
|
||||
|
||||
static void gen_stxvb16x(DisasContext *ctx)
|
||||
|
@ -439,9 +396,6 @@ static void gen_stxvb16x(DisasContext *ctx)
|
|||
tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_gen_addi_tl(EA, EA, 8);
|
||||
tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ);
|
||||
tcg_temp_free(EA);
|
||||
tcg_temp_free_i64(xsh);
|
||||
tcg_temp_free_i64(xsl);
|
||||
}
|
||||
|
||||
static void gen_mfvsrwz(DisasContext *ctx)
|
||||
|
@ -462,8 +416,6 @@ static void gen_mfvsrwz(DisasContext *ctx)
|
|||
get_cpu_vsr(xsh, xS(ctx->opcode), true);
|
||||
tcg_gen_ext32u_i64(tmp, xsh);
|
||||
tcg_gen_trunc_i64_tl(cpu_gpr[rA(ctx->opcode)], tmp);
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(xsh);
|
||||
}
|
||||
|
||||
static void gen_mtvsrwa(DisasContext *ctx)
|
||||
|
@ -484,8 +436,6 @@ static void gen_mtvsrwa(DisasContext *ctx)
|
|||
tcg_gen_extu_tl_i64(tmp, cpu_gpr[rA(ctx->opcode)]);
|
||||
tcg_gen_ext32s_i64(xsh, tmp);
|
||||
set_cpu_vsr(xT(ctx->opcode), xsh, true);
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(xsh);
|
||||
}
|
||||
|
||||
static void gen_mtvsrwz(DisasContext *ctx)
|
||||
|
@ -506,8 +456,6 @@ static void gen_mtvsrwz(DisasContext *ctx)
|
|||
tcg_gen_extu_tl_i64(tmp, cpu_gpr[rA(ctx->opcode)]);
|
||||
tcg_gen_ext32u_i64(xsh, tmp);
|
||||
set_cpu_vsr(xT(ctx->opcode), xsh, true);
|
||||
tcg_temp_free_i64(tmp);
|
||||
tcg_temp_free_i64(xsh);
|
||||
}
|
||||
|
||||
#if defined(TARGET_PPC64)
|
||||
|
@ -528,7 +476,6 @@ static void gen_mfvsrd(DisasContext *ctx)
|
|||
t0 = tcg_temp_new_i64();
|
||||
get_cpu_vsr(t0, xS(ctx->opcode), true);
|
||||
tcg_gen_mov_i64(cpu_gpr[rA(ctx->opcode)], t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_mtvsrd(DisasContext *ctx)
|
||||
|
@ -548,7 +495,6 @@ static void gen_mtvsrd(DisasContext *ctx)
|
|||
t0 = tcg_temp_new_i64();
|
||||
tcg_gen_mov_i64(t0, cpu_gpr[rA(ctx->opcode)]);
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, true);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_mfvsrld(DisasContext *ctx)
|
||||
|
@ -568,7 +514,6 @@ static void gen_mfvsrld(DisasContext *ctx)
|
|||
t0 = tcg_temp_new_i64();
|
||||
get_cpu_vsr(t0, xS(ctx->opcode), false);
|
||||
tcg_gen_mov_i64(cpu_gpr[rA(ctx->opcode)], t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_mtvsrdd(DisasContext *ctx)
|
||||
|
@ -596,7 +541,6 @@ static void gen_mtvsrdd(DisasContext *ctx)
|
|||
|
||||
tcg_gen_mov_i64(t0, cpu_gpr[rB(ctx->opcode)]);
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, false);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_mtvsrws(DisasContext *ctx)
|
||||
|
@ -619,7 +563,6 @@ static void gen_mtvsrws(DisasContext *ctx)
|
|||
cpu_gpr[rA(ctx->opcode)], 32, 32);
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, false);
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, true);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -666,14 +609,11 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
tcg_gen_and_i64(xa, xa, sgm); \
|
||||
tcg_gen_andc_i64(xb, xb, sgm); \
|
||||
tcg_gen_or_i64(xb, xb, xa); \
|
||||
tcg_temp_free_i64(xa); \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
set_cpu_vsr(xT(ctx->opcode), xb, true); \
|
||||
set_cpu_vsr(xT(ctx->opcode), tcg_constant_i64(0), false); \
|
||||
tcg_temp_free_i64(xb); \
|
||||
tcg_temp_free_i64(sgm); \
|
||||
}
|
||||
|
||||
VSX_SCALAR_MOVE(xsabsdp, OP_ABS, SGN_MASK_DP)
|
||||
|
@ -717,15 +657,10 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
tcg_gen_and_i64(xah, tmp, sgm); \
|
||||
tcg_gen_andc_i64(xbh, xbh, sgm); \
|
||||
tcg_gen_or_i64(xbh, xbh, xah); \
|
||||
tcg_temp_free_i64(xah); \
|
||||
break; \
|
||||
} \
|
||||
set_cpu_vsr(xt, xbh, true); \
|
||||
set_cpu_vsr(xt, xbl, false); \
|
||||
tcg_temp_free_i64(xbl); \
|
||||
tcg_temp_free_i64(xbh); \
|
||||
tcg_temp_free_i64(sgm); \
|
||||
tcg_temp_free_i64(tmp); \
|
||||
}
|
||||
|
||||
VSX_SCALAR_MOVE_QP(xsabsqp, OP_ABS, SGN_MASK_DP)
|
||||
|
@ -870,11 +805,7 @@ static void gen_##name(DisasContext *ctx) \
|
|||
} else { \
|
||||
ignored = tcg_temp_new_i32(); \
|
||||
gen_helper_##name(ignored, cpu_env, xt, xa, xb); \
|
||||
tcg_temp_free_i32(ignored); \
|
||||
} \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
tcg_temp_free_ptr(xa); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
VSX_CMP(xvcmpeqdp, 0x0C, 0x0C, 0, PPC2_VSX)
|
||||
|
@ -899,10 +830,6 @@ static bool trans_XSCVQPDP(DisasContext *ctx, arg_X_tb_rc *a)
|
|||
xt = gen_avr_ptr(a->rt);
|
||||
xb = gen_avr_ptr(a->rb);
|
||||
gen_helper_XSCVQPDP(cpu_env, ro, xt, xb);
|
||||
tcg_temp_free_i32(ro);
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -917,9 +844,6 @@ static bool do_helper_env_X_tb(DisasContext *ctx, arg_X_tb *a,
|
|||
xt = gen_avr_ptr(a->rt);
|
||||
xb = gen_avr_ptr(a->rb);
|
||||
gen_helper(cpu_env, xt, xb);
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -938,7 +862,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
} \
|
||||
opc = tcg_const_i32(ctx->opcode); \
|
||||
gen_helper_##name(cpu_env, opc); \
|
||||
tcg_temp_free_i32(opc); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_X3(name, op1, op2, inval, type) \
|
||||
|
@ -953,9 +876,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
xa = gen_vsr_ptr(xA(ctx->opcode)); \
|
||||
xb = gen_vsr_ptr(xB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, xt, xa, xb); \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
tcg_temp_free_ptr(xa); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_X2(name, op1, op2, inval, type) \
|
||||
|
@ -969,8 +889,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
xt = gen_vsr_ptr(xT(ctx->opcode)); \
|
||||
xb = gen_vsr_ptr(xB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, xt, xb); \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_X2_AB(name, op1, op2, inval, type) \
|
||||
|
@ -986,9 +904,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
xa = gen_vsr_ptr(xA(ctx->opcode)); \
|
||||
xb = gen_vsr_ptr(xB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, opc, xa, xb); \
|
||||
tcg_temp_free_i32(opc); \
|
||||
tcg_temp_free_ptr(xa); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_X1(name, op1, op2, inval, type) \
|
||||
|
@ -1003,8 +918,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
opc = tcg_const_i32(ctx->opcode); \
|
||||
xb = gen_vsr_ptr(xB(ctx->opcode)); \
|
||||
gen_helper_##name(cpu_env, opc, xb); \
|
||||
tcg_temp_free_i32(opc); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_R3(name, op1, op2, inval, type) \
|
||||
|
@ -1021,10 +934,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
xa = gen_vsr_ptr(rA(ctx->opcode) + 32); \
|
||||
xb = gen_vsr_ptr(rB(ctx->opcode) + 32); \
|
||||
gen_helper_##name(cpu_env, opc, xt, xa, xb); \
|
||||
tcg_temp_free_i32(opc); \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
tcg_temp_free_ptr(xa); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_R2(name, op1, op2, inval, type) \
|
||||
|
@ -1040,9 +949,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
xt = gen_vsr_ptr(rD(ctx->opcode) + 32); \
|
||||
xb = gen_vsr_ptr(rB(ctx->opcode) + 32); \
|
||||
gen_helper_##name(cpu_env, opc, xt, xb); \
|
||||
tcg_temp_free_i32(opc); \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_R2_AB(name, op1, op2, inval, type) \
|
||||
|
@ -1058,9 +964,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
xa = gen_vsr_ptr(rA(ctx->opcode) + 32); \
|
||||
xb = gen_vsr_ptr(rB(ctx->opcode) + 32); \
|
||||
gen_helper_##name(cpu_env, opc, xa, xb); \
|
||||
tcg_temp_free_i32(opc); \
|
||||
tcg_temp_free_ptr(xa); \
|
||||
tcg_temp_free_ptr(xb); \
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_XT_XB_ENV(name, op1, op2, inval, type) \
|
||||
|
@ -1078,8 +981,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
gen_helper_##name(t1, cpu_env, t0); \
|
||||
set_cpu_vsr(xT(ctx->opcode), t1, true); \
|
||||
set_cpu_vsr(xT(ctx->opcode), tcg_constant_i64(0), false); \
|
||||
tcg_temp_free_i64(t0); \
|
||||
tcg_temp_free_i64(t1); \
|
||||
}
|
||||
|
||||
GEN_VSX_HELPER_X3(xsadddp, 0x00, 0x04, 0, PPC2_VSX)
|
||||
|
@ -1291,8 +1192,6 @@ static bool do_XX2_bf_uim(DisasContext *ctx, arg_XX2_bf_uim *a, bool vsr,
|
|||
REQUIRE_VSX(ctx);
|
||||
xb = vsr ? gen_vsr_ptr(a->xb) : gen_avr_ptr(a->xb);
|
||||
gen_helper(cpu_env, tcg_constant_i32(a->bf), tcg_constant_i32(a->uim), xb);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1314,9 +1213,6 @@ bool trans_XSCVSPDPN(DisasContext *ctx, arg_XX2 *a)
|
|||
|
||||
set_cpu_vsr(a->xt, tmp, true);
|
||||
set_cpu_vsr(a->xt, tcg_constant_i64(0), false);
|
||||
|
||||
tcg_temp_free_i64(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1413,11 +1309,6 @@ static bool trans_XXPERM(DisasContext *ctx, arg_XX3 *a)
|
|||
xb = gen_vsr_ptr(a->xb);
|
||||
|
||||
gen_helper_VPERM(xt, xa, xt, xb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1433,11 +1324,6 @@ static bool trans_XXPERMR(DisasContext *ctx, arg_XX3 *a)
|
|||
xb = gen_vsr_ptr(a->xb);
|
||||
|
||||
gen_helper_VPERMR(xt, xa, xt, xb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1458,8 +1344,6 @@ static bool trans_XXPERMDI(DisasContext *ctx, arg_XX3_dm *a)
|
|||
|
||||
set_cpu_vsr(a->xt, t0, true);
|
||||
set_cpu_vsr(a->xt, t1, false);
|
||||
|
||||
tcg_temp_free_i64(t1);
|
||||
} else {
|
||||
get_cpu_vsr(t0, a->xa, (a->dm & 2) == 0);
|
||||
set_cpu_vsr(a->xt, t0, true);
|
||||
|
@ -1467,9 +1351,6 @@ static bool trans_XXPERMDI(DisasContext *ctx, arg_XX3_dm *a)
|
|||
get_cpu_vsr(t0, a->xb, (a->dm & 1) == 0);
|
||||
set_cpu_vsr(a->xt, t0, false);
|
||||
}
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1486,12 +1367,6 @@ static bool trans_XXPERMX(DisasContext *ctx, arg_8RR_XX4_uim3 *a)
|
|||
xc = gen_vsr_ptr(a->xc);
|
||||
|
||||
gen_helper_XXPERMX(xt, xa, xb, xc, tcg_constant_tl(a->uim3));
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
tcg_temp_free_ptr(xc);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1514,10 +1389,6 @@ static bool do_xxgenpcv(DisasContext *ctx, arg_X_imm5 *a,
|
|||
vrb = gen_avr_ptr(a->vrb);
|
||||
|
||||
fn[a->imm](xt, vrb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(vrb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1550,12 +1421,6 @@ static bool do_xsmadd(DisasContext *ctx, int tgt, int src1, int src2, int src3,
|
|||
s3 = gen_vsr_ptr(src3);
|
||||
|
||||
gen_helper(cpu_env, t, s1, s2, s3);
|
||||
|
||||
tcg_temp_free_ptr(t);
|
||||
tcg_temp_free_ptr(s1);
|
||||
tcg_temp_free_ptr(s2);
|
||||
tcg_temp_free_ptr(s3);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1636,10 +1501,6 @@ static void gen_##name(DisasContext *ctx) \
|
|||
s3 = gen_vsr_ptr(xB(ctx->opcode)); \
|
||||
} \
|
||||
gen_helper_##name(cpu_env, xt, s1, s2, s3); \
|
||||
tcg_temp_free_ptr(xt); \
|
||||
tcg_temp_free_ptr(s1); \
|
||||
tcg_temp_free_ptr(s2); \
|
||||
tcg_temp_free_ptr(s3); \
|
||||
}
|
||||
|
||||
GEN_VSX_HELPER_VSX_MADD(xvmadddp, 0x04, 0x0C, 0x0D, 0, PPC2_VSX)
|
||||
|
@ -1673,11 +1534,6 @@ static void gen_xxbrd(DisasContext *ctx)
|
|||
tcg_gen_bswap64_i64(xtl, xbl);
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static void gen_xxbrh(DisasContext *ctx)
|
||||
|
@ -1701,11 +1557,6 @@ static void gen_xxbrh(DisasContext *ctx)
|
|||
gen_bswap16x8(xth, xtl, xbh, xbl);
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static void gen_xxbrq(DisasContext *ctx)
|
||||
|
@ -1733,12 +1584,6 @@ static void gen_xxbrq(DisasContext *ctx)
|
|||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
tcg_gen_mov_i64(xth, t0);
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static void gen_xxbrw(DisasContext *ctx)
|
||||
|
@ -1762,11 +1607,6 @@ static void gen_xxbrw(DisasContext *ctx)
|
|||
gen_bswap32x4(xth, xtl, xbh, xbl);
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
#define VSX_LOGICAL(name, vece, tcg_op) \
|
||||
|
@ -1813,11 +1653,6 @@ static void glue(gen_, name)(DisasContext *ctx) \
|
|||
set_cpu_vsr(xT(ctx->opcode), tmp, true); \
|
||||
tcg_gen_deposit_i64(tmp, b1, a1, 32, 32); \
|
||||
set_cpu_vsr(xT(ctx->opcode), tmp, false); \
|
||||
tcg_temp_free_i64(a0); \
|
||||
tcg_temp_free_i64(a1); \
|
||||
tcg_temp_free_i64(b0); \
|
||||
tcg_temp_free_i64(b1); \
|
||||
tcg_temp_free_i64(tmp); \
|
||||
}
|
||||
|
||||
VSX_XXMRG(xxmrghw, 1)
|
||||
|
@ -1974,13 +1809,6 @@ static bool trans_XVTLSBB(DisasContext *ctx, arg_XX2_bf_xb *a)
|
|||
|
||||
tcg_gen_or_i64(t0, all_false, all_true);
|
||||
tcg_gen_extrl_i64_i32(cpu_crf[a->bf], t0);
|
||||
|
||||
tcg_temp_free_i64(xb);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(all_true);
|
||||
tcg_temp_free_i64(all_false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2012,7 +1840,6 @@ static void gen_xxsldwi(DisasContext *ctx)
|
|||
get_cpu_vsr(t0, xB(ctx->opcode), true);
|
||||
tcg_gen_shri_i64(t0, t0, 32);
|
||||
tcg_gen_or_i64(xtl, xtl, t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
|
@ -2032,16 +1859,12 @@ static void gen_xxsldwi(DisasContext *ctx)
|
|||
get_cpu_vsr(t0, xB(ctx->opcode), false);
|
||||
tcg_gen_shri_i64(t0, t0, 32);
|
||||
tcg_gen_or_i64(xtl, xtl, t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
}
|
||||
|
||||
static bool do_vsx_extract_insert(DisasContext *ctx, arg_XX2_uim *a,
|
||||
|
@ -2064,10 +1887,7 @@ static bool do_vsx_extract_insert(DisasContext *ctx, arg_XX2_uim *a,
|
|||
xt = gen_vsr_ptr(a->xt);
|
||||
xb = gen_vsr_ptr(a->xb);
|
||||
gen_helper(xt, xb, tcg_constant_i32(a->uim));
|
||||
tcg_temp_free_ptr(xb);
|
||||
tcg_temp_free_ptr(xt);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2086,7 +1906,6 @@ static void gen_xsxexpdp(DisasContext *ctx)
|
|||
t0 = tcg_temp_new_i64();
|
||||
get_cpu_vsr(t0, xB(ctx->opcode), true);
|
||||
tcg_gen_extract_i64(rt, t0, 52, 11);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static void gen_xsxexpqp(DisasContext *ctx)
|
||||
|
@ -2108,10 +1927,6 @@ static void gen_xsxexpqp(DisasContext *ctx)
|
|||
set_cpu_vsr(rD(ctx->opcode) + 32, xth, true);
|
||||
tcg_gen_movi_i64(xtl, 0);
|
||||
set_cpu_vsr(rD(ctx->opcode) + 32, xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
}
|
||||
|
||||
static void gen_xsiexpdp(DisasContext *ctx)
|
||||
|
@ -2133,8 +1948,6 @@ static void gen_xsiexpdp(DisasContext *ctx)
|
|||
tcg_gen_or_i64(xth, xth, t0);
|
||||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
set_cpu_vsr(xT(ctx->opcode), tcg_constant_i64(0), false);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(xth);
|
||||
}
|
||||
|
||||
static void gen_xsiexpqp(DisasContext *ctx)
|
||||
|
@ -2167,13 +1980,6 @@ static void gen_xsiexpqp(DisasContext *ctx)
|
|||
set_cpu_vsr(rD(ctx->opcode) + 32, xth, true);
|
||||
tcg_gen_mov_i64(xtl, xal);
|
||||
set_cpu_vsr(rD(ctx->opcode) + 32, xtl, false);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xah);
|
||||
tcg_temp_free_i64(xal);
|
||||
tcg_temp_free_i64(xbh);
|
||||
}
|
||||
|
||||
static void gen_xsxsigdp(DisasContext *ctx)
|
||||
|
@ -2198,12 +2004,6 @@ static void gen_xsxsigdp(DisasContext *ctx)
|
|||
tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0);
|
||||
get_cpu_vsr(t1, xB(ctx->opcode), true);
|
||||
tcg_gen_deposit_i64(rt, t0, t1, 0, 52);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(exp);
|
||||
tcg_temp_free_i64(zr);
|
||||
tcg_temp_free_i64(nan);
|
||||
}
|
||||
|
||||
static void gen_xsxsigqp(DisasContext *ctx)
|
||||
|
@ -2237,15 +2037,6 @@ static void gen_xsxsigqp(DisasContext *ctx)
|
|||
set_cpu_vsr(rD(ctx->opcode) + 32, xth, true);
|
||||
tcg_gen_mov_i64(xtl, xbl);
|
||||
set_cpu_vsr(rD(ctx->opcode) + 32, xtl, false);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(exp);
|
||||
tcg_temp_free_i64(zr);
|
||||
tcg_temp_free_i64(nan);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -2285,14 +2076,6 @@ static void gen_xviexpsp(DisasContext *ctx)
|
|||
tcg_gen_shli_i64(t0, t0, 23);
|
||||
tcg_gen_or_i64(xtl, xtl, t0);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xah);
|
||||
tcg_temp_free_i64(xal);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static void gen_xviexpdp(DisasContext *ctx)
|
||||
|
@ -2324,13 +2107,6 @@ static void gen_xviexpdp(DisasContext *ctx)
|
|||
|
||||
tcg_gen_deposit_i64(xtl, xal, xbl, 52, 11);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xah);
|
||||
tcg_temp_free_i64(xal);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static void gen_xvxexpsp(DisasContext *ctx)
|
||||
|
@ -2357,11 +2133,6 @@ static void gen_xvxexpsp(DisasContext *ctx)
|
|||
tcg_gen_shri_i64(xtl, xbl, 23);
|
||||
tcg_gen_andi_i64(xtl, xtl, 0xFF000000FF);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static void gen_xvxexpdp(DisasContext *ctx)
|
||||
|
@ -2386,11 +2157,6 @@ static void gen_xvxexpdp(DisasContext *ctx)
|
|||
set_cpu_vsr(xT(ctx->opcode), xth, true);
|
||||
tcg_gen_extract_i64(xtl, xbl, 52, 11);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static bool trans_XVXSIGSP(DisasContext *ctx, arg_XX2 *a)
|
||||
|
@ -2404,10 +2170,6 @@ static bool trans_XVXSIGSP(DisasContext *ctx, arg_XX2 *a)
|
|||
b = gen_vsr_ptr(a->xb);
|
||||
|
||||
gen_helper_XVXSIGSP(t, b);
|
||||
|
||||
tcg_temp_free_ptr(t);
|
||||
tcg_temp_free_ptr(b);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2447,15 +2209,6 @@ static void gen_xvxsigdp(DisasContext *ctx)
|
|||
tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0);
|
||||
tcg_gen_deposit_i64(xtl, t0, xbl, 0, 52);
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(exp);
|
||||
tcg_temp_free_i64(zr);
|
||||
tcg_temp_free_i64(nan);
|
||||
tcg_temp_free_i64(xth);
|
||||
tcg_temp_free_i64(xtl);
|
||||
tcg_temp_free_i64(xbh);
|
||||
tcg_temp_free_i64(xbl);
|
||||
}
|
||||
|
||||
static bool do_lstxv(DisasContext *ctx, int ra, TCGv displ,
|
||||
|
@ -2510,9 +2263,6 @@ static bool do_lstxv(DisasContext *ctx, int ra, TCGv displ,
|
|||
set_cpu_vsr(rt2, xt, ctx->le_mode);
|
||||
}
|
||||
}
|
||||
|
||||
tcg_temp_free(ea);
|
||||
tcg_temp_free_i64(xt);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2577,10 +2327,6 @@ static bool do_lstxsd(DisasContext *ctx, int rt, int ra, TCGv displ, bool store)
|
|||
set_cpu_vsr(rt + 32, xt, true);
|
||||
set_cpu_vsr(rt + 32, tcg_constant_i64(0), false);
|
||||
}
|
||||
|
||||
tcg_temp_free(ea);
|
||||
tcg_temp_free_i64(xt);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2620,10 +2366,6 @@ static bool do_lstxssp(DisasContext *ctx, int rt, int ra, TCGv displ, bool store
|
|||
set_cpu_vsr(rt + 32, xt, true);
|
||||
set_cpu_vsr(rt + 32, tcg_constant_i64(0), false);
|
||||
}
|
||||
|
||||
tcg_temp_free(ea);
|
||||
tcg_temp_free_i64(xt);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2684,9 +2426,6 @@ static bool do_lstrm(DisasContext *ctx, arg_X *a, MemOp mop, bool store)
|
|||
set_cpu_vsr(a->rt, xt, false);
|
||||
set_cpu_vsr(a->rt, tcg_constant_i64(0), true);
|
||||
}
|
||||
|
||||
tcg_temp_free(ea);
|
||||
tcg_temp_free_i64(xt);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2741,9 +2480,6 @@ static void gen_xxeval_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, TCGv_i64 c,
|
|||
}
|
||||
|
||||
tcg_gen_mov_i64(t, disj);
|
||||
|
||||
tcg_temp_free_i64(conj);
|
||||
tcg_temp_free_i64(disj);
|
||||
}
|
||||
|
||||
static void gen_xxeval_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b,
|
||||
|
@ -2788,9 +2524,6 @@ static void gen_xxeval_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b,
|
|||
}
|
||||
|
||||
tcg_gen_mov_vec(t, disj);
|
||||
|
||||
tcg_temp_free_vec(disj);
|
||||
tcg_temp_free_vec(conj);
|
||||
}
|
||||
|
||||
static bool trans_XXEVAL(DisasContext *ctx, arg_8RR_XX4_imm *a)
|
||||
|
@ -2925,7 +2658,6 @@ static void gen_xxblendv_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b,
|
|||
TCGv_vec tmp = tcg_temp_new_vec_matching(c);
|
||||
tcg_gen_sari_vec(vece, tmp, c, (8 << vece) - 1);
|
||||
tcg_gen_bitsel_vec(vece, t, tmp, b, a);
|
||||
tcg_temp_free_vec(tmp);
|
||||
}
|
||||
|
||||
static bool do_xxblendv(DisasContext *ctx, arg_8RR_XX4 *a, unsigned vece)
|
||||
|
@ -2987,11 +2719,6 @@ static bool do_helper_XX3(DisasContext *ctx, arg_XX3 *a,
|
|||
xb = gen_vsr_ptr(a->xb);
|
||||
|
||||
helper(cpu_env, xt, xa, xb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3013,11 +2740,6 @@ static bool do_helper_X(arg_X *a,
|
|||
rb = gen_avr_ptr(a->rb);
|
||||
|
||||
helper(cpu_env, rt, ra, rb);
|
||||
|
||||
tcg_temp_free_ptr(rt);
|
||||
tcg_temp_free_ptr(ra);
|
||||
tcg_temp_free_ptr(rb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3047,10 +2769,6 @@ static bool trans_XVCVSPBF16(DisasContext *ctx, arg_XX2 *a)
|
|||
xb = gen_vsr_ptr(a->xb);
|
||||
|
||||
gen_helper_XVCVSPBF16(cpu_env, xt, xb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3114,9 +2832,6 @@ static bool do_ger(DisasContext *ctx, arg_MMIRR_XX3 *a,
|
|||
|
||||
mask = ger_pack_masks(a->pmsk, a->ymsk, a->xmsk);
|
||||
helper(cpu_env, xa, xb, xt, tcg_constant_i32(mask));
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -64,7 +64,6 @@ static void gen_clzw(TCGv ret, TCGv arg1)
|
|||
TCGv t = tcg_temp_new();
|
||||
tcg_gen_shli_tl(t, arg1, 32);
|
||||
tcg_gen_clzi_tl(ret, t, 32);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static bool trans_clz(DisasContext *ctx, arg_clz *a)
|
||||
|
@ -161,8 +160,6 @@ static void gen_bset(TCGv ret, TCGv arg1, TCGv shamt)
|
|||
|
||||
gen_sbop_mask(t, shamt);
|
||||
tcg_gen_or_tl(ret, arg1, t);
|
||||
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static bool trans_bset(DisasContext *ctx, arg_bset *a)
|
||||
|
@ -183,8 +180,6 @@ static void gen_bclr(TCGv ret, TCGv arg1, TCGv shamt)
|
|||
|
||||
gen_sbop_mask(t, shamt);
|
||||
tcg_gen_andc_tl(ret, arg1, t);
|
||||
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static bool trans_bclr(DisasContext *ctx, arg_bclr *a)
|
||||
|
@ -205,8 +200,6 @@ static void gen_binv(TCGv ret, TCGv arg1, TCGv shamt)
|
|||
|
||||
gen_sbop_mask(t, shamt);
|
||||
tcg_gen_xor_tl(ret, arg1, t);
|
||||
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static bool trans_binv(DisasContext *ctx, arg_binv *a)
|
||||
|
@ -252,9 +245,6 @@ static void gen_rorw(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
|
||||
/* sign-extend 64-bits */
|
||||
tcg_gen_ext_i32_tl(ret, t1);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t2);
|
||||
}
|
||||
|
||||
static bool trans_ror(DisasContext *ctx, arg_ror *a)
|
||||
|
@ -270,8 +260,6 @@ static void gen_roriw(TCGv ret, TCGv arg1, target_long shamt)
|
|||
tcg_gen_trunc_tl_i32(t1, arg1);
|
||||
tcg_gen_rotri_i32(t1, t1, shamt);
|
||||
tcg_gen_ext_i32_tl(ret, t1);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
}
|
||||
|
||||
static bool trans_rori(DisasContext *ctx, arg_rori *a)
|
||||
|
@ -294,9 +282,6 @@ static void gen_rolw(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
|
||||
/* sign-extend 64-bits */
|
||||
tcg_gen_ext_i32_tl(ret, t1);
|
||||
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t2);
|
||||
}
|
||||
|
||||
static bool trans_rol(DisasContext *ctx, arg_rol *a)
|
||||
|
@ -340,8 +325,6 @@ static void gen_orc_b(TCGv ret, TCGv source1)
|
|||
|
||||
/* Replicate the lsb of each byte across the byte. */
|
||||
tcg_gen_muli_tl(ret, tmp, 0xff);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static bool trans_orc_b(DisasContext *ctx, arg_orc_b *a)
|
||||
|
@ -357,8 +340,6 @@ static void gen_sh##SHAMT##add(TCGv ret, TCGv arg1, TCGv arg2) \
|
|||
\
|
||||
tcg_gen_shli_tl(t, arg1, SHAMT); \
|
||||
tcg_gen_add_tl(ret, t, arg2); \
|
||||
\
|
||||
tcg_temp_free(t); \
|
||||
}
|
||||
|
||||
GEN_SHADD(1)
|
||||
|
@ -446,8 +427,6 @@ static void gen_sh##SHAMT##add_uw(TCGv ret, TCGv arg1, TCGv arg2) \
|
|||
\
|
||||
tcg_gen_shli_tl(t, t, SHAMT); \
|
||||
tcg_gen_add_tl(ret, t, arg2); \
|
||||
\
|
||||
tcg_temp_free(t); \
|
||||
}
|
||||
|
||||
GEN_SHADD_UW(1)
|
||||
|
@ -472,7 +451,6 @@ static void gen_add_uw(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
TCGv t = tcg_temp_new();
|
||||
tcg_gen_ext32u_tl(t, arg1);
|
||||
tcg_gen_add_tl(ret, t, arg2);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static bool trans_add_uw(DisasContext *ctx, arg_add_uw *a)
|
||||
|
@ -531,7 +509,6 @@ static void gen_packh(TCGv ret, TCGv src1, TCGv src2)
|
|||
|
||||
tcg_gen_ext8u_tl(t, src2);
|
||||
tcg_gen_deposit_tl(ret, src1, t, 8, TARGET_LONG_BITS - 8);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void gen_packw(TCGv ret, TCGv src1, TCGv src2)
|
||||
|
@ -540,7 +517,6 @@ static void gen_packw(TCGv ret, TCGv src1, TCGv src2)
|
|||
|
||||
tcg_gen_ext16s_tl(t, src2);
|
||||
tcg_gen_deposit_tl(ret, src1, t, 16, TARGET_LONG_BITS - 16);
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static bool trans_brev8(DisasContext *ctx, arg_brev8 *a)
|
||||
|
|
|
@ -250,7 +250,6 @@ static bool trans_fsgnjn_d(DisasContext *ctx, arg_fsgnjn_d *a)
|
|||
TCGv_i64 t0 = tcg_temp_new_i64();
|
||||
tcg_gen_not_i64(t0, src2);
|
||||
tcg_gen_deposit_i64(dest, t0, src1, 0, 63);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
gen_set_fpr_d(ctx, a->rd, dest);
|
||||
mark_fs_dirty(ctx);
|
||||
|
@ -273,7 +272,6 @@ static bool trans_fsgnjx_d(DisasContext *ctx, arg_fsgnjx_d *a)
|
|||
TCGv_i64 t0 = tcg_temp_new_i64();
|
||||
tcg_gen_andi_i64(t0, src2, INT64_MIN);
|
||||
tcg_gen_xor_i64(dest, src1, t0);
|
||||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
gen_set_fpr_d(ctx, a->rd, dest);
|
||||
mark_fs_dirty(ctx);
|
||||
|
|
|
@ -233,9 +233,6 @@ static bool trans_fsgnj_s(DisasContext *ctx, arg_fsgnj_s *a)
|
|||
|
||||
/* This formulation retains the nanboxing of rs2 in normal 'F'. */
|
||||
tcg_gen_deposit_i64(dest, rs2, rs1, 0, 31);
|
||||
|
||||
tcg_temp_free_i64(rs1);
|
||||
tcg_temp_free_i64(rs2);
|
||||
} else {
|
||||
tcg_gen_deposit_i64(dest, src2, src1, 0, 31);
|
||||
tcg_gen_ext32s_i64(dest, dest);
|
||||
|
@ -281,15 +278,12 @@ static bool trans_fsgnjn_s(DisasContext *ctx, arg_fsgnjn_s *a)
|
|||
tcg_gen_nor_i64(rs2, rs2, mask);
|
||||
tcg_gen_and_i64(dest, mask, rs1);
|
||||
tcg_gen_or_i64(dest, dest, rs2);
|
||||
|
||||
tcg_temp_free_i64(rs2);
|
||||
}
|
||||
/* signed-extended intead of nanboxing for result if enable zfinx */
|
||||
if (ctx->cfg_ptr->ext_zfinx) {
|
||||
tcg_gen_ext32s_i64(dest, dest);
|
||||
}
|
||||
gen_set_fpr_hs(ctx, a->rd, dest);
|
||||
tcg_temp_free_i64(rs1);
|
||||
mark_fs_dirty(ctx);
|
||||
return true;
|
||||
}
|
||||
|
@ -329,14 +323,11 @@ static bool trans_fsgnjx_s(DisasContext *ctx, arg_fsgnjx_s *a)
|
|||
*/
|
||||
tcg_gen_andi_i64(dest, rs2, MAKE_64BIT_MASK(31, 1));
|
||||
tcg_gen_xor_i64(dest, rs1, dest);
|
||||
|
||||
tcg_temp_free_i64(rs2);
|
||||
}
|
||||
/* signed-extended intead of nanboxing for result if enable zfinx */
|
||||
if (ctx->cfg_ptr->ext_zfinx) {
|
||||
tcg_gen_ext32s_i64(dest, dest);
|
||||
}
|
||||
tcg_temp_free_i64(rs1);
|
||||
gen_set_fpr_hs(ctx, a->rd, dest);
|
||||
mark_fs_dirty(ctx);
|
||||
return true;
|
||||
|
|
|
@ -62,7 +62,6 @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a)
|
|||
misaligned = gen_new_label();
|
||||
tcg_gen_andi_tl(t0, cpu_pc, 0x2);
|
||||
tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0x0, misaligned);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
gen_set_gpri(ctx, a->rd, ctx->pc_succ_insn);
|
||||
|
@ -108,8 +107,6 @@ static TCGCond gen_compare_i128(bool bz, TCGv rl,
|
|||
tcg_gen_xor_tl(tmp, ah, bh);
|
||||
tcg_gen_and_tl(rl, rl, tmp);
|
||||
tcg_gen_xor_tl(rl, rh, rl);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -128,8 +125,6 @@ static TCGCond gen_compare_i128(bool bz, TCGv rl,
|
|||
/* seed third word with 1, which will be result */
|
||||
tcg_gen_sub2_tl(tmp, rh, ah, one, tmp, zero);
|
||||
tcg_gen_sub2_tl(tmp, rl, tmp, rh, bh, zero);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -140,8 +135,6 @@ static TCGCond gen_compare_i128(bool bz, TCGv rl,
|
|||
if (invert) {
|
||||
cond = tcg_invert_cond(cond);
|
||||
}
|
||||
|
||||
tcg_temp_free(rh);
|
||||
return cond;
|
||||
}
|
||||
|
||||
|
@ -169,8 +162,6 @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
|
|||
cond = gen_compare_i128(a->rs2 == 0,
|
||||
tmp, src1, src1h, src2, src2h, cond);
|
||||
tcg_gen_brcondi_tl(cond, tmp, 0, l);
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
tcg_gen_brcond_tl(cond, src1, src2, l);
|
||||
}
|
||||
|
@ -254,8 +245,6 @@ static bool gen_load_i128(DisasContext *ctx, arg_lb *a, MemOp memop)
|
|||
}
|
||||
|
||||
gen_set_gpr128(ctx, a->rd, destl, desth);
|
||||
|
||||
tcg_temp_free(addrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -344,8 +333,6 @@ static bool gen_store_i128(DisasContext *ctx, arg_sb *a, MemOp memop)
|
|||
tcg_gen_addi_tl(addrl, addrl, 8);
|
||||
tcg_gen_qemu_st_tl(src2h, addrl, ctx->mem_idx, MO_TEUQ);
|
||||
}
|
||||
|
||||
tcg_temp_free(addrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -568,14 +555,6 @@ static void gen_sll_i128(TCGv destl, TCGv desth,
|
|||
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, destl, hs, zero, zero, ll);
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, desth, hs, zero, ll, h1);
|
||||
|
||||
tcg_temp_free(ls);
|
||||
tcg_temp_free(rs);
|
||||
tcg_temp_free(hs);
|
||||
tcg_temp_free(ll);
|
||||
tcg_temp_free(lr);
|
||||
tcg_temp_free(h0);
|
||||
tcg_temp_free(h1);
|
||||
}
|
||||
|
||||
static bool trans_sll(DisasContext *ctx, arg_sll *a)
|
||||
|
@ -618,14 +597,6 @@ static void gen_srl_i128(TCGv destl, TCGv desth,
|
|||
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, destl, hs, zero, h1, h0);
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, desth, hs, zero, zero, h1);
|
||||
|
||||
tcg_temp_free(ls);
|
||||
tcg_temp_free(rs);
|
||||
tcg_temp_free(hs);
|
||||
tcg_temp_free(ll);
|
||||
tcg_temp_free(lr);
|
||||
tcg_temp_free(h0);
|
||||
tcg_temp_free(h1);
|
||||
}
|
||||
|
||||
static bool trans_srl(DisasContext *ctx, arg_srl *a)
|
||||
|
@ -659,14 +630,6 @@ static void gen_sra_i128(TCGv destl, TCGv desth,
|
|||
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, destl, hs, zero, h1, h0);
|
||||
tcg_gen_movcond_tl(TCG_COND_NE, desth, hs, zero, lr, h1);
|
||||
|
||||
tcg_temp_free(ls);
|
||||
tcg_temp_free(rs);
|
||||
tcg_temp_free(hs);
|
||||
tcg_temp_free(ll);
|
||||
tcg_temp_free(lr);
|
||||
tcg_temp_free(h0);
|
||||
tcg_temp_free(h1);
|
||||
}
|
||||
|
||||
static bool trans_sra(DisasContext *ctx, arg_sra *a)
|
||||
|
|
|
@ -161,9 +161,6 @@ static bool gen_sha256(DisasContext *ctx, arg_r2 *a, DisasExtend ext,
|
|||
tcg_gen_ext_i32_tl(dest, t1);
|
||||
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -212,9 +209,6 @@ static bool gen_sha512_rv32(DisasContext *ctx, arg_r *a, DisasExtend ext,
|
|||
tcg_gen_trunc_i64_tl(dest, t1);
|
||||
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -271,9 +265,6 @@ static bool gen_sha512h_rv32(DisasContext *ctx, arg_r *a, DisasExtend ext,
|
|||
tcg_gen_trunc_i64_tl(dest, t1);
|
||||
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -310,9 +301,6 @@ static bool gen_sha512_rv64(DisasContext *ctx, arg_r2 *a, DisasExtend ext,
|
|||
tcg_gen_trunc_i64_tl(dest, t1);
|
||||
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free_i64(t2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -359,9 +347,6 @@ static bool gen_sm3(DisasContext *ctx, arg_r2 *a, int32_t b, int32_t c)
|
|||
tcg_gen_xor_i32(t1, t1, t0);
|
||||
tcg_gen_ext_i32_tl(dest, t1);
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
|
||||
tcg_temp_free_i32(t0);
|
||||
tcg_temp_free_i32(t1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,9 +45,6 @@ static void gen_mulhu_i128(TCGv r2, TCGv r3, TCGv al, TCGv ah, TCGv bl, TCGv bh)
|
|||
|
||||
tcg_gen_mulu2_tl(tmpl, tmph, ah, bh);
|
||||
tcg_gen_add2_tl(r2, r3, r2, r3, tmpl, tmph);
|
||||
|
||||
tcg_temp_free(tmpl);
|
||||
tcg_temp_free(tmph);
|
||||
}
|
||||
|
||||
static void gen_mul_i128(TCGv rl, TCGv rh,
|
||||
|
@ -63,10 +60,6 @@ static void gen_mul_i128(TCGv rl, TCGv rh,
|
|||
tcg_gen_add2_tl(rh, tmpx, rh, zero, tmpl, tmph);
|
||||
tcg_gen_mulu2_tl(tmpl, tmph, rs1h, rs2l);
|
||||
tcg_gen_add2_tl(rh, tmph, rh, tmpx, tmpl, tmph);
|
||||
|
||||
tcg_temp_free(tmpl);
|
||||
tcg_temp_free(tmph);
|
||||
tcg_temp_free(tmpx);
|
||||
}
|
||||
|
||||
static bool trans_mul(DisasContext *ctx, arg_mul *a)
|
||||
|
@ -92,11 +85,6 @@ static void gen_mulh_i128(TCGv rl, TCGv rh,
|
|||
tcg_gen_and_tl(t1h, t1h, rs1h);
|
||||
tcg_gen_sub2_tl(t0l, t0h, rl, rh, t0l, t0h);
|
||||
tcg_gen_sub2_tl(rl, rh, t0l, t0h, t1l, t1h);
|
||||
|
||||
tcg_temp_free(t0l);
|
||||
tcg_temp_free(t0h);
|
||||
tcg_temp_free(t1l);
|
||||
tcg_temp_free(t1h);
|
||||
}
|
||||
|
||||
static void gen_mulh(TCGv ret, TCGv s1, TCGv s2)
|
||||
|
@ -104,7 +92,6 @@ static void gen_mulh(TCGv ret, TCGv s1, TCGv s2)
|
|||
TCGv discard = tcg_temp_new();
|
||||
|
||||
tcg_gen_muls2_tl(discard, ret, s1, s2);
|
||||
tcg_temp_free(discard);
|
||||
}
|
||||
|
||||
static void gen_mulh_w(TCGv ret, TCGv s1, TCGv s2)
|
||||
|
@ -132,9 +119,6 @@ static void gen_mulhsu_i128(TCGv rl, TCGv rh,
|
|||
tcg_gen_and_tl(t0l, t0h, rs2l);
|
||||
tcg_gen_and_tl(t0h, t0h, rs2h);
|
||||
tcg_gen_sub2_tl(rl, rh, rl, rh, t0l, t0h);
|
||||
|
||||
tcg_temp_free(t0l);
|
||||
tcg_temp_free(t0h);
|
||||
}
|
||||
|
||||
static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2)
|
||||
|
@ -147,9 +131,6 @@ static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
tcg_gen_sari_tl(rl, arg1, TARGET_LONG_BITS - 1);
|
||||
tcg_gen_and_tl(rl, rl, arg2);
|
||||
tcg_gen_sub_tl(ret, rh, rl);
|
||||
|
||||
tcg_temp_free(rl);
|
||||
tcg_temp_free(rh);
|
||||
}
|
||||
|
||||
static void gen_mulhsu_w(TCGv ret, TCGv arg1, TCGv arg2)
|
||||
|
@ -160,8 +141,6 @@ static void gen_mulhsu_w(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
tcg_gen_ext32s_tl(t1, arg1);
|
||||
tcg_gen_ext32u_tl(t2, arg2);
|
||||
tcg_gen_mul_tl(ret, t1, t2);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
tcg_gen_sari_tl(ret, ret, 32);
|
||||
}
|
||||
|
||||
|
@ -177,7 +156,6 @@ static void gen_mulhu(TCGv ret, TCGv s1, TCGv s2)
|
|||
TCGv discard = tcg_temp_new();
|
||||
|
||||
tcg_gen_mulu2_tl(discard, ret, s1, s2);
|
||||
tcg_temp_free(discard);
|
||||
}
|
||||
|
||||
static bool trans_mulhu(DisasContext *ctx, arg_mulhu *a)
|
||||
|
@ -223,9 +201,6 @@ static void gen_div(TCGv ret, TCGv source1, TCGv source2)
|
|||
tcg_gen_movcond_tl(TCG_COND_EQ, temp2, source2, zero, one, temp2);
|
||||
|
||||
tcg_gen_div_tl(ret, temp1, temp2);
|
||||
|
||||
tcg_temp_free(temp1);
|
||||
tcg_temp_free(temp2);
|
||||
}
|
||||
|
||||
static bool trans_div(DisasContext *ctx, arg_div *a)
|
||||
|
@ -258,9 +233,6 @@ static void gen_divu(TCGv ret, TCGv source1, TCGv source2)
|
|||
tcg_gen_movcond_tl(TCG_COND_EQ, temp1, source2, zero, max, source1);
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, temp2, source2, zero, one, source2);
|
||||
tcg_gen_divu_tl(ret, temp1, temp2);
|
||||
|
||||
tcg_temp_free(temp1);
|
||||
tcg_temp_free(temp2);
|
||||
}
|
||||
|
||||
static bool trans_divu(DisasContext *ctx, arg_divu *a)
|
||||
|
@ -306,9 +278,6 @@ static void gen_rem(TCGv ret, TCGv source1, TCGv source2)
|
|||
|
||||
/* If div by zero, the required result is the original dividend. */
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, ret, source2, zero, source1, temp1);
|
||||
|
||||
tcg_temp_free(temp1);
|
||||
tcg_temp_free(temp2);
|
||||
}
|
||||
|
||||
static bool trans_rem(DisasContext *ctx, arg_rem *a)
|
||||
|
@ -342,8 +311,6 @@ static void gen_remu(TCGv ret, TCGv source1, TCGv source2)
|
|||
|
||||
/* If div by zero, the required result is the original dividend. */
|
||||
tcg_gen_movcond_tl(TCG_COND_EQ, ret, source2, zero, source1, temp);
|
||||
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
static bool trans_remu(DisasContext *ctx, arg_remu *a)
|
||||
|
|
|
@ -172,11 +172,6 @@ static bool do_vsetvl(DisasContext *s, int rd, int rs1, TCGv s2)
|
|||
gen_set_pc_imm(s, s->pc_succ_insn);
|
||||
lookup_and_goto_ptr(s);
|
||||
s->base.is_jmp = DISAS_NORETURN;
|
||||
|
||||
if (rd == 0 && rs1 == 0) {
|
||||
tcg_temp_free(s1);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -214,8 +209,8 @@ static bool trans_vsetvli(DisasContext *s, arg_vsetvli *a)
|
|||
|
||||
static bool trans_vsetivli(DisasContext *s, arg_vsetivli *a)
|
||||
{
|
||||
TCGv s1 = tcg_const_tl(a->rs1);
|
||||
TCGv s2 = tcg_const_tl(a->zimm);
|
||||
TCGv s1 = tcg_constant_tl(a->rs1);
|
||||
TCGv s2 = tcg_constant_tl(a->zimm);
|
||||
return do_vsetivli(s, a->rd, s1, s2);
|
||||
}
|
||||
|
||||
|
@ -644,9 +639,6 @@ static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data,
|
|||
|
||||
fn(dest, mask, base, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
|
||||
if (!is_store) {
|
||||
mark_vs_dirty(s);
|
||||
}
|
||||
|
@ -809,9 +801,6 @@ static bool ldst_stride_trans(uint32_t vd, uint32_t rs1, uint32_t rs2,
|
|||
|
||||
fn(dest, mask, base, stride, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
|
||||
if (!is_store) {
|
||||
mark_vs_dirty(s);
|
||||
}
|
||||
|
@ -920,10 +909,6 @@ static bool ldst_index_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
|
|||
|
||||
fn(dest, mask, base, index, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
tcg_temp_free_ptr(index);
|
||||
|
||||
if (!is_store) {
|
||||
mark_vs_dirty(s);
|
||||
}
|
||||
|
@ -1063,8 +1048,6 @@ static bool ldff_trans(uint32_t vd, uint32_t rs1, uint32_t data,
|
|||
|
||||
fn(dest, mask, base, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
return true;
|
||||
|
@ -1125,8 +1108,6 @@ static bool ldst_whole_trans(uint32_t vd, uint32_t rs1, uint32_t nf,
|
|||
|
||||
fn(dest, base, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
|
||||
if (!is_store) {
|
||||
mark_vs_dirty(s);
|
||||
}
|
||||
|
@ -1282,9 +1263,6 @@ static bool opivx_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, uint32_t vm,
|
|||
|
||||
fn(dest, mask, src1, src2, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
tcg_temp_free_ptr(src2);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
return true;
|
||||
|
@ -1315,7 +1293,6 @@ do_opivx_gvec(DisasContext *s, arg_rmrr *a, GVecGen2sFn *gvec_fn,
|
|||
gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
|
||||
src1, MAXSZ(s), MAXSZ(s));
|
||||
|
||||
tcg_temp_free_i64(src1);
|
||||
mark_vs_dirty(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1450,9 +1427,6 @@ static bool opivi_trans(uint32_t vd, uint32_t imm, uint32_t vs2, uint32_t vm,
|
|||
|
||||
fn(dest, mask, src1, src2, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
tcg_temp_free_ptr(src2);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
return true;
|
||||
|
@ -1821,7 +1795,6 @@ do_opivx_gvec_shift(DisasContext *s, arg_rmrr *a, GVecGen2sFn32 *gvec_fn,
|
|||
gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
|
||||
src1, MAXSZ(s), MAXSZ(s));
|
||||
|
||||
tcg_temp_free_i32(src1);
|
||||
mark_vs_dirty(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -2114,7 +2087,6 @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a)
|
|||
tcg_gen_ext_tl_i64(s1_i64, s1);
|
||||
tcg_gen_gvec_dup_i64(s->sew, vreg_ofs(s, a->rd),
|
||||
MAXSZ(s), MAXSZ(s), s1_i64);
|
||||
tcg_temp_free_i64(s1_i64);
|
||||
} else {
|
||||
tcg_gen_gvec_dup_tl(s->sew, vreg_ofs(s, a->rd),
|
||||
MAXSZ(s), MAXSZ(s), s1);
|
||||
|
@ -2135,9 +2107,6 @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a)
|
|||
s->cfg_ptr->vlen / 8, data));
|
||||
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
|
||||
fns[s->sew](dest, s1_i64, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_i64(s1_i64);
|
||||
}
|
||||
|
||||
mark_vs_dirty(s);
|
||||
|
@ -2179,7 +2148,6 @@ static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a)
|
|||
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
|
||||
fns[s->sew](dest, s1, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
}
|
||||
|
@ -2372,10 +2340,6 @@ static bool opfvf_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
|
|||
|
||||
fn(dest, mask, t1, src2, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
tcg_temp_free_ptr(mask);
|
||||
tcg_temp_free_ptr(src2);
|
||||
tcg_temp_free_i64(t1);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
return true;
|
||||
|
@ -2761,11 +2725,9 @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
|
|||
|
||||
fns[s->sew - 1](dest, t1, cpu_env, desc);
|
||||
|
||||
tcg_temp_free_ptr(dest);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
}
|
||||
tcg_temp_free_i64(t1);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -3140,10 +3102,6 @@ static bool trans_vcpop_m(DisasContext *s, arg_rmr *a)
|
|||
|
||||
gen_helper_vcpop_m(dst, mask, src2, cpu_env, desc);
|
||||
gen_set_gpr(s, a->rd, dst);
|
||||
|
||||
tcg_temp_free_ptr(mask);
|
||||
tcg_temp_free_ptr(src2);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -3173,9 +3131,6 @@ static bool trans_vfirst_m(DisasContext *s, arg_rmr *a)
|
|||
|
||||
gen_helper_vfirst_m(dst, mask, src2, cpu_env, desc);
|
||||
gen_set_gpr(s, a->rd, dst);
|
||||
|
||||
tcg_temp_free_ptr(mask);
|
||||
tcg_temp_free_ptr(src2);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -3370,8 +3325,6 @@ static void vec_element_loadx(DisasContext *s, TCGv_i64 dest,
|
|||
/* Perform the load. */
|
||||
load_element(dest, base,
|
||||
vreg_ofs(s, vreg), s->sew, false);
|
||||
tcg_temp_free_ptr(base);
|
||||
tcg_temp_free_i32(ofs);
|
||||
|
||||
/* Flush out-of-range indexing to zero. */
|
||||
t_vlmax = tcg_constant_i64(vlmax);
|
||||
|
@ -3380,8 +3333,6 @@ static void vec_element_loadx(DisasContext *s, TCGv_i64 dest,
|
|||
|
||||
tcg_gen_movcond_i64(TCG_COND_LTU, dest, t_idx,
|
||||
t_vlmax, dest, t_zero);
|
||||
|
||||
tcg_temp_free_i64(t_idx);
|
||||
}
|
||||
|
||||
static void vec_element_loadi(DisasContext *s, TCGv_i64 dest,
|
||||
|
@ -3441,9 +3392,6 @@ static bool trans_vmv_x_s(DisasContext *s, arg_vmv_x_s *a)
|
|||
vec_element_loadi(s, t1, a->rs2, 0, true);
|
||||
tcg_gen_trunc_i64_tl(dest, t1);
|
||||
gen_set_gpr(s, a->rd, dest);
|
||||
tcg_temp_free_i64(t1);
|
||||
tcg_temp_free(dest);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -3471,7 +3419,6 @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x *a)
|
|||
s1 = get_gpr(s, a->rs1, EXT_NONE);
|
||||
tcg_gen_ext_tl_i64(t1, s1);
|
||||
vec_element_storei(s, a->rd, 0, t1);
|
||||
tcg_temp_free_i64(t1);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
return true;
|
||||
|
@ -3526,7 +3473,6 @@ static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
|
|||
do_nanbox(s, t1, cpu_fpr[a->rs1]);
|
||||
|
||||
vec_element_storei(s, a->rd, 0, t1);
|
||||
tcg_temp_free_i64(t1);
|
||||
mark_vs_dirty(s);
|
||||
gen_set_label(over);
|
||||
return true;
|
||||
|
@ -3635,7 +3581,6 @@ static bool trans_vrgather_vx(DisasContext *s, arg_rmrr *a)
|
|||
|
||||
tcg_gen_gvec_dup_i64(s->sew, vreg_ofs(s, a->rd),
|
||||
MAXSZ(s), MAXSZ(s), dest);
|
||||
tcg_temp_free_i64(dest);
|
||||
mark_vs_dirty(s);
|
||||
} else {
|
||||
static gen_helper_opivx * const fns[4] = {
|
||||
|
|
|
@ -51,7 +51,7 @@ static bool trans_flh(DisasContext *ctx, arg_flh *a)
|
|||
decode_save_opc(ctx);
|
||||
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
||||
if (a->imm) {
|
||||
TCGv temp = temp_new(ctx);
|
||||
TCGv temp = tcg_temp_new();
|
||||
tcg_gen_addi_tl(temp, t0, a->imm);
|
||||
t0 = temp;
|
||||
}
|
||||
|
@ -256,9 +256,6 @@ static bool trans_fsgnj_h(DisasContext *ctx, arg_fsgnj_h *a)
|
|||
|
||||
/* This formulation retains the nanboxing of rs2 in normal 'Zfh'. */
|
||||
tcg_gen_deposit_i64(dest, rs2, rs1, 0, 15);
|
||||
|
||||
tcg_temp_free_i64(rs1);
|
||||
tcg_temp_free_i64(rs2);
|
||||
} else {
|
||||
tcg_gen_deposit_i64(dest, src2, src1, 0, 15);
|
||||
tcg_gen_ext16s_i64(dest, dest);
|
||||
|
@ -302,20 +299,16 @@ static bool trans_fsgnjn_h(DisasContext *ctx, arg_fsgnjn_h *a)
|
|||
* Replace bit 15 in rs1 with inverse in rs2.
|
||||
* This formulation retains the nanboxing of rs1.
|
||||
*/
|
||||
mask = tcg_const_i64(~MAKE_64BIT_MASK(15, 1));
|
||||
mask = tcg_constant_i64(~MAKE_64BIT_MASK(15, 1));
|
||||
tcg_gen_not_i64(rs2, rs2);
|
||||
tcg_gen_andc_i64(rs2, rs2, mask);
|
||||
tcg_gen_and_i64(dest, mask, rs1);
|
||||
tcg_gen_or_i64(dest, dest, rs2);
|
||||
|
||||
tcg_temp_free_i64(mask);
|
||||
tcg_temp_free_i64(rs2);
|
||||
}
|
||||
/* signed-extended intead of nanboxing for result if enable zfinx */
|
||||
if (ctx->cfg_ptr->ext_zfinx) {
|
||||
tcg_gen_ext16s_i64(dest, dest);
|
||||
}
|
||||
tcg_temp_free_i64(rs1);
|
||||
mark_fs_dirty(ctx);
|
||||
return true;
|
||||
}
|
||||
|
@ -355,14 +348,11 @@ static bool trans_fsgnjx_h(DisasContext *ctx, arg_fsgnjx_h *a)
|
|||
*/
|
||||
tcg_gen_andi_i64(dest, rs2, MAKE_64BIT_MASK(15, 1));
|
||||
tcg_gen_xor_i64(dest, rs1, dest);
|
||||
|
||||
tcg_temp_free_i64(rs2);
|
||||
}
|
||||
/* signed-extended intead of nanboxing for result if enable zfinx */
|
||||
if (ctx->cfg_ptr->ext_zfinx) {
|
||||
tcg_gen_ext16s_i64(dest, dest);
|
||||
}
|
||||
tcg_temp_free_i64(rs1);
|
||||
mark_fs_dirty(ctx);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -100,10 +100,7 @@ static TCGv get_th_address_indexed(DisasContext *ctx, int rs1, int rs2,
|
|||
tcg_gen_shli_tl(offs, src2, imm2);
|
||||
}
|
||||
|
||||
TCGv addr = get_address_indexed(ctx, rs1, offs);
|
||||
|
||||
tcg_temp_free(offs);
|
||||
return addr;
|
||||
return get_address_indexed(ctx, rs1, offs);
|
||||
}
|
||||
|
||||
/* XTheadBa */
|
||||
|
@ -120,7 +117,6 @@ static void gen_th_addsl##SHAMT(TCGv ret, TCGv arg1, TCGv arg2) \
|
|||
TCGv t = tcg_temp_new(); \
|
||||
tcg_gen_shli_tl(t, arg2, SHAMT); \
|
||||
tcg_gen_add_tl(ret, t, arg1); \
|
||||
tcg_temp_free(t); \
|
||||
}
|
||||
|
||||
GEN_TH_ADDSL(1)
|
||||
|
@ -204,7 +200,6 @@ static bool gen_th_ff0(DisasContext *ctx, arg_th_ff0 *a, DisasExtend ext)
|
|||
gen_clz(dest, t);
|
||||
}
|
||||
|
||||
tcg_temp_free(t);
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
|
||||
return true;
|
||||
|
@ -469,7 +464,6 @@ static bool trans_th_fmv_hw_x(DisasContext *ctx, arg_th_fmv_hw_x *a)
|
|||
|
||||
tcg_gen_extu_tl_i64(t1, src1);
|
||||
tcg_gen_deposit_i64(cpu_fpr[a->rd], cpu_fpr[a->rd], t1, 32, 32);
|
||||
tcg_temp_free_i64(t1);
|
||||
mark_fs_dirty(ctx);
|
||||
return true;
|
||||
}
|
||||
|
@ -489,7 +483,6 @@ static bool trans_th_fmv_x_hw(DisasContext *ctx, arg_th_fmv_x_hw *a)
|
|||
tcg_gen_extract_i64(t1, cpu_fpr[a->rs1], 32, 32);
|
||||
tcg_gen_trunc_i64_tl(dst, t1);
|
||||
gen_set_gpr(ctx, a->rd, dst);
|
||||
tcg_temp_free_i64(t1);
|
||||
mark_fs_dirty(ctx);
|
||||
return true;
|
||||
}
|
||||
|
@ -511,15 +504,12 @@ static bool gen_th_mac(DisasContext *ctx, arg_r *a,
|
|||
extend_operand_func(tmp, src1);
|
||||
extend_operand_func(tmp2, src2);
|
||||
tcg_gen_mul_tl(tmp, tmp, tmp2);
|
||||
tcg_temp_free(tmp2);
|
||||
} else {
|
||||
tcg_gen_mul_tl(tmp, src1, src2);
|
||||
}
|
||||
|
||||
accumulate_func(dest, src0, tmp);
|
||||
gen_set_gpr(ctx, a->rd, dest);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -594,8 +584,6 @@ static bool gen_load_inc(DisasContext *ctx, arg_th_meminc *a, MemOp memop,
|
|||
tcg_gen_addi_tl(rs1, rs1, imm);
|
||||
gen_set_gpr(ctx, a->rd, rd);
|
||||
gen_set_gpr(ctx, a->rs1, rs1);
|
||||
|
||||
tcg_temp_free(addr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -615,8 +603,6 @@ static bool gen_store_inc(DisasContext *ctx, arg_th_meminc *a, MemOp memop,
|
|||
tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, memop);
|
||||
tcg_gen_addi_tl(rs1, rs1, imm);
|
||||
gen_set_gpr(ctx, a->rs1, rs1);
|
||||
|
||||
tcg_temp_free(addr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -950,11 +936,6 @@ static bool gen_loadpair_tl(DisasContext *ctx, arg_th_pair *a, MemOp memop,
|
|||
tcg_gen_qemu_ld_tl(t2, addr2, ctx->mem_idx, memop);
|
||||
gen_set_gpr(ctx, a->rd1, t1);
|
||||
gen_set_gpr(ctx, a->rd2, t2);
|
||||
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
tcg_temp_free(addr1);
|
||||
tcg_temp_free(addr2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -991,9 +972,6 @@ static bool gen_storepair_tl(DisasContext *ctx, arg_th_pair *a, MemOp memop,
|
|||
|
||||
tcg_gen_qemu_st_tl(data1, addr1, ctx->mem_idx, memop);
|
||||
tcg_gen_qemu_st_tl(data2, addr2, ctx->mem_idx, memop);
|
||||
|
||||
tcg_temp_free(addr1);
|
||||
tcg_temp_free(addr2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -101,14 +101,8 @@ typedef struct DisasContext {
|
|||
bool cfg_vta_all_1s;
|
||||
target_ulong vstart;
|
||||
bool vl_eq_vlmax;
|
||||
uint8_t ntemp;
|
||||
CPUState *cs;
|
||||
TCGv zero;
|
||||
/* Space for 3 operands plus 1 extra for address computation. */
|
||||
TCGv temp[4];
|
||||
/* Space for 4 operands(1 dest and <=3 src) for float point computation */
|
||||
TCGv_i64 ftemp[4];
|
||||
uint8_t nftemp;
|
||||
/* PointerMasking extension */
|
||||
bool pm_mask_enabled;
|
||||
bool pm_base_enabled;
|
||||
|
@ -207,12 +201,10 @@ static void gen_nanbox_h(TCGv_i64 out, TCGv_i64 in)
|
|||
*/
|
||||
static void gen_check_nanbox_h(TCGv_i64 out, TCGv_i64 in)
|
||||
{
|
||||
TCGv_i64 t_max = tcg_const_i64(0xffffffffffff0000ull);
|
||||
TCGv_i64 t_nan = tcg_const_i64(0xffffffffffff7e00ull);
|
||||
TCGv_i64 t_max = tcg_constant_i64(0xffffffffffff0000ull);
|
||||
TCGv_i64 t_nan = tcg_constant_i64(0xffffffffffff7e00ull);
|
||||
|
||||
tcg_gen_movcond_i64(TCG_COND_GEU, out, in, t_max, in, t_nan);
|
||||
tcg_temp_free_i64(t_max);
|
||||
tcg_temp_free_i64(t_nan);
|
||||
}
|
||||
|
||||
static void gen_check_nanbox_s(TCGv_i64 out, TCGv_i64 in)
|
||||
|
@ -315,12 +307,6 @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
|
|||
*
|
||||
* Further, we may provide an extension for word operations.
|
||||
*/
|
||||
static TCGv temp_new(DisasContext *ctx)
|
||||
{
|
||||
assert(ctx->ntemp < ARRAY_SIZE(ctx->temp));
|
||||
return ctx->temp[ctx->ntemp++] = tcg_temp_new();
|
||||
}
|
||||
|
||||
static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext)
|
||||
{
|
||||
TCGv t;
|
||||
|
@ -335,11 +321,11 @@ static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext)
|
|||
case EXT_NONE:
|
||||
break;
|
||||
case EXT_SIGN:
|
||||
t = temp_new(ctx);
|
||||
t = tcg_temp_new();
|
||||
tcg_gen_ext32s_tl(t, cpu_gpr[reg_num]);
|
||||
return t;
|
||||
case EXT_ZERO:
|
||||
t = temp_new(ctx);
|
||||
t = tcg_temp_new();
|
||||
tcg_gen_ext32u_tl(t, cpu_gpr[reg_num]);
|
||||
return t;
|
||||
default:
|
||||
|
@ -367,7 +353,7 @@ static TCGv get_gprh(DisasContext *ctx, int reg_num)
|
|||
static TCGv dest_gpr(DisasContext *ctx, int reg_num)
|
||||
{
|
||||
if (reg_num == 0 || get_olen(ctx) < TARGET_LONG_BITS) {
|
||||
return temp_new(ctx);
|
||||
return tcg_temp_new();
|
||||
}
|
||||
return cpu_gpr[reg_num];
|
||||
}
|
||||
|
@ -375,7 +361,7 @@ static TCGv dest_gpr(DisasContext *ctx, int reg_num)
|
|||
static TCGv dest_gprh(DisasContext *ctx, int reg_num)
|
||||
{
|
||||
if (reg_num == 0) {
|
||||
return temp_new(ctx);
|
||||
return tcg_temp_new();
|
||||
}
|
||||
return cpu_gprh[reg_num];
|
||||
}
|
||||
|
@ -431,12 +417,6 @@ static void gen_set_gpr128(DisasContext *ctx, int reg_num, TCGv rl, TCGv rh)
|
|||
}
|
||||
}
|
||||
|
||||
static TCGv_i64 ftemp_new(DisasContext *ctx)
|
||||
{
|
||||
assert(ctx->nftemp < ARRAY_SIZE(ctx->ftemp));
|
||||
return ctx->ftemp[ctx->nftemp++] = tcg_temp_new_i64();
|
||||
}
|
||||
|
||||
static TCGv_i64 get_fpr_hs(DisasContext *ctx, int reg_num)
|
||||
{
|
||||
if (!ctx->cfg_ptr->ext_zfinx) {
|
||||
|
@ -450,7 +430,7 @@ static TCGv_i64 get_fpr_hs(DisasContext *ctx, int reg_num)
|
|||
case MXL_RV32:
|
||||
#ifdef TARGET_RISCV32
|
||||
{
|
||||
TCGv_i64 t = ftemp_new(ctx);
|
||||
TCGv_i64 t = tcg_temp_new_i64();
|
||||
tcg_gen_ext_i32_i64(t, cpu_gpr[reg_num]);
|
||||
return t;
|
||||
}
|
||||
|
@ -476,7 +456,7 @@ static TCGv_i64 get_fpr_d(DisasContext *ctx, int reg_num)
|
|||
switch (get_xl(ctx)) {
|
||||
case MXL_RV32:
|
||||
{
|
||||
TCGv_i64 t = ftemp_new(ctx);
|
||||
TCGv_i64 t = tcg_temp_new_i64();
|
||||
tcg_gen_concat_tl_i64(t, cpu_gpr[reg_num], cpu_gpr[reg_num + 1]);
|
||||
return t;
|
||||
}
|
||||
|
@ -496,12 +476,12 @@ static TCGv_i64 dest_fpr(DisasContext *ctx, int reg_num)
|
|||
}
|
||||
|
||||
if (reg_num == 0) {
|
||||
return ftemp_new(ctx);
|
||||
return tcg_temp_new_i64();
|
||||
}
|
||||
|
||||
switch (get_xl(ctx)) {
|
||||
case MXL_RV32:
|
||||
return ftemp_new(ctx);
|
||||
return tcg_temp_new_i64();
|
||||
#ifdef TARGET_RISCV64
|
||||
case MXL_RV64:
|
||||
return cpu_gpr[reg_num];
|
||||
|
@ -584,7 +564,7 @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
|
|||
/* Compute a canonical address from a register plus offset. */
|
||||
static TCGv get_address(DisasContext *ctx, int rs1, int imm)
|
||||
{
|
||||
TCGv addr = temp_new(ctx);
|
||||
TCGv addr = tcg_temp_new();
|
||||
TCGv src1 = get_gpr(ctx, rs1, EXT_NONE);
|
||||
|
||||
tcg_gen_addi_tl(addr, src1, imm);
|
||||
|
@ -602,7 +582,7 @@ static TCGv get_address(DisasContext *ctx, int rs1, int imm)
|
|||
/* Compute a canonical address from a register plus reg offset. */
|
||||
static TCGv get_address_indexed(DisasContext *ctx, int rs1, TCGv offs)
|
||||
{
|
||||
TCGv addr = temp_new(ctx);
|
||||
TCGv addr = tcg_temp_new();
|
||||
TCGv src1 = get_gpr(ctx, rs1, EXT_NONE);
|
||||
|
||||
tcg_gen_add_tl(addr, src1, offs);
|
||||
|
@ -639,7 +619,6 @@ static void mark_fs_dirty(DisasContext *ctx)
|
|||
tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus));
|
||||
tcg_gen_ori_tl(tmp, tmp, MSTATUS_FS);
|
||||
tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus));
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
if (ctx->virt_enabled && ctx->mstatus_hs_fs != MSTATUS_FS) {
|
||||
|
@ -650,7 +629,6 @@ static void mark_fs_dirty(DisasContext *ctx)
|
|||
tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs));
|
||||
tcg_gen_ori_tl(tmp, tmp, MSTATUS_FS);
|
||||
tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs));
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
@ -675,7 +653,6 @@ static void mark_vs_dirty(DisasContext *ctx)
|
|||
tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus));
|
||||
tcg_gen_ori_tl(tmp, tmp, MSTATUS_VS);
|
||||
tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus));
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
if (ctx->virt_enabled && ctx->mstatus_hs_vs != MSTATUS_VS) {
|
||||
|
@ -686,7 +663,6 @@ static void mark_vs_dirty(DisasContext *ctx)
|
|||
tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs));
|
||||
tcg_gen_ori_tl(tmp, tmp, MSTATUS_VS);
|
||||
tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs));
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
@ -1037,7 +1013,6 @@ static bool gen_shift(DisasContext *ctx, arg_r *a, DisasExtend ext,
|
|||
f128(dest, desth, src1, src1h, ext2);
|
||||
gen_set_gpr128(ctx, a->rd, dest, desth);
|
||||
}
|
||||
tcg_temp_free(ext2);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1206,10 +1181,6 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
|
|||
ctx->misa_mxl_max = env->misa_mxl_max;
|
||||
ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL);
|
||||
ctx->cs = cs;
|
||||
ctx->ntemp = 0;
|
||||
memset(ctx->temp, 0, sizeof(ctx->temp));
|
||||
ctx->nftemp = 0;
|
||||
memset(ctx->ftemp, 0, sizeof(ctx->ftemp));
|
||||
ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED);
|
||||
ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED);
|
||||
ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER);
|
||||
|
@ -1234,23 +1205,11 @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
|
|||
DisasContext *ctx = container_of(dcbase, DisasContext, base);
|
||||
CPURISCVState *env = cpu->env_ptr;
|
||||
uint16_t opcode16 = translator_lduw(env, &ctx->base, ctx->base.pc_next);
|
||||
int i;
|
||||
|
||||
ctx->ol = ctx->xl;
|
||||
decode_opc(env, ctx, opcode16);
|
||||
ctx->base.pc_next = ctx->pc_succ_insn;
|
||||
|
||||
for (i = ctx->ntemp - 1; i >= 0; --i) {
|
||||
tcg_temp_free(ctx->temp[i]);
|
||||
ctx->temp[i] = NULL;
|
||||
}
|
||||
ctx->ntemp = 0;
|
||||
for (i = ctx->nftemp - 1; i >= 0; --i) {
|
||||
tcg_temp_free_i64(ctx->ftemp[i]);
|
||||
ctx->ftemp[i] = NULL;
|
||||
}
|
||||
ctx->nftemp = 0;
|
||||
|
||||
/* Only the first insn within a TB is allowed to cross a page boundary. */
|
||||
if (ctx->base.is_jmp == DISAS_NEXT) {
|
||||
if (ctx->itrigger || !is_same_page(&ctx->base, ctx->base.pc_next)) {
|
||||
|
|
|
@ -429,7 +429,6 @@ static bool trans_MOV_rm(DisasContext *ctx, arg_MOV_rm *a)
|
|||
mem = tcg_temp_new();
|
||||
tcg_gen_addi_i32(mem, cpu_regs[a->rd], a->dsp << a->sz);
|
||||
rx_gen_st(a->sz, cpu_regs[a->rs], mem);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -440,7 +439,6 @@ static bool trans_MOV_mr(DisasContext *ctx, arg_MOV_mr *a)
|
|||
mem = tcg_temp_new();
|
||||
tcg_gen_addi_i32(mem, cpu_regs[a->rs], a->dsp << a->sz);
|
||||
rx_gen_ld(a->sz, cpu_regs[a->rd], mem);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -462,8 +460,6 @@ static bool trans_MOV_im(DisasContext *ctx, arg_MOV_im *a)
|
|||
mem = tcg_temp_new();
|
||||
tcg_gen_addi_i32(mem, cpu_regs[a->rd], a->dsp << a->sz);
|
||||
rx_gen_st(a->sz, imm, mem);
|
||||
tcg_temp_free(imm);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -474,7 +470,6 @@ static bool trans_MOV_ar(DisasContext *ctx, arg_MOV_ar *a)
|
|||
mem = tcg_temp_new();
|
||||
rx_gen_regindex(ctx, mem, a->sz, a->ri, a->rb);
|
||||
rx_gen_ld(a->sz, cpu_regs[a->rd], mem);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -485,7 +480,6 @@ static bool trans_MOV_ra(DisasContext *ctx, arg_MOV_ra *a)
|
|||
mem = tcg_temp_new();
|
||||
rx_gen_regindex(ctx, mem, a->sz, a->ri, a->rb);
|
||||
rx_gen_st(a->sz, cpu_regs[a->rs], mem);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -521,9 +515,7 @@ static bool trans_MOV_mm(DisasContext *ctx, arg_MOV_mm *a)
|
|||
rx_gen_ld(a->sz, tmp, addr);
|
||||
addr = rx_index_addr(ctx, mem, a->ldd, a->sz, a->rd);
|
||||
rx_gen_st(a->sz, tmp, addr);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -541,7 +533,6 @@ static bool trans_MOV_rp(DisasContext *ctx, arg_MOV_rp *a)
|
|||
if (a->ad == 0) {
|
||||
tcg_gen_addi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 1 << a->sz);
|
||||
}
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -559,7 +550,6 @@ static bool trans_MOV_pr(DisasContext *ctx, arg_MOV_pr *a)
|
|||
tcg_gen_addi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 1 << a->sz);
|
||||
}
|
||||
tcg_gen_mov_i32(cpu_regs[a->rs], val);
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -571,7 +561,6 @@ static bool trans_MOVU_mr(DisasContext *ctx, arg_MOVU_mr *a)
|
|||
mem = tcg_temp_new();
|
||||
tcg_gen_addi_i32(mem, cpu_regs[a->rs], a->dsp << a->sz);
|
||||
rx_gen_ldu(a->sz, cpu_regs[a->rd], mem);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -592,7 +581,6 @@ static bool trans_MOVU_ar(DisasContext *ctx, arg_MOVU_ar *a)
|
|||
mem = tcg_temp_new();
|
||||
rx_gen_regindex(ctx, mem, a->sz, a->ri, a->rb);
|
||||
rx_gen_ldu(a->sz, cpu_regs[a->rd], mem);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -610,7 +598,6 @@ static bool trans_MOVU_pr(DisasContext *ctx, arg_MOVU_pr *a)
|
|||
tcg_gen_addi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 1 << a->sz);
|
||||
}
|
||||
tcg_gen_mov_i32(cpu_regs[a->rs], val);
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -635,7 +622,6 @@ static bool trans_POPC(DisasContext *ctx, arg_POPC *a)
|
|||
val = tcg_temp_new();
|
||||
pop(val);
|
||||
move_to_cr(ctx, val, a->cr);
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -663,7 +649,6 @@ static bool trans_PUSH_r(DisasContext *ctx, arg_PUSH_r *a)
|
|||
tcg_gen_mov_i32(val, cpu_regs[a->rs]);
|
||||
tcg_gen_subi_i32(cpu_sp, cpu_sp, 4);
|
||||
rx_gen_st(a->sz, val, cpu_sp);
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -677,8 +662,6 @@ static bool trans_PUSH_m(DisasContext *ctx, arg_PUSH_m *a)
|
|||
rx_gen_ld(a->sz, val, addr);
|
||||
tcg_gen_subi_i32(cpu_sp, cpu_sp, 4);
|
||||
rx_gen_st(a->sz, val, cpu_sp);
|
||||
tcg_temp_free(mem);
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -689,7 +672,6 @@ static bool trans_PUSHC(DisasContext *ctx, arg_PUSHC *a)
|
|||
val = tcg_temp_new();
|
||||
move_from_cr(ctx, val, a->cr, ctx->pc);
|
||||
push(val);
|
||||
tcg_temp_free(val);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -717,7 +699,6 @@ static bool trans_XCHG_rr(DisasContext *ctx, arg_XCHG_rr *a)
|
|||
tcg_gen_mov_i32(tmp, cpu_regs[a->rs]);
|
||||
tcg_gen_mov_i32(cpu_regs[a->rs], cpu_regs[a->rd]);
|
||||
tcg_gen_mov_i32(cpu_regs[a->rd], tmp);
|
||||
tcg_temp_free(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -741,7 +722,6 @@ static bool trans_XCHG_mr(DisasContext *ctx, arg_XCHG_mr *a)
|
|||
}
|
||||
tcg_gen_atomic_xchg_i32(cpu_regs[a->rd], addr, cpu_regs[a->rd],
|
||||
0, mi_to_mop(a->mi));
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -753,8 +733,6 @@ static inline void stcond(TCGCond cond, int rd, int imm)
|
|||
_imm = tcg_const_i32(imm);
|
||||
tcg_gen_movcond_i32(cond, cpu_regs[rd], cpu_psw_z, z,
|
||||
_imm, cpu_regs[rd]);
|
||||
tcg_temp_free(z);
|
||||
tcg_temp_free(_imm);
|
||||
}
|
||||
|
||||
/* stz #imm,rd */
|
||||
|
@ -785,12 +763,9 @@ static bool trans_SCCnd(DisasContext *ctx, arg_SCCnd *a)
|
|||
tcg_gen_setcondi_i32(dc.cond, val, dc.value, 0);
|
||||
addr = rx_index_addr(ctx, mem, a->sz, a->ld, a->rd);
|
||||
rx_gen_st(a->sz, val, addr);
|
||||
tcg_temp_free(val);
|
||||
tcg_temp_free(mem);
|
||||
} else {
|
||||
tcg_gen_setcondi_i32(dc.cond, cpu_regs[a->rd], dc.value, 0);
|
||||
}
|
||||
tcg_temp_free(dc.temp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -842,7 +817,6 @@ static inline void rx_gen_op_irr(op3fn opr, int dst, int src, uint32_t src2)
|
|||
{
|
||||
TCGv imm = tcg_const_i32(src2);
|
||||
opr(cpu_regs[dst], cpu_regs[src], imm);
|
||||
tcg_temp_free(imm);
|
||||
}
|
||||
|
||||
static inline void rx_gen_op_mr(op3fn opr, DisasContext *ctx,
|
||||
|
@ -852,7 +826,6 @@ static inline void rx_gen_op_mr(op3fn opr, DisasContext *ctx,
|
|||
mem = tcg_temp_new();
|
||||
val = rx_load_source(ctx, mem, ld, mi, src);
|
||||
opr(cpu_regs[dst], cpu_regs[dst], val);
|
||||
tcg_temp_free(mem);
|
||||
}
|
||||
|
||||
static void rx_and(TCGv ret, TCGv arg1, TCGv arg2)
|
||||
|
@ -1003,7 +976,6 @@ static void rx_adc(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
tcg_gen_xor_i32(z, arg1, arg2);
|
||||
tcg_gen_andc_i32(cpu_psw_o, cpu_psw_o, z);
|
||||
tcg_gen_mov_i32(ret, cpu_psw_s);
|
||||
tcg_temp_free(z);
|
||||
}
|
||||
|
||||
/* adc #imm, rd */
|
||||
|
@ -1042,7 +1014,6 @@ static void rx_add(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
tcg_gen_xor_i32(z, arg1, arg2);
|
||||
tcg_gen_andc_i32(cpu_psw_o, cpu_psw_o, z);
|
||||
tcg_gen_mov_i32(ret, cpu_psw_s);
|
||||
tcg_temp_free(z);
|
||||
}
|
||||
|
||||
/* add #uimm4, rd */
|
||||
|
@ -1079,7 +1050,6 @@ static void rx_sub(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
temp = tcg_temp_new_i32();
|
||||
tcg_gen_xor_i32(temp, arg1, arg2);
|
||||
tcg_gen_and_i32(cpu_psw_o, cpu_psw_o, temp);
|
||||
tcg_temp_free_i32(temp);
|
||||
/* CMP not required return */
|
||||
if (ret) {
|
||||
tcg_gen_mov_i32(ret, cpu_psw_s);
|
||||
|
@ -1097,7 +1067,6 @@ static void rx_sbb(TCGv ret, TCGv arg1, TCGv arg2)
|
|||
temp = tcg_temp_new();
|
||||
tcg_gen_not_i32(temp, arg2);
|
||||
rx_adc(ret, arg1, temp);
|
||||
tcg_temp_free(temp);
|
||||
}
|
||||
|
||||
/* cmp #imm4, rs2 */
|
||||
|
@ -1165,8 +1134,6 @@ static void rx_abs(TCGv ret, TCGv arg1)
|
|||
zero = tcg_const_i32(0);
|
||||
tcg_gen_neg_i32(neg, arg1);
|
||||
tcg_gen_movcond_i32(TCG_COND_LT, ret, arg1, zero, neg, arg1);
|
||||
tcg_temp_free(neg);
|
||||
tcg_temp_free(zero);
|
||||
}
|
||||
|
||||
/* abs rd */
|
||||
|
@ -1239,7 +1206,6 @@ static bool trans_EMUL_ir(DisasContext *ctx, arg_EMUL_ir *a)
|
|||
}
|
||||
tcg_gen_muls2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15],
|
||||
cpu_regs[a->rd], imm);
|
||||
tcg_temp_free(imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1255,7 +1221,6 @@ static bool trans_EMUL_mr(DisasContext *ctx, arg_EMUL_mr *a)
|
|||
val = rx_load_source(ctx, mem, a->ld, a->mi, a->rs);
|
||||
tcg_gen_muls2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15],
|
||||
cpu_regs[a->rd], val);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1268,7 +1233,6 @@ static bool trans_EMULU_ir(DisasContext *ctx, arg_EMULU_ir *a)
|
|||
}
|
||||
tcg_gen_mulu2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15],
|
||||
cpu_regs[a->rd], imm);
|
||||
tcg_temp_free(imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1284,7 +1248,6 @@ static bool trans_EMULU_mr(DisasContext *ctx, arg_EMULU_mr *a)
|
|||
val = rx_load_source(ctx, mem, a->ld, a->mi, a->rs);
|
||||
tcg_gen_mulu2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15],
|
||||
cpu_regs[a->rd], val);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1381,8 +1344,6 @@ static bool trans_SHLL_rr(DisasContext *ctx, arg_SHLL_rr *a)
|
|||
gen_set_label(done);
|
||||
tcg_gen_mov_i32(cpu_psw_z, cpu_regs[a->rd]);
|
||||
tcg_gen_mov_i32(cpu_psw_s, cpu_regs[a->rd]);
|
||||
tcg_temp_free(count);
|
||||
tcg_temp_free(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1436,7 +1397,6 @@ static inline void shiftr_reg(uint32_t rd, uint32_t rs, unsigned int alith)
|
|||
tcg_gen_movi_i32(cpu_psw_o, 0);
|
||||
tcg_gen_mov_i32(cpu_psw_z, cpu_regs[rd]);
|
||||
tcg_gen_mov_i32(cpu_psw_s, cpu_regs[rd]);
|
||||
tcg_temp_free(count);
|
||||
}
|
||||
|
||||
/* shar #imm:5, rd */
|
||||
|
@ -1480,7 +1440,6 @@ static bool trans_ROLC(DisasContext *ctx, arg_ROLC *a)
|
|||
tcg_gen_mov_i32(cpu_psw_c, tmp);
|
||||
tcg_gen_mov_i32(cpu_psw_z, cpu_regs[a->rd]);
|
||||
tcg_gen_mov_i32(cpu_psw_s, cpu_regs[a->rd]);
|
||||
tcg_temp_free(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1570,7 +1529,6 @@ static bool trans_REVW(DisasContext *ctx, arg_REVW *a)
|
|||
tcg_gen_shri_i32(cpu_regs[a->rd], cpu_regs[a->rs], 8);
|
||||
tcg_gen_andi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 0x00ff00ff);
|
||||
tcg_gen_or_i32(cpu_regs[a->rd], cpu_regs[a->rd], tmp);
|
||||
tcg_temp_free(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1592,7 +1550,6 @@ static void rx_bcnd_main(DisasContext *ctx, int cd, int dst)
|
|||
gen_set_label(t);
|
||||
gen_goto_tb(ctx, 1, ctx->pc + dst);
|
||||
gen_set_label(done);
|
||||
tcg_temp_free(dc.temp);
|
||||
break;
|
||||
case 14:
|
||||
/* always true case */
|
||||
|
@ -1642,7 +1599,6 @@ static inline void rx_save_pc(DisasContext *ctx)
|
|||
{
|
||||
TCGv pc = tcg_const_i32(ctx->base.pc_next);
|
||||
push(pc);
|
||||
tcg_temp_free(pc);
|
||||
}
|
||||
|
||||
/* jmp rs */
|
||||
|
@ -1726,7 +1682,6 @@ static bool trans_SMOVB(DisasContext *ctx, arg_SMOVB *a)
|
|||
do { \
|
||||
TCGv size = tcg_const_i32(a->sz); \
|
||||
gen_helper_##op(cpu_env, size); \
|
||||
tcg_temp_free(size); \
|
||||
} while (0)
|
||||
|
||||
/* suntile.<bwl> */
|
||||
|
@ -1767,8 +1722,6 @@ static void rx_mul64hi(TCGv_i64 ret, int rs, int rs2)
|
|||
tcg_gen_sari_i64(tmp1, tmp1, 16);
|
||||
tcg_gen_mul_i64(ret, tmp0, tmp1);
|
||||
tcg_gen_shli_i64(ret, ret, 16);
|
||||
tcg_temp_free_i64(tmp0);
|
||||
tcg_temp_free_i64(tmp1);
|
||||
}
|
||||
|
||||
static void rx_mul64lo(TCGv_i64 ret, int rs, int rs2)
|
||||
|
@ -1782,8 +1735,6 @@ static void rx_mul64lo(TCGv_i64 ret, int rs, int rs2)
|
|||
tcg_gen_ext16s_i64(tmp1, tmp1);
|
||||
tcg_gen_mul_i64(ret, tmp0, tmp1);
|
||||
tcg_gen_shli_i64(ret, ret, 16);
|
||||
tcg_temp_free_i64(tmp0);
|
||||
tcg_temp_free_i64(tmp1);
|
||||
}
|
||||
|
||||
/* mulhi rs,rs2 */
|
||||
|
@ -1807,7 +1758,6 @@ static bool trans_MACHI(DisasContext *ctx, arg_MACHI *a)
|
|||
tmp = tcg_temp_new_i64();
|
||||
rx_mul64hi(tmp, a->rs, a->rs2);
|
||||
tcg_gen_add_i64(cpu_acc, cpu_acc, tmp);
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1818,7 +1768,6 @@ static bool trans_MACLO(DisasContext *ctx, arg_MACLO *a)
|
|||
tmp = tcg_temp_new_i64();
|
||||
rx_mul64lo(tmp, a->rs, a->rs2);
|
||||
tcg_gen_add_i64(cpu_acc, cpu_acc, tmp);
|
||||
tcg_temp_free_i64(tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1836,7 +1785,6 @@ static bool trans_MVFACMI(DisasContext *ctx, arg_MVFACMI *a)
|
|||
rd64 = tcg_temp_new_i64();
|
||||
tcg_gen_extract_i64(rd64, cpu_acc, 16, 32);
|
||||
tcg_gen_extrl_i64_i32(cpu_regs[a->rd], rd64);
|
||||
tcg_temp_free_i64(rd64);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1847,7 +1795,6 @@ static bool trans_MVTACHI(DisasContext *ctx, arg_MVTACHI *a)
|
|||
rs64 = tcg_temp_new_i64();
|
||||
tcg_gen_extu_i32_i64(rs64, cpu_regs[a->rs]);
|
||||
tcg_gen_deposit_i64(cpu_acc, cpu_acc, rs64, 32, 32);
|
||||
tcg_temp_free_i64(rs64);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1858,7 +1805,6 @@ static bool trans_MVTACLO(DisasContext *ctx, arg_MVTACLO *a)
|
|||
rs64 = tcg_temp_new_i64();
|
||||
tcg_gen_extu_i32_i64(rs64, cpu_regs[a->rs]);
|
||||
tcg_gen_deposit_i64(cpu_acc, cpu_acc, rs64, 0, 32);
|
||||
tcg_temp_free_i64(rs64);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1867,7 +1813,6 @@ static bool trans_RACW(DisasContext *ctx, arg_RACW *a)
|
|||
{
|
||||
TCGv imm = tcg_const_i32(a->imm + 1);
|
||||
gen_helper_racw(cpu_env, imm);
|
||||
tcg_temp_free(imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1883,8 +1828,6 @@ static bool trans_SAT(DisasContext *ctx, arg_SAT *a)
|
|||
tcg_gen_xori_i32(tmp, tmp, 0x80000000);
|
||||
tcg_gen_movcond_i32(TCG_COND_LT, cpu_regs[a->rd],
|
||||
cpu_psw_o, z, tmp, cpu_regs[a->rd]);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_temp_free(z);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1903,7 +1846,6 @@ static bool trans_SATR(DisasContext *ctx, arg_SATR *a)
|
|||
TCGv imm = tcg_const_i32(li(ctx, 0)); \
|
||||
gen_helper_##op(cpu_regs[a->rd], cpu_env, \
|
||||
cpu_regs[a->rd], imm); \
|
||||
tcg_temp_free(imm); \
|
||||
return true; \
|
||||
} \
|
||||
static bool cat3(trans_, name, _mr)(DisasContext *ctx, \
|
||||
|
@ -1914,7 +1856,6 @@ static bool trans_SATR(DisasContext *ctx, arg_SATR *a)
|
|||
val = rx_load_source(ctx, mem, a->ld, MO_32, a->rs); \
|
||||
gen_helper_##op(cpu_regs[a->rd], cpu_env, \
|
||||
cpu_regs[a->rd], val); \
|
||||
tcg_temp_free(mem); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -1925,7 +1866,6 @@ static bool trans_SATR(DisasContext *ctx, arg_SATR *a)
|
|||
mem = tcg_temp_new(); \
|
||||
val = rx_load_source(ctx, mem, a->ld, MO_32, a->rs); \
|
||||
gen_helper_##op(cpu_regs[a->rd], cpu_env, val); \
|
||||
tcg_temp_free(mem); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -1939,7 +1879,6 @@ static bool trans_FCMP_ir(DisasContext *ctx, arg_FCMP_ir * a)
|
|||
{
|
||||
TCGv imm = tcg_const_i32(li(ctx, 0));
|
||||
gen_helper_fcmp(cpu_env, cpu_regs[a->rd], imm);
|
||||
tcg_temp_free(imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1951,7 +1890,6 @@ static bool trans_FCMP_mr(DisasContext *ctx, arg_FCMP_mr *a)
|
|||
mem = tcg_temp_new();
|
||||
val = rx_load_source(ctx, mem, a->ld, MO_32, a->rs);
|
||||
gen_helper_fcmp(cpu_env, cpu_regs[a->rd], val);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1966,7 +1904,6 @@ static bool trans_ITOF(DisasContext *ctx, arg_ITOF * a)
|
|||
mem = tcg_temp_new();
|
||||
val = rx_load_source(ctx, mem, a->ld, a->mi, a->rs);
|
||||
gen_helper_itof(cpu_regs[a->rd], cpu_env, val);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1977,7 +1914,6 @@ static void rx_bsetm(TCGv mem, TCGv mask)
|
|||
rx_gen_ld(MO_8, val, mem);
|
||||
tcg_gen_or_i32(val, val, mask);
|
||||
rx_gen_st(MO_8, val, mem);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
|
||||
static void rx_bclrm(TCGv mem, TCGv mask)
|
||||
|
@ -1987,7 +1923,6 @@ static void rx_bclrm(TCGv mem, TCGv mask)
|
|||
rx_gen_ld(MO_8, val, mem);
|
||||
tcg_gen_andc_i32(val, val, mask);
|
||||
rx_gen_st(MO_8, val, mem);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
|
||||
static void rx_btstm(TCGv mem, TCGv mask)
|
||||
|
@ -1998,7 +1933,6 @@ static void rx_btstm(TCGv mem, TCGv mask)
|
|||
tcg_gen_and_i32(val, val, mask);
|
||||
tcg_gen_setcondi_i32(TCG_COND_NE, cpu_psw_c, val, 0);
|
||||
tcg_gen_mov_i32(cpu_psw_z, cpu_psw_c);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
|
||||
static void rx_bnotm(TCGv mem, TCGv mask)
|
||||
|
@ -2008,7 +1942,6 @@ static void rx_bnotm(TCGv mem, TCGv mask)
|
|||
rx_gen_ld(MO_8, val, mem);
|
||||
tcg_gen_xor_i32(val, val, mask);
|
||||
rx_gen_st(MO_8, val, mem);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
|
||||
static void rx_bsetr(TCGv reg, TCGv mask)
|
||||
|
@ -2028,7 +1961,6 @@ static inline void rx_btstr(TCGv reg, TCGv mask)
|
|||
tcg_gen_and_i32(t0, reg, mask);
|
||||
tcg_gen_setcondi_i32(TCG_COND_NE, cpu_psw_c, t0, 0);
|
||||
tcg_gen_mov_i32(cpu_psw_z, cpu_psw_c);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
static inline void rx_bnotr(TCGv reg, TCGv mask)
|
||||
|
@ -2045,8 +1977,6 @@ static inline void rx_bnotr(TCGv reg, TCGv mask)
|
|||
mask = tcg_const_i32(1 << a->imm); \
|
||||
addr = rx_index_addr(ctx, mem, a->ld, MO_8, a->rs); \
|
||||
cat3(rx_, op, m)(addr, mask); \
|
||||
tcg_temp_free(mask); \
|
||||
tcg_temp_free(mem); \
|
||||
return true; \
|
||||
} \
|
||||
static bool cat3(trans_, name, _ir)(DisasContext *ctx, \
|
||||
|
@ -2055,7 +1985,6 @@ static inline void rx_bnotr(TCGv reg, TCGv mask)
|
|||
TCGv mask; \
|
||||
mask = tcg_const_i32(1 << a->imm); \
|
||||
cat3(rx_, op, r)(cpu_regs[a->rd], mask); \
|
||||
tcg_temp_free(mask); \
|
||||
return true; \
|
||||
} \
|
||||
static bool cat3(trans_, name, _rr)(DisasContext *ctx, \
|
||||
|
@ -2067,8 +1996,6 @@ static inline void rx_bnotr(TCGv reg, TCGv mask)
|
|||
tcg_gen_andi_i32(b, cpu_regs[a->rs], 31); \
|
||||
tcg_gen_shl_i32(mask, mask, b); \
|
||||
cat3(rx_, op, r)(cpu_regs[a->rd], mask); \
|
||||
tcg_temp_free(mask); \
|
||||
tcg_temp_free(b); \
|
||||
return true; \
|
||||
} \
|
||||
static bool cat3(trans_, name, _rm)(DisasContext *ctx, \
|
||||
|
@ -2082,9 +2009,6 @@ static inline void rx_bnotr(TCGv reg, TCGv mask)
|
|||
mem = tcg_temp_new(); \
|
||||
addr = rx_index_addr(ctx, mem, a->ld, MO_8, a->rs); \
|
||||
cat3(rx_, op, m)(addr, mask); \
|
||||
tcg_temp_free(mem); \
|
||||
tcg_temp_free(mask); \
|
||||
tcg_temp_free(b); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
@ -2103,8 +2027,6 @@ static inline void bmcnd_op(TCGv val, TCGCond cond, int pos)
|
|||
tcg_gen_andi_i32(val, val, ~(1 << pos));
|
||||
tcg_gen_setcondi_i32(dc.cond, bit, dc.value, 0);
|
||||
tcg_gen_deposit_i32(val, val, bit, pos, 1);
|
||||
tcg_temp_free(bit);
|
||||
tcg_temp_free(dc.temp);
|
||||
}
|
||||
|
||||
/* bmcnd #imm, dsp[rd] */
|
||||
|
@ -2117,8 +2039,6 @@ static bool trans_BMCnd_im(DisasContext *ctx, arg_BMCnd_im *a)
|
|||
rx_gen_ld(MO_8, val, addr);
|
||||
bmcnd_op(val, a->cd, a->imm);
|
||||
rx_gen_st(MO_8, val, addr);
|
||||
tcg_temp_free(val);
|
||||
tcg_temp_free(mem);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2210,7 +2130,6 @@ static bool trans_MVTC_i(DisasContext *ctx, arg_MVTC_i *a)
|
|||
|
||||
imm = tcg_const_i32(a->imm);
|
||||
move_to_cr(ctx, imm, a->cr);
|
||||
tcg_temp_free(imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2238,7 +2157,6 @@ static bool trans_RTFI(DisasContext *ctx, arg_RTFI *a)
|
|||
tcg_gen_mov_i32(psw, cpu_bpsw);
|
||||
gen_helper_set_psw_rte(cpu_env, psw);
|
||||
ctx->base.is_jmp = DISAS_EXIT;
|
||||
tcg_temp_free(psw);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2253,7 +2171,6 @@ static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
|
|||
pop(psw);
|
||||
gen_helper_set_psw_rte(cpu_env, psw);
|
||||
ctx->base.is_jmp = DISAS_EXIT;
|
||||
tcg_temp_free(psw);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2276,7 +2193,6 @@ static bool trans_INT(DisasContext *ctx, arg_INT *a)
|
|||
vec = tcg_const_i32(a->imm);
|
||||
tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
|
||||
gen_helper_rxint(cpu_env, vec);
|
||||
tcg_temp_free(vec);
|
||||
ctx->base.is_jmp = DISAS_NORETURN;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -5886,9 +5886,14 @@ static void in2_a2(DisasContext *s, DisasOps *o)
|
|||
}
|
||||
#define SPEC_in2_a2 0
|
||||
|
||||
static TCGv gen_ri2(DisasContext *s)
|
||||
{
|
||||
return tcg_constant_i64(s->base.pc_next + (int64_t)get_field(s, i2) * 2);
|
||||
}
|
||||
|
||||
static void in2_ri2(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
o->in2 = tcg_const_i64(s->base.pc_next + (int64_t)get_field(s, i2) * 2);
|
||||
o->in2 = gen_ri2(s);
|
||||
}
|
||||
#define SPEC_in2_ri2 0
|
||||
|
||||
|
@ -5976,29 +5981,29 @@ static void in2_m2_64a(DisasContext *s, DisasOps *o)
|
|||
|
||||
static void in2_mri2_16u(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
in2_ri2(s, o);
|
||||
tcg_gen_qemu_ld16u(o->in2, o->in2, get_mem_index(s));
|
||||
o->in2 = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld16u(o->in2, gen_ri2(s), get_mem_index(s));
|
||||
}
|
||||
#define SPEC_in2_mri2_16u 0
|
||||
|
||||
static void in2_mri2_32s(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
in2_ri2(s, o);
|
||||
tcg_gen_qemu_ld32s(o->in2, o->in2, get_mem_index(s));
|
||||
o->in2 = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld32s(o->in2, gen_ri2(s), get_mem_index(s));
|
||||
}
|
||||
#define SPEC_in2_mri2_32s 0
|
||||
|
||||
static void in2_mri2_32u(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
in2_ri2(s, o);
|
||||
tcg_gen_qemu_ld32u(o->in2, o->in2, get_mem_index(s));
|
||||
o->in2 = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld32u(o->in2, gen_ri2(s), get_mem_index(s));
|
||||
}
|
||||
#define SPEC_in2_mri2_32u 0
|
||||
|
||||
static void in2_mri2_64(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
in2_ri2(s, o);
|
||||
tcg_gen_qemu_ld64(o->in2, o->in2, get_mem_index(s));
|
||||
o->in2 = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld64(o->in2, gen_ri2(s), get_mem_index(s));
|
||||
}
|
||||
#define SPEC_in2_mri2_64 0
|
||||
|
||||
|
|
|
@ -196,7 +196,6 @@ static void gen_read_sr(TCGv dst)
|
|||
tcg_gen_or_i32(dst, dst, t0);
|
||||
tcg_gen_shli_i32(t0, cpu_sr_t, SR_T);
|
||||
tcg_gen_or_i32(dst, cpu_sr, t0);
|
||||
tcg_temp_free_i32(t0);
|
||||
}
|
||||
|
||||
static void gen_write_sr(TCGv src)
|
||||
|
@ -499,7 +498,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_addi_i32(addr, REG(B11_8), B3_0 * 4);
|
||||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx,
|
||||
MO_TEUL | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x5000: /* mov.l @(disp,Rm),Rn */
|
||||
|
@ -508,7 +506,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 4);
|
||||
tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx,
|
||||
MO_TESL | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xe000: /* mov #imm,Rn */
|
||||
|
@ -531,14 +528,12 @@ static void _decode_opc(DisasContext * ctx)
|
|||
{
|
||||
TCGv addr = tcg_const_i32(ctx->base.pc_next + 4 + B7_0 * 2);
|
||||
tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESW);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xd000: /* mov.l @(disp,PC),Rn */
|
||||
{
|
||||
TCGv addr = tcg_const_i32((ctx->base.pc_next + 4 + B7_0 * 4) & ~3);
|
||||
tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESL);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x7000: /* add #imm,Rn */
|
||||
|
@ -590,7 +585,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
/* might cause re-execution */
|
||||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_UB);
|
||||
tcg_gen_mov_i32(REG(B11_8), addr); /* modify register status */
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x2005: /* mov.w Rm,@-Rn */
|
||||
|
@ -600,7 +594,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx,
|
||||
MO_TEUW | UNALIGN(ctx));
|
||||
tcg_gen_mov_i32(REG(B11_8), addr);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x2006: /* mov.l Rm,@-Rn */
|
||||
|
@ -610,7 +603,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx,
|
||||
MO_TEUL | UNALIGN(ctx));
|
||||
tcg_gen_mov_i32(REG(B11_8), addr);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x6004: /* mov.b @Rm+,Rn */
|
||||
|
@ -635,7 +627,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_add_i32(addr, REG(B11_8), REG(0));
|
||||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_UB);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x0005: /* mov.w Rm,@(R0,Rn) */
|
||||
|
@ -644,7 +635,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_add_i32(addr, REG(B11_8), REG(0));
|
||||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx,
|
||||
MO_TEUW | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x0006: /* mov.l Rm,@(R0,Rn) */
|
||||
|
@ -653,7 +643,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_add_i32(addr, REG(B11_8), REG(0));
|
||||
tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx,
|
||||
MO_TEUL | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x000c: /* mov.b @(R0,Rm),Rn */
|
||||
|
@ -661,7 +650,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_add_i32(addr, REG(B7_4), REG(0));
|
||||
tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_SB);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x000d: /* mov.w @(R0,Rm),Rn */
|
||||
|
@ -670,7 +658,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_add_i32(addr, REG(B7_4), REG(0));
|
||||
tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx,
|
||||
MO_TESW | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x000e: /* mov.l @(R0,Rm),Rn */
|
||||
|
@ -679,7 +666,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_add_i32(addr, REG(B7_4), REG(0));
|
||||
tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx,
|
||||
MO_TESL | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x6008: /* swap.b Rm,Rn */
|
||||
|
@ -687,7 +673,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv low = tcg_temp_new();
|
||||
tcg_gen_bswap16_i32(low, REG(B7_4), 0);
|
||||
tcg_gen_deposit_i32(REG(B11_8), REG(B7_4), low, 0, 16);
|
||||
tcg_temp_free(low);
|
||||
}
|
||||
return;
|
||||
case 0x6009: /* swap.w Rm,Rn */
|
||||
|
@ -701,8 +686,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
low = tcg_temp_new();
|
||||
tcg_gen_shri_i32(low, REG(B11_8), 16);
|
||||
tcg_gen_or_i32(REG(B11_8), high, low);
|
||||
tcg_temp_free(low);
|
||||
tcg_temp_free(high);
|
||||
}
|
||||
return;
|
||||
case 0x300c: /* add Rm,Rn */
|
||||
|
@ -716,8 +699,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_add2_i32(t1, cpu_sr_t, cpu_sr_t, t0, REG(B7_4), t0);
|
||||
tcg_gen_add2_i32(REG(B11_8), cpu_sr_t,
|
||||
REG(B11_8), t0, t1, cpu_sr_t);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
}
|
||||
return;
|
||||
case 0x300f: /* addv Rm,Rn */
|
||||
|
@ -730,11 +711,8 @@ static void _decode_opc(DisasContext * ctx)
|
|||
t2 = tcg_temp_new();
|
||||
tcg_gen_xor_i32(t2, REG(B7_4), REG(B11_8));
|
||||
tcg_gen_andc_i32(cpu_sr_t, t1, t2);
|
||||
tcg_temp_free(t2);
|
||||
tcg_gen_shri_i32(cpu_sr_t, cpu_sr_t, 31);
|
||||
tcg_temp_free(t1);
|
||||
tcg_gen_mov_i32(REG(B7_4), t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
return;
|
||||
case 0x2009: /* and Rm,Rn */
|
||||
|
@ -764,8 +742,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_andc_i32(cmp1, cmp1, cmp2);
|
||||
tcg_gen_andi_i32(cmp1, cmp1, 0x80808080);
|
||||
tcg_gen_setcondi_i32(TCG_COND_NE, cpu_sr_t, cmp1, 0);
|
||||
tcg_temp_free(cmp2);
|
||||
tcg_temp_free(cmp1);
|
||||
}
|
||||
return;
|
||||
case 0x2007: /* div0s Rm,Rn */
|
||||
|
@ -801,11 +777,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_xor_i32(t1, t1, t0);
|
||||
tcg_gen_xori_i32(cpu_sr_t, t1, 1);
|
||||
tcg_gen_xor_i32(cpu_sr_q, cpu_sr_m, t1);
|
||||
|
||||
tcg_temp_free(zero);
|
||||
tcg_temp_free(t2);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
return;
|
||||
case 0x300d: /* dmuls.l Rm,Rn */
|
||||
|
@ -834,8 +805,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
arg1 = tcg_temp_new();
|
||||
tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx, MO_TESL);
|
||||
gen_helper_macl(cpu_env, arg0, arg1);
|
||||
tcg_temp_free(arg1);
|
||||
tcg_temp_free(arg0);
|
||||
tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
|
||||
tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
|
||||
}
|
||||
|
@ -848,8 +817,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
arg1 = tcg_temp_new();
|
||||
tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx, MO_TESL);
|
||||
gen_helper_macw(cpu_env, arg0, arg1);
|
||||
tcg_temp_free(arg1);
|
||||
tcg_temp_free(arg0);
|
||||
tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2);
|
||||
tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
|
||||
}
|
||||
|
@ -865,8 +832,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
arg1 = tcg_temp_new();
|
||||
tcg_gen_ext16s_i32(arg1, REG(B11_8));
|
||||
tcg_gen_mul_i32(cpu_macl, arg0, arg1);
|
||||
tcg_temp_free(arg1);
|
||||
tcg_temp_free(arg0);
|
||||
}
|
||||
return;
|
||||
case 0x200e: /* mulu.w Rm,Rn */
|
||||
|
@ -877,8 +842,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
arg1 = tcg_temp_new();
|
||||
tcg_gen_ext16u_i32(arg1, REG(B11_8));
|
||||
tcg_gen_mul_i32(cpu_macl, arg0, arg1);
|
||||
tcg_temp_free(arg1);
|
||||
tcg_temp_free(arg0);
|
||||
}
|
||||
return;
|
||||
case 0x600b: /* neg Rm,Rn */
|
||||
|
@ -892,7 +855,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_sub2_i32(REG(B11_8), cpu_sr_t,
|
||||
t0, t0, REG(B11_8), cpu_sr_t);
|
||||
tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
return;
|
||||
case 0x6007: /* not Rm,Rn */
|
||||
|
@ -921,10 +883,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
/* select between the two cases */
|
||||
tcg_gen_movi_i32(t0, 0);
|
||||
tcg_gen_movcond_i32(TCG_COND_GE, REG(B11_8), REG(B7_4), t0, t1, t2);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
}
|
||||
return;
|
||||
case 0x400d: /* shld Rm,Rn */
|
||||
|
@ -947,10 +905,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
/* select between the two cases */
|
||||
tcg_gen_movi_i32(t0, 0);
|
||||
tcg_gen_movcond_i32(TCG_COND_GE, REG(B11_8), REG(B7_4), t0, t1, t2);
|
||||
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
tcg_temp_free(t2);
|
||||
}
|
||||
return;
|
||||
case 0x3008: /* sub Rm,Rn */
|
||||
|
@ -965,8 +919,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_sub2_i32(REG(B11_8), cpu_sr_t,
|
||||
REG(B11_8), t0, t1, cpu_sr_t);
|
||||
tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1);
|
||||
tcg_temp_free(t0);
|
||||
tcg_temp_free(t1);
|
||||
}
|
||||
return;
|
||||
case 0x300b: /* subv Rm,Rn */
|
||||
|
@ -979,11 +931,8 @@ static void _decode_opc(DisasContext * ctx)
|
|||
t2 = tcg_temp_new();
|
||||
tcg_gen_xor_i32(t2, REG(B11_8), REG(B7_4));
|
||||
tcg_gen_and_i32(t1, t1, t2);
|
||||
tcg_temp_free(t2);
|
||||
tcg_gen_shri_i32(cpu_sr_t, t1, 31);
|
||||
tcg_temp_free(t1);
|
||||
tcg_gen_mov_i32(REG(B11_8), t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
return;
|
||||
case 0x2008: /* tst Rm,Rn */
|
||||
|
@ -991,7 +940,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv val = tcg_temp_new();
|
||||
tcg_gen_and_i32(val, REG(B7_4), REG(B11_8));
|
||||
tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
return;
|
||||
case 0x200a: /* xor Rm,Rn */
|
||||
|
@ -1014,7 +962,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
gen_load_fpr64(ctx, fp, XHACK(B7_4));
|
||||
tcg_gen_qemu_st_i64(fp, REG(B11_8), ctx->memidx, MO_TEUQ);
|
||||
tcg_temp_free_i64(fp);
|
||||
} else {
|
||||
tcg_gen_qemu_st_i32(FREG(B7_4), REG(B11_8), ctx->memidx, MO_TEUL);
|
||||
}
|
||||
|
@ -1025,7 +972,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld_i64(fp, REG(B7_4), ctx->memidx, MO_TEUQ);
|
||||
gen_store_fpr64(ctx, fp, XHACK(B11_8));
|
||||
tcg_temp_free_i64(fp);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i32(FREG(B11_8), REG(B7_4), ctx->memidx, MO_TEUL);
|
||||
}
|
||||
|
@ -1036,7 +982,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld_i64(fp, REG(B7_4), ctx->memidx, MO_TEUQ);
|
||||
gen_store_fpr64(ctx, fp, XHACK(B11_8));
|
||||
tcg_temp_free_i64(fp);
|
||||
tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 8);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i32(FREG(B11_8), REG(B7_4), ctx->memidx, MO_TEUL);
|
||||
|
@ -1052,13 +997,11 @@ static void _decode_opc(DisasContext * ctx)
|
|||
gen_load_fpr64(ctx, fp, XHACK(B7_4));
|
||||
tcg_gen_subi_i32(addr, REG(B11_8), 8);
|
||||
tcg_gen_qemu_st_i64(fp, addr, ctx->memidx, MO_TEUQ);
|
||||
tcg_temp_free_i64(fp);
|
||||
} else {
|
||||
tcg_gen_subi_i32(addr, REG(B11_8), 4);
|
||||
tcg_gen_qemu_st_i32(FREG(B7_4), addr, ctx->memidx, MO_TEUL);
|
||||
}
|
||||
tcg_gen_mov_i32(REG(B11_8), addr);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
|
||||
|
@ -1070,11 +1013,9 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
tcg_gen_qemu_ld_i64(fp, addr, ctx->memidx, MO_TEUQ);
|
||||
gen_store_fpr64(ctx, fp, XHACK(B11_8));
|
||||
tcg_temp_free_i64(fp);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i32(FREG(B11_8), addr, ctx->memidx, MO_TEUL);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
|
||||
|
@ -1086,11 +1027,9 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
gen_load_fpr64(ctx, fp, XHACK(B7_4));
|
||||
tcg_gen_qemu_st_i64(fp, addr, ctx->memidx, MO_TEUQ);
|
||||
tcg_temp_free_i64(fp);
|
||||
} else {
|
||||
tcg_gen_qemu_st_i32(FREG(B7_4), addr, ctx->memidx, MO_TEUL);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
|
||||
|
@ -1132,8 +1071,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
return;
|
||||
}
|
||||
gen_store_fpr64(ctx, fp0, B11_8);
|
||||
tcg_temp_free_i64(fp0);
|
||||
tcg_temp_free_i64(fp1);
|
||||
} else {
|
||||
switch (ctx->opcode & 0xf00f) {
|
||||
case 0xf000: /* fadd Rm,Rn */
|
||||
|
@ -1185,8 +1122,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
|
||||
tcg_gen_andi_i32(val, val, B7_0);
|
||||
tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
|
||||
tcg_temp_free(val);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x8b00: /* bf label */
|
||||
|
@ -1217,7 +1152,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
|
||||
tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_SB);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc500: /* mov.w @(disp,GBR),R0 */
|
||||
|
@ -1225,7 +1159,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
|
||||
tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESW);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc600: /* mov.l @(disp,GBR),R0 */
|
||||
|
@ -1233,7 +1166,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
|
||||
tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESL);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc000: /* mov.b R0,@(disp,GBR) */
|
||||
|
@ -1241,7 +1173,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
|
||||
tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_UB);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc100: /* mov.w R0,@(disp,GBR) */
|
||||
|
@ -1249,7 +1180,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
|
||||
tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUW);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc200: /* mov.l R0,@(disp,GBR) */
|
||||
|
@ -1257,7 +1187,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
|
||||
tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUL);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x8000: /* mov.b R0,@(disp,Rn) */
|
||||
|
@ -1265,7 +1194,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
|
||||
tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_UB);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x8100: /* mov.w R0,@(disp,Rn) */
|
||||
|
@ -1274,7 +1202,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
|
||||
tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx,
|
||||
MO_TEUW | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x8400: /* mov.b @(disp,Rn),R0 */
|
||||
|
@ -1282,7 +1209,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv addr = tcg_temp_new();
|
||||
tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
|
||||
tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_SB);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0x8500: /* mov.w @(disp,Rn),R0 */
|
||||
|
@ -1291,7 +1217,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
|
||||
tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx,
|
||||
MO_TESW | UNALIGN(ctx));
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc700: /* mova @(disp,PC),R0 */
|
||||
|
@ -1310,8 +1235,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
|
||||
tcg_gen_ori_i32(val, val, B7_0);
|
||||
tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
|
||||
tcg_temp_free(val);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
case 0xc300: /* trapa #imm */
|
||||
|
@ -1321,7 +1244,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
gen_save_cpu_state(ctx, true);
|
||||
imm = tcg_const_i32(B7_0);
|
||||
gen_helper_trapa(cpu_env, imm);
|
||||
tcg_temp_free(imm);
|
||||
ctx->base.is_jmp = DISAS_NORETURN;
|
||||
}
|
||||
return;
|
||||
|
@ -1330,7 +1252,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv val = tcg_temp_new();
|
||||
tcg_gen_andi_i32(val, REG(0), B7_0);
|
||||
tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
return;
|
||||
case 0xcc00: /* tst.b #imm,@(R0,GBR) */
|
||||
|
@ -1340,7 +1261,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(val, val, ctx->memidx, MO_UB);
|
||||
tcg_gen_andi_i32(val, val, B7_0);
|
||||
tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
return;
|
||||
case 0xca00: /* xor #imm,R0 */
|
||||
|
@ -1355,8 +1275,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
|
||||
tcg_gen_xori_i32(val, val, B7_0);
|
||||
tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
|
||||
tcg_temp_free(val);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1382,7 +1300,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_subi_i32(addr, REG(B11_8), 4);
|
||||
tcg_gen_qemu_st_i32(ALTREG(B6_4), addr, ctx->memidx, MO_TEUL);
|
||||
tcg_gen_mov_i32(REG(B11_8), addr);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1430,7 +1347,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv val = tcg_temp_new();
|
||||
tcg_gen_andi_i32(val, REG(B11_8), 0x700083f3);
|
||||
gen_write_sr(val);
|
||||
tcg_temp_free(val);
|
||||
ctx->base.is_jmp = DISAS_STOP;
|
||||
}
|
||||
return;
|
||||
|
@ -1441,7 +1357,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(val, REG(B11_8), ctx->memidx, MO_TESL);
|
||||
tcg_gen_andi_i32(val, val, 0x700083f3);
|
||||
gen_write_sr(val);
|
||||
tcg_temp_free(val);
|
||||
tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
|
||||
ctx->base.is_jmp = DISAS_STOP;
|
||||
}
|
||||
|
@ -1459,8 +1374,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
gen_read_sr(val);
|
||||
tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_TEUL);
|
||||
tcg_gen_mov_i32(REG(B11_8), addr);
|
||||
tcg_temp_free(val);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
return;
|
||||
#define LD(reg,ldnum,ldpnum,prechk) \
|
||||
|
@ -1485,7 +1398,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_subi_i32(addr, REG(B11_8), 4); \
|
||||
tcg_gen_qemu_st_i32(cpu_##reg, addr, ctx->memidx, MO_TEUL); \
|
||||
tcg_gen_mov_i32(REG(B11_8), addr); \
|
||||
tcg_temp_free(addr); \
|
||||
} \
|
||||
return;
|
||||
#define LDST(reg,ldnum,ldpnum,stnum,stpnum,prechk) \
|
||||
|
@ -1514,7 +1426,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(addr, REG(B11_8), ctx->memidx, MO_TESL);
|
||||
tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
|
||||
gen_helper_ld_fpscr(cpu_env, addr);
|
||||
tcg_temp_free(addr);
|
||||
ctx->base.is_jmp = DISAS_STOP;
|
||||
}
|
||||
return;
|
||||
|
@ -1532,8 +1443,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_subi_i32(addr, REG(B11_8), 4);
|
||||
tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_TEUL);
|
||||
tcg_gen_mov_i32(REG(B11_8), addr);
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
return;
|
||||
case 0x00c3: /* movca.l R0,@Rm */
|
||||
|
@ -1542,7 +1451,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(val, REG(B11_8), ctx->memidx, MO_TEUL);
|
||||
gen_helper_movcal(cpu_env, REG(B11_8), val);
|
||||
tcg_gen_qemu_st_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
ctx->has_movcal = 1;
|
||||
return;
|
||||
|
@ -1586,7 +1494,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_atomic_cmpxchg_i32(tmp, REG(B11_8), cpu_lock_value,
|
||||
REG(0), ctx->memidx, MO_TEUL);
|
||||
tcg_gen_setcond_i32(TCG_COND_EQ, cpu_sr_t, tmp, cpu_lock_value);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_lock_addr, -1, fail);
|
||||
tcg_gen_qemu_st_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL);
|
||||
|
@ -1617,7 +1524,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TESL);
|
||||
tcg_gen_mov_i32(cpu_lock_value, REG(0));
|
||||
tcg_gen_mov_i32(cpu_lock_addr, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TESL);
|
||||
tcg_gen_movi_i32(cpu_lock_addr, 0);
|
||||
|
@ -1653,7 +1559,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_shri_i32(cpu_sr_t, REG(B11_8), 31);
|
||||
tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
|
||||
tcg_gen_or_i32(REG(B11_8), REG(B11_8), tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
return;
|
||||
case 0x4025: /* rotcr Rn */
|
||||
|
@ -1663,7 +1568,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 1);
|
||||
tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
|
||||
tcg_gen_or_i32(REG(B11_8), REG(B11_8), tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
return;
|
||||
case 0x4004: /* rotl Rn */
|
||||
|
@ -1711,7 +1615,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
tcg_gen_atomic_fetch_or_i32(val, REG(B11_8), val,
|
||||
ctx->memidx, MO_UB);
|
||||
tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
|
||||
tcg_temp_free(val);
|
||||
}
|
||||
return;
|
||||
case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */
|
||||
|
@ -1732,7 +1635,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
fp = tcg_temp_new_i64();
|
||||
gen_helper_float_DT(fp, cpu_env, cpu_fpul);
|
||||
gen_store_fpr64(ctx, fp, B11_8);
|
||||
tcg_temp_free_i64(fp);
|
||||
}
|
||||
else {
|
||||
gen_helper_float_FT(FREG(B11_8), cpu_env, cpu_fpul);
|
||||
|
@ -1748,7 +1650,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
fp = tcg_temp_new_i64();
|
||||
gen_load_fpr64(ctx, fp, B11_8);
|
||||
gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp);
|
||||
tcg_temp_free_i64(fp);
|
||||
}
|
||||
else {
|
||||
gen_helper_ftrc_FT(cpu_fpul, cpu_env, FREG(B11_8));
|
||||
|
@ -1772,7 +1673,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
gen_load_fpr64(ctx, fp, B11_8);
|
||||
gen_helper_fsqrt_DT(fp, cpu_env, fp);
|
||||
gen_store_fpr64(ctx, fp, B11_8);
|
||||
tcg_temp_free_i64(fp);
|
||||
} else {
|
||||
gen_helper_fsqrt_FT(FREG(B11_8), cpu_env, FREG(B11_8));
|
||||
}
|
||||
|
@ -1798,7 +1698,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul);
|
||||
gen_store_fpr64(ctx, fp, B11_8);
|
||||
tcg_temp_free_i64(fp);
|
||||
}
|
||||
return;
|
||||
case 0xf0bd: /* fcnvds DRn,FPUL */
|
||||
|
@ -1807,7 +1706,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv_i64 fp = tcg_temp_new_i64();
|
||||
gen_load_fpr64(ctx, fp, B11_8);
|
||||
gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp);
|
||||
tcg_temp_free_i64(fp);
|
||||
}
|
||||
return;
|
||||
case 0xf0ed: /* fipr FVm,FVn */
|
||||
|
@ -1817,8 +1715,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
TCGv m = tcg_const_i32((ctx->opcode >> 8) & 3);
|
||||
TCGv n = tcg_const_i32((ctx->opcode >> 10) & 3);
|
||||
gen_helper_fipr(cpu_env, m, n);
|
||||
tcg_temp_free(m);
|
||||
tcg_temp_free(n);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -1831,7 +1727,6 @@ static void _decode_opc(DisasContext * ctx)
|
|||
}
|
||||
TCGv n = tcg_const_i32((ctx->opcode >> 10) & 3);
|
||||
gen_helper_ftrv(cpu_env, n);
|
||||
tcg_temp_free(n);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -2220,11 +2115,6 @@ static void decode_gusa(DisasContext *ctx, CPUSH4State *env)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
/* If op_src is not a valid register, then op_arg was a constant. */
|
||||
if (op_src < 0 && op_arg) {
|
||||
tcg_temp_free_i32(op_arg);
|
||||
}
|
||||
|
||||
/* The entire region has been translated. */
|
||||
ctx->envflags &= ~TB_FLAG_GUSA_MASK;
|
||||
ctx->base.pc_next = pc_end;
|
||||
|
|
|
@ -64,10 +64,9 @@ static const int perm_table[2][8] = {
|
|||
}
|
||||
};
|
||||
|
||||
static int get_physical_address(CPUSPARCState *env, hwaddr *physical,
|
||||
int *prot, int *access_index, MemTxAttrs *attrs,
|
||||
target_ulong address, int rw, int mmu_idx,
|
||||
target_ulong *page_size)
|
||||
static int get_physical_address(CPUSPARCState *env, CPUTLBEntryFull *full,
|
||||
int *access_index, target_ulong address,
|
||||
int rw, int mmu_idx)
|
||||
{
|
||||
int access_perms = 0;
|
||||
hwaddr pde_ptr;
|
||||
|
@ -80,20 +79,20 @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical,
|
|||
is_user = mmu_idx == MMU_USER_IDX;
|
||||
|
||||
if (mmu_idx == MMU_PHYS_IDX) {
|
||||
*page_size = TARGET_PAGE_SIZE;
|
||||
full->lg_page_size = TARGET_PAGE_BITS;
|
||||
/* Boot mode: instruction fetches are taken from PROM */
|
||||
if (rw == 2 && (env->mmuregs[0] & env->def.mmu_bm)) {
|
||||
*physical = env->prom_addr | (address & 0x7ffffULL);
|
||||
*prot = PAGE_READ | PAGE_EXEC;
|
||||
full->phys_addr = env->prom_addr | (address & 0x7ffffULL);
|
||||
full->prot = PAGE_READ | PAGE_EXEC;
|
||||
return 0;
|
||||
}
|
||||
*physical = address;
|
||||
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
full->phys_addr = address;
|
||||
full->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*access_index = ((rw & 1) << 2) | (rw & 2) | (is_user ? 0 : 1);
|
||||
*physical = 0xffffffffffff0000ULL;
|
||||
full->phys_addr = 0xffffffffffff0000ULL;
|
||||
|
||||
/* SPARC reference MMU table walk: Context table->L1->L2->PTE */
|
||||
/* Context base + context number */
|
||||
|
@ -157,16 +156,17 @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical,
|
|||
case 2: /* L3 PTE */
|
||||
page_offset = 0;
|
||||
}
|
||||
*page_size = TARGET_PAGE_SIZE;
|
||||
full->lg_page_size = TARGET_PAGE_BITS;
|
||||
break;
|
||||
case 2: /* L2 PTE */
|
||||
page_offset = address & 0x3f000;
|
||||
*page_size = 0x40000;
|
||||
full->lg_page_size = 18;
|
||||
}
|
||||
break;
|
||||
case 2: /* L1 PTE */
|
||||
page_offset = address & 0xfff000;
|
||||
*page_size = 0x1000000;
|
||||
full->lg_page_size = 24;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,16 +188,16 @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical,
|
|||
}
|
||||
|
||||
/* the page can be put in the TLB */
|
||||
*prot = perm_table[is_user][access_perms];
|
||||
full->prot = perm_table[is_user][access_perms];
|
||||
if (!(pde & PG_MODIFIED_MASK)) {
|
||||
/* only set write access if already dirty... otherwise wait
|
||||
for dirty access */
|
||||
*prot &= ~PAGE_WRITE;
|
||||
full->prot &= ~PAGE_WRITE;
|
||||
}
|
||||
|
||||
/* Even if large ptes, we map only one 4KB page in the cache to
|
||||
avoid filling it too fast */
|
||||
*physical = ((hwaddr)(pde & PTE_ADDR_MASK) << 4) + page_offset;
|
||||
full->phys_addr = ((hwaddr)(pde & PTE_ADDR_MASK) << 4) + page_offset;
|
||||
return error_code;
|
||||
}
|
||||
|
||||
|
@ -208,11 +208,9 @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
|||
{
|
||||
SPARCCPU *cpu = SPARC_CPU(cs);
|
||||
CPUSPARCState *env = &cpu->env;
|
||||
hwaddr paddr;
|
||||
CPUTLBEntryFull full = {};
|
||||
target_ulong vaddr;
|
||||
target_ulong page_size;
|
||||
int error_code = 0, prot, access_index;
|
||||
MemTxAttrs attrs = {};
|
||||
int error_code = 0, access_index;
|
||||
|
||||
/*
|
||||
* TODO: If we ever need tlb_vaddr_to_host for this target,
|
||||
|
@ -223,16 +221,15 @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
|||
assert(!probe);
|
||||
|
||||
address &= TARGET_PAGE_MASK;
|
||||
error_code = get_physical_address(env, &paddr, &prot, &access_index, &attrs,
|
||||
address, access_type,
|
||||
mmu_idx, &page_size);
|
||||
error_code = get_physical_address(env, &full, &access_index,
|
||||
address, access_type, mmu_idx);
|
||||
vaddr = address;
|
||||
if (likely(error_code == 0)) {
|
||||
qemu_log_mask(CPU_LOG_MMU,
|
||||
"Translate at %" VADDR_PRIx " -> "
|
||||
HWADDR_FMT_plx ", vaddr " TARGET_FMT_lx "\n",
|
||||
address, paddr, vaddr);
|
||||
tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size);
|
||||
address, full.phys_addr, vaddr);
|
||||
tlb_set_page_full(cs, mmu_idx, vaddr, &full);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -247,8 +244,8 @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
|||
permissions. If no mapping is available, redirect accesses to
|
||||
neverland. Fake/overridden mappings will be flushed when
|
||||
switching to normal mode. */
|
||||
prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, TARGET_PAGE_SIZE);
|
||||
full.prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
tlb_set_page_full(cs, mmu_idx, vaddr, &full);
|
||||
return true;
|
||||
} else {
|
||||
if (access_type == MMU_INST_FETCH) {
|
||||
|
@ -545,8 +542,7 @@ static uint64_t build_sfsr(CPUSPARCState *env, int mmu_idx, int rw)
|
|||
return sfsr;
|
||||
}
|
||||
|
||||
static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical,
|
||||
int *prot, MemTxAttrs *attrs,
|
||||
static int get_physical_address_data(CPUSPARCState *env, CPUTLBEntryFull *full,
|
||||
target_ulong address, int rw, int mmu_idx)
|
||||
{
|
||||
CPUState *cs = env_cpu(env);
|
||||
|
@ -579,11 +575,12 @@ static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical,
|
|||
|
||||
for (i = 0; i < 64; i++) {
|
||||
/* ctx match, vaddr match, valid? */
|
||||
if (ultrasparc_tag_match(&env->dtlb[i], address, context, physical)) {
|
||||
if (ultrasparc_tag_match(&env->dtlb[i], address, context,
|
||||
&full->phys_addr)) {
|
||||
int do_fault = 0;
|
||||
|
||||
if (TTE_IS_IE(env->dtlb[i].tte)) {
|
||||
attrs->byte_swap = true;
|
||||
full->attrs.byte_swap = true;
|
||||
}
|
||||
|
||||
/* access ok? */
|
||||
|
@ -616,9 +613,9 @@ static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical,
|
|||
}
|
||||
|
||||
if (!do_fault) {
|
||||
*prot = PAGE_READ;
|
||||
full->prot = PAGE_READ;
|
||||
if (TTE_IS_W_OK(env->dtlb[i].tte)) {
|
||||
*prot |= PAGE_WRITE;
|
||||
full->prot |= PAGE_WRITE;
|
||||
}
|
||||
|
||||
TTE_SET_USED(env->dtlb[i].tte);
|
||||
|
@ -645,8 +642,7 @@ static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical,
|
||||
int *prot, MemTxAttrs *attrs,
|
||||
static int get_physical_address_code(CPUSPARCState *env, CPUTLBEntryFull *full,
|
||||
target_ulong address, int mmu_idx)
|
||||
{
|
||||
CPUState *cs = env_cpu(env);
|
||||
|
@ -681,7 +677,7 @@ static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical,
|
|||
for (i = 0; i < 64; i++) {
|
||||
/* ctx match, vaddr match, valid? */
|
||||
if (ultrasparc_tag_match(&env->itlb[i],
|
||||
address, context, physical)) {
|
||||
address, context, &full->phys_addr)) {
|
||||
/* access ok? */
|
||||
if (TTE_IS_PRIV(env->itlb[i].tte) && is_user) {
|
||||
/* Fault status register */
|
||||
|
@ -708,7 +704,7 @@ static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical,
|
|||
|
||||
return 1;
|
||||
}
|
||||
*prot = PAGE_EXEC;
|
||||
full->prot = PAGE_EXEC;
|
||||
TTE_SET_USED(env->itlb[i].tte);
|
||||
return 0;
|
||||
}
|
||||
|
@ -722,14 +718,13 @@ static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int get_physical_address(CPUSPARCState *env, hwaddr *physical,
|
||||
int *prot, int *access_index, MemTxAttrs *attrs,
|
||||
target_ulong address, int rw, int mmu_idx,
|
||||
target_ulong *page_size)
|
||||
static int get_physical_address(CPUSPARCState *env, CPUTLBEntryFull *full,
|
||||
int *access_index, target_ulong address,
|
||||
int rw, int mmu_idx)
|
||||
{
|
||||
/* ??? We treat everything as a small page, then explicitly flush
|
||||
everything when an entry is evicted. */
|
||||
*page_size = TARGET_PAGE_SIZE;
|
||||
full->lg_page_size = TARGET_PAGE_BITS;
|
||||
|
||||
/* safety net to catch wrong softmmu index use from dynamic code */
|
||||
if (env->tl > 0 && mmu_idx != MMU_NUCLEUS_IDX) {
|
||||
|
@ -747,17 +742,15 @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical,
|
|||
}
|
||||
|
||||
if (mmu_idx == MMU_PHYS_IDX) {
|
||||
*physical = ultrasparc_truncate_physical(address);
|
||||
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
full->phys_addr = ultrasparc_truncate_physical(address);
|
||||
full->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rw == 2) {
|
||||
return get_physical_address_code(env, physical, prot, attrs, address,
|
||||
mmu_idx);
|
||||
return get_physical_address_code(env, full, address, mmu_idx);
|
||||
} else {
|
||||
return get_physical_address_data(env, physical, prot, attrs, address,
|
||||
rw, mmu_idx);
|
||||
return get_physical_address_data(env, full, address, rw, mmu_idx);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -768,25 +761,17 @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
|||
{
|
||||
SPARCCPU *cpu = SPARC_CPU(cs);
|
||||
CPUSPARCState *env = &cpu->env;
|
||||
target_ulong vaddr;
|
||||
hwaddr paddr;
|
||||
target_ulong page_size;
|
||||
MemTxAttrs attrs = {};
|
||||
int error_code = 0, prot, access_index;
|
||||
CPUTLBEntryFull full = {};
|
||||
int error_code = 0, access_index;
|
||||
|
||||
address &= TARGET_PAGE_MASK;
|
||||
error_code = get_physical_address(env, &paddr, &prot, &access_index, &attrs,
|
||||
address, access_type,
|
||||
mmu_idx, &page_size);
|
||||
error_code = get_physical_address(env, &full, &access_index,
|
||||
address, access_type, mmu_idx);
|
||||
if (likely(error_code == 0)) {
|
||||
vaddr = address;
|
||||
|
||||
trace_mmu_helper_mmu_fault(address, paddr, mmu_idx, env->tl,
|
||||
trace_mmu_helper_mmu_fault(address, full.phys_addr, mmu_idx, env->tl,
|
||||
env->dmmu.mmu_primary_context,
|
||||
env->dmmu.mmu_secondary_context);
|
||||
|
||||
tlb_set_page_with_attrs(cs, vaddr, paddr, attrs, prot, mmu_idx,
|
||||
page_size);
|
||||
tlb_set_page_full(cs, mmu_idx, address, &full);
|
||||
return true;
|
||||
}
|
||||
if (probe) {
|
||||
|
@ -888,12 +873,14 @@ void dump_mmu(CPUSPARCState *env)
|
|||
static int cpu_sparc_get_phys_page(CPUSPARCState *env, hwaddr *phys,
|
||||
target_ulong addr, int rw, int mmu_idx)
|
||||
{
|
||||
target_ulong page_size;
|
||||
int prot, access_index;
|
||||
MemTxAttrs attrs = {};
|
||||
CPUTLBEntryFull full = {};
|
||||
int access_index, ret;
|
||||
|
||||
return get_physical_address(env, phys, &prot, &access_index, &attrs, addr,
|
||||
rw, mmu_idx, &page_size);
|
||||
ret = get_physical_address(env, &full, &access_index, addr, rw, mmu_idx);
|
||||
if (ret == 0) {
|
||||
*phys = full.phys_addr;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(TARGET_SPARC64)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -57,7 +57,6 @@ struct DisasContext {
|
|||
|
||||
bool sar_5bit;
|
||||
bool sar_m32_5bit;
|
||||
bool sar_m32_allocated;
|
||||
TCGv_i32 sar_m32;
|
||||
|
||||
unsigned window;
|
||||
|
@ -284,14 +283,7 @@ static void init_sar_tracker(DisasContext *dc)
|
|||
{
|
||||
dc->sar_5bit = false;
|
||||
dc->sar_m32_5bit = false;
|
||||
dc->sar_m32_allocated = false;
|
||||
}
|
||||
|
||||
static void reset_sar_tracker(DisasContext *dc)
|
||||
{
|
||||
if (dc->sar_m32_allocated) {
|
||||
tcg_temp_free(dc->sar_m32);
|
||||
}
|
||||
dc->sar_m32 = NULL;
|
||||
}
|
||||
|
||||
static void gen_right_shift_sar(DisasContext *dc, TCGv_i32 sa)
|
||||
|
@ -306,9 +298,8 @@ static void gen_right_shift_sar(DisasContext *dc, TCGv_i32 sa)
|
|||
|
||||
static void gen_left_shift_sar(DisasContext *dc, TCGv_i32 sa)
|
||||
{
|
||||
if (!dc->sar_m32_allocated) {
|
||||
if (!dc->sar_m32) {
|
||||
dc->sar_m32 = tcg_temp_new_i32();
|
||||
dc->sar_m32_allocated = true;
|
||||
}
|
||||
tcg_gen_andi_i32(dc->sar_m32, sa, 0x1f);
|
||||
tcg_gen_sub_i32(cpu_SR[SAR], tcg_constant_i32(32), dc->sar_m32);
|
||||
|
@ -1111,16 +1102,6 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)
|
|||
ops->translate(dc, pslot->arg, ops->par);
|
||||
}
|
||||
|
||||
for (i = 0; i < n_arg_copy; ++i) {
|
||||
if (arg_copy[i].arg->num_bits <= 32) {
|
||||
tcg_temp_free_i32(arg_copy[i].temp);
|
||||
} else if (arg_copy[i].arg->num_bits <= 64) {
|
||||
tcg_temp_free_i64(arg_copy[i].temp);
|
||||
} else {
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
if (dc->base.is_jmp == DISAS_NEXT) {
|
||||
gen_postprocess(dc, 0);
|
||||
dc->op_flags = 0;
|
||||
|
@ -1247,11 +1228,6 @@ static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
reset_sar_tracker(dc);
|
||||
if (dc->icount) {
|
||||
tcg_temp_free(dc->next_icount);
|
||||
}
|
||||
|
||||
switch (dc->base.is_jmp) {
|
||||
case DISAS_NORETURN:
|
||||
break;
|
||||
|
@ -1379,14 +1355,13 @@ static void translate_addx(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
|
||||
tcg_gen_add_i32(arg[0].out, tmp, arg[2].in);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_all(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
uint32_t shift = par[1];
|
||||
TCGv_i32 mask = tcg_const_i32(((1 << shift) - 1) << arg[1].imm);
|
||||
TCGv_i32 mask = tcg_constant_i32(((1 << shift) - 1) << arg[1].imm);
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
|
||||
tcg_gen_and_i32(tmp, arg[1].in, mask);
|
||||
|
@ -1398,8 +1373,6 @@ static void translate_all(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_shri_i32(tmp, tmp, arg[1].imm + shift);
|
||||
tcg_gen_deposit_i32(arg[0].out, arg[0].out,
|
||||
tmp, arg[0].imm, 1);
|
||||
tcg_temp_free(mask);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_and(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1414,7 +1387,6 @@ static void translate_ball(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
|
||||
gen_brcond(dc, par[0], tmp, arg[1].in, arg[2].imm);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_bany(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1423,7 +1395,6 @@ static void translate_bany(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
|
||||
gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_b(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1435,22 +1406,16 @@ static void translate_b(DisasContext *dc, const OpcodeArg arg[],
|
|||
static void translate_bb(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
#if TARGET_BIG_ENDIAN
|
||||
TCGv_i32 bit = tcg_const_i32(0x80000000u);
|
||||
#else
|
||||
TCGv_i32 bit = tcg_const_i32(0x00000001u);
|
||||
#endif
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
|
||||
tcg_gen_andi_i32(tmp, arg[1].in, 0x1f);
|
||||
#if TARGET_BIG_ENDIAN
|
||||
tcg_gen_shr_i32(bit, bit, tmp);
|
||||
#else
|
||||
tcg_gen_shl_i32(bit, bit, tmp);
|
||||
#endif
|
||||
tcg_gen_and_i32(tmp, arg[0].in, bit);
|
||||
if (TARGET_BIG_ENDIAN) {
|
||||
tcg_gen_shr_i32(tmp, tcg_constant_i32(0x80000000u), tmp);
|
||||
} else {
|
||||
tcg_gen_shl_i32(tmp, tcg_constant_i32(0x00000001u), tmp);
|
||||
}
|
||||
tcg_gen_and_i32(tmp, arg[0].in, tmp);
|
||||
gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
|
||||
tcg_temp_free(tmp);
|
||||
tcg_temp_free(bit);
|
||||
}
|
||||
|
||||
static void translate_bbi(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1463,7 +1428,6 @@ static void translate_bbi(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_andi_i32(tmp, arg[0].in, 0x00000001u << arg[1].imm);
|
||||
#endif
|
||||
gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_bi(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1504,8 +1468,6 @@ static void translate_boolean(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_shri_i32(tmp2, arg[2].in, arg[2].imm);
|
||||
op[par[0]](tmp1, tmp1, tmp2);
|
||||
tcg_gen_deposit_i32(arg[0].out, arg[0].out, tmp1, arg[0].imm, 1);
|
||||
tcg_temp_free(tmp1);
|
||||
tcg_temp_free(tmp2);
|
||||
}
|
||||
|
||||
static void translate_bp(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1515,7 +1477,6 @@ static void translate_bp(DisasContext *dc, const OpcodeArg arg[],
|
|||
|
||||
tcg_gen_andi_i32(tmp, arg[0].in, 1 << arg[0].imm);
|
||||
gen_brcondi(dc, par[0], tmp, 0, arg[1].imm);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_call0(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1528,9 +1489,8 @@ static void translate_call0(DisasContext *dc, const OpcodeArg arg[],
|
|||
static void translate_callw(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
TCGv_i32 tmp = tcg_const_i32(arg[0].imm);
|
||||
TCGv_i32 tmp = tcg_constant_i32(arg[0].imm);
|
||||
gen_callw_slot(dc, par[0], tmp, adjust_jump_slot(dc, arg[0].imm, 0));
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_callx0(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1540,7 +1500,6 @@ static void translate_callx0(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_mov_i32(tmp, arg[0].in);
|
||||
tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
|
||||
gen_jump(dc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_callxw(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1550,19 +1509,16 @@ static void translate_callxw(DisasContext *dc, const OpcodeArg arg[],
|
|||
|
||||
tcg_gen_mov_i32(tmp, arg[0].in);
|
||||
gen_callw_slot(dc, par[0], tmp, -1);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_clamps(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
TCGv_i32 tmp1 = tcg_const_i32(-1u << arg[2].imm);
|
||||
TCGv_i32 tmp2 = tcg_const_i32((1 << arg[2].imm) - 1);
|
||||
TCGv_i32 tmp1 = tcg_constant_i32(-1u << arg[2].imm);
|
||||
TCGv_i32 tmp2 = tcg_constant_i32((1 << arg[2].imm) - 1);
|
||||
|
||||
tcg_gen_smax_i32(tmp1, tmp1, arg[1].in);
|
||||
tcg_gen_smin_i32(arg[0].out, tmp1, tmp2);
|
||||
tcg_temp_free(tmp1);
|
||||
tcg_temp_free(tmp2);
|
||||
tcg_gen_smax_i32(arg[0].out, tmp1, arg[1].in);
|
||||
tcg_gen_smin_i32(arg[0].out, arg[0].out, tmp2);
|
||||
}
|
||||
|
||||
static void translate_clrb_expstate(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1581,10 +1537,9 @@ static void translate_clrex(DisasContext *dc, const OpcodeArg arg[],
|
|||
static void translate_const16(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
TCGv_i32 c = tcg_const_i32(arg[1].imm);
|
||||
TCGv_i32 c = tcg_constant_i32(arg[1].imm);
|
||||
|
||||
tcg_gen_deposit_i32(arg[0].out, c, arg[0].in, 16, 16);
|
||||
tcg_temp_free(c);
|
||||
}
|
||||
|
||||
static void translate_dcache(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1595,8 +1550,6 @@ static void translate_dcache(DisasContext *dc, const OpcodeArg arg[],
|
|||
|
||||
tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
|
||||
tcg_gen_qemu_ld8u(res, addr, dc->cring);
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(res);
|
||||
}
|
||||
|
||||
static void translate_depbits(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1647,7 +1600,6 @@ static void translate_extui(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shri_i32(tmp, arg[1].in, arg[2].imm);
|
||||
tcg_gen_andi_i32(arg[0].out, tmp, maskimm);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_getex(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1658,7 +1610,6 @@ static void translate_getex(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_extract_i32(tmp, cpu_SR[ATOMCTL], 8, 1);
|
||||
tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], arg[0].in, 8, 1);
|
||||
tcg_gen_mov_i32(arg[0].out, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_icache(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1670,7 +1621,6 @@ static void translate_icache(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_movi_i32(cpu_pc, dc->pc);
|
||||
tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
|
||||
gen_helper_itlb_hit_test(cpu_env, addr);
|
||||
tcg_temp_free(addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1705,7 +1655,6 @@ static void translate_l32e(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
|
||||
mop = gen_load_store_alignment(dc, MO_TEUL, addr);
|
||||
tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->ring, mop);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
|
@ -1736,7 +1685,6 @@ static void translate_l32ex(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_qemu_ld_i32(arg[0].out, addr, dc->cring, mop);
|
||||
tcg_gen_mov_i32(cpu_exclusive_addr, addr);
|
||||
tcg_gen_mov_i32(cpu_exclusive_val, arg[0].out);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void translate_ldst(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1759,7 +1707,6 @@ static void translate_ldst(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_mb(TCG_BAR_LDAQ | TCG_MO_ALL);
|
||||
}
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void translate_lct(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1774,13 +1721,12 @@ static void translate_l32r(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp;
|
||||
|
||||
if (dc->base.tb->flags & XTENSA_TBFLAG_LITBASE) {
|
||||
tmp = tcg_const_i32(arg[1].raw_imm - 1);
|
||||
tcg_gen_add_i32(tmp, cpu_SR[LITBASE], tmp);
|
||||
tmp = tcg_temp_new();
|
||||
tcg_gen_addi_i32(tmp, cpu_SR[LITBASE], arg[1].raw_imm - 1);
|
||||
} else {
|
||||
tmp = tcg_const_i32(arg[1].imm);
|
||||
tmp = tcg_constant_i32(arg[1].imm);
|
||||
}
|
||||
tcg_gen_qemu_ld32u(arg[0].out, tmp, dc->cring);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_loop(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1866,19 +1812,12 @@ static void translate_mac16(DisasContext *dc, const OpcodeArg arg[],
|
|||
lo, hi);
|
||||
}
|
||||
tcg_gen_ext8s_i32(cpu_SR[ACCHI], cpu_SR[ACCHI]);
|
||||
|
||||
tcg_temp_free_i32(lo);
|
||||
tcg_temp_free_i32(hi);
|
||||
}
|
||||
tcg_temp_free(m1);
|
||||
tcg_temp_free(m2);
|
||||
}
|
||||
if (ld_offset) {
|
||||
tcg_gen_mov_i32(arg[1].out, vaddr);
|
||||
tcg_gen_mov_i32(cpu_SR[MR + arg[0].imm], mem32);
|
||||
}
|
||||
tcg_temp_free(vaddr);
|
||||
tcg_temp_free(mem32);
|
||||
}
|
||||
|
||||
static void translate_memw(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1942,7 +1881,6 @@ static void translate_movp(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_movcond_i32(par[0],
|
||||
arg[0].out, tmp, zero,
|
||||
arg[1].in, arg[0].in);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_movsp(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1965,8 +1903,6 @@ static void translate_mul16(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_ext16u_i32(v2, arg[2].in);
|
||||
}
|
||||
tcg_gen_mul_i32(arg[0].out, v1, v2);
|
||||
tcg_temp_free(v2);
|
||||
tcg_temp_free(v1);
|
||||
}
|
||||
|
||||
static void translate_mull(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -1985,7 +1921,6 @@ static void translate_mulh(DisasContext *dc, const OpcodeArg arg[],
|
|||
} else {
|
||||
tcg_gen_mulu2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
|
||||
}
|
||||
tcg_temp_free(lo);
|
||||
}
|
||||
|
||||
static void translate_neg(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2112,15 +2047,14 @@ static uint32_t test_exceptions_retw(DisasContext *dc, const OpcodeArg arg[],
|
|||
static void translate_retw(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
TCGv_i32 tmp = tcg_const_i32(1);
|
||||
tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]);
|
||||
TCGv_i32 tmp = tcg_temp_new();
|
||||
tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]);
|
||||
tcg_gen_andc_i32(cpu_SR[WINDOW_START],
|
||||
cpu_SR[WINDOW_START], tmp);
|
||||
tcg_gen_movi_i32(tmp, dc->pc);
|
||||
tcg_gen_deposit_i32(tmp, tmp, cpu_R[0], 0, 30);
|
||||
gen_helper_retw(cpu_env, cpu_R[0]);
|
||||
gen_jump(dc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_rfde(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2146,10 +2080,10 @@ static void translate_rfi(DisasContext *dc, const OpcodeArg arg[],
|
|||
static void translate_rfw(DisasContext *dc, const OpcodeArg arg[],
|
||||
const uint32_t par[])
|
||||
{
|
||||
TCGv_i32 tmp = tcg_const_i32(1);
|
||||
TCGv_i32 tmp = tcg_temp_new();
|
||||
|
||||
tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
|
||||
tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]);
|
||||
tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]);
|
||||
|
||||
if (par[0]) {
|
||||
tcg_gen_andc_i32(cpu_SR[WINDOW_START],
|
||||
|
@ -2159,7 +2093,6 @@ static void translate_rfw(DisasContext *dc, const OpcodeArg arg[],
|
|||
cpu_SR[WINDOW_START], tmp);
|
||||
}
|
||||
|
||||
tcg_temp_free(tmp);
|
||||
gen_helper_restore_owb(cpu_env);
|
||||
gen_jump(dc, cpu_SR[EPC1]);
|
||||
}
|
||||
|
@ -2209,7 +2142,6 @@ static void translate_rsr_ptevaddr(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_shri_i32(tmp, cpu_SR[EXCVADDR], 10);
|
||||
tcg_gen_or_i32(tmp, tmp, cpu_SR[PTEVADDR]);
|
||||
tcg_gen_andi_i32(arg[0].out, tmp, 0xfffffffc);
|
||||
tcg_temp_free(tmp);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -2283,8 +2215,6 @@ static void translate_s32c1i(DisasContext *dc, const OpcodeArg arg[],
|
|||
gen_check_atomctl(dc, addr);
|
||||
tcg_gen_atomic_cmpxchg_i32(arg[0].out, addr, cpu_SR[SCOMPARE1],
|
||||
tmp, dc->cring, mop);
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_s32e(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2296,7 +2226,6 @@ static void translate_s32e(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
|
||||
mop = gen_load_store_alignment(dc, MO_TEUL, addr);
|
||||
tcg_gen_qemu_st_tl(arg[0].in, addr, dc->ring, mop);
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2322,9 +2251,6 @@ static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[],
|
|||
gen_set_label(label);
|
||||
tcg_gen_extract_i32(arg[0].out, cpu_SR[ATOMCTL], 8, 1);
|
||||
tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], res, 8, 1);
|
||||
tcg_temp_free(prev);
|
||||
tcg_temp_free(addr);
|
||||
tcg_temp_free(res);
|
||||
}
|
||||
|
||||
static void translate_salt(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2348,7 +2274,6 @@ static void translate_sext(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shli_i32(tmp, arg[1].in, shift);
|
||||
tcg_gen_sari_i32(arg[0].out, tmp, shift);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2388,8 +2313,6 @@ static void translate_simcall(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_extu_i32_i64(tmp, reg); \
|
||||
tcg_gen_##cmd##_i64(v, v, tmp); \
|
||||
tcg_gen_extrl_i64_i32(arg[0].out, v); \
|
||||
tcg_temp_free_i64(v); \
|
||||
tcg_temp_free_i64(tmp); \
|
||||
} while (0)
|
||||
|
||||
#define gen_shift(cmd) gen_shift_reg(cmd, cpu_SR[SAR])
|
||||
|
@ -2401,12 +2324,11 @@ static void translate_sll(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_shl_i32(arg[0].out, arg[1].in, dc->sar_m32);
|
||||
} else {
|
||||
TCGv_i64 v = tcg_temp_new_i64();
|
||||
TCGv_i32 s = tcg_const_i32(32);
|
||||
tcg_gen_sub_i32(s, s, cpu_SR[SAR]);
|
||||
TCGv_i32 s = tcg_temp_new();
|
||||
tcg_gen_subfi_i32(s, 32, cpu_SR[SAR]);
|
||||
tcg_gen_andi_i32(s, s, 0x3f);
|
||||
tcg_gen_extu_i32_i64(v, arg[1].in);
|
||||
gen_shift_reg(shl, s);
|
||||
tcg_temp_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2473,7 +2395,6 @@ static void translate_ssa8b(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shli_i32(tmp, arg[0].in, 3);
|
||||
gen_left_shift_sar(dc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2482,7 +2403,6 @@ static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shli_i32(tmp, arg[0].in, 3);
|
||||
gen_right_shift_sar(dc, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_ssai(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2515,7 +2435,6 @@ static void translate_subx(DisasContext *dc, const OpcodeArg arg[],
|
|||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
|
||||
tcg_gen_sub_i32(arg[0].out, tmp, arg[2].in);
|
||||
tcg_temp_free(tmp);
|
||||
}
|
||||
|
||||
static void translate_waiti(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -2767,7 +2686,6 @@ static void translate_xsr(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_mov_i32(tmp, arg[0].in);
|
||||
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
|
||||
tcg_gen_mov_i32(cpu_SR[par[0]], tmp);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
tcg_gen_movi_i32(arg[0].out, 0);
|
||||
}
|
||||
|
@ -2782,7 +2700,6 @@ static void translate_xsr_mask(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_mov_i32(tmp, arg[0].in);
|
||||
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
|
||||
tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
tcg_gen_movi_i32(arg[0].out, 0);
|
||||
}
|
||||
|
@ -2802,7 +2719,6 @@ static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_mov_i32(tmp, cpu_SR[par[0]]);
|
||||
gen_helper_wsr_ccount(cpu_env, arg[0].in);
|
||||
tcg_gen_mov_i32(arg[0].out, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
@ -2820,7 +2736,6 @@ static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
|
|||
} \
|
||||
translate_wsr_##name(dc, arg, par); \
|
||||
tcg_gen_mov_i32(arg[0].out, tmp); \
|
||||
tcg_temp_free(tmp); \
|
||||
}
|
||||
|
||||
gen_translate_xsr(acchi)
|
||||
|
@ -6307,16 +6222,6 @@ static inline void put_f32_o1_i3(const OpcodeArg *arg, const OpcodeArg *arg32,
|
|||
(o0 >= 0 && arg[o0].num_bits == 64)) {
|
||||
if (o0 >= 0) {
|
||||
tcg_gen_extu_i32_i64(arg[o0].out, arg32[o0].out);
|
||||
tcg_temp_free_i32(arg32[o0].out);
|
||||
}
|
||||
if (i0 >= 0) {
|
||||
tcg_temp_free_i32(arg32[i0].in);
|
||||
}
|
||||
if (i1 >= 0) {
|
||||
tcg_temp_free_i32(arg32[i1].in);
|
||||
}
|
||||
if (i2 >= 0) {
|
||||
tcg_temp_free_i32(arg32[i2].in);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6440,9 +6345,6 @@ static void translate_compare_d(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_movcond_i32(TCG_COND_NE,
|
||||
arg[0].out, res, zero,
|
||||
set_br, clr_br);
|
||||
tcg_temp_free(res);
|
||||
tcg_temp_free(set_br);
|
||||
tcg_temp_free(clr_br);
|
||||
}
|
||||
|
||||
static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -6473,9 +6375,6 @@ static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[],
|
|||
arg[0].out, res, zero,
|
||||
set_br, clr_br);
|
||||
put_f32_i2(arg, arg32, 1, 2);
|
||||
tcg_temp_free(res);
|
||||
tcg_temp_free(set_br);
|
||||
tcg_temp_free(clr_br);
|
||||
}
|
||||
|
||||
static void translate_const_d(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -6594,7 +6493,6 @@ static void translate_ldsti(DisasContext *dc, const OpcodeArg arg[],
|
|||
if (par[1]) {
|
||||
tcg_gen_mov_i32(arg[1].out, addr);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -6613,7 +6511,6 @@ static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[],
|
|||
if (par[1]) {
|
||||
tcg_gen_mov_i32(arg[1].out, addr);
|
||||
}
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
|
||||
static void translate_fpu2k_madd_s(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -6649,7 +6546,6 @@ static void translate_movcond_d(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_movcond_i64(par[0], arg[0].out,
|
||||
arg2, zero,
|
||||
arg[1].in, arg[0].in);
|
||||
tcg_temp_free_i64(arg2);
|
||||
}
|
||||
|
||||
static void translate_movcond_s(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -6678,8 +6574,6 @@ static void translate_movp_d(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_movcond_i64(par[0],
|
||||
arg[0].out, tmp2, zero,
|
||||
arg[1].in, arg[0].in);
|
||||
tcg_temp_free_i32(tmp1);
|
||||
tcg_temp_free_i64(tmp2);
|
||||
}
|
||||
|
||||
static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -6693,7 +6587,6 @@ static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_movcond_i32(par[0],
|
||||
arg[0].out, tmp, zero,
|
||||
arg[1].in, arg[0].in);
|
||||
tcg_temp_free(tmp);
|
||||
} else {
|
||||
translate_movp_d(dc, arg, par);
|
||||
}
|
||||
|
@ -7025,7 +6918,6 @@ static void translate_cvtd_s(DisasContext *dc, const OpcodeArg arg[],
|
|||
|
||||
tcg_gen_extrl_i64_i32(v, arg[1].in);
|
||||
gen_helper_cvtd_s(arg[0].out, cpu_env, v);
|
||||
tcg_temp_free_i32(v);
|
||||
}
|
||||
|
||||
static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -7035,7 +6927,6 @@ static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[],
|
|||
|
||||
gen_helper_cvts_d(v, cpu_env, arg[1].in);
|
||||
tcg_gen_extu_i32_i64(arg[0].out, v);
|
||||
tcg_temp_free_i32(v);
|
||||
}
|
||||
|
||||
static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -7063,9 +6954,6 @@ static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
|
||||
}
|
||||
}
|
||||
if (par[1]) {
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -7098,9 +6986,6 @@ static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
|
||||
}
|
||||
}
|
||||
if (par[1]) {
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -7128,9 +7013,6 @@ static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
|
||||
}
|
||||
}
|
||||
if (par[1]) {
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
@ -7163,9 +7045,6 @@ static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[],
|
|||
tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
|
||||
}
|
||||
}
|
||||
if (par[1]) {
|
||||
tcg_temp_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void translate_madd_d(DisasContext *dc, const OpcodeArg arg[],
|
||||
|
|
|
@ -4156,12 +4156,9 @@ static void tcg_target_init(TCGContext *s)
|
|||
/* There are a number of things we must check before we can be
|
||||
sure of not hitting invalid opcode. */
|
||||
if (c & bit_OSXSAVE) {
|
||||
unsigned xcrl, xcrh;
|
||||
/* The xgetbv instruction is not available to older versions of
|
||||
* the assembler, so we encode the instruction manually.
|
||||
*/
|
||||
asm(".byte 0x0f, 0x01, 0xd0" : "=a" (xcrl), "=d" (xcrh) : "c" (0));
|
||||
if ((xcrl & 6) == 6) {
|
||||
unsigned bv = xgetbv_low(0);
|
||||
|
||||
if ((bv & 6) == 6) {
|
||||
have_avx1 = (c & bit_AVX) != 0;
|
||||
have_avx2 = (b7 & bit_AVX2) != 0;
|
||||
|
||||
|
@ -4172,7 +4169,7 @@ static void tcg_target_init(TCGContext *s)
|
|||
* check that OPMASK and all extended ZMM state are enabled
|
||||
* even if we're not using them -- the insns will fault.
|
||||
*/
|
||||
if ((xcrl & 0xe0) == 0xe0
|
||||
if ((bv & 0xe0) == 0xe0
|
||||
&& (b7 & bit_AVX512F)
|
||||
&& (b7 & bit_AVX512VL)) {
|
||||
have_avx512vl = true;
|
||||
|
@ -4221,6 +4218,19 @@ static void tcg_target_init(TCGContext *s)
|
|||
|
||||
s->reserved_regs = 0;
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK);
|
||||
#ifdef _WIN64
|
||||
/* These are call saved, and we don't save them, so don't use them. */
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM6);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM7);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM8);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM9);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM10);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM11);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM12);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM13);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM14);
|
||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM15);
|
||||
#endif
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
22
tcg/tcg-op.c
22
tcg/tcg-op.c
|
@ -84,6 +84,22 @@ void tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3,
|
|||
op->args[5] = a6;
|
||||
}
|
||||
|
||||
/* Generic ops. */
|
||||
|
||||
static void add_last_as_label_use(TCGLabel *l)
|
||||
{
|
||||
TCGLabelUse *u = tcg_malloc(sizeof(TCGLabelUse));
|
||||
|
||||
u->op = tcg_last_op();
|
||||
QSIMPLEQ_INSERT_TAIL(&l->branches, u, next);
|
||||
}
|
||||
|
||||
void tcg_gen_br(TCGLabel *l)
|
||||
{
|
||||
tcg_gen_op1(INDEX_op_br, label_arg(l));
|
||||
add_last_as_label_use(l);
|
||||
}
|
||||
|
||||
void tcg_gen_mb(TCGBar mb_type)
|
||||
{
|
||||
if (tcg_ctx->gen_tb->cflags & CF_PARALLEL) {
|
||||
|
@ -216,8 +232,8 @@ void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1, TCGv_i32 arg2, TCGLabel *l)
|
|||
if (cond == TCG_COND_ALWAYS) {
|
||||
tcg_gen_br(l);
|
||||
} else if (cond != TCG_COND_NEVER) {
|
||||
l->refs++;
|
||||
tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_arg(l));
|
||||
add_last_as_label_use(l);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1474,7 +1490,6 @@ void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, TCGv_i64 arg2, TCGLabel *l)
|
|||
if (cond == TCG_COND_ALWAYS) {
|
||||
tcg_gen_br(l);
|
||||
} else if (cond != TCG_COND_NEVER) {
|
||||
l->refs++;
|
||||
if (TCG_TARGET_REG_BITS == 32) {
|
||||
tcg_gen_op6ii_i32(INDEX_op_brcond2_i32, TCGV_LOW(arg1),
|
||||
TCGV_HIGH(arg1), TCGV_LOW(arg2),
|
||||
|
@ -1483,6 +1498,7 @@ void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, TCGv_i64 arg2, TCGLabel *l)
|
|||
tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond,
|
||||
label_arg(l));
|
||||
}
|
||||
add_last_as_label_use(l);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1493,12 +1509,12 @@ void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1, int64_t arg2, TCGLabel *l)
|
|||
} else if (cond == TCG_COND_ALWAYS) {
|
||||
tcg_gen_br(l);
|
||||
} else if (cond != TCG_COND_NEVER) {
|
||||
l->refs++;
|
||||
tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
|
||||
TCGV_LOW(arg1), TCGV_HIGH(arg1),
|
||||
tcg_constant_i32(arg2),
|
||||
tcg_constant_i32(arg2 >> 32),
|
||||
cond, label_arg(l));
|
||||
add_last_as_label_use(l);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
208
tcg/tcg.c
208
tcg/tcg.c
|
@ -36,6 +36,7 @@
|
|||
#include "qemu/qemu-print.h"
|
||||
#include "qemu/cacheflush.h"
|
||||
#include "qemu/cacheinfo.h"
|
||||
#include "qemu/timer.h"
|
||||
|
||||
/* Note: the long term plan is to reduce the dependencies on the QEMU
|
||||
CPU definitions. Currently they are used for qemu_ld/st
|
||||
|
@ -282,6 +283,7 @@ TCGLabel *gen_new_label(void)
|
|||
|
||||
memset(l, 0, sizeof(TCGLabel));
|
||||
l->id = s->nb_labels++;
|
||||
QSIMPLEQ_INIT(&l->branches);
|
||||
QSIMPLEQ_INIT(&l->relocs);
|
||||
|
||||
QSIMPLEQ_INSERT_TAIL(&s->labels, l, next);
|
||||
|
@ -1271,7 +1273,7 @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind)
|
|||
ts->temp_allocated = 1;
|
||||
tcg_debug_assert(ts->base_type == type);
|
||||
tcg_debug_assert(ts->kind == kind);
|
||||
goto done;
|
||||
return ts;
|
||||
}
|
||||
} else {
|
||||
tcg_debug_assert(kind == TEMP_TB);
|
||||
|
@ -1315,11 +1317,6 @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind)
|
|||
ts2->kind = kind;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
#if defined(CONFIG_DEBUG_TCG)
|
||||
s->temps_in_use++;
|
||||
#endif
|
||||
return ts;
|
||||
}
|
||||
|
||||
|
@ -1364,30 +1361,18 @@ void tcg_temp_free_internal(TCGTemp *ts)
|
|||
|
||||
switch (ts->kind) {
|
||||
case TEMP_CONST:
|
||||
/*
|
||||
* In order to simplify users of tcg_constant_*,
|
||||
* silently ignore free.
|
||||
*/
|
||||
return;
|
||||
case TEMP_EBB:
|
||||
case TEMP_TB:
|
||||
/* Silently ignore free. */
|
||||
break;
|
||||
case TEMP_EBB:
|
||||
tcg_debug_assert(ts->temp_allocated != 0);
|
||||
ts->temp_allocated = 0;
|
||||
set_bit(temp_idx(ts), s->free_temps[ts->base_type].l);
|
||||
break;
|
||||
default:
|
||||
/* It never made sense to free TEMP_FIXED or TEMP_GLOBAL. */
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
tcg_debug_assert(ts->temp_allocated != 0);
|
||||
ts->temp_allocated = 0;
|
||||
|
||||
#if defined(CONFIG_DEBUG_TCG)
|
||||
assert(s->temps_in_use > 0);
|
||||
s->temps_in_use--;
|
||||
#endif
|
||||
|
||||
if (ts->kind == TEMP_EBB) {
|
||||
int idx = temp_idx(ts);
|
||||
set_bit(idx, s->free_temps[ts->base_type].l);
|
||||
}
|
||||
}
|
||||
|
||||
TCGTemp *tcg_constant_internal(TCGType type, int64_t val)
|
||||
|
@ -1475,27 +1460,6 @@ TCGv_i64 tcg_const_i64(int64_t val)
|
|||
return t0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_TCG)
|
||||
void tcg_clear_temp_count(void)
|
||||
{
|
||||
TCGContext *s = tcg_ctx;
|
||||
s->temps_in_use = 0;
|
||||
}
|
||||
|
||||
int tcg_check_temp_count(void)
|
||||
{
|
||||
TCGContext *s = tcg_ctx;
|
||||
if (s->temps_in_use) {
|
||||
/* Clear the count so that we don't give another
|
||||
* warning immediately next time around.
|
||||
*/
|
||||
s->temps_in_use = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Return true if OP may appear in the opcode stream.
|
||||
Test the runtime variable that controls each opcode. */
|
||||
bool tcg_op_supported(TCGOpcode op)
|
||||
|
@ -2190,6 +2154,85 @@ static void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
|||
arg_label(op->args[k])->id);
|
||||
i++, k++;
|
||||
break;
|
||||
case INDEX_op_mb:
|
||||
{
|
||||
TCGBar membar = op->args[k];
|
||||
const char *b_op, *m_op;
|
||||
|
||||
switch (membar & TCG_BAR_SC) {
|
||||
case 0:
|
||||
b_op = "none";
|
||||
break;
|
||||
case TCG_BAR_LDAQ:
|
||||
b_op = "acq";
|
||||
break;
|
||||
case TCG_BAR_STRL:
|
||||
b_op = "rel";
|
||||
break;
|
||||
case TCG_BAR_SC:
|
||||
b_op = "seq";
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
switch (membar & TCG_MO_ALL) {
|
||||
case 0:
|
||||
m_op = "none";
|
||||
break;
|
||||
case TCG_MO_LD_LD:
|
||||
m_op = "rr";
|
||||
break;
|
||||
case TCG_MO_LD_ST:
|
||||
m_op = "rw";
|
||||
break;
|
||||
case TCG_MO_ST_LD:
|
||||
m_op = "wr";
|
||||
break;
|
||||
case TCG_MO_ST_ST:
|
||||
m_op = "ww";
|
||||
break;
|
||||
case TCG_MO_LD_LD | TCG_MO_LD_ST:
|
||||
m_op = "rr+rw";
|
||||
break;
|
||||
case TCG_MO_LD_LD | TCG_MO_ST_LD:
|
||||
m_op = "rr+wr";
|
||||
break;
|
||||
case TCG_MO_LD_LD | TCG_MO_ST_ST:
|
||||
m_op = "rr+ww";
|
||||
break;
|
||||
case TCG_MO_LD_ST | TCG_MO_ST_LD:
|
||||
m_op = "rw+wr";
|
||||
break;
|
||||
case TCG_MO_LD_ST | TCG_MO_ST_ST:
|
||||
m_op = "rw+ww";
|
||||
break;
|
||||
case TCG_MO_ST_LD | TCG_MO_ST_ST:
|
||||
m_op = "wr+ww";
|
||||
break;
|
||||
case TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_LD:
|
||||
m_op = "rr+rw+wr";
|
||||
break;
|
||||
case TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST:
|
||||
m_op = "rr+rw+ww";
|
||||
break;
|
||||
case TCG_MO_LD_LD | TCG_MO_ST_LD | TCG_MO_ST_ST:
|
||||
m_op = "rr+wr+ww";
|
||||
break;
|
||||
case TCG_MO_LD_ST | TCG_MO_ST_LD | TCG_MO_ST_ST:
|
||||
m_op = "rw+wr+ww";
|
||||
break;
|
||||
case TCG_MO_ALL:
|
||||
m_op = "all";
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
col += ne_fprintf(f, "%s%s:%s", (k ? "," : ""), b_op, m_op);
|
||||
i++, k++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -2519,23 +2562,32 @@ static void process_op_defs(TCGContext *s)
|
|||
}
|
||||
}
|
||||
|
||||
static void remove_label_use(TCGOp *op, int idx)
|
||||
{
|
||||
TCGLabel *label = arg_label(op->args[idx]);
|
||||
TCGLabelUse *use;
|
||||
|
||||
QSIMPLEQ_FOREACH(use, &label->branches, next) {
|
||||
if (use->op == op) {
|
||||
QSIMPLEQ_REMOVE(&label->branches, use, TCGLabelUse, next);
|
||||
return;
|
||||
}
|
||||
}
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
void tcg_op_remove(TCGContext *s, TCGOp *op)
|
||||
{
|
||||
TCGLabel *label;
|
||||
|
||||
switch (op->opc) {
|
||||
case INDEX_op_br:
|
||||
label = arg_label(op->args[0]);
|
||||
label->refs--;
|
||||
remove_label_use(op, 0);
|
||||
break;
|
||||
case INDEX_op_brcond_i32:
|
||||
case INDEX_op_brcond_i64:
|
||||
label = arg_label(op->args[3]);
|
||||
label->refs--;
|
||||
remove_label_use(op, 3);
|
||||
break;
|
||||
case INDEX_op_brcond2_i32:
|
||||
label = arg_label(op->args[5]);
|
||||
label->refs--;
|
||||
remove_label_use(op, 5);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -2617,6 +2669,31 @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
|
|||
return new_op;
|
||||
}
|
||||
|
||||
static void move_label_uses(TCGLabel *to, TCGLabel *from)
|
||||
{
|
||||
TCGLabelUse *u;
|
||||
|
||||
QSIMPLEQ_FOREACH(u, &from->branches, next) {
|
||||
TCGOp *op = u->op;
|
||||
switch (op->opc) {
|
||||
case INDEX_op_br:
|
||||
op->args[0] = label_arg(to);
|
||||
break;
|
||||
case INDEX_op_brcond_i32:
|
||||
case INDEX_op_brcond_i64:
|
||||
op->args[3] = label_arg(to);
|
||||
break;
|
||||
case INDEX_op_brcond2_i32:
|
||||
op->args[5] = label_arg(to);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
QSIMPLEQ_CONCAT(&to->branches, &from->branches);
|
||||
}
|
||||
|
||||
/* Reachable analysis : remove unreachable code. */
|
||||
static void __attribute__((noinline))
|
||||
reachable_code_pass(TCGContext *s)
|
||||
|
@ -2632,6 +2709,24 @@ reachable_code_pass(TCGContext *s)
|
|||
case INDEX_op_set_label:
|
||||
label = arg_label(op->args[0]);
|
||||
|
||||
/*
|
||||
* Note that the first op in the TB is always a load,
|
||||
* so there is always something before a label.
|
||||
*/
|
||||
op_prev = QTAILQ_PREV(op, link);
|
||||
|
||||
/*
|
||||
* If we find two sequential labels, move all branches to
|
||||
* reference the second label and remove the first label.
|
||||
* Do this before branch to next optimization, so that the
|
||||
* middle label is out of the way.
|
||||
*/
|
||||
if (op_prev->opc == INDEX_op_set_label) {
|
||||
move_label_uses(label, arg_label(op_prev->args[0]));
|
||||
tcg_op_remove(s, op_prev);
|
||||
op_prev = QTAILQ_PREV(op, link);
|
||||
}
|
||||
|
||||
/*
|
||||
* Optimization can fold conditional branches to unconditional.
|
||||
* If we find a label which is preceded by an unconditional
|
||||
|
@ -2639,7 +2734,6 @@ reachable_code_pass(TCGContext *s)
|
|||
* processing the branch because any dead code between the branch
|
||||
* and label had not yet been removed.
|
||||
*/
|
||||
op_prev = QTAILQ_PREV(op, link);
|
||||
if (op_prev->opc == INDEX_op_br &&
|
||||
label == arg_label(op_prev->args[0])) {
|
||||
tcg_op_remove(s, op_prev);
|
||||
|
@ -2647,7 +2741,7 @@ reachable_code_pass(TCGContext *s)
|
|||
dead = false;
|
||||
}
|
||||
|
||||
if (label->refs == 0) {
|
||||
if (QSIMPLEQ_EMPTY(&label->branches)) {
|
||||
/*
|
||||
* While there is an occasional backward branch, virtually
|
||||
* all branches generated by the translators are forward.
|
||||
|
@ -4891,7 +4985,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, target_ulong pc_start)
|
|||
bool error = false;
|
||||
|
||||
QSIMPLEQ_FOREACH(l, &s->labels, next) {
|
||||
if (unlikely(!l->present) && l->refs) {
|
||||
if (unlikely(!l->present) && !QSIMPLEQ_EMPTY(&l->branches)) {
|
||||
qemu_log_mask(CPU_LOG_TB_OP,
|
||||
"$L%d referenced but not present.\n", l->id);
|
||||
error = true;
|
||||
|
|
|
@ -258,8 +258,7 @@ static void __attribute__((constructor)) init_cpuid_cache(void)
|
|||
|
||||
/* We must check that AVX is not just available, but usable. */
|
||||
if ((c & bit_OSXSAVE) && (c & bit_AVX) && max >= 7) {
|
||||
int bv;
|
||||
__asm("xgetbv" : "=a"(bv), "=d"(d) : "c"(0));
|
||||
unsigned bv = xgetbv_low(0);
|
||||
__cpuid_count(7, 0, a, b, c, d);
|
||||
if ((bv & 0x6) == 0x6 && (b & bit_AVX2)) {
|
||||
cache |= CACHE_AVX2;
|
||||
|
|
Loading…
Reference in New Issue