@@ -482,23 +482,6 @@ JIT_PollGCRarePath:
482482 TAILJMP_RAX
483483LEAF_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
504487LEAF_ENTRY ThisPtrRetBufPrecodeWorker , _TEXT
@@ -629,4 +612,305 @@ NESTED_ENTRY CallEHFilterFunclet, _TEXT
629612 ret
630613NESTED_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