blob: a901029e5972337105e85d8718040d0ded6e14bd (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
id = 2319
title = "SPARC32-bit SDIV of negative divisor gives wrong result"
state = "closed"
created_at = "2024-04-30T01:02:36.888Z"
closed_at = "2024-06-23T12:33:26.420Z"
labels = ["target: sparc", "workflow::Patch available"]
url = "https://gitlab.com/qemu-project/qemu/-/issues/2319"
host-os = "- any -"
host-arch = "- QEMU flavor:"
qemu-version = "9.0.00"
guest-os = "- OS/kernel version:"
guest-arch = "SPARC"
description = """SDIV of negative divisor gives wrong result because of typo in helper_sdiv(). This is true for QEMU 9.0.0 and earlier.
Place -1 in the Y register and -128 in another reg, then -120 in another register and do SDIV into a result register, instead of the proper value of 1 for the result, the incorrect value of 0 is produced.
There is a typo in target/sparc/helper.c that causes the divisor to be consider unsigned, this patch fixes it:
\\*\\*\\* helper.c.ori Tue Apr 23 16:23:45 2024 --- helper.c Mon Apr 29 20:14:07 2024
---
\\*\\*\\* 121,127 \\*\\*\\*\\* return (uint32_t)(b32 \\< 0 ? INT32_MAX : INT32_MIN) | (-1ull \\<\\< 32); }
! a64 /= b; r = a64; if (unlikely(r != a64)) { return (uint32_t)(a64 \\< 0 ? INT32_MIN : INT32_MAX) | (-1ull \\<\\< 32); --- 121,127 ---- return (uint32_t)(b32 \\< 0 ? INT32_MAX : INT32_MIN) | (-1ull \\<\\< 32); }
! a64 /= b32; r = a64; if (unlikely(r != a64)) { return (uint32_t)(a64 \\< 0 ? INT32_MIN : INT32_MAX) | (-1ull \\<\\< 32);"""
reproduce = "n/a"
additional = "n/a"
|