blob: 0caf342f057b7bdc5cd6d256f9d10822a598d77d [file]
;-------------------------------------------------------------------------------------------------------
; 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
ifdef _CONTROL_FLOW_GUARD
extrn __guard_check_icall_fptr:QWORD
endif
;;============================================================================================================
;; NativeCodeGenerator::CheckCodeGenThunk
;;============================================================================================================
extrn ?CheckCodeGen@NativeCodeGenerator@@SAP6APEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZPEAVScriptFunction@3@@Z : PROC
align 16
?CheckCodeGenThunk@NativeCodeGenerator@@SAPEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZ PROC FRAME
;; save volatile registers
mov qword ptr [rsp + 8h], rcx
mov qword ptr [rsp + 10h], rdx
mov qword ptr [rsp + 18h], r8
mov qword ptr [rsp + 20h], r9
push rbp
.pushreg rbp
lea rbp, [rsp]
.setframe rbp, 0
.endprolog
ifdef _CONTROL_FLOW_GUARD
sub rsp, 20h ; allocate stack space for the callee params(min 4 slots is mandate)
call ?CheckCodeGen@NativeCodeGenerator@@SAP6APEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZPEAVScriptFunction@3@@Z
mov rcx, rax ; __guard_check_icall_fptr requires the call target in rcx.
call [__guard_check_icall_fptr] ; verify that the call target is valid
add rsp, 20h ;de-allocate stack space for the callee params(min 4 slots is mandate + 1 for alignment )
mov rax, rcx
else
sub rsp, 20h ;allocate stack space for the callee params(min 4 slots is mandate)
call ?CheckCodeGen@NativeCodeGenerator@@SAP6APEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZPEAVScriptFunction@3@@Z
add rsp, 20h ;de-allocate stack space for the callee params(min 4 slots is mandate)
endif
;EPILOGUE starts here
lea rsp, [rbp]
pop rbp
;; restore volatile registers
mov rcx, qword ptr [rsp + 8h]
mov rdx, qword ptr [rsp + 10h]
mov r8, qword ptr [rsp + 18h]
mov r9, qword ptr [rsp + 20h]
rex_jmp_reg rax
?CheckCodeGenThunk@NativeCodeGenerator@@SAPEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZ ENDP
;;============================================================================================================
;; NativeCodeGenerator::CheckAsmJsCodeGenThunk
;;============================================================================================================
extrn ?CheckAsmJsCodeGen@NativeCodeGenerator@@SAPEAXPEAVScriptFunction@Js@@@Z : PROC
align 16
?CheckAsmJsCodeGenThunk@NativeCodeGenerator@@SAPEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZ PROC FRAME
;; save volatile registers
mov qword ptr [rsp + 8h], rcx
mov qword ptr [rsp + 10h], rdx
mov qword ptr [rsp + 18h], r8
mov qword ptr [rsp + 20h], r9
push rbp
.pushreg rbp
lea rbp, [rsp]
.setframe rbp, 0
.endprolog
sub rsp, 60h
; spill potential floating point arguments to stack
movups xmmword ptr [rsp + 30h], xmm1
movups xmmword ptr [rsp + 40h], xmm2
movups xmmword ptr [rsp + 50h], xmm3
ifdef _CONTROL_FLOW_GUARD
call ?CheckAsmJsCodeGen@NativeCodeGenerator@@SAPEAXPEAVScriptFunction@Js@@@Z
mov rcx, rax ; __guard_check_icall_fptr requires the call target in rcx.
call [__guard_check_icall_fptr] ; verify that the call target is valid
mov rax, rcx ; CFG is guaranteed not to mess up rcx
else
call ?CheckAsmJsCodeGen@NativeCodeGenerator@@SAPEAXPEAVScriptFunction@Js@@@Z
endif
;EPILOGUE starts here
movups xmm1, xmmword ptr [rsp + 30h]
movups xmm2, xmmword ptr [rsp + 40h]
movups xmm3, xmmword ptr [rsp + 50h]
lea rsp, [rbp]
pop rbp
;; restore volatile registers
mov rcx, qword ptr [rsp + 8h]
mov rdx, qword ptr [rsp + 10h]
mov r8, qword ptr [rsp + 18h]
mov r9, qword ptr [rsp + 20h]
rex_jmp_reg rax
?CheckAsmJsCodeGenThunk@NativeCodeGenerator@@SAPEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZ ENDP
;;============================================================================================================
_TEXT ENDS
end