;; Copyright (C) 2013 Google Inc. All rights reserved.
;;
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following conditions are
;; met:
;;
;;     * Redistributions of source code must retain the above copyright
;; notice, this list of conditions and the following disclaimer.
;;     * Redistributions in binary form must reproduce the above
;; copyright notice, this list of conditions and the following disclaimer
;; in the documentation and/or other materials provided with the
;; distribution.
;;     * Neither the name of Google Inc. nor the names of its
;; contributors may be used to endorse or promote products derived from
;; this software without specific prior written permission.
;;
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
;; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;

%ifndef X64POSIX
%define X64POSIX 0
%endif

%ifndef X64WIN
%define X64WIN 0
%endif

%ifndef IA32
%define IA32 0
%endif

%ifndef ARM
%define ARM 0
%endif

;; Prefix symbols by '_' if PREFIX is defined.
%ifdef PREFIX
%define mangle(x) _ %+ x
%else
%define mangle(x) x
%endif

;; typedef void (*PushAllRegistersCallback)(SafePointBarrier*, ThreadState*, intptr_t*);
;; extern "C" void pushAllRegisters(SafePointBarrier*, ThreadState*, PushAllRegistersCallback)

        global mangle(pushAllRegisters)

%if X64POSIX

mangle(pushAllRegisters):
        ;; Push all callee-saves registers to get them
        ;; on the stack for conservative stack scanning.
        push rbx
        push rbp
        push r12
        push r13
        push r14
        push r15
        ;; Pass the two first arguments unchanged (rdi, rsi)
        ;; and the stack pointer after pushing callee-saved
        ;; registers to the callback.
        mov r8, rdx
        mov rdx, rsp
        call r8
        ;; Pop the callee-saved registers. None of them were
        ;; modified so no restoring is needed.
        add rsp, 48
        ret

%elif X64WIN

mangle(pushAllRegisters):
        ;; Push all callee-saves registers to get them
        ;; on the stack for conservative stack scanning.
        push rsi
        push rdi
        push rbx
        push rbp
        push r12
        push r13
        push r14
        push r15
        ;; Pass the two first arguments unchanged (rcx, rdx)
        ;; and the stack pointer after pushing callee-saved
        ;; registers to the callback.
        mov r9, r8
        mov r8, rsp
        call r9
        ;; Pop the callee-saved registers. None of them were
        ;; modified so no restoring is needed.
        add rsp, 64
        ret

%elif IA32

mangle(pushAllRegisters):
        ;; Push all callee-saves registers to get them
        ;; on the stack for conservative stack scanning.
        push ebx
        push ebp
        push esi
        push edi
        ;; Pass the two first arguments unchanged and the
        ;; stack pointer after pushing callee-save registers
        ;; to the callback.
        mov ecx, [esp + 28]
        push esp
        push dword [esp + 28]
        push dword [esp + 28]
        call ecx
        ;; Pop arguments and the callee-saved registers.
        ;; None of the callee-saved registers were modified
        ;; so we do not need to restore them.
        add esp, 28
        ret


%elif ARM
%error "Yasm does not support arm. Use SaveRegisters_arm.S on arm."
%else
%error "Unsupported platform."
%endif
