From fe4e864e4c05276a1cca62cce1fc423f50f2928a Mon Sep 17 00:00:00 2001
From: Merry <git@mary.rs>
Date: Fri, 22 Jul 2022 20:20:59 +0100
Subject: [PATCH] backend/arm64: Implement Pack2x32To1x64

---
 .../backend/arm64/emit_arm64_data_processing.cpp    | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp b/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp
index 631b3f5e..6249b6e3 100644
--- a/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp
+++ b/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp
@@ -21,10 +21,15 @@ using namespace oaknut::util;
 
 template<>
 void EmitIR<IR::Opcode::Pack2x32To1x64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
-    (void)code;
-    (void)ctx;
-    (void)inst;
-    ASSERT_FALSE("Unimplemented");
+    auto args = ctx.reg_alloc.GetArgumentInfo(inst);
+
+    auto Wlo = ctx.reg_alloc.ReadW(args[0]);
+    auto Whi = ctx.reg_alloc.ReadW(args[1]);
+    auto Xresult = ctx.reg_alloc.WriteX(inst);
+    RegAlloc::Realize(Wlo, Whi, Xresult);
+
+    code.MOV(Xresult->toW(), Wlo);  // TODO: Move eliminiation
+    code.BFI(Xresult, Whi->toX(), 32, 32);
 }
 
 template<>