| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- ;-------------------------------------------------------------------------------------------------------
- ; Copyright (C) Microsoft. All rights reserved.
- ; Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- ;-------------------------------------------------------------------------------------------------------
- include ksamd64.inc
- _TEXT SEGMENT
- ;; BailOutRecord::BailOut(BailOutRecord const * bailOutRecord)
- extrn ?BailOut@BailOutRecord@@SAPEAXPEBV1@@Z : PROC
- ;; BranchBailOutRecord::BailOut(BranchBailOutRecord const * bailOutRecord, BOOL cond)
- extrn ?BailOut@BranchBailOutRecord@@SAPEAXPEBV1@H@Z : PROC
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; LinearScanMD::SaveAllRegisters(BailOutRecord *const bailOutRecord)
- align 16
- ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z PROC
- ;; [rsp + 7 * 8] == saved rax
- ;; [rsp + 8 * 8] == saved rcx
- ;; [rsp + 9 * 8] == saved rdx
- ;; rcx == bailOutRecord
- ;; rdx == condition
- mov rax, [rcx] ;; bailOutRecord->globalBailOutRecordDataTable
- mov rax, [rax] ;; bailOutRecord->globalBailOutRecordDataTable->registerSaveSpace
- ;; Save r8 first to free up a register
- mov [rax + 8 * 8], r8
- ;; Save the original values of rax, rcx, and rdx into the actual register save space
- mov r8, [rsp + 7 * 8] ;; saved rax
- mov [rax + 0 * 8], r8
- mov r8, [rsp + 8 * 8] ;; saved rcx
- mov [rax + 1 * 8], r8
- mov r8, [rsp + 9 * 8] ;; saved rdx
- mov [rax + 2 * 8], r8
- ;; Save remaining registers
- mov [rax + 3 * 8], rbx
- ;; [rax + 4 * 8] == save space for rsp, which doesn't need to be saved since bailout uses rbp for stack access
- mov [rax + 5 * 8], rbp
- mov [rax + 6 * 8], rsi
- mov [rax + 7 * 8], rdi
- ;; mov [rax + 8 * 8], r8 ;; r8 was saved earlier
- mov [rax + 9 * 8], r9
- mov [rax + 10 * 8], r10
- mov [rax + 11 * 8], r11
- mov [rax + 12 * 8], r12
- mov [rax + 13 * 8], r13
- mov [rax + 14 * 8], r14
- mov [rax + 15 * 8], r15
- ;; Save all XMM regs (full width)
- movups xmmword ptr [rax + 80h], xmm0 ;; [rax + 16 * 8 + 0 * 16] = xmm0
- movups xmmword ptr [rax + 90h], xmm1 ;; [rax + 16 * 8 + 1 * 16] = xmm1
- movups xmmword ptr [rax + 0a0h], xmm2 ;; ...
- movups xmmword ptr [rax + 0b0h], xmm3
- movups xmmword ptr [rax + 0c0h], xmm4
- movups xmmword ptr [rax + 0d0h], xmm5
- movups xmmword ptr [rax + 0e0h], xmm6
- movups xmmword ptr [rax + 0f0h], xmm7
- movups xmmword ptr [rax + 100h], xmm8
- movups xmmword ptr [rax + 110h], xmm9
- movups xmmword ptr [rax + 120h], xmm10
- movups xmmword ptr [rax + 130h], xmm11
- movups xmmword ptr [rax + 140h], xmm12
- movups xmmword ptr [rax + 150h], xmm13
- movups xmmword ptr [rax + 160h], xmm14
- movups xmmword ptr [rax + 170h], xmm15 ;; [rax + 16 * 8 + 15 * 16] = xmm15
- ret
- ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z ENDP
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; LinearScanMD::SaveAllRegistersAndBailOut(BailOutRecord *const bailOutRecord)
- align 16
- NESTED_ENTRY ?SaveAllRegistersAndBailOut@LinearScanMD@@SAXQEAVBailOutRecord@@@Z, _TEXT
- ;; We follow Custom calling convention
- ;; [rsp + 1 * 8] == saved rax
- ;; [rsp + 2 * 8] == saved rcx
- ;; rcx == bailOutRecord
- ;; Relative to this function, SaveAllRegisters expects:
- ;; [rsp + 3 * 8] == saved rdx
- ;; Since rdx is not a parameter to this function, it won't be saved on the stack by jitted code, so copy it there now
- mov [rsp + 3 * 8], rdx
- sub rsp, 28h ;; standard minimum stack allocation space which accounts for 4 home params and to align the return address.
- END_PROLOGUE
- call ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z
- add rsp, 28h ;; deallocate stack space
- jmp ?BailOut@BailOutRecord@@SAPEAXPEBV1@@Z
- NESTED_END ?SaveAllRegistersAndBailOut@LinearScanMD@@SAXQEAVBailOutRecord@@@Z, _TEXT
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; LinearScanMD::SaveAllRegistersAndBranchBailOut(BranchBailOutRecord *const bailOutRecord, const BOOL condition)
- align 16
- NESTED_ENTRY ?SaveAllRegistersAndBranchBailOut@LinearScanMD@@SAXQEAVBranchBailOutRecord@@H@Z, _TEXT
- ;; We follow custom calling convention
- ;; [rsp + 1 * 8] == saved rax
- ;; [rsp + 2 * 8] == saved rcx
- ;; [rsp + 3 * 8] == saved rdx
- ;; rcx == bailOutRecord
- ;; rdx == condition
- sub rsp, 28h ;; standard minimum stack allocation space which accounts for 4 home params and to align the return address.
- END_PROLOGUE
- call ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z
- add rsp, 28h ;; deallocate stack space
- jmp ?BailOut@BranchBailOutRecord@@SAPEAXPEBV1@H@Z
- NESTED_END ?SaveAllRegistersAndBranchBailOut@LinearScanMD@@SAXQEAVBranchBailOutRecord@@H@Z, _TEXT
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- _TEXT ENDS
- end
|