From 59fc92ee6ebfbd1dfdf47fb9335141bd91bc1ffa Mon Sep 17 00:00:00 2001 From: Merry Date: Sat, 10 Dec 2022 23:51:42 +0000 Subject: [PATCH] backend/arm64/a64_address_space: Avoid use of stack in Emit*Read128CallTrampoline --- .../backend/arm64/a64_address_space.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/backend/arm64/a64_address_space.cpp index f468808c..3fe11dd4 100644 --- a/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -163,13 +163,13 @@ static void* EmitRead128CallTrampoline(oaknut::CodeGenerator& code, A64::UserCal oaknut::Label l_addr, l_this; void* target = code.ptr(); - ABI_PushRegisters(code, (1ull << 29) | (1ull << 30), sizeof(Vector)); + ABI_PushRegisters(code, (1ull << 29) | (1ull << 30), 0); code.LDR(X0, l_this); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); - code.STP(X0, X1, SP); - code.LDR(Q0, SP); - ABI_PopRegisters(code, (1ull << 29) | (1ull << 30), sizeof(Vector)); + code.FMOV(D0, X0); + code.FMOV(V0.D()[1], X1); + ABI_PopRegisters(code, (1ull << 29) | (1ull << 30), 0); code.RET(); code.align(8); @@ -191,14 +191,14 @@ static void* EmitWrappedRead128CallTrampoline(oaknut::CodeGenerator& code, A64:: constexpr u64 save_regs = ABI_CALLER_SAVE & ~ToRegList(Q0); void* target = code.ptr(); - ABI_PushRegisters(code, save_regs, sizeof(Vector)); + ABI_PushRegisters(code, save_regs, 0); code.LDR(X0, l_this); code.LDR(X1, Xscratch0); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); - code.STP(X0, X1, SP); - code.LDR(Q0, SP); - ABI_PopRegisters(code, save_regs, sizeof(Vector)); + code.FMOV(D0, X0); + code.FMOV(V0.D()[1], X1); + ABI_PopRegisters(code, save_regs, 0); code.RET(); code.align(8); @@ -222,13 +222,13 @@ static void* EmitExclusiveRead128CallTrampoline(oaknut::CodeGenerator& code, con }; void* target = code.ptr(); - ABI_PushRegisters(code, (1ull << 29) | (1ull << 30), sizeof(Vector)); + ABI_PushRegisters(code, (1ull << 29) | (1ull << 30), 0); code.LDR(X0, l_this); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); - code.STP(X0, X1, SP); - code.LDR(Q0, SP); - ABI_PopRegisters(code, (1ull << 29) | (1ull << 30), sizeof(Vector)); + code.FMOV(D0, X0); + code.FMOV(V0.D()[1], X1); + ABI_PopRegisters(code, (1ull << 29) | (1ull << 30), 0); code.RET(); code.align(8);