From ecbce5269e7fcf03cd20577fd088bcf68c84b71a Mon Sep 17 00:00:00 2001 From: Christopher Milan Date: Tue, 3 Feb 2026 20:45:33 -0800 Subject: [PATCH] PYTHONREMU properly supports S_PACK_LL_B32_B16 (#14527) * PYTHONREMU properly supports S_PACK_LL_B32_B16 * default --- extra/assembly/amd/pcode.py | 2 +- extra/assembly/amd/test/test_emu2_pcode.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/extra/assembly/amd/pcode.py b/extra/assembly/amd/pcode.py index 166f2c5e48..4151d9daba 100644 --- a/extra/assembly/amd/pcode.py +++ b/extra/assembly/amd/pcode.py @@ -440,7 +440,7 @@ class Parser: self.eat('COMMA') lo = self.parse() self.eat('RBRACE') - return (hi.cast(dtypes.uint64) << _u64(32)) | lo.cast(dtypes.uint64) + return (hi.cast(dt:=_BITS_DT.get((s:=lo.dtype.bitsize) * 2, dtypes.uint64)) << _const(dt, s)) | lo.cast(dt) if self.at('NUM'): num = self.eat('NUM').val if self.try_eat('QUOTE'): diff --git a/extra/assembly/amd/test/test_emu2_pcode.py b/extra/assembly/amd/test/test_emu2_pcode.py index 0be69661a7..a1b5450948 100644 --- a/extra/assembly/amd/test/test_emu2_pcode.py +++ b/extra/assembly/amd/test/test_emu2_pcode.py @@ -62,6 +62,16 @@ 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."""