aboutsummaryrefslogtreecommitdiff
path: root/sim/mn10300/simops.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1998-02-25 08:58:23 +0000
committerJeff Law <law@redhat.com>1998-02-25 08:58:23 +0000
commit097e6924c2d28d8171eaa4665b9dab9e63c8a967 (patch)
tree44e08b5e39ff8e70e12b00de5eb1fdee1e2accc0 /sim/mn10300/simops.c
parentc248113005c23176daaa3bc521ee40d0e832f5e4 (diff)
downloadgdb-097e6924c2d28d8171eaa4665b9dab9e63c8a967.zip
gdb-097e6924c2d28d8171eaa4665b9dab9e63c8a967.tar.gz
gdb-097e6924c2d28d8171eaa4665b9dab9e63c8a967.tar.bz2
* simops.c (signed multiply instructions): Cast input operands to
signed32 before casting them to signed64 so that the sign bit is propagated properly.
Diffstat (limited to 'sim/mn10300/simops.c')
-rw-r--r--sim/mn10300/simops.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/sim/mn10300/simops.c b/sim/mn10300/simops.c
index efed7dc..6425e49 100644
--- a/sim/mn10300/simops.c
+++ b/sim/mn10300/simops.c
@@ -1433,8 +1433,8 @@ void OP_F240 (insn, extension)
unsigned long long temp;
int n, z;
- temp = ((signed64)State.regs[REG_D0 + REG0 (insn)]
- * (signed64)State.regs[REG_D0 + REG1 (insn)]);
+ temp = ((signed64)(signed32)State.regs[REG_D0 + REG0 (insn)]
+ * (signed64)(signed32)State.regs[REG_D0 + REG1 (insn)]);
State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
z = (State.regs[REG_D0 + REG0 (insn)] == 0);
@@ -3061,8 +3061,8 @@ void OP_F600 (insn, extension)
unsigned long long temp;
int n, z;
- temp = ((signed64)State.regs[REG_D0 + REG0 (insn)]
- * (signed64)State.regs[REG_D0 + REG1 (insn)]);
+ temp = ((signed64)(signed32)State.regs[REG_D0 + REG0 (insn)]
+ * (signed64)(signed32)State.regs[REG_D0 + REG1 (insn)]);
State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
z = (State.regs[REG_D0 + REG0 (insn)] == 0);
@@ -3078,8 +3078,8 @@ void OP_F90000 (insn, extension)
unsigned long long temp;
int n, z;
- temp = ((signed64)State.regs[REG_D0 + REG0_8 (insn)]
- * (signed64)SEXT8 (insn & 0xff));
+ temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_8 (insn)]
+ * (signed64)(signed32)SEXT8 (insn & 0xff));
State.regs[REG_D0 + REG0_8 (insn)] = temp & 0xffffffff;
State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
@@ -3095,8 +3095,8 @@ void OP_FB000000 (insn, extension)
unsigned long long temp;
int n, z;
- temp = ((signed64)State.regs[REG_D0 + REG0_16 (insn)]
- * (signed64)SEXT16 (insn & 0xffff));
+ temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_16 (insn)]
+ * (signed64)(signed32)SEXT16 (insn & 0xffff));
State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
@@ -3112,8 +3112,8 @@ void OP_FD000000 (insn, extension)
unsigned long long temp;
int n, z;
- temp = ((signed64)State.regs[REG_D0 + REG0_16 (insn)]
- * (signed64)(((insn & 0xffff) << 16) + extension));
+ temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_16 (insn)]
+ * (signed64)(signed32)(((insn & 0xffff) << 16) + extension));
State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);