2 * Copyright (c) 1999-2009 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #include <TargetConditionals.h>
25 #if defined(__i386__) && TARGET_OS_SIMULATOR
27 #include "objc-config.h"
31 // _objc_entryPoints and _objc_exitPoints are used by objc
32 // to get the critical regions for which method caches
33 // cannot be garbage collected.
36 .private_extern _objc_entryPoints
40 .long _objc_msgSend_fpret
41 .long _objc_msgSend_stret
42 .long _objc_msgSendSuper
43 .long _objc_msgSendSuper2
44 .long _objc_msgSendSuper_stret
45 .long _objc_msgSendSuper2_stret
47 .long _objc_msgLookup_fpret
48 .long _objc_msgLookup_stret
49 .long _objc_msgLookupSuper2
50 .long _objc_msgLookupSuper2_stret
53 .private_extern _objc_exitPoints
55 .long LExit_cache_getImp
56 .long LExit_objc_msgSend
57 .long LExit_objc_msgSend_fpret
58 .long LExit_objc_msgSend_stret
59 .long LExit_objc_msgSendSuper
60 .long LExit_objc_msgSendSuper2
61 .long LExit_objc_msgSendSuper_stret
62 .long LExit_objc_msgSendSuper2_stret
63 .long LExit_objc_msgLookup
64 .long LExit_objc_msgLookup_fpret
65 .long LExit_objc_msgLookup_stret
66 .long LExit_objc_msgLookupSuper2
67 .long LExit_objc_msgLookupSuper2_stret
71 /********************************************************************
72 * List every exit insn from every messenger for debugger use.
75 * 1 word instruction's address
76 * 1 word type (ENTER or FAST_EXIT or SLOW_EXIT or NIL_EXIT)
80 * ENTER is the start of a dispatcher
81 * FAST_EXIT is method dispatch
82 * SLOW_EXIT is uncached method lookup
83 * NIL_EXIT is returning zero from a message sent to nil
84 * These must match objc-gdb.h.
85 ********************************************************************/
92 .section __DATA,__objc_msg_break
93 .globl _gdb_objc_messenger_breakpoints
94 _gdb_objc_messenger_breakpoints:
95 // contents populated by the macros below
97 .macro MESSENGER_START
99 .section __DATA,__objc_msg_break
104 .macro MESSENGER_END_FAST
106 .section __DATA,__objc_msg_break
111 .macro MESSENGER_END_SLOW
113 .section __DATA,__objc_msg_break
118 .macro MESSENGER_END_NIL
120 .section __DATA,__objc_msg_break
127 /********************************************************************
128 * Names for relative labels
129 * DO NOT USE THESE LABELS ELSEWHERE
130 * Reserved labels: 5: 6: 7: 8: 9:
131 ********************************************************************/
133 #define LCacheMiss_f 5f
134 #define LCacheMiss_b 5b
135 #define LNilTestDone 6
136 #define LNilTestDone_f 6f
137 #define LNilTestDone_b 6b
138 #define LNilTestSlow 7
139 #define LNilTestSlow_f 7f
140 #define LNilTestSlow_b 7b
141 #define LGetIsaDone 8
142 #define LGetIsaDone_f 8f
143 #define LGetIsaDone_b 8b
144 #define LGetIsaSlow 9
145 #define LGetIsaSlow_f 9f
146 #define LGetIsaSlow_b 9b
148 /********************************************************************
150 ********************************************************************/
162 /********************************************************************
164 * Structure definitions.
166 ********************************************************************/
176 #define struct_addr 4
179 #define super_stret 8
180 #define selector_stret 12
181 #define marg_size_stret 16
182 #define marg_list_stret 20
184 // objc_super parameter to sendSuper
188 // Selected field offsets in class structure
193 #define method_name 0
197 //////////////////////////////////////////////////////////////////////
199 // ENTRY functionName
201 // Assembly directives to begin an exported function.
203 // Takes: functionName - name of the exported function
204 //////////////////////////////////////////////////////////////////////
220 //////////////////////////////////////////////////////////////////////
222 // END_ENTRY functionName
224 // Assembly directives to end an exported function. Just a placeholder,
225 // a close-parenthesis for ENTRY, until it is needed for something.
227 // Takes: functionName - name of the exported function
228 //////////////////////////////////////////////////////////////////////
235 /********************************************************************
237 * Unwind info generation
238 ********************************************************************/
240 .section __LD,__compact_unwind,regular,debug
242 .set LUnwind$0, LExit$0 - $0
245 .long 0 /* no personality */
246 .long 0 /* no LSDA */
250 #define NoFrame 0x02010000 // no frame, no SP adjustment except return address
251 #define FrameWithNoSaves 0x01000000 // frame, no non-volatile saves
254 /////////////////////////////////////////////////////////////////////
256 // CacheLookup return-type, caller
258 // Locate the implementation for a selector in a class method cache.
261 // $0 = NORMAL, FPRET, STRET
262 // $1 = CALL, LOOKUP, GETIMP
263 // ecx = selector to search for
264 // edx = class to search
266 // On exit: ecx clobbered
267 // (found) calls or returns IMP in eax, eq/ne set for forwarding
268 // (not found) jumps to LCacheMiss, class still in edx
270 /////////////////////////////////////////////////////////////////////
274 // CacheHit must always be preceded by a not-taken `jne` instruction
275 // in case the imp is _objc_msgForward_impcache.
277 // eax = found bucket
280 movl 4(%eax), %eax // return imp
286 // eq already set for forwarding by `jne`
288 test %eax, %eax // set ne for stret forwarding
293 jmp *4(%eax) // call imp
296 movl 4(%eax), %eax // return imp
310 movzwl 12(%edx), %eax // eax = mask
311 andl %ecx, %eax // eax = SEL & mask
312 shll $$3, %eax // eax = offset = (SEL & mask) * 8
313 addl 8(%edx), %eax // eax = bucket = cache->buckets+offset
314 cmpl (%eax), %ecx // if (bucket->sel != SEL)
316 // The `jne` above sets flags for CacheHit
317 CacheHit $0, $1 // call or return imp
322 jbe 3f // if (bucket->sel <= 1) wrap or miss
324 addl $$8, %eax // bucket++
326 cmpl (%eax), %ecx // if (bucket->sel != sel)
328 // The `jne` above sets flags for CacheHit
329 CacheHit $0, $1 // call or return imp
333 jb LCacheMiss_f // if (bucket->sel < 1) cache miss
335 movl 4(%eax), %eax // bucket->imp is really first bucket
338 // Clone scanning loop to miss instead of hang when cache is corrupt.
339 // The slow path may detect any corruption and halt later.
344 jbe 3f // if (bucket->sel <= 1) wrap or miss
346 addl $$8, %eax // bucket++
348 cmpl (%eax), %ecx // if (bucket->sel != sel)
350 // The `jne` above sets flags for CacheHit
351 CacheHit $0, $1 // call or return imp
354 // double wrap or miss
360 /////////////////////////////////////////////////////////////////////
362 // MethodTableLookup NORMAL|STRET
365 // receiver (not struct objc_super) and selector on stack
366 // edx = class to search
368 // On exit: IMP in eax, eq/ne set for forwarding
370 /////////////////////////////////////////////////////////////////////
372 .macro MethodTableLookup
376 subl $$(8+5*16), %esp
379 movl self+4(%ebp), %eax
380 movl selector+4(%ebp), %ecx
382 movl self_stret+4(%ebp), %eax
383 movl selector_stret+4(%ebp), %ecx
386 movdqa %xmm3, 4*16(%esp)
387 movdqa %xmm2, 3*16(%esp)
388 movdqa %xmm1, 2*16(%esp)
389 movdqa %xmm0, 1*16(%esp)
391 movl %edx, 8(%esp) // class
392 movl %ecx, 4(%esp) // selector
393 movl %eax, 0(%esp) // receiver
394 call __class_lookupMethodAndLoadCache3
398 movdqa 4*16(%esp), %xmm3
399 movdqa 3*16(%esp), %xmm2
400 movdqa 2*16(%esp), %xmm1
401 movdqa 1*16(%esp), %xmm0
404 cmp %eax, %eax // set eq for nonstret forwarding
406 test %eax, %eax // set ne for stret forwarding
414 /////////////////////////////////////////////////////////////////////
416 // NilTest return-type
418 // Takes: $0 = NORMAL or FPRET or STRET
421 // On exit: Loads non-nil receiver in eax and self(esp) or self_stret(esp),
424 // NilTestReturnZero return-type
426 // Takes: $0 = NORMAL or FPRET or STRET
429 // On exit: Loads non-nil receiver in eax and self(esp) or self_stret(esp),
432 // NilTestReturnIMP return-type
434 // Takes: $0 = NORMAL or FPRET or STRET
437 // On exit: Loads non-nil receiver in eax and self(esp) or self_stret(esp),
438 // or returns an IMP in eax that returns zero.
440 /////////////////////////////////////////////////////////////////////
449 .macro ZeroReturnFPRET
453 .macro ZeroReturnSTRET
457 STATIC_ENTRY __objc_msgNil
460 END_ENTRY __objc_msgNil
462 STATIC_ENTRY __objc_msgNil_fpret
465 END_ENTRY __objc_msgNil_fpret
467 STATIC_ENTRY __objc_msgNil_stret
470 END_ENTRY __objc_msgNil_stret
479 .macro NilTestReturnZero
500 .macro NilTestReturnIMP
507 leal __objc_msgNil-1b(%eax), %eax
509 leal __objc_msgNil_fpret-1b(%eax), %eax
511 leal __objc_msgNil_stret-1b(%eax), %eax
519 /********************************************************************
520 * IMP _cache_getImp(Class cls, SEL sel)
522 * If found, returns method implementation.
523 * If not found, returns NULL.
524 ********************************************************************/
526 STATIC_ENTRY _cache_getImp
528 // load the class and selector
529 movl selector(%esp), %ecx
530 movl self(%esp), %edx
532 CacheLookup NORMAL, GETIMP // returns IMP on success
535 // cache miss, return nil
539 END_ENTRY _cache_getImp
542 /********************************************************************
544 * id objc_msgSend(id self, SEL _cmd, ...);
545 * IMP objc_msgLookup(id self, SEL _cmd, ...);
547 * objc_msgLookup ABI:
548 * IMP returned in eax
549 * Forwarding returned in Z flag
550 * edx reserved for our use but not used
552 ********************************************************************/
555 UNWIND _objc_msgSend, NoFrame
558 movl selector(%esp), %ecx
559 movl self(%esp), %eax
563 movl isa(%eax), %edx // class = self->isa
564 CacheLookup NORMAL, CALL // calls IMP on success
566 NilTestReturnZero NORMAL
571 jmp __objc_msgSend_uncached
573 END_ENTRY _objc_msgSend
576 ENTRY _objc_msgLookup
577 UNWIND _objc_msgLookup, NoFrame
579 movl selector(%esp), %ecx
580 movl self(%esp), %eax
584 movl isa(%eax), %edx // class = self->isa
585 CacheLookup NORMAL, LOOKUP // returns IMP on success
587 NilTestReturnIMP NORMAL
591 jmp __objc_msgLookup_uncached
593 END_ENTRY _objc_msgLookup
596 /********************************************************************
598 * id objc_msgSendSuper(struct objc_super *super, SEL _cmd, ...);
599 * IMP objc_msgLookupSuper(struct objc_super *super, SEL _cmd, ...);
601 ********************************************************************/
603 ENTRY _objc_msgSendSuper
604 UNWIND _objc_msgSendSuper, NoFrame
607 movl selector(%esp), %ecx
608 movl super(%esp), %eax // struct objc_super
609 movl class(%eax), %edx // struct objc_super->class
610 movl receiver(%eax), %eax // struct objc_super->receiver
611 movl %eax, super(%esp) // replace super arg with receiver
612 CacheLookup NORMAL, CALL // calls IMP on success
615 // class still in edx
617 jmp __objc_msgSend_uncached
619 END_ENTRY _objc_msgSendSuper
623 ENTRY _objc_msgLookupSuper
624 UNWIND _objc_msgLookupSuper, NoFrame
626 movl selector(%esp), %ecx
627 movl super(%esp), %eax // struct objc_super
628 movl class(%eax), %edx // struct objc_super->class
629 movl receiver(%eax), %eax // struct objc_super->receiver
630 movl %eax, super(%esp) // replace super arg with receiver
631 CacheLookup NORMAL, LOOKUP // returns IMP on success
634 // class still in edx
635 jmp __objc_msgLookup_uncached
637 END_ENTRY _objc_msgLookupSuper
640 /********************************************************************
642 * id objc_msgSendSuper2(struct objc_super *super, SEL _cmd, ...);
643 * IMP objc_msgLookupSuper2(struct objc_super *super, SEL _cmd, ...);
645 ********************************************************************/
647 ENTRY _objc_msgSendSuper2
648 UNWIND _objc_msgSendSuper2, NoFrame
651 movl selector(%esp), %ecx
652 movl super(%esp), %eax // struct objc_super
653 movl class(%eax), %edx // struct objc_super->class
654 movl receiver(%eax), %eax // struct objc_super->receiver
655 movl %eax, super(%esp) // replace super arg with receiver
656 movl superclass(%edx), %edx // edx = objc_super->class->super_class
657 CacheLookup NORMAL, CALL // calls IMP on success
660 // class still in edx
662 jmp __objc_msgSend_uncached
664 END_ENTRY _objc_msgSendSuper2
667 ENTRY _objc_msgLookupSuper2
668 UNWIND _objc_msgLookupSuper2, NoFrame
670 movl selector(%esp), %ecx
671 movl super(%esp), %eax // struct objc_super
672 movl class(%eax), %edx // struct objc_super->class
673 movl receiver(%eax), %eax // struct objc_super->receiver
674 movl %eax, super(%esp) // replace super arg with receiver
675 movl superclass(%edx), %edx // edx = objc_super->class->super_class
676 CacheLookup NORMAL, LOOKUP // returns IMP on success
679 // class still in edx
680 jmp __objc_msgLookup_uncached
682 END_ENTRY _objc_msgLookupSuper2
685 /********************************************************************
687 * double objc_msgSend_fpret(id self, SEL _cmd, ...);
688 * IMP objc_msgLookup_fpret(id self, SEL _cmd, ...);
690 ********************************************************************/
692 ENTRY _objc_msgSend_fpret
693 UNWIND _objc_msgSend_fpret, NoFrame
696 movl selector(%esp), %ecx
697 movl self(%esp), %eax
701 movl isa(%eax), %edx // class = self->isa
702 CacheLookup FPRET, CALL // calls IMP on success
704 NilTestReturnZero FPRET
707 // class still in edx
709 jmp __objc_msgSend_uncached
711 END_ENTRY _objc_msgSend_fpret
714 ENTRY _objc_msgLookup_fpret
715 UNWIND _objc_msgLookup_fpret, NoFrame
717 movl selector(%esp), %ecx
718 movl self(%esp), %eax
722 movl isa(%eax), %edx // class = self->isa
723 CacheLookup FPRET, LOOKUP // returns IMP on success
725 NilTestReturnIMP FPRET
728 // class still in edx
729 jmp __objc_msgLookup_uncached
731 END_ENTRY _objc_msgLookup_fpret
734 /********************************************************************
736 * void objc_msgSend_stret(void *st_addr, id self, SEL _cmd, ...);
737 * IMP objc_msgLookup_stret(void *st_addr, id self, SEL _cmd, ...);
739 ********************************************************************/
741 ENTRY _objc_msgSend_stret
742 UNWIND _objc_msgSend_stret, NoFrame
745 movl selector_stret(%esp), %ecx
746 movl self_stret(%esp), %eax
750 movl isa(%eax), %edx // class = self->isa
751 CacheLookup STRET, CALL // calls IMP on success
753 NilTestReturnZero STRET
756 // class still in edx
758 jmp __objc_msgSend_stret_uncached
760 END_ENTRY _objc_msgSend_stret
763 ENTRY _objc_msgLookup_stret
764 UNWIND _objc_msgLookup_stret, NoFrame
766 movl selector_stret(%esp), %ecx
767 movl self_stret(%esp), %eax
771 movl isa(%eax), %edx // class = self->isa
772 CacheLookup STRET, LOOKUP // returns IMP on success
774 NilTestReturnIMP STRET
777 // class still in edx
778 jmp __objc_msgLookup_stret_uncached
780 END_ENTRY _objc_msgLookup_stret
783 /********************************************************************
785 * void objc_msgSendSuper_stret(void *st_addr, struct objc_super *super, SEL _cmd, ...);
786 * IMP objc_msgLookupSuper_stret(void *st_addr, struct objc_super *super, SEL _cmd, ...);
788 ********************************************************************/
790 ENTRY _objc_msgSendSuper_stret
791 UNWIND _objc_msgSendSuper_stret, NoFrame
794 movl selector_stret(%esp), %ecx
795 movl super_stret(%esp), %eax // struct objc_super
796 movl class(%eax), %edx // struct objc_super->class
797 movl receiver(%eax), %eax // struct objc_super->receiver
798 movl %eax, super_stret(%esp) // replace super arg with receiver
799 CacheLookup STRET, CALL // calls IMP on success
802 // class still in edx
804 jmp __objc_msgSend_stret_uncached
806 END_ENTRY _objc_msgSendSuper_stret
809 ENTRY _objc_msgLookupSuper_stret
810 UNWIND _objc_msgLookupSuper_stret, NoFrame
812 movl selector_stret(%esp), %ecx
813 movl super_stret(%esp), %eax // struct objc_super
814 movl class(%eax), %edx // struct objc_super->class
815 movl receiver(%eax), %eax // struct objc_super->receiver
816 movl %eax, super_stret(%esp) // replace super arg with receiver
817 CacheLookup STRET, LOOKUP // returns IMP on success
820 // class still in edx
821 jmp __objc_msgLookup_stret_uncached
823 END_ENTRY _objc_msgLookupSuper_stret
826 /********************************************************************
828 * void objc_msgSendSuper2_stret(void *st_addr, struct objc_super *super, SEL _cmd, ...);
829 * IMP objc_msgLookupSuper2_stret(void *st_addr, struct objc_super *super, SEL _cmd, ...);
831 ********************************************************************/
833 ENTRY _objc_msgSendSuper2_stret
834 UNWIND _objc_msgSendSuper2_stret, NoFrame
837 movl selector_stret(%esp), %ecx
838 movl super_stret(%esp), %eax // struct objc_super
839 movl class(%eax), %edx // struct objc_super->class
840 movl receiver(%eax), %eax // struct objc_super->receiver
841 movl %eax, super_stret(%esp) // replace super arg with receiver
842 mov superclass(%edx), %edx // edx = objc_super->class->super_class
843 CacheLookup STRET, CALL // calls IMP on success
845 // cache miss: go search the method lists
847 // class still in edx
849 jmp __objc_msgSend_stret_uncached
851 END_ENTRY _objc_msgSendSuper2_stret
854 ENTRY _objc_msgLookupSuper2_stret
855 UNWIND _objc_msgLookupSuper2_stret, NoFrame
857 movl selector_stret(%esp), %ecx
858 movl super_stret(%esp), %eax // struct objc_super
859 movl class(%eax), %edx // struct objc_super->class
860 movl receiver(%eax), %eax // struct objc_super->receiver
861 movl %eax, super_stret(%esp) // replace super arg with receiver
862 mov superclass(%edx), %edx // edx = objc_super->class->super_class
863 CacheLookup STRET, LOOKUP // returns IMP on success
865 // cache miss: go search the method lists
867 // class still in edx
868 jmp __objc_msgLookup_stret_uncached
870 END_ENTRY _objc_msgLookupSuper2_stret
873 /********************************************************************
875 * _objc_msgSend_uncached
876 * _objc_msgSend_stret_uncached
877 * _objc_msgLookup_uncached
878 * _objc_msgLookup_stret_uncached
880 * The uncached method lookup.
882 ********************************************************************/
884 STATIC_ENTRY __objc_msgSend_uncached
885 UNWIND __objc_msgSend_uncached, FrameWithNoSaves
887 // THIS IS NOT A CALLABLE C FUNCTION
888 // Out-of-band edx is the searched class
890 // edx is already the class to search
891 MethodTableLookup NORMAL
892 jmp *%eax // call imp
894 END_ENTRY __objc_msgSend_uncached
897 STATIC_ENTRY __objc_msgSend_stret_uncached
898 UNWIND __objc_msgSend_stret_uncached, FrameWithNoSaves
900 // THIS IS NOT A CALLABLE C FUNCTION
901 // Out-of-band edx is the searched class
903 // edx is already the class to search
904 MethodTableLookup STRET
905 jmp *%eax // call imp
907 END_ENTRY __objc_msgSend_stret_uncached
910 STATIC_ENTRY __objc_msgLookup_uncached
911 UNWIND __objc_msgLookup_uncached, FrameWithNoSaves
913 // THIS IS NOT A CALLABLE C FUNCTION
914 // Out-of-band edx is the searched class
916 // edx is already the class to search
917 MethodTableLookup NORMAL // eax = IMP
920 END_ENTRY __objc_msgLookup_uncached
923 STATIC_ENTRY __objc_msgLookup_stret_uncached
924 UNWIND __objc_msgLookup_stret_uncached, FrameWithNoSaves
926 // THIS IS NOT A CALLABLE C FUNCTION
927 // Out-of-band edx is the searched class
929 // edx is already the class to search
930 MethodTableLookup STRET // eax = IMP
933 END_ENTRY __objc_msgLookup_stret_uncached
936 /********************************************************************
938 * id _objc_msgForward(id self, SEL _cmd,...);
940 * _objc_msgForward and _objc_msgForward_stret are the externally-callable
941 * functions returned by things like method_getImplementation().
942 * _objc_msgForward_impcache is the function pointer actually stored in
945 ********************************************************************/
947 .non_lazy_symbol_pointer
949 .indirect_symbol __objc_forward_handler
951 L_forward_stret_handler:
952 .indirect_symbol __objc_forward_stret_handler
955 STATIC_ENTRY __objc_msgForward_impcache
956 // Method cache version
958 // THIS IS NOT A CALLABLE C FUNCTION
959 // Out-of-band condition register is NE for stret, EQ otherwise.
965 jne __objc_msgForward_stret
966 jmp __objc_msgForward
968 END_ENTRY _objc_msgForward_impcache
971 ENTRY __objc_msgForward
972 // Non-struct return version
976 movl L_forward_handler-1b(%edx), %edx
979 END_ENTRY __objc_msgForward
982 ENTRY __objc_msgForward_stret
983 // Struct return version
987 movl L_forward_stret_handler-1b(%edx), %edx
990 END_ENTRY __objc_msgForward_stret
993 ENTRY _objc_msgSend_debug
995 END_ENTRY _objc_msgSend_debug
997 ENTRY _objc_msgSendSuper2_debug
998 jmp _objc_msgSendSuper2
999 END_ENTRY _objc_msgSendSuper2_debug
1001 ENTRY _objc_msgSend_stret_debug
1002 jmp _objc_msgSend_stret
1003 END_ENTRY _objc_msgSend_stret_debug
1005 ENTRY _objc_msgSendSuper2_stret_debug
1006 jmp _objc_msgSendSuper2_stret
1007 END_ENTRY _objc_msgSendSuper2_stret_debug
1009 ENTRY _objc_msgSend_fpret_debug
1010 jmp _objc_msgSend_fpret
1011 END_ENTRY _objc_msgSend_fpret_debug
1014 ENTRY _objc_msgSend_noarg
1016 END_ENTRY _objc_msgSend_noarg
1019 ENTRY _method_invoke
1021 movl selector(%esp), %ecx
1022 movl method_name(%ecx), %edx
1023 movl method_imp(%ecx), %eax
1024 movl %edx, selector(%esp)
1027 END_ENTRY _method_invoke
1030 ENTRY _method_invoke_stret
1032 movl selector_stret(%esp), %ecx
1033 movl method_name(%ecx), %edx
1034 movl method_imp(%ecx), %eax
1035 movl %edx, selector_stret(%esp)
1038 END_ENTRY _method_invoke_stret
1041 .section __DATA,__objc_msg_break