blob: f29bf7870b53e8ac6e49fbc0d25063c210c7f54b (
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
device: 0.799
register: 0.752
ppc: 0.725
architecture: 0.712
assembly: 0.702
performance: 0.663
network: 0.623
vnc: 0.598
kernel: 0.591
PID: 0.530
arm: 0.522
socket: 0.510
risc-v: 0.477
x86: 0.465
files: 0.464
TCG: 0.453
semantic: 0.449
peripherals: 0.448
i386: 0.440
hypervisor: 0.430
permissions: 0.428
graphic: 0.427
boot: 0.402
debug: 0.387
VMM: 0.382
virtual: 0.267
KVM: 0.247
mistranslation: 0.236
user-level: 0.223
Sparc: fdtox/fqtox instructions incorrectly select destination register
Description of problem:
This bug report is mostly for informational purposes as I will be posting a fix for the bug.
The `fdtox` and `fqtox` instructions incorrectly select the destination register when the destination register is higher than `f31`.
Steps to reproduce:
1. Install Sparc cross compiler `gcc-12-sparc64-linux-gnu`(in Debian)
2. Compile the test program using `sparc64-linux-gnu-gcc-12 -m64 -o test_program -static test_program.c`
3. Run the test program using `qemu-sparc64-static ./test_program`
4. Expected output is 60. Prints 0 instead.
Additional information:
Test program to test the issue:
```c
#include <stdio.h>
int main(int argc, char** argv) {
long long truncated = 0;
__asm__("fdtox %0,%%f32\n\t" :: "f"(60.0));
__asm__("fmovd %%f32,%0\n\t" : "=f"(truncated));
printf("%lld\n", truncated);
return 0;
}
```
The issue is caused by the commit 0bba7572d4. Where certain changes were made in the way destination registers are selected(moving the DFPREG/QFPREG to decodetree).
|