aboutsummaryrefslogtreecommitdiff
path: root/sim/mips
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@redhat.com>1998-04-17 19:04:53 +0000
committerFrank Ch. Eigler <fche@redhat.com>1998-04-17 19:04:53 +0000
commitf8998e7780a74bd98a55029be88580a06a630ba9 (patch)
tree079d2e064a5ae3da5962951f693d967c51062faf /sim/mips
parentaa4d43968a50e9ee0f88fa4a2e55ecdcd1b3bc06 (diff)
downloadgdb-f8998e7780a74bd98a55029be88580a06a630ba9.zip
gdb-f8998e7780a74bd98a55029be88580a06a630ba9.tar.gz
gdb-f8998e7780a74bd98a55029be88580a06a630ba9.tar.bz2
* Fixed data mangling problems in R5900 COP2 LQC2/SQC2 instructions.
Diffstat (limited to 'sim/mips')
-rw-r--r--sim/mips/ChangeLog7
-rw-r--r--sim/mips/interp.c26
2 files changed, 21 insertions, 12 deletions
diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog
index 1802105..8bc443c 100644
--- a/sim/mips/ChangeLog
+++ b/sim/mips/ChangeLog
@@ -1,4 +1,11 @@
start-sanitize-sky
+Fri Apr 17 14:50:39 1998 Frank Ch. Eigler <fche@cygnus.com>
+
+ * r5900.igen (COP_[LS]Q): Transfer COP2 quadwords.
+ * interp.c (cop_[ls]q): Fixes corresponding to above.
+
+end-sanitize-sky
+start-sanitize-sky
Thu Apr 16 15:24:14 1998 Frank Ch. Eigler <fche@cygnus.com>
* interp.c (decode_coproc): Adapt COP2 micro interlock to
diff --git a/sim/mips/interp.c b/sim/mips/interp.c
index 5ed3d44..8f45da9 100644
--- a/sim/mips/interp.c
+++ b/sim/mips/interp.c
@@ -2951,18 +2951,18 @@ cop_lq (SIM_DESC sd,
{
case 2:
{
- unsigned_16 xyzw;
+ int i;
while(vu0_busy())
vu0_issue(sd);
- memcpy(& xyzw, & memword, sizeof(xyzw));
- xyzw = H2T_16(xyzw);
/* one word at a time, argh! */
- write_vu_vec_reg(&(vu0_device.regs), coproc_reg, 0, A4_16(& xyzw, 3));
- write_vu_vec_reg(&(vu0_device.regs), coproc_reg, 1, A4_16(& xyzw, 2));
- write_vu_vec_reg(&(vu0_device.regs), coproc_reg, 2, A4_16(& xyzw, 1));
- write_vu_vec_reg(&(vu0_device.regs), coproc_reg, 3, A4_16(& xyzw, 0));
+ for(i=0; i<4; i++)
+ {
+ unsigned_4 value;
+ value = H2T_4(*A4_16(& memword, 3-i));
+ write_vu_vec_reg(&(vu0_device.regs), coproc_reg, i, & value);
+ }
}
break;
@@ -3053,16 +3053,18 @@ cop_sq (SIM_DESC sd,
case 2:
{
unsigned_16 xyzw;
+ int i;
while(vu0_busy())
vu0_issue(sd);
/* one word at a time, argh! */
- read_vu_vec_reg(&(vu0_device.regs), coproc_reg, 0, A4_16(& xyzw, 3));
- read_vu_vec_reg(&(vu0_device.regs), coproc_reg, 1, A4_16(& xyzw, 2));
- read_vu_vec_reg(&(vu0_device.regs), coproc_reg, 2, A4_16(& xyzw, 1));
- read_vu_vec_reg(&(vu0_device.regs), coproc_reg, 3, A4_16(& xyzw, 0));
- xyzw = T2H_16(xyzw);
+ for(i=0; i<4; i++)
+ {
+ unsigned_4 value;
+ read_vu_vec_reg(&(vu0_device.regs), coproc_reg, i, & value);
+ *A4_16(& xyzw, 3-i) = T2H_4(value);
+ }
return xyzw;
}
break;