@@ -482,23 +482,6 @@ JIT_PollGCRarePath:
482
482
TAILJMP_RAX
483
483
LEAF_END JIT_PollGC , _TEXT
484
484
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
-
502
485
; rcx -This pointer
503
486
; rdx -ReturnBuffer
504
487
LEAF_ENTRY ThisPtrRetBufPrecodeWorker , _TEXT
@@ -629,4 +612,305 @@ NESTED_ENTRY CallEHFilterFunclet, _TEXT
629
612
ret
630
613
NESTED_END CallEHFilterFunclet , _TEXT
631
614
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
+
632
916
end
0 commit comments