From 5338ce6b7450458718f98474fb34bbd3cdc80a07 Mon Sep 17 00:00:00 2001 From: Christopher Milan Date: Wed, 4 Feb 2026 11:17:16 -0800 Subject: [PATCH] test S_PACK in extra/assembly/amd/test/hw (#14537) * S_PACK_LL_B32_B16 in test/hw * add rest of S_PACK instructions --- extra/assembly/amd/test/hw/test_sop.py | 44 ++++++++++++++++++++++ extra/assembly/amd/test/test_emu2_pcode.py | 10 ----- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/extra/assembly/amd/test/hw/test_sop.py b/extra/assembly/amd/test/hw/test_sop.py index 4f51e67abc..158240f103 100644 --- a/extra/assembly/amd/test/hw/test_sop.py +++ b/extra/assembly/amd/test/hw/test_sop.py @@ -87,6 +87,50 @@ class TestBasicScalar(unittest.TestCase): self.assertEqual(st.sgpr[2], f2i(2.0)) +class TestPack(unittest.TestCase): + """Tests for S_PACK instructions.""" + + def test_s_pack_ll_b32_b16(self): + """S_PACK_LL_B32_B16 packs low 16 bits of two sources into one 32-bit result.""" + instructions = [ + s_mov_b32(s[0], 0xDEADAAAA), + s_mov_b32(s[1], 0xDEADBBBB), + s_pack_ll_b32_b16(s[2], s[0], s[1]), + ] + st = run_program(instructions, n_lanes=1) + self.assertEqual(st.sgpr[2], 0xBBBBAAAA) + + def test_s_pack_lh_b32_b16(self): + """S_PACK_LH_B32_B16: D0 = { S1[31:16], S0[15:0] }.""" + instructions = [ + s_mov_b32(s[0], 0xDEADAAAA), + s_mov_b32(s[1], 0xDEADBBBB), + s_pack_lh_b32_b16(s[2], s[0], s[1]), + ] + st = run_program(instructions, n_lanes=1) + self.assertEqual(st.sgpr[2], 0xDEADAAAA) + + def test_s_pack_hh_b32_b16(self): + """S_PACK_HH_B32_B16: D0 = { S1[31:16], S0[31:16] }.""" + instructions = [ + s_mov_b32(s[0], 0xDEADAAAA), + s_mov_b32(s[1], 0xDEADBBBB), + s_pack_hh_b32_b16(s[2], s[0], s[1]), + ] + st = run_program(instructions, n_lanes=1) + self.assertEqual(st.sgpr[2], 0xDEADDEAD) + + def test_s_pack_hl_b32_b16(self): + """S_PACK_HL_B32_B16: D0 = { S1[15:0], S0[31:16] }.""" + instructions = [ + s_mov_b32(s[0], 0xDEADAAAA), + s_mov_b32(s[1], 0xDEADBBBB), + s_pack_hl_b32_b16(s[2], s[0], s[1]), + ] + st = run_program(instructions, n_lanes=1) + self.assertEqual(st.sgpr[2], 0xBBBBDEAD) + + class TestQuadmaskWqm(unittest.TestCase): """Tests for S_QUADMASK_B32 and S_WQM_B32.""" diff --git a/extra/assembly/amd/test/test_emu2_pcode.py b/extra/assembly/amd/test/test_emu2_pcode.py index a1b5450948..0be69661a7 100644 --- a/extra/assembly/amd/test/test_emu2_pcode.py +++ b/extra/assembly/amd/test/test_emu2_pcode.py @@ -62,16 +62,6 @@ class TestWithSources(unittest.TestCase): dest, val = assigns[0] self.assertEqual(val.op, Ops.MUL) - def test_s_pack_ll_b32_b16(self): - """Test S_PACK_LL_B32_B16 packs two 16-bit values into 32-bit result.""" - s0 = UOp.const(dtypes.uint32, 0xDEADAAAA) - s1 = UOp.const(dtypes.uint32, 0xDEADBBBB) - _, assigns = parse_pcode(PCODE[SOP2Op.S_PACK_LL_B32_B16], {'S0': s0, 'S1': s1}) - self.assertEqual(len(assigns), 1) - dest, val = assigns[0] - self.assertTrue(dest.startswith('D0')) - self.assertEqual(val.simplify().arg, 0xBBBBAAAA) - class TestParseExpr(unittest.TestCase): """Test the parse_expr function directly."""