blob: cc32274c449485cbf0adaea4f54df51f93d015a9 (
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
risc-v: 0.953
architecture: 0.878
performance: 0.868
graphic: 0.795
user-level: 0.783
device: 0.773
files: 0.738
network: 0.736
socket: 0.730
mistranslation: 0.690
virtual: 0.677
debug: 0.660
semantic: 0.652
hypervisor: 0.637
ppc: 0.633
kernel: 0.632
PID: 0.629
VMM: 0.610
x86: 0.595
boot: 0.569
permissions: 0.563
arm: 0.561
register: 0.509
TCG: 0.506
peripherals: 0.501
vnc: 0.496
assembly: 0.459
i386: 0.437
KVM: 0.396
--------------------
risc-v: 0.875
debug: 0.300
assembly: 0.250
performance: 0.091
files: 0.050
architecture: 0.044
TCG: 0.023
PID: 0.014
virtual: 0.011
hypervisor: 0.007
semantic: 0.007
user-level: 0.004
register: 0.004
kernel: 0.004
VMM: 0.002
network: 0.002
device: 0.002
vnc: 0.001
boot: 0.001
permissions: 0.001
graphic: 0.001
socket: 0.001
peripherals: 0.001
mistranslation: 0.000
KVM: 0.000
arm: 0.000
ppc: 0.000
i386: 0.000
x86: 0.000
RISC-V Vector Instruction vssub.vv not saturating
I noticed doing a negate ( 0 – 0x80000000 ) using vssub.vv produces an incorrect result of 0x80000000 (should saturate to 0x7FFFFFFF).
Here is the bit of the code:
vmv.v.i v16, 0
…
8f040457 vssub.vv v8,v16,v8
I believe the instruction encoding is correct (vssub.vv with vd = v8, vs2 = v16, rs1 = v8), but the result does not saturate in QEMU.
I’ve just tested with what I think is the latest branch ( https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v7 commit 26 Feb 2021: 1151361fa7d45cc90d69086ccf1a4d8397931811 ) and the problem still exists.
Thanks for raising this bug case. A fix should be available soon.
This should be a quick fix, we will run couple tests again to ensure the fix doesn't break anything. Thanks~
This was fixed by commit:
commit 65606f21243a796537bfe4708720a9bf4bb50169
Author: LIU Zhiwei <email address hidden>
Date: Fri Feb 12 23:02:21 2021 +0800
target/riscv: Fixup saturate subtract function
The overflow predication ((a - b) ^ a) & (a ^ b) & INT64_MIN is right.
However, when the predication is ture and a is 0, it should return maximum.
Signed-off-by: LIU Zhiwei <email address hidden>
Reviewed-by: Richard Henderson <email address hidden>
Reviewed-by: Alistair Francis <email address hidden>
Message-id: <email address hidden>
Signed-off-by: Alistair Francis <email address hidden>
The fix will be in the QEMU 6.1 release.
|