diff --git a/target-ppc/op.c b/target-ppc/op.c index 64166595cf..4ab0f00433 100644 --- a/target-ppc/op.c +++ b/target-ppc/op.c @@ -798,7 +798,11 @@ void OPPROTO op_mulli (void) /* multiply low word */ void OPPROTO op_mullw (void) { +#if defined(TARGET_PPC64) + T0 = (int64_t)(int32_t)T0 * (int64_t)(int32_t)T1; +#else T0 = (int32_t)(T0 * T1); +#endif RETURN(); } diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c index 46e9b7ab6c..d398640278 100644 --- a/target-ppc/op_helper.c +++ b/target-ppc/op_helper.c @@ -227,7 +227,7 @@ void do_divduo (void) void do_mullwo (void) { - int64_t res = (int64_t)T0 * (int64_t)T1; + int64_t res = (int64_t)(int32_t)T0 * (int64_t)(int32_t)T1; if (likely((int32_t)res == res)) { xer_ov = 0;