Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/coreclr/vm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,7 @@ set(VM_SOURCES_WKS
callconvbuilder.cpp
callhelpers.cpp
callsiteinspect.cpp
callstubgenerator.cpp
clrconfignative.cpp
clrex.cpp
clrvarargs.cpp
Expand Down Expand Up @@ -449,6 +450,7 @@ set(VM_HEADERS_WKS
interoputil.inl
interpexec.h
interpframeallocator.h
callstubgenerator.h
invokeutil.h
managedmdimport.hpp
marshalnative.h
Expand Down
318 changes: 301 additions & 17 deletions src/coreclr/vm/amd64/AsmHelpers.asm
Original file line number Diff line number Diff line change
Expand Up @@ -482,23 +482,6 @@ JIT_PollGCRarePath:
TAILJMP_RAX
LEAF_END JIT_PollGC, _TEXT

ifdef FEATURE_INTERPRETER
NESTED_ENTRY InterpreterStub, _TEXT

PROLOG_WITH_TRANSITION_BLOCK

;
; call ExecuteInterpretedMethod
;
lea rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock*
mov rdx, METHODDESC_REGISTER
call ExecuteInterpretedMethod

EPILOG_WITH_TRANSITION_BLOCK_RETURN

NESTED_END InterpreterStub, _TEXT
endif ; FEATURE_INTERPRETER

; rcx -This pointer
; rdx -ReturnBuffer
LEAF_ENTRY ThisPtrRetBufPrecodeWorker, _TEXT
Expand Down Expand Up @@ -629,4 +612,305 @@ NESTED_ENTRY CallEHFilterFunclet, _TEXT
ret
NESTED_END CallEHFilterFunclet, _TEXT

ifdef FEATURE_INTERPRETER

NESTED_ENTRY InterpreterStub, _TEXT

PROLOG_WITH_TRANSITION_BLOCK

;
; call ExecuteInterpretedMethod
;
lea rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock*
mov rdx, METHODDESC_REGISTER
call ExecuteInterpretedMethod

EPILOG_WITH_TRANSITION_BLOCK_RETURN

NESTED_END InterpreterStub, _TEXT

; Copy arguments from the interpreter stack to the processor stack.
; The CPU stack slots are aligned to pointer size.
LEAF_ENTRY Load_Stack, _TEXT
push rdi
push rsi
push rcx
mov edi, dword ptr [r11 + 8] ; SP offset
mov ecx, dword ptr [r11 + 12] ; number of stack slots
add edi, 20h ; the 3 pushes above plus return address
add rdi, rsp
mov rsi, r10
shr rcx, 3
rep movsq
mov r10, rsi
pop rcx
pop rsi
pop rdi
add r11, 16
jmp qword ptr [r11]
LEAF_END Load_Stack, _TEXT

; Routines for passing value type arguments by reference in general purpose registers RCX, RDX, R8, R9

LEAF_ENTRY Load_Ref_RCX, _TEXT
mov rcx, r10
add r10, [r11 + 8] ; size of the value type
add r11, 16
jmp qword ptr [r11]
LEAF_END Load_Ref_RCX, _TEXT

LEAF_ENTRY Load_Ref_RDX, _TEXT
mov rdx, r10
add r10, [r11 + 8] ; size of the value type
add r11, 16
jmp qword ptr [r11]
LEAF_END Load_Ref_RDX, _TEXT

LEAF_ENTRY Load_Ref_R8, _TEXT
mov r8, r10
add r10, [r11 + 8] ; size of the value type
add r11, 16
jmp qword ptr [r11]
LEAF_END Load_Ref_R8, _TEXT

LEAF_ENTRY Load_Ref_R9, _TEXT
mov r9, r10
add r10, [r11 + 8] ; size of the value type
add r11, 16
jmp qword ptr [r11]
LEAF_END Load_Ref_R9, _TEXT

; Routines for passing arguments by value in general purpose registers RCX, RDX, R8, R9

LEAF_ENTRY Load_RCX, _TEXT
mov rcx, [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RCX, _TEXT

LEAF_ENTRY Load_RCX_RDX, _TEXT
mov rcx, [r10]
mov rdx, [r10 + 8]
add r10, 16
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RCX_RDX, _TEXT

LEAF_ENTRY Load_RCX_RDX_R8, _TEXT
mov rcx, [r10]
mov rdx, [r10 + 8]
mov r8, [r10 + 16]
add r10, 24
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RCX_RDX_R8, _TEXT

LEAF_ENTRY Load_RCX_RDX_R8_R9, _TEXT
mov rcx, [r10]
mov rdx, [r10 + 8]
mov r8, [r10 + 16]
mov r9, [r10 + 24]
add r10, 32
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RCX_RDX_R8_R9, _TEXT

LEAF_ENTRY Load_RDX, _TEXT
mov rdx, [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RDX, _TEXT

LEAF_ENTRY Load_RDX_R8, _TEXT
mov rdx, [r10]
mov r8, [r10 + 8]
add r10, 16
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RDX_R8, _TEXT

LEAF_ENTRY Load_RDX_R8_R9, _TEXT
mov rdx, [r10]
mov r8, [r10 + 8]
mov r9, [r10 + 16]
add r10, 24
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_RDX_R8_R9, _TEXT

LEAF_ENTRY Load_R8, _TEXT
mov r8, [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_R8, _TEXT

LEAF_ENTRY Load_R8_R9, _TEXT
mov r8, [r10]
mov r9, [r10 + 8]
add r10, 16
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_R8_R9, _TEXT

LEAF_ENTRY Load_R9, _TEXT
mov r9, [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_R9, _TEXT

; Routines for passing arguments in floating point registers XMM0..XMM3

LEAF_ENTRY Load_XMM0, _TEXT
movsd xmm0, real8 ptr [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM0, _TEXT

LEAF_ENTRY Load_XMM0_XMM1, _TEXT
movsd xmm0, real8 ptr [r10]
movsd xmm1, real8 ptr [r10 + 8]
add r10, 10h
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM0_XMM1, _TEXT

LEAF_ENTRY Load_XMM0_XMM1_XMM2, _TEXT
movsd xmm0, real8 ptr [r10]
movsd xmm1, real8 ptr [r10 + 8]
movsd xmm2, real8 ptr [r10 + 16]
add r10, 24
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM0_XMM1_XMM2, _TEXT

LEAF_ENTRY Load_XMM0_XMM1_XMM2_XMM3, _TEXT
movsd xmm0, real8 ptr [r10]
movsd xmm1, real8 ptr [r10 + 8]
movsd xmm2, real8 ptr [r10 + 16]
movsd xmm3, real8 ptr [r10 + 24]
add r10, 32
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM0_XMM1_XMM2_XMM3, _TEXT

LEAF_ENTRY Load_XMM1, _TEXT
movsd xmm1, real8 ptr [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM1, _TEXT

LEAF_ENTRY Load_XMM1_XMM2, _TEXT
movsd xmm1, real8 ptr [r10]
movsd xmm2, real8 ptr [r10 + 8]
add r10, 16
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM1_XMM2, _TEXT

LEAF_ENTRY Load_XMM1_XMM2_XMM3, _TEXT
movsd xmm1, real8 ptr [r10]
movsd xmm2, real8 ptr [r10 + 8]
movsd xmm3, real8 ptr [r10 + 16]
add r10, 24
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM1_XMM2_XMM3, _TEXT

LEAF_ENTRY Load_XMM2, _TEXT
movsd xmm2, real8 ptr [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM2, _TEXT

LEAF_ENTRY Load_XMM2_XMM3, _TEXT
movsd xmm2, real8 ptr [r10]
movsd xmm3, real8 ptr [r10 + 8]
add r10, 16
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM2_XMM3, _TEXT

LEAF_ENTRY Load_XMM3, _TEXT
movsd xmm3, real8 ptr [r10]
add r10, 8
add r11, 8
jmp qword ptr [r11]
LEAF_END Load_XMM3, _TEXT

NESTED_ENTRY CallJittedMethodRetVoid, _TEXT
push_vol_reg rbp
mov rbp, rsp
END_PROLOGUE
add r9, 20h ; argument save area + alignment
sub rsp, r9 ; total stack space
mov r11, rcx ; The routines list
mov r10, rdx ; interpreter stack args
call qword ptr [r11]
mov rsp, rbp
pop rbp
ret
NESTED_END CallJittedMethodRetVoid, _TEXT

NESTED_ENTRY CallJittedMethodRetBuff, _TEXT
push_vol_reg rbp
mov rbp, rsp
END_PROLOGUE
add r9, 20h ; argument save area + alignment
sub rsp, r9 ; total stack space
mov r11, rcx ; The routines list
mov r10, rdx ; interpreter stack args
mov rcx, r8 ; return buffer
call qword ptr [r11]
mov rsp, rbp
pop rbp
ret
NESTED_END CallJittedMethodRetBuff, _TEXT

NESTED_ENTRY CallJittedMethodRetDouble, _TEXT
push_nonvol_reg rbp
mov rbp, rsp
push_vol_reg r8
push_vol_reg rax ; align
END_PROLOGUE
add r9, 20h ; argument save area + alignment
sub rsp, r9 ; total stack space
mov r11, rcx ; The routines list
mov r10, rdx ; interpreter stack args
call qword ptr [r11]
add rsp, 20h
mov r8, [rbp - 8]
movsd real8 ptr [r8], xmm0
mov rsp, rbp
pop rbp
ret
NESTED_END CallJittedMethodRetDouble, _TEXT

NESTED_ENTRY CallJittedMethodRetI8, _TEXT
push_nonvol_reg rbp
mov rbp, rsp
push_vol_reg r8
push_vol_reg rax ; align
END_PROLOGUE
add r9, 20h ; argument save area + alignment
sub rsp, r9 ; total stack space
mov r11, rcx ; The routines list
mov r10, rdx ; interpreter stack args
call qword ptr [r11]
add rsp, 20h
mov r8, [rbp - 8]
mov qword ptr [r8], rax
mov rsp, rbp
pop rbp
ret
NESTED_END CallJittedMethodRetI8, _TEXT

endif ; FEATURE_INTERPRETER

end
Loading
Loading