Skip to content

Commit 97424fe

Browse files
authored
Interpreter to JIT/AOT calls (#115375)
* Intepreter to JIT/AOT calls This change adds support for making calls from the interpreter to JIT/AOT generated code. For each target method, it parses the signature and creates a list of hand written asm routines that transfer the arguments from the interpreter stack to the CPU registers / stack based on the native calling convention, call the target method and then places the return value to the interpreter stack. This list is cached in the MethodDescData so that for repeated calls to the same method, it doesn't need to be re-generated. * Calling convention testing * Cleanup, comments and apple arm64 fix * Fix test build break and cleanup Apple arm64 stack args handling * Fix build break * Fix Unix x64 build break * Fix some contracts and a bug in args by ref introduced in a previous commit * Move to allocations from LoaderHeap * PR feedback * PR feedback 2 * PR feedback 3 * Wrap all the asm helpers in #ifdef FEATURE_INTERPRETER
1 parent a50dedf commit 97424fe

File tree

11 files changed

+3645
-60
lines changed

11 files changed

+3645
-60
lines changed

src/coreclr/vm/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ set(VM_SOURCES_WKS
304304
callconvbuilder.cpp
305305
callhelpers.cpp
306306
callsiteinspect.cpp
307+
callstubgenerator.cpp
307308
clrconfignative.cpp
308309
clrex.cpp
309310
clrvarargs.cpp
@@ -449,6 +450,7 @@ set(VM_HEADERS_WKS
449450
interoputil.inl
450451
interpexec.h
451452
interpframeallocator.h
453+
callstubgenerator.h
452454
invokeutil.h
453455
managedmdimport.hpp
454456
marshalnative.h

src/coreclr/vm/amd64/AsmHelpers.asm

Lines changed: 301 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -482,23 +482,6 @@ JIT_PollGCRarePath:
482482
TAILJMP_RAX
483483
LEAF_END JIT_PollGC, _TEXT
484484

485-
ifdef FEATURE_INTERPRETER
486-
NESTED_ENTRY InterpreterStub, _TEXT
487-
488-
PROLOG_WITH_TRANSITION_BLOCK
489-
490-
;
491-
; call ExecuteInterpretedMethod
492-
;
493-
lea rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock*
494-
mov rdx, METHODDESC_REGISTER
495-
call ExecuteInterpretedMethod
496-
497-
EPILOG_WITH_TRANSITION_BLOCK_RETURN
498-
499-
NESTED_END InterpreterStub, _TEXT
500-
endif ; FEATURE_INTERPRETER
501-
502485
; rcx -This pointer
503486
; rdx -ReturnBuffer
504487
LEAF_ENTRY ThisPtrRetBufPrecodeWorker, _TEXT
@@ -629,4 +612,305 @@ NESTED_ENTRY CallEHFilterFunclet, _TEXT
629612
ret
630613
NESTED_END CallEHFilterFunclet, _TEXT
631614

615+
ifdef FEATURE_INTERPRETER
616+
617+
NESTED_ENTRY InterpreterStub, _TEXT
618+
619+
PROLOG_WITH_TRANSITION_BLOCK
620+
621+
;
622+
; call ExecuteInterpretedMethod
623+
;
624+
lea rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock*
625+
mov rdx, METHODDESC_REGISTER
626+
call ExecuteInterpretedMethod
627+
628+
EPILOG_WITH_TRANSITION_BLOCK_RETURN
629+
630+
NESTED_END InterpreterStub, _TEXT
631+
632+
; Copy arguments from the interpreter stack to the processor stack.
633+
; The CPU stack slots are aligned to pointer size.
634+
LEAF_ENTRY Load_Stack, _TEXT
635+
push rdi
636+
push rsi
637+
push rcx
638+
mov edi, dword ptr [r11 + 8] ; SP offset
639+
mov ecx, dword ptr [r11 + 12] ; number of stack slots
640+
add edi, 20h ; the 3 pushes above plus return address
641+
add rdi, rsp
642+
mov rsi, r10
643+
shr rcx, 3
644+
rep movsq
645+
mov r10, rsi
646+
pop rcx
647+
pop rsi
648+
pop rdi
649+
add r11, 16
650+
jmp qword ptr [r11]
651+
LEAF_END Load_Stack, _TEXT
652+
653+
; Routines for passing value type arguments by reference in general purpose registers RCX, RDX, R8, R9
654+
655+
LEAF_ENTRY Load_Ref_RCX, _TEXT
656+
mov rcx, r10
657+
add r10, [r11 + 8] ; size of the value type
658+
add r11, 16
659+
jmp qword ptr [r11]
660+
LEAF_END Load_Ref_RCX, _TEXT
661+
662+
LEAF_ENTRY Load_Ref_RDX, _TEXT
663+
mov rdx, r10
664+
add r10, [r11 + 8] ; size of the value type
665+
add r11, 16
666+
jmp qword ptr [r11]
667+
LEAF_END Load_Ref_RDX, _TEXT
668+
669+
LEAF_ENTRY Load_Ref_R8, _TEXT
670+
mov r8, r10
671+
add r10, [r11 + 8] ; size of the value type
672+
add r11, 16
673+
jmp qword ptr [r11]
674+
LEAF_END Load_Ref_R8, _TEXT
675+
676+
LEAF_ENTRY Load_Ref_R9, _TEXT
677+
mov r9, r10
678+
add r10, [r11 + 8] ; size of the value type
679+
add r11, 16
680+
jmp qword ptr [r11]
681+
LEAF_END Load_Ref_R9, _TEXT
682+
683+
; Routines for passing arguments by value in general purpose registers RCX, RDX, R8, R9
684+
685+
LEAF_ENTRY Load_RCX, _TEXT
686+
mov rcx, [r10]
687+
add r10, 8
688+
add r11, 8
689+
jmp qword ptr [r11]
690+
LEAF_END Load_RCX, _TEXT
691+
692+
LEAF_ENTRY Load_RCX_RDX, _TEXT
693+
mov rcx, [r10]
694+
mov rdx, [r10 + 8]
695+
add r10, 16
696+
add r11, 8
697+
jmp qword ptr [r11]
698+
LEAF_END Load_RCX_RDX, _TEXT
699+
700+
LEAF_ENTRY Load_RCX_RDX_R8, _TEXT
701+
mov rcx, [r10]
702+
mov rdx, [r10 + 8]
703+
mov r8, [r10 + 16]
704+
add r10, 24
705+
add r11, 8
706+
jmp qword ptr [r11]
707+
LEAF_END Load_RCX_RDX_R8, _TEXT
708+
709+
LEAF_ENTRY Load_RCX_RDX_R8_R9, _TEXT
710+
mov rcx, [r10]
711+
mov rdx, [r10 + 8]
712+
mov r8, [r10 + 16]
713+
mov r9, [r10 + 24]
714+
add r10, 32
715+
add r11, 8
716+
jmp qword ptr [r11]
717+
LEAF_END Load_RCX_RDX_R8_R9, _TEXT
718+
719+
LEAF_ENTRY Load_RDX, _TEXT
720+
mov rdx, [r10]
721+
add r10, 8
722+
add r11, 8
723+
jmp qword ptr [r11]
724+
LEAF_END Load_RDX, _TEXT
725+
726+
LEAF_ENTRY Load_RDX_R8, _TEXT
727+
mov rdx, [r10]
728+
mov r8, [r10 + 8]
729+
add r10, 16
730+
add r11, 8
731+
jmp qword ptr [r11]
732+
LEAF_END Load_RDX_R8, _TEXT
733+
734+
LEAF_ENTRY Load_RDX_R8_R9, _TEXT
735+
mov rdx, [r10]
736+
mov r8, [r10 + 8]
737+
mov r9, [r10 + 16]
738+
add r10, 24
739+
add r11, 8
740+
jmp qword ptr [r11]
741+
LEAF_END Load_RDX_R8_R9, _TEXT
742+
743+
LEAF_ENTRY Load_R8, _TEXT
744+
mov r8, [r10]
745+
add r10, 8
746+
add r11, 8
747+
jmp qword ptr [r11]
748+
LEAF_END Load_R8, _TEXT
749+
750+
LEAF_ENTRY Load_R8_R9, _TEXT
751+
mov r8, [r10]
752+
mov r9, [r10 + 8]
753+
add r10, 16
754+
add r11, 8
755+
jmp qword ptr [r11]
756+
LEAF_END Load_R8_R9, _TEXT
757+
758+
LEAF_ENTRY Load_R9, _TEXT
759+
mov r9, [r10]
760+
add r10, 8
761+
add r11, 8
762+
jmp qword ptr [r11]
763+
LEAF_END Load_R9, _TEXT
764+
765+
; Routines for passing arguments in floating point registers XMM0..XMM3
766+
767+
LEAF_ENTRY Load_XMM0, _TEXT
768+
movsd xmm0, real8 ptr [r10]
769+
add r10, 8
770+
add r11, 8
771+
jmp qword ptr [r11]
772+
LEAF_END Load_XMM0, _TEXT
773+
774+
LEAF_ENTRY Load_XMM0_XMM1, _TEXT
775+
movsd xmm0, real8 ptr [r10]
776+
movsd xmm1, real8 ptr [r10 + 8]
777+
add r10, 10h
778+
add r11, 8
779+
jmp qword ptr [r11]
780+
LEAF_END Load_XMM0_XMM1, _TEXT
781+
782+
LEAF_ENTRY Load_XMM0_XMM1_XMM2, _TEXT
783+
movsd xmm0, real8 ptr [r10]
784+
movsd xmm1, real8 ptr [r10 + 8]
785+
movsd xmm2, real8 ptr [r10 + 16]
786+
add r10, 24
787+
add r11, 8
788+
jmp qword ptr [r11]
789+
LEAF_END Load_XMM0_XMM1_XMM2, _TEXT
790+
791+
LEAF_ENTRY Load_XMM0_XMM1_XMM2_XMM3, _TEXT
792+
movsd xmm0, real8 ptr [r10]
793+
movsd xmm1, real8 ptr [r10 + 8]
794+
movsd xmm2, real8 ptr [r10 + 16]
795+
movsd xmm3, real8 ptr [r10 + 24]
796+
add r10, 32
797+
add r11, 8
798+
jmp qword ptr [r11]
799+
LEAF_END Load_XMM0_XMM1_XMM2_XMM3, _TEXT
800+
801+
LEAF_ENTRY Load_XMM1, _TEXT
802+
movsd xmm1, real8 ptr [r10]
803+
add r10, 8
804+
add r11, 8
805+
jmp qword ptr [r11]
806+
LEAF_END Load_XMM1, _TEXT
807+
808+
LEAF_ENTRY Load_XMM1_XMM2, _TEXT
809+
movsd xmm1, real8 ptr [r10]
810+
movsd xmm2, real8 ptr [r10 + 8]
811+
add r10, 16
812+
add r11, 8
813+
jmp qword ptr [r11]
814+
LEAF_END Load_XMM1_XMM2, _TEXT
815+
816+
LEAF_ENTRY Load_XMM1_XMM2_XMM3, _TEXT
817+
movsd xmm1, real8 ptr [r10]
818+
movsd xmm2, real8 ptr [r10 + 8]
819+
movsd xmm3, real8 ptr [r10 + 16]
820+
add r10, 24
821+
add r11, 8
822+
jmp qword ptr [r11]
823+
LEAF_END Load_XMM1_XMM2_XMM3, _TEXT
824+
825+
LEAF_ENTRY Load_XMM2, _TEXT
826+
movsd xmm2, real8 ptr [r10]
827+
add r10, 8
828+
add r11, 8
829+
jmp qword ptr [r11]
830+
LEAF_END Load_XMM2, _TEXT
831+
832+
LEAF_ENTRY Load_XMM2_XMM3, _TEXT
833+
movsd xmm2, real8 ptr [r10]
834+
movsd xmm3, real8 ptr [r10 + 8]
835+
add r10, 16
836+
add r11, 8
837+
jmp qword ptr [r11]
838+
LEAF_END Load_XMM2_XMM3, _TEXT
839+
840+
LEAF_ENTRY Load_XMM3, _TEXT
841+
movsd xmm3, real8 ptr [r10]
842+
add r10, 8
843+
add r11, 8
844+
jmp qword ptr [r11]
845+
LEAF_END Load_XMM3, _TEXT
846+
847+
NESTED_ENTRY CallJittedMethodRetVoid, _TEXT
848+
push_vol_reg rbp
849+
mov rbp, rsp
850+
END_PROLOGUE
851+
add r9, 20h ; argument save area + alignment
852+
sub rsp, r9 ; total stack space
853+
mov r11, rcx ; The routines list
854+
mov r10, rdx ; interpreter stack args
855+
call qword ptr [r11]
856+
mov rsp, rbp
857+
pop rbp
858+
ret
859+
NESTED_END CallJittedMethodRetVoid, _TEXT
860+
861+
NESTED_ENTRY CallJittedMethodRetBuff, _TEXT
862+
push_vol_reg rbp
863+
mov rbp, rsp
864+
END_PROLOGUE
865+
add r9, 20h ; argument save area + alignment
866+
sub rsp, r9 ; total stack space
867+
mov r11, rcx ; The routines list
868+
mov r10, rdx ; interpreter stack args
869+
mov rcx, r8 ; return buffer
870+
call qword ptr [r11]
871+
mov rsp, rbp
872+
pop rbp
873+
ret
874+
NESTED_END CallJittedMethodRetBuff, _TEXT
875+
876+
NESTED_ENTRY CallJittedMethodRetDouble, _TEXT
877+
push_nonvol_reg rbp
878+
mov rbp, rsp
879+
push_vol_reg r8
880+
push_vol_reg rax ; align
881+
END_PROLOGUE
882+
add r9, 20h ; argument save area + alignment
883+
sub rsp, r9 ; total stack space
884+
mov r11, rcx ; The routines list
885+
mov r10, rdx ; interpreter stack args
886+
call qword ptr [r11]
887+
add rsp, 20h
888+
mov r8, [rbp - 8]
889+
movsd real8 ptr [r8], xmm0
890+
mov rsp, rbp
891+
pop rbp
892+
ret
893+
NESTED_END CallJittedMethodRetDouble, _TEXT
894+
895+
NESTED_ENTRY CallJittedMethodRetI8, _TEXT
896+
push_nonvol_reg rbp
897+
mov rbp, rsp
898+
push_vol_reg r8
899+
push_vol_reg rax ; align
900+
END_PROLOGUE
901+
add r9, 20h ; argument save area + alignment
902+
sub rsp, r9 ; total stack space
903+
mov r11, rcx ; The routines list
904+
mov r10, rdx ; interpreter stack args
905+
call qword ptr [r11]
906+
add rsp, 20h
907+
mov r8, [rbp - 8]
908+
mov qword ptr [r8], rax
909+
mov rsp, rbp
910+
pop rbp
911+
ret
912+
NESTED_END CallJittedMethodRetI8, _TEXT
913+
914+
endif ; FEATURE_INTERPRETER
915+
632916
end

0 commit comments

Comments
 (0)