diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /xpcom/reflect/xptcall/md/win32/xptcinvoke_asm_aarch64.asm | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xpcom/reflect/xptcall/md/win32/xptcinvoke_asm_aarch64.asm')
-rw-r--r-- | xpcom/reflect/xptcall/md/win32/xptcinvoke_asm_aarch64.asm | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/xpcom/reflect/xptcall/md/win32/xptcinvoke_asm_aarch64.asm b/xpcom/reflect/xptcall/md/win32/xptcinvoke_asm_aarch64.asm new file mode 100644 index 0000000000..21f80f4cb3 --- /dev/null +++ b/xpcom/reflect/xptcall/md/win32/xptcinvoke_asm_aarch64.asm @@ -0,0 +1,66 @@ +; This Source Code Form is subject to the terms of the Mozilla Public +; License, v. 2.0. If a copy of the MPL was not distributed with this +; file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include "ksarm64.h" + + IMPORT |invoke_copy_to_stack| + TEXTAREA + +; +;XPTC__InvokebyIndex(nsISupports* that, uint32_t methodIndex, +; uint32_t paramCount, nsXPTCVariant* params) +; + + NESTED_ENTRY XPTC__InvokebyIndex + + ; set up frame + PROLOG_SAVE_REG_PAIR fp, lr, #-32! + PROLOG_SAVE_REG_PAIR x19, x20, #16 + + ; save methodIndex across function calls + mov w20, w1 + + ; end of stack area passed to invoke_copy_to_stack + mov x1, sp + + ; assume 8 bytes of stack for each argument with 16-byte alignment + add w19, w2, #1 + and w19, w19, #0xfffffffe + sub sp, sp, w19, uxth #3 + + ; temporary place to store args passed in r0-r7,v0-v7 + sub sp, sp, #128 + + ; save 'that' on stack + str x0, [sp] + + ; start of stack area passed to invoke_copy_to_stack + mov x0, sp + bl invoke_copy_to_stack + + ; load arguments passed in r0-r7 + ldp x6, x7, [sp, #48] + ldp x4, x5, [sp, #32] + ldp x2, x3, [sp, #16] + ldp x0, x1, [sp],#64 + + ; load arguments passed in v0-v7 + ldp d6, d7, [sp, #48] + ldp d4, d5, [sp, #32] + ldp d2, d3, [sp, #16] + ldp d0, d1, [sp],#64 + + ; call the method + ldr x16, [x0] + add x16, x16, w20, uxth #3 + ldr x16, [x16] + blr x16 + + EPILOG_STACK_RESTORE + EPILOG_RESTORE_REG_PAIR x19, x20, #16 + EPILOG_RESTORE_REG_PAIR x29, x30, #32! + EPILOG_RETURN + + NESTED_END XPTC__InvokebyIndex + END |