94 lines · python
1"""2Test lldb's ability to read and write the LoongArch SIMD registers.3"""4 5from enum import Enum6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class Mode(Enum):13 LSX = 014 LASX = 115 16 17class LoongArch64LinuxRegisters(TestBase):18 NO_DEBUG_INFO_TESTCASE = True19 20 def get_build_flags(self, mode):21 cflags = "-march=la464"22 if mode == Mode.LASX:23 cflags += " -DLASX"24 25 return {"CFLAGS_EXTRAS": cflags}26 27 def make_simd_value(self, n, mode):28 count = 32 if mode == Mode.LASX else 1629 return "{" + " ".join(["0x{:02x}".format(n)] * count) + "}"30 31 def check_simd_values(self, value_offset, mode):32 reg_prefix = "xr" if mode == Mode.LASX else "vr"33 for i in range(32):34 self.expect(35 "register read {}{}".format(reg_prefix, i),36 substrs=[self.make_simd_value(i + value_offset, mode)],37 )38 39 def simd_registers_impl(self, mode):40 self.build(dictionary=self.get_build_flags(mode))41 self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)42 43 lldbutil.run_break_set_by_file_and_line(44 self,45 "main.c",46 line_number("main.c", "// Set break point at this line."),47 num_expected_locations=1,48 )49 50 self.runCmd("run", RUN_SUCCEEDED)51 52 if self.process().GetState() == lldb.eStateExited:53 self.fail("Test program failed to run.")54 55 self.expect(56 "thread list",57 STOPPED_DUE_TO_BREAKPOINT,58 substrs=["stopped", "stop reason = breakpoint"],59 )60 61 self.check_simd_values(0, mode)62 self.runCmd("expression write_simd_regs(1)")63 self.check_simd_values(0, mode)64 65 reg_prefix = "xr" if mode == Mode.LASX else "vr"66 for i in range(32):67 self.runCmd(68 'register write {}{} "{}"'.format(69 reg_prefix, i, self.make_simd_value(i + 1, mode)70 )71 )72 73 # Should be visible within lldb.74 self.check_simd_values(1, mode)75 76 # The program should agree with lldb.77 self.expect("continue", substrs=["exited with status = 0"])78 79 @skipUnlessArch("loongarch64")80 @skipUnlessPlatform(["linux"])81 def test_lsx(self):82 """Test read/write of LSX registers."""83 if not self.isLoongArchLSX():84 self.skipTest("LSX must be present.")85 self.simd_registers_impl(Mode.LSX)86 87 @skipUnlessArch("loongarch64")88 @skipUnlessPlatform(["linux"])89 def test_lasx(self):90 """Test read/write of LASX registers."""91 if not self.isLoongArchLASX():92 self.skipTest("LASX must be present.")93 self.simd_registers_impl(Mode.LASX)94