Avoid memory dependency between instructions. (#8284)

This commit is contained in:
Samuel Williams 2023-08-25 13:28:33 +12:00 коммит произвёл GitHub
Родитель 97a97d6d6c
Коммит 40d774bec6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 22 добавлений и 16 удалений

Просмотреть файл

@ -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