summary refs log tree commit diff stats
path: root/results/classifier/zero-shot/105/semantic/1908551
blob: 47bdaa7bbfd701ac6440d57fec5277b505f87256 (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
semantic: 0.876
graphic: 0.871
other: 0.842
assembly: 0.808
vnc: 0.763
instruction: 0.730
device: 0.704
KVM: 0.671
mistranslation: 0.667
socket: 0.636
network: 0.628
boot: 0.561

aarch64 SVE emulation breaks strnlen and strrchr

arm optimized-routines have sve string functions with test code.

the test worked up until recently: with qemu-5.2.0 i see

$ qemu-aarch64 build/bin/test/strnlen
PASS strnlen
PASS __strnlen_aarch64
__strnlen_aarch64_sve (0x490fa0, 32) len 32 returned 64, expected 32
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80"
__strnlen_aarch64_sve (0x490fa0, 32) len 33 returned 64, expected 32
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80a"
__strnlen_aarch64_sve (0x490fa0, 33) len 33 returned 64, expected 33
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80a"
__strnlen_aarch64_sve (0x490fa0, 32) len 34 returned 64, expected 32
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80ab"
__strnlen_aarch64_sve (0x490fa0, 33) len 34 returned 64, expected 33
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80ab"
__strnlen_aarch64_sve (0x490fa0, 34) len 34 returned 64, expected 34
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80ab"
__strnlen_aarch64_sve (0x490fa0, 32) len 35 returned 64, expected 32
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80a\x00c"
__strnlen_aarch64_sve (0x490fa0, 33) len 35 returned 64, expected 33
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80ab\x00"
__strnlen_aarch64_sve (0x490fa0, 34) len 35 returned 64, expected 34
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80abc"
__strnlen_aarch64_sve (0x490fa0, 35) len 35 returned 64, expected 35
input: "abcdefghijklmnopqrstuvwxyz\{|}~\x7f\x80abc"
FAIL __strnlen_aarch64_sve

however the test passes with

qemu-aarch64 -cpu max,sve-max-vq=2

there should be nothing vector length specific in the code.

i haven't debugged it further, to reproduce the issue clone
https://github.com/ARM-software/optimized-routines

and run 'make build/bin/test/strnlen' with a config.mk like

SUBS = string
ARCH = aarch64
CROSS_COMPILE = aarch64-none-linux-gnu-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -std=c99 -pipe -O3
CFLAGS += -march=armv8.2-a+sve
EMULATOR = qemu-aarch64

(native compilation works too, and you can run 'make check' to
run all string tests) this will build a static linked executable
into build/bin/test. if you want a smaller test case edit
string/test/strnlen.c

I don't know why the test worked previously, and I did not
investigate, but as far as I can tell, the test is broken.

The test is returning a value >= maxlen because it it using
the wrong increment.  Fixed thus.



FWIW, as I think on this further, this probably isn't the
ideal fix -- I recall now that INCP is a "reduction" class
instruction and thus its overhead is non-trivial.

We could instead add an integer min operation at label 9,
which is outside of the main loop.

Bah.  The code at label 9 does not match the comment.
Best fixed thus.

... but you also mentioned strrchr, and there is a qemu bug there.  The REV (predicate) instruction doesn't seem to be doing the right thing -- input 0x1 -> output 0x80000000 which is not correct for the current vector length (64).

Patch fixing strrchr:
https://<email address hidden>/

https://gitlab.com/qemu-project/qemu/-/commit/70acaafef2e053a3