mirror of https://gitee.com/openkylin/qemu.git
-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJYEw/nAAoJEPMMOL0/L748V2QP/AzBlebi7/QTxH7lFAEmzveC oSxp9TPAgqGOs2jIENP4Q/z3ZCRL5LX9XYWBeEqe5gSfrim+zhkVNMv61dd7xuP/ JrQKU8tWcmxEiCfawfSpWSKfMGssY/i3T7Nhtgzcv7DaaRT0zwzLQOlJ4+5uSLnN u9mtzxjw4gJSp6Q6S3vWuyfLBjy4DiOz0/Zk0kgHU/ohF+z6J4ui7mz2ipsWcv2F UWZPUzyPYNekpDx359qFZ096ZNN5MIDKVsivyKGeCZyZoeLzJ2X0OO1EPP7gLADU +ww3l53r24UxlWpRQsbWZ7E0CZTdVdIpHu0hLfUe2TPgiW/6vKnJeX3P2Lz2U+Vg quDDlDC0DIIg3ELtUcKPOZMQ0PUUgeAsHGU0XxSF31uJ1BKkI1FdmieLiZQMpqPg SGQZUaPns/WmeTeIOAWdG9qTDlwvVseZsCMKWdK1708oQLYnUDy2hB55dKvoB59f eqEJQfXV/zCqDSIWUkdhpV2ReHGkJVPjbTt0jNjUClHnU7UrbhRSb1qFGngh+4St 63X9yg+duMRGB1WUuyiy1GMoPu6zzF6/vPaOjVMHsI9kbYCU2ItEIk1+u6ZfiJDq lQlfKgk4YInheB97jC9LTHp/aLzVeqOhAWFJiQ8Vvg+PTfaDZhzyBoDipoY0VDZk P2M90Q3zc2JXkjxU0N6z =/jrf -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/vivier/tags/m68k-part2-pull-request' into staging # gpg: Signature made Fri 28 Oct 2016 09:44:23 BST # gpg: using RSA key 0xF30C38BD3F2FBE3C # gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" # gpg: aka "Laurent Vivier <laurent@vivier.eu>" # gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" # Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C * remotes/vivier/tags/m68k-part2-pull-request: MAINTAINERS: update M68K entry target-m68k: immediate ops manage word and byte operands target-m68k: cmp manages word and bytes operands target-m68k: add/sub manage word and byte operands target-m68k: add addressing modes to neg target-m68k: introduce byte and word cc_ops target-m68k: some bit ops cleanup target-m68k: suba/adda can manage word operand target-m68k: and can manage word and byte operands target-m68k: or can manage word and byte operands target-m68k: eor can manage word and byte operands target-m68k: add addressing modes to not target-m68k: Inline addx, subx, negx target-m68k: add dbcc target-m68k: add addressing modes to scc target-m68k: add exg ops target-m68k: add linkl target-m68k: add bkpt instruction Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
eb540e2cc3
|
@ -133,7 +133,8 @@ F: include/hw/lm32/
|
|||
F: tests/tcg/lm32/
|
||||
|
||||
M68K
|
||||
S: Orphan
|
||||
M: Laurent Vivier <laurent@vivier.eu>
|
||||
S: Maintained
|
||||
F: target-m68k/
|
||||
F: hw/m68k/
|
||||
|
||||
|
|
|
@ -179,11 +179,11 @@ typedef enum {
|
|||
CC_OP_FLAGS,
|
||||
|
||||
/* X in cc_x, C = X, N in cc_n, Z in cc_n, V via cc_n/cc_v. */
|
||||
CC_OP_ADD,
|
||||
CC_OP_SUB,
|
||||
CC_OP_ADDB, CC_OP_ADDW, CC_OP_ADDL,
|
||||
CC_OP_SUBB, CC_OP_SUBW, CC_OP_SUBL,
|
||||
|
||||
/* X in cc_x, {N,Z,C,V} via cc_n/cc_v. */
|
||||
CC_OP_CMP,
|
||||
CC_OP_CMPB, CC_OP_CMPW, CC_OP_CMPL,
|
||||
|
||||
/* X in cc_x, C = 0, V = 0, N in cc_n, Z in cc_n. */
|
||||
CC_OP_LOGIC,
|
||||
|
|
|
@ -277,46 +277,6 @@ uint32_t HELPER(sats)(uint32_t val, uint32_t v)
|
|||
return val;
|
||||
}
|
||||
|
||||
uint32_t HELPER(subx_cc)(CPUM68KState *env, uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t res, new_x;
|
||||
|
||||
if (env->cc_x) {
|
||||
new_x = (op1 <= op2);
|
||||
res = op1 - (op2 + 1);
|
||||
} else {
|
||||
new_x = (op1 < op2);
|
||||
res = op1 - op2;
|
||||
}
|
||||
env->cc_x = new_x;
|
||||
env->cc_c = new_x;
|
||||
env->cc_n = res;
|
||||
env->cc_z |= res; /* !Z is sticky */
|
||||
env->cc_v = (res ^ op1) & (op1 ^ op2);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
uint32_t HELPER(addx_cc)(CPUM68KState *env, uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t res, new_x;
|
||||
|
||||
if (env->cc_x) {
|
||||
res = op1 + op2 + 1;
|
||||
new_x = (res <= op2);
|
||||
} else {
|
||||
res = op1 + op2;
|
||||
new_x = (res < op2);
|
||||
}
|
||||
env->cc_x = new_x;
|
||||
env->cc_c = new_x;
|
||||
env->cc_n = res;
|
||||
env->cc_z |= res; /* !Z is sticky. */
|
||||
env->cc_v = (res ^ op1) & ~(op1 ^ op2);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void HELPER(set_sr)(CPUM68KState *env, uint32_t val)
|
||||
{
|
||||
env->sr = val & 0xffe0;
|
||||
|
@ -624,32 +584,41 @@ void HELPER(mac_set_flags)(CPUM68KState *env, uint32_t acc)
|
|||
}
|
||||
}
|
||||
|
||||
#define EXTSIGN(val, index) ( \
|
||||
(index == 0) ? (int8_t)(val) : ((index == 1) ? (int16_t)(val) : (val)) \
|
||||
)
|
||||
|
||||
#define COMPUTE_CCR(op, x, n, z, v, c) { \
|
||||
switch (op) { \
|
||||
case CC_OP_FLAGS: \
|
||||
/* Everything in place. */ \
|
||||
break; \
|
||||
case CC_OP_ADD: \
|
||||
case CC_OP_ADDB: \
|
||||
case CC_OP_ADDW: \
|
||||
case CC_OP_ADDL: \
|
||||
res = n; \
|
||||
src2 = v; \
|
||||
src1 = res - src2; \
|
||||
src1 = EXTSIGN(res - src2, op - CC_OP_ADDB); \
|
||||
c = x; \
|
||||
z = n; \
|
||||
v = (res ^ src1) & ~(src1 ^ src2); \
|
||||
break; \
|
||||
case CC_OP_SUB: \
|
||||
case CC_OP_SUBB: \
|
||||
case CC_OP_SUBW: \
|
||||
case CC_OP_SUBL: \
|
||||
res = n; \
|
||||
src2 = v; \
|
||||
src1 = res + src2; \
|
||||
src1 = EXTSIGN(res + src2, op - CC_OP_SUBB); \
|
||||
c = x; \
|
||||
z = n; \
|
||||
v = (res ^ src1) & (src1 ^ src2); \
|
||||
break; \
|
||||
case CC_OP_CMP: \
|
||||
case CC_OP_CMPB: \
|
||||
case CC_OP_CMPW: \
|
||||
case CC_OP_CMPL: \
|
||||
src1 = n; \
|
||||
src2 = v; \
|
||||
res = src1 - src2; \
|
||||
res = EXTSIGN(src1 - src2, op - CC_OP_CMPB); \
|
||||
n = res; \
|
||||
z = res; \
|
||||
c = src1 < src2; \
|
||||
|
@ -670,16 +639,16 @@ uint32_t cpu_m68k_get_ccr(CPUM68KState *env)
|
|||
uint32_t res, src1, src2;
|
||||
|
||||
x = env->cc_x;
|
||||
c = env->cc_c;
|
||||
n = env->cc_n;
|
||||
z = env->cc_z;
|
||||
v = env->cc_v;
|
||||
c = env->cc_c;
|
||||
|
||||
COMPUTE_CCR(env->cc_op, x, n, z, v, c);
|
||||
|
||||
n = n >> 31;
|
||||
v = v >> 31;
|
||||
z = (z == 0);
|
||||
v = v >> 31;
|
||||
|
||||
return x * CCF_X + n * CCF_N + z * CCF_Z + v * CCF_V + c * CCF_C;
|
||||
}
|
||||
|
|
|
@ -3,8 +3,6 @@ DEF_HELPER_1(ff1, i32, i32)
|
|||
DEF_HELPER_FLAGS_2(sats, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
||||
DEF_HELPER_2(divu, void, env, i32)
|
||||
DEF_HELPER_2(divs, void, env, i32)
|
||||
DEF_HELPER_3(addx_cc, i32, env, i32, i32)
|
||||
DEF_HELPER_3(subx_cc, i32, env, i32, i32)
|
||||
DEF_HELPER_3(shl_cc, i32, env, i32, i32)
|
||||
DEF_HELPER_3(shr_cc, i32, env, i32, i32)
|
||||
DEF_HELPER_3(sar_cc, i32, env, i32, i32)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue