From e5fd3d340cf7490b757ee78cac721462567fb0b3 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sat, 4 May 2024 12:59:01 -0700 Subject: [PATCH] [a64] Implement `OPCODE_PACK`(SHORT) Fails unit tests due to subtle rounding errors `SHORT_4` unit-test is missing but implementation is the same as `SHORT_4` --- src/xenia/cpu/backend/a64/a64_seq_vector.cc | 22 +++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/xenia/cpu/backend/a64/a64_seq_vector.cc b/src/xenia/cpu/backend/a64/a64_seq_vector.cc index dab01ee68..188b8dfdb 100644 --- a/src/xenia/cpu/backend/a64/a64_seq_vector.cc +++ b/src/xenia/cpu/backend/a64/a64_seq_vector.cc @@ -1175,8 +1175,26 @@ struct PACK : Sequence> { e.CallNativeSafe(reinterpret_cast(EmulateFLOAT16_4)); e.MOV(i.dest.reg().B16(), Q0.B16()); } - static void EmitSHORT_2(A64Emitter& e, const EmitArgType& i) {} - static void EmitSHORT_4(A64Emitter& e, const EmitArgType& i) {} + static void EmitSHORT_2(A64Emitter& e, const EmitArgType& i) { + QReg src = i.src1; + if (i.src1.is_constant) { + src = i.dest; + e.LoadConstantV(src, i.src1.constant()); + } + e.SQSHRN(i.dest.reg().toD().H4(), src.S4(), 8); + e.EXT(i.dest.reg().B16(), i.dest.reg().B16(), i.dest.reg().B16(), 4); + e.REV32(i.dest.reg().H8(), i.dest.reg().H8()); + } + static void EmitSHORT_4(A64Emitter& e, const EmitArgType& i) { + QReg src = i.src1; + if (i.src1.is_constant) { + src = i.dest; + e.LoadConstantV(src, i.src1.constant()); + } + e.SQSHRN(i.dest.reg().toD().H4(), src.S4(), 8); + e.EXT(i.dest.reg().B16(), i.dest.reg().B16(), i.dest.reg().B16(), 4); + e.REV32(i.dest.reg().H8(), i.dest.reg().H8()); + } static void EmitUINT_2101010(A64Emitter& e, const EmitArgType& i) {} static void EmitULONG_4202020(A64Emitter& e, const EmitArgType& i) {} static void Emit8_IN_16(A64Emitter& e, const EmitArgType& i, uint32_t flags) {