[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 29/52] target-m68k: factorize flags computing
From: |
Laurent Vivier |
Subject: |
[Qemu-devel] [PATCH 29/52] target-m68k: factorize flags computing |
Date: |
Wed, 4 May 2016 22:12:09 +0200 |
Signed-off-by: Laurent Vivier <address@hidden>
---
target-m68k/helper.c | 125 +++++++++++++++++----------------------------------
1 file changed, 42 insertions(+), 83 deletions(-)
diff --git a/target-m68k/helper.c b/target-m68k/helper.c
index 42a2f1c..e9e7cee 100644
--- a/target-m68k/helper.c
+++ b/target-m68k/helper.c
@@ -531,6 +531,46 @@ void HELPER(mac_set_flags)(CPUM68KState *env, uint32_t acc)
}
}
+
+#define COMPUTE_CCR(op, x, n, z, v, c) { \
+ switch (op) { \
+ case CC_OP_FLAGS: \
+ /* Everything in place. */ \
+ break; \
+ case CC_OP_ADD: \
+ res = n; \
+ src2 = v; \
+ src1 = res - src2; \
+ c = x; \
+ z = n; \
+ v = (res ^ src1) & ~(src1 ^ src2); \
+ break; \
+ case CC_OP_SUB: \
+ res = n; \
+ src2 = v; \
+ src1 = res + src2; \
+ c = x; \
+ z = n; \
+ v = (res ^ src1) & (src1 ^ src2); \
+ break; \
+ case CC_OP_CMP: \
+ src1 = n; \
+ src2 = v; \
+ res = src1 - src2; \
+ n = res; \
+ z = res; \
+ c = src1 < src2; \
+ v = (res ^ src1) & (src1 ^ src2); \
+ break; \
+ case CC_OP_LOGIC: \
+ c = v = 0; \
+ z = n; \
+ break; \
+ default: \
+ cpu_abort(CPU(m68k_env_get_cpu(env)), "Bad CC_OP %d", op); \
+ } \
+} while (0)
+
uint32_t cpu_m68k_get_ccr(CPUM68KState *env)
{
uint32_t x, c, n, z, v;
@@ -542,47 +582,7 @@ uint32_t cpu_m68k_get_ccr(CPUM68KState *env)
z = env->cc_z;
v = env->cc_v;
- switch (env->cc_op) {
- case CC_OP_FLAGS:
- /* Everything in place. */
- break;
-
- case CC_OP_ADD:
- res = n;
- src2 = v;
- src1 = res - src2;
- c = x;
- z = n;
- v = (res ^ src1) & ~(src1 ^ src2);
- break;
-
- case CC_OP_SUB:
- res = n;
- src2 = v;
- src1 = res + src2;
- c = x;
- z = n;
- v = (res ^ src1) & (src1 ^ src2);
- break;
-
- case CC_OP_CMP:
- src1 = n;
- src2 = v;
- res = src1 - src2;
- n = res;
- z = res;
- c = src1 < src2;
- v = (res ^ src1) & (src1 ^ src2);
- break;
-
- case CC_OP_LOGIC:
- c = v = 0;
- z = n;
- break;
-
- default:
- cpu_abort(CPU(m68k_env_get_cpu(env)), "Bad CC_OP %d", env->cc_op);
- }
+ COMPUTE_CCR(env->cc_op, x, n, z, v, c);
n = n >> 31;
v = v >> 31;
@@ -615,48 +615,7 @@ void HELPER(flush_flags)(CPUM68KState *env, uint32_t cc_op)
{
uint32_t res, src1, src2;
- switch (cc_op) {
- case CC_OP_FLAGS:
- /* Everything up to date. */
- return;
-
- case CC_OP_ADD:
- res = env->cc_n;
- src2 = env->cc_v;
- src1 = res - src2;
- env->cc_z = res;
- env->cc_c = env->cc_x;
- env->cc_v = (res ^ src1) & ~(src1 ^ src2);
- break;
-
- case CC_OP_SUB:
- res = env->cc_n;
- src2 = env->cc_v;
- src1 = res + src2;
- env->cc_z = res;
- env->cc_c = env->cc_x;
- env->cc_v = (res ^ src1) & (src1 ^ src2);
- break;
-
- case CC_OP_CMP:
- src1 = env->cc_n;
- src2 = env->cc_v;
- res = src1 - src2;
- env->cc_n = res;
- env->cc_z = res;
- env->cc_c = src1 < src2;
- env->cc_v = (res ^ src1) & (src1 ^ src2);
- break;
-
- case CC_OP_LOGIC:
- env->cc_c = 0;
- env->cc_v = 0;
- env->cc_z = env->cc_n;
- break;
-
- default:
- cpu_abort(CPU(m68k_env_get_cpu(env)), "Bad CC_OP %d", cc_op);
- }
+ COMPUTE_CCR(cc_op, env->cc_x, env->cc_n, env->cc_z, env->cc_v, env->cc_c);
env->cc_op = CC_OP_FLAGS;
}
--
2.5.5
- [Qemu-devel] [PATCH 23/52] target-m68k: Use setcond for scc, (continued)
- [Qemu-devel] [PATCH 23/52] target-m68k: Use setcond for scc, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 21/52] target-m68k: Reorg flags handling, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 24/52] target-m68k: Optimize some comparisons, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 25/52] target-m68k: Optimize gen_flush_flags, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 26/52] target-m68k: Inline shifts, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 27/52] target-m68k: Inline addx, subx, negx, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 28/52] target-m68k: add addx/subx/negx ops, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 29/52] target-m68k: factorize flags computing,
Laurent Vivier <=
- [Qemu-devel] [PATCH 30/52] target-m68k: add scc/dbcc, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 31/52] target-m68k: some bit ops cleanup, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 32/52] target-m68k: bitfield ops, Laurent Vivier, 2016/05/04
- [Qemu-devel] [PATCH 33/52] target-m68k: inline divu/divs, Laurent Vivier, 2016/05/04