""" 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)