From 40d774bec68de3f252c0b252d9d0303a67bee0cb Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 25 Aug 2023 13:28:33 +1200 Subject: [PATCH] Avoid memory dependency between instructions. (#8284) --- coroutine/amd64/Context.S | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/coroutine/amd64/Context.S b/coroutine/amd64/Context.S index d50732adbc..056c276a31 100644 --- a/coroutine/amd64/Context.S +++ b/coroutine/amd64/Context.S @@ -13,29 +13,35 @@ .globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): - # Save caller state - pushq %rbp - pushq %rbx - pushq %r12 - pushq %r13 - pushq %r14 - pushq %r15 + # Make space on the stack for 6 registers: + subq $48, %rsp - # Save caller stack pointer + # Save caller state: + movq %rbp, 40(%rsp) + movq %rbx, 32(%rsp) + movq %r12, 24(%rsp) + movq %r13, 16(%rsp) + movq %r14, 8(%rsp) + movq %r15, (%rsp) + + # Save caller stack pointer: movq %rsp, (%rdi) - # Restore callee stack pointer + # Restore callee stack pointer: movq (%rsi), %rsp # Restore callee state - popq %r15 - popq %r14 - popq %r13 - popq %r12 - popq %rbx - popq %rbp + movq 40(%rsp), %rbp + movq 32(%rsp), %rbx + movq 24(%rsp), %r12 + movq 16(%rsp), %r13 + movq 8(%rsp), %r14 + movq (%rsp), %r15 - # Put the first argument into the return value + # Adjust stack pointer back: + addq $48, %rsp + + # Put the first argument into the return value: movq %rdi, %rax # We pop the return address and jump to it