From f8998e7780a74bd98a55029be88580a06a630ba9 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Fri, 17 Apr 1998 19:04:53 +0000 Subject: [PATCH] * Fixed data mangling problems in R5900 COP2 LQC2/SQC2 instructions. --- sim/mips/ChangeLog | 7 +++++++ sim/mips/interp.c | 26 ++++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog index 1802105813..8bc443c305 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 + + * 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 * interp.c (decode_coproc): Adapt COP2 micro interlock to diff --git a/sim/mips/interp.c b/sim/mips/interp.c index 5ed3d4453b..8f45da9fd9 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; -- 2.34.1