| Message ID | 1330845699-12895-1-git-send-email-sw@weilnetz.de |
|---|---|
| State | Accepted |
| Headers | show |
Am 04.03.2012 08:21, schrieb Stefan Weil: > Commits b5dc7732e1cc2fb549e48b7b5d664f2c79628e2e and > be24bb4f3007c3e07cbf1934f7e781493d876ab7 optimized the code > and removed the correct setting of t0. Fix this. > > gcc-4.7 detected this bug because parameter arg1 was unused > but set in set_HIT0_LO and set_HI_LOT0. > > Cc: Aurelien Jarno<aurelien@aurel32.net> > Signed-off-by: Stefan Weil<sw@weilnetz.de> > --- > > Is anybody using QEMU with MIPS VR5432 code which uses the > special multiply opcodes? I don't have such code, so I could > not test my patch. > > Regards, > Stefan Weil > > target-mips/op_helper.c | 75 ++++++++++++++++++---------------------------- > 1 files changed, 29 insertions(+), 46 deletions(-) > > diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c > index c51b9cb..8556c17 100644 > --- a/target-mips/op_helper.c > +++ b/target-mips/op_helper.c > @@ -199,115 +199,98 @@ static inline void set_HILO (uint64_t HILO) > env->active_tc.HI[0] = (int32_t)(HILO>> 32); > } > > -static inline void set_HIT0_LO (target_ulong arg1, uint64_t HILO) > +static inline target_ulong set_HIT0_LO(uint64_t HILO) > { > + target_ulong tmp; > env->active_tc.LO[0] = (int32_t)(HILO& 0xFFFFFFFF); > - arg1 = env->active_tc.HI[0] = (int32_t)(HILO>> 32); > + tmp = env->active_tc.HI[0] = (int32_t)(HILO>> 32); > + return tmp; > } > > -static inline void set_HI_LOT0 (target_ulong arg1, uint64_t HILO) > +static inline target_ulong set_HI_LOT0(uint64_t HILO) > { > - arg1 = env->active_tc.LO[0] = (int32_t)(HILO& 0xFFFFFFFF); > + target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO& 0xFFFFFFFF); > env->active_tc.HI[0] = (int32_t)(HILO>> 32); > + return tmp; > } > > /* Multiplication variants of the vr54xx. */ > target_ulong helper_muls (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0(0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > } > > target_ulong helper_mulsu (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_macc (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_macchi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_maccu (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_macchiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_msac (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_msachi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_msacu (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_msachiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_mulhi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); > - > - return arg1; > + return set_HIT0_LO((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); > } > > target_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > - > - return arg1; > + return set_HIT0_LO((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_mulshi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO(0 - (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); > } > > target_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > } > > #ifdef TARGET_MIPS64 > Ping? Maybe this can be included in 1.2. Regards, Stefan
On Sun, Mar 04, 2012 at 08:21:39AM +0100, Stefan Weil wrote: > Commits b5dc7732e1cc2fb549e48b7b5d664f2c79628e2e and > be24bb4f3007c3e07cbf1934f7e781493d876ab7 optimized the code > and removed the correct setting of t0. Fix this. > > gcc-4.7 detected this bug because parameter arg1 was unused > but set in set_HIT0_LO and set_HI_LOT0. > > Cc: Aurelien Jarno <aurelien@aurel32.net> > Signed-off-by: Stefan Weil <sw@weilnetz.de> > --- > > Is anybody using QEMU with MIPS VR5432 code which uses the > special multiply opcodes? I don't have such code, so I could > not test my patch. > > Regards, > Stefan Weil Thanks, applied. > target-mips/op_helper.c | 75 ++++++++++++++++++---------------------------- > 1 files changed, 29 insertions(+), 46 deletions(-) > > diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c > index c51b9cb..8556c17 100644 > --- a/target-mips/op_helper.c > +++ b/target-mips/op_helper.c > @@ -199,115 +199,98 @@ static inline void set_HILO (uint64_t HILO) > env->active_tc.HI[0] = (int32_t)(HILO >> 32); > } > > -static inline void set_HIT0_LO (target_ulong arg1, uint64_t HILO) > +static inline target_ulong set_HIT0_LO(uint64_t HILO) > { > + target_ulong tmp; > env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); > - arg1 = env->active_tc.HI[0] = (int32_t)(HILO >> 32); > + tmp = env->active_tc.HI[0] = (int32_t)(HILO >> 32); > + return tmp; > } > > -static inline void set_HI_LOT0 (target_ulong arg1, uint64_t HILO) > +static inline target_ulong set_HI_LOT0(uint64_t HILO) > { > - arg1 = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); > + target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); > env->active_tc.HI[0] = (int32_t)(HILO >> 32); > + return tmp; > } > > /* Multiplication variants of the vr54xx. */ > target_ulong helper_muls (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0(0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > } > > target_ulong helper_mulsu (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_macc (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_macchi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_maccu (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_macchiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_msac (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_msachi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * > + (int64_t)(int32_t)arg2); > } > > target_ulong helper_msacu (target_ulong arg1, target_ulong arg2) > { > - set_HI_LOT0(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HI_LOT0((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_msachiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * > + (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_mulhi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); > - > - return arg1; > + return set_HIT0_LO((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); > } > > target_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > - > - return arg1; > + return set_HIT0_LO((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > } > > target_ulong helper_mulshi (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO(0 - (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); > } > > target_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2) > { > - set_HIT0_LO(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); > - > - return arg1; > + return set_HIT0_LO(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); > } > > #ifdef TARGET_MIPS64 > -- > 1.7.9 > > >
diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c index c51b9cb..8556c17 100644 --- a/target-mips/op_helper.c +++ b/target-mips/op_helper.c @@ -199,115 +199,98 @@ static inline void set_HILO (uint64_t HILO) env->active_tc.HI[0] = (int32_t)(HILO >> 32); } -static inline void set_HIT0_LO (target_ulong arg1, uint64_t HILO) +static inline target_ulong set_HIT0_LO(uint64_t HILO) { + target_ulong tmp; env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); - arg1 = env->active_tc.HI[0] = (int32_t)(HILO >> 32); + tmp = env->active_tc.HI[0] = (int32_t)(HILO >> 32); + return tmp; } -static inline void set_HI_LOT0 (target_ulong arg1, uint64_t HILO) +static inline target_ulong set_HI_LOT0(uint64_t HILO) { - arg1 = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); + target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); env->active_tc.HI[0] = (int32_t)(HILO >> 32); + return tmp; } /* Multiplication variants of the vr54xx. */ target_ulong helper_muls (target_ulong arg1, target_ulong arg2) { - set_HI_LOT0(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); - - return arg1; + return set_HI_LOT0(0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); } target_ulong helper_mulsu (target_ulong arg1, target_ulong arg2) { - set_HI_LOT0(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); - - return arg1; + return set_HI_LOT0(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); } target_ulong helper_macc (target_ulong arg1, target_ulong arg2) { - set_HI_LOT0(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); - - return arg1; + return set_HI_LOT0((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); } target_ulong helper_macchi (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); - - return arg1; + return set_HIT0_LO((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); } target_ulong helper_maccu (target_ulong arg1, target_ulong arg2) { - set_HI_LOT0(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); - - return arg1; + return set_HI_LOT0((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); } target_ulong helper_macchiu (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); - - return arg1; + return set_HIT0_LO((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); } target_ulong helper_msac (target_ulong arg1, target_ulong arg2) { - set_HI_LOT0(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); - - return arg1; + return set_HI_LOT0((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); } target_ulong helper_msachi (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); - - return arg1; + return set_HIT0_LO((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); } target_ulong helper_msacu (target_ulong arg1, target_ulong arg2) { - set_HI_LOT0(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); - - return arg1; + return set_HI_LOT0((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); } target_ulong helper_msachiu (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); - - return arg1; + return set_HIT0_LO((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); } target_ulong helper_mulhi (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); - - return arg1; + return set_HIT0_LO((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); } target_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); - - return arg1; + return set_HIT0_LO((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); } target_ulong helper_mulshi (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); - - return arg1; + return set_HIT0_LO(0 - (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); } target_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2) { - set_HIT0_LO(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); - - return arg1; + return set_HIT0_LO(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); } #ifdef TARGET_MIPS64
Commits b5dc7732e1cc2fb549e48b7b5d664f2c79628e2e and be24bb4f3007c3e07cbf1934f7e781493d876ab7 optimized the code and removed the correct setting of t0. Fix this. gcc-4.7 detected this bug because parameter arg1 was unused but set in set_HIT0_LO and set_HI_LOT0. Cc: Aurelien Jarno <aurelien@aurel32.net> Signed-off-by: Stefan Weil <sw@weilnetz.de> --- Is anybody using QEMU with MIPS VR5432 code which uses the special multiply opcodes? I don't have such code, so I could not test my patch. Regards, Stefan Weil target-mips/op_helper.c | 75 ++++++++++++++++++---------------------------- 1 files changed, 29 insertions(+), 46 deletions(-)