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
|
"""
Test lldb's ability to read and write the LoongArch SIMD registers.
"""
from enum import Enum
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class Mode(Enum):
LSX = 0
LASX = 1
class LoongArch64LinuxRegisters(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def get_build_flags(self, mode):
cflags = "-march=la464"
if mode == Mode.LASX:
cflags += " -DLASX"
return {"CFLAGS_EXTRAS": cflags}
def make_simd_value(self, n, mode):
count = 32 if mode == Mode.LASX else 16
return "{" + " ".join(["0x{:02x}".format(n)] * count) + "}"
def check_simd_values(self, value_offset, mode):
reg_prefix = "xr" if mode == Mode.LASX else "vr"
for i in range(32):
self.expect(
"register read {}{}".format(reg_prefix, i),
substrs=[self.make_simd_value(i + value_offset, mode)],
)
def simd_registers_impl(self, mode):
self.build(dictionary=self.get_build_flags(mode))
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
lldbutil.run_break_set_by_file_and_line(
self,
"main.c",
line_number("main.c", "// Set break point at this line."),
num_expected_locations=1,
)
self.runCmd("run", RUN_SUCCEEDED)
if self.process().GetState() == lldb.eStateExited:
self.fail("Test program failed to run.")
self.expect(
"thread list",
STOPPED_DUE_TO_BREAKPOINT,
substrs=["stopped", "stop reason = breakpoint"],
)
self.check_simd_values(0, mode)
self.runCmd("expression write_simd_regs(1)")
self.check_simd_values(0, mode)
reg_prefix = "xr" if mode == Mode.LASX else "vr"
for i in range(32):
self.runCmd(
'register write {}{} "{}"'.format(
reg_prefix, i, self.make_simd_value(i + 1, mode)
)
)
# Should be visible within lldb.
self.check_simd_values(1, mode)
# The program should agree with lldb.
self.expect("continue", substrs=["exited with status = 0"])
@skipUnlessArch("loongarch64")
@skipUnlessPlatform(["linux"])
def test_lsx(self):
"""Test read/write of LSX registers."""
if not self.isLoongArchLSX():
self.skipTest("LSX must be present.")
self.simd_registers_impl(Mode.LSX)
@skipUnlessArch("loongarch64")
@skipUnlessPlatform(["linux"])
def test_lasx(self):
"""Test read/write of LASX registers."""
if not self.isLoongArchLASX():
self.skipTest("LASX must be present.")
self.simd_registers_impl(Mode.LASX)
|