mirror of
https://github.com/mii443/qemu.git
synced 2025-12-03 11:08:25 +00:00
Merge tag 'pull-sp-20231105' of https://gitlab.com/rth7680/qemu into staging
target/sparc: Explicitly compute condition codes # -----BEGIN PGP SIGNATURE----- # # iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmVH9oodHHJpY2hhcmQu # aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV/M8QgAgPTp/wFLVnSRFLaN # fBoelVhM4WTWMQ+SUwZMtCvqcMHaBxIMu+hyk5MI11hFOUi9N+vWvRb+NZ6JbK+1 # sqWcx0NdYfNdOeoi1dgzGgcCkFA8u9zW/K7Ih0W8WuU20uiJ4Zw/qmnEELIl/mZR # 5Ft1mhLMhQSYsH0KSypugLWBxR9SFNH1cV3C1SG2q+6snm/mhKk9NN18zJGFdmmY # 4CQThx159P/DaPUONZbSAMN94opu6K8FSymELPDUZBYwJRq7fyGKYuDUGRvN1kxx # I8p/MF1V5Vcth9lvGyBYulFWjo9BDMpkIdmWzXZLOWfzZVAed8PcglxoQqgMbU5u # eyY/Cw== # =Tv1h # -----END PGP SIGNATURE----- # gpg: Signature made Mon 06 Nov 2023 04:09:46 HKT # 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-sp-20231105' of https://gitlab.com/rth7680/qemu: (21 commits) target/sparc: Check for invalid cond in gen_compare_reg target/sparc: Implement UDIV inline target/sparc: Implement UDIVX and SDIVX inline target/sparc: Discard cpu_cond at the end of each insn target/sparc: Record entire jump condition in DisasContext target/sparc: Merge gen_op_next_insn into only caller target/sparc: Pass displacement to advance_jump_cond target/sparc: Merge advance_jump_uncond_{never,always} into advance_jump_cond target/sparc: Merge gen_branch2 into advance_pc target/sparc: Do flush_cond in advance_jump_cond target/sparc: Always copy conditions into a new temporary target/sparc: Change DisasCompare.c2 to int target/sparc: Remove DisasCompare.is_bool target/sparc: Remove CC_OP leftovers target/sparc: Remove CC_OP_TADDTV, CC_OP_TSUBTV target/sparc: Remove CC_OP_SUB, CC_OP_SUBX, CC_OP_TSUB target/sparc: Remove CC_OP_ADD, CC_OP_ADDX, CC_OP_TADD target/sparc: Remove CC_OP_DIV target/sparc: Remove CC_OP_LOGIC target/sparc: Split psr and xcc into components ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -197,10 +197,8 @@ static uint32_t do_getpsr(CPUSPARCState *env)
|
||||
/* Avoid ifdefs below for the abi32 and abi64 paths. */
|
||||
#ifdef TARGET_ABI32
|
||||
#define TARGET_TT_SYSCALL (TT_TRAP + 0x10) /* t_linux */
|
||||
#define syscall_cc psr
|
||||
#else
|
||||
#define TARGET_TT_SYSCALL (TT_TRAP + 0x6d) /* tl0_linux64 */
|
||||
#define syscall_cc xcc
|
||||
#endif
|
||||
|
||||
/* Avoid ifdefs below for the v9 and pre-v9 hw traps. */
|
||||
@@ -224,11 +222,6 @@ void cpu_loop (CPUSPARCState *env)
|
||||
cpu_exec_end(cs);
|
||||
process_queued_cpu_work(cs);
|
||||
|
||||
/* Compute PSR before exposing state. */
|
||||
if (env->cc_op != CC_OP_FLAGS) {
|
||||
cpu_get_psr(env);
|
||||
}
|
||||
|
||||
switch (trapnr) {
|
||||
case TARGET_TT_SYSCALL:
|
||||
ret = do_syscall (env, env->gregs[1],
|
||||
@@ -240,10 +233,10 @@ void cpu_loop (CPUSPARCState *env)
|
||||
break;
|
||||
}
|
||||
if ((abi_ulong)ret >= (abi_ulong)(-515)) {
|
||||
env->syscall_cc |= PSR_CARRY;
|
||||
set_syscall_C(env, 1);
|
||||
ret = -ret;
|
||||
} else {
|
||||
env->syscall_cc &= ~PSR_CARRY;
|
||||
set_syscall_C(env, 0);
|
||||
}
|
||||
env->regwptr[0] = ret;
|
||||
/* next instruction */
|
||||
|
||||
@@ -164,7 +164,7 @@ static void restore_pt_regs(struct target_pt_regs *regs, CPUSPARCState *env)
|
||||
*/
|
||||
uint32_t psr;
|
||||
__get_user(psr, ®s->psr);
|
||||
env->psr = (psr & PSR_ICC) | (env->psr & ~PSR_ICC);
|
||||
cpu_put_psr_icc(env, psr);
|
||||
#endif
|
||||
|
||||
/* Note that pc and npc are handled in the caller. */
|
||||
|
||||
@@ -26,6 +26,17 @@
|
||||
# define TARGET_STACK_BIAS 0
|
||||
#endif
|
||||
|
||||
static void set_syscall_C(CPUSPARCState *env, bool val)
|
||||
{
|
||||
#ifndef TARGET_SPARC64
|
||||
env->icc_C = val;
|
||||
#elif defined(TARGET_ABI32)
|
||||
env->icc_C = (uint64_t)val << 32;
|
||||
#else
|
||||
env->xcc_C = val;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
|
||||
unsigned flags)
|
||||
{
|
||||
@@ -58,11 +69,7 @@ static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
|
||||
* do the pc advance twice.
|
||||
*/
|
||||
env->regwptr[WREG_O0] = 0;
|
||||
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
|
||||
env->xcc &= ~PSR_CARRY;
|
||||
#else
|
||||
env->psr &= ~PSR_CARRY;
|
||||
#endif
|
||||
set_syscall_C(env, 0);
|
||||
env->pc = env->npc;
|
||||
env->npc = env->npc + 4;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user