diff options
author | Frank Ch. Eigler <fche@redhat.com> | 1998-04-17 19:04:53 +0000 |
---|---|---|
committer | Frank Ch. Eigler <fche@redhat.com> | 1998-04-17 19:04:53 +0000 |
commit | f8998e7780a74bd98a55029be88580a06a630ba9 (patch) | |
tree | 079d2e064a5ae3da5962951f693d967c51062faf /sim | |
parent | aa4d43968a50e9ee0f88fa4a2e55ecdcd1b3bc06 (diff) | |
download | gdb-f8998e7780a74bd98a55029be88580a06a630ba9.zip gdb-f8998e7780a74bd98a55029be88580a06a630ba9.tar.gz gdb-f8998e7780a74bd98a55029be88580a06a630ba9.tar.bz2 |
* Fixed data mangling problems in R5900 COP2 LQC2/SQC2 instructions.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/mips/ChangeLog | 7 | ||||
-rw-r--r-- | sim/mips/interp.c | 26 |
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; |