sparc32 : Signed integer division overflow
PATCH v2 1/1 sparc32 : Signed integer division overflow
The signed integer division -0x8000_0000_0000_0000 / -1 must be handled separately to avoid an overflow on the QEMU host.
Signed-off-by Olivier Danet <[email protected]>
--- target-sparc/helper.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
target-sparc/helper.c +8 -5
@@ -122,12 +122,15 @@ static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a,if (x1 ==0 ) {cpu_restore_state (CPU (cpu),GETPC ());helper_raise_exception (env,TT_DIV_ZERO ); - } - - x0 = x0 / x1; -if ((int32_t ) x0 != x0) { - x0 = x0 <0 ?0x80000000 :0x7fffffff ; + }else if (x1 ==-1 && x0 ==INT64_MIN ) { + x0 =0x7fffffff ; overflow =1 ; + }else { + x0 = x0 / x1; +if ((int32_t ) x0 != x0) { + x0 = x0 <0 ?0x80000000 :0x7fffffff ; + overflow =1 ; + } }if (cc) {
Signature · 1 line
1.8.1.5
Quoted 7 lines · Olivier Danet
The signed integer division -0x8000_0000_0000_0000 / -1 must be handled separately to avoid an overflow on the QEMU host.
Signed-off-by Olivier Danet <[email protected]>--- target-sparc/helper.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
Reviewed-by Richard Henderson <[email protected]>
r~
target-sparc/helper.c static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a, · line 133
Quoted 4 lines · Olivier Danet
target-sparc/helper.c +4
-0+if ((int32_t ) x0 != x0) { + x0 = x0 <0 ?0x80000000 :0x7fffffff ; + overflow =1 ; + }
Actually, there's an existing bug here that we might as well fix.
## ... the 32-bit result is sign-extended to 64 bits and ## written into register R[rd].
That 0x80000000 is not going to promote properly to 64-bits. We might as well go ahead and use INT32_MIN and INT32_MAX here at the same time.
r~