13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
+
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
|
* file.
*/
#include "config.h"
#include "invoke-x86_64.h"
.globl of_invocation_call
.globl OFInvocationCall
.section .text
of_invocation_call:
OFInvocationCall:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
andq $-16, %rsp
movq %rdi, -8(%rbp)
movb OFFSET_RETURN_TYPE(%rdi), %r11b
cmpb $RETURN_TYPE_STRET, %r11b
movb offsetReturnType(%rdi), %r11b
cmpb $returnTypeStret, %r11b
je .Llookup_stret
cmpb $RETURN_TYPE_JMP_STRET, %r11b
cmpb $returnTypeJmpStret, %r11b
je .Llookup_stret
movq OFFSET_GPR_IN+8(%rdi), %rsi
movq OFFSET_GPR_IN+0(%rdi), %rdi
movq offsetGPRIn+8(%rdi), %rsi
movq offsetGPRIn+0(%rdi), %rdi
call objc_msg_lookup@PLT
.Lafter_lookup:
movq %rax, -16(%rbp)
movq -8(%rbp), %rdi
leaq OFFSET_STACK(%rdi), %rdx
movq OFFSET_STACK_SIZE(%rdi), %rcx
leaq offsetStack(%rdi), %rdx
movq offsetStackSize(%rdi), %rcx
testq $1, %rcx
jnz .Lfix_align
.Lfill_stack:
testq %rcx, %rcx
jz .Lstack_filled
decq %rcx
movq (%rdx,%rcx,8), %r11
pushq %r11
jmp .Lfill_stack
.Lstack_filled:
movb OFFSET_NUM_SSE_USED(%rdi), %al
movb offsetNumSSEUsed(%rdi), %al
movaps OFFSET_SSE_INOUT+112(%rdi), %xmm7
movaps OFFSET_SSE_INOUT+96(%rdi), %xmm6
movaps OFFSET_SSE_INOUT+80(%rdi), %xmm5
movaps OFFSET_SSE_INOUT+64(%rdi), %xmm4
movaps OFFSET_SSE_INOUT+48(%rdi), %xmm3
movaps OFFSET_SSE_INOUT+32(%rdi), %xmm2
movaps OFFSET_SSE_INOUT+16(%rdi), %xmm1
movaps OFFSET_SSE_INOUT(%rdi), %xmm0
movaps offsetSSEInOut+112(%rdi), %xmm7
movaps offsetSSEInOut+96(%rdi), %xmm6
movaps offsetSSEInOut+80(%rdi), %xmm5
movaps offsetSSEInOut+64(%rdi), %xmm4
movaps offsetSSEInOut+48(%rdi), %xmm3
movaps offsetSSEInOut+32(%rdi), %xmm2
movaps offsetSSEInOut+16(%rdi), %xmm1
movaps offsetSSEInOut(%rdi), %xmm0
movq OFFSET_GPR_IN+40(%rdi), %r9
movq OFFSET_GPR_IN+32(%rdi), %r8
movq OFFSET_GPR_IN+24(%rdi), %rcx
movq OFFSET_GPR_IN+16(%rdi), %rdx
movq OFFSET_GPR_IN+8(%rdi), %rsi
movq offsetGPRIn+40(%rdi), %r9
movq offsetGPRIn+32(%rdi), %r8
movq offsetGPRIn+24(%rdi), %rcx
movq offsetGPRIn+16(%rdi), %rdx
movq offsetGPRIn+8(%rdi), %rsi
movb OFFSET_RETURN_TYPE(%rdi), %r11b
movq OFFSET_GPR_IN(%rdi), %rdi
movb offsetReturnType(%rdi), %r11b
movq offsetGPRIn(%rdi), %rdi
cmpb $RETURN_TYPE_JMP, %r11b
cmpb $returnTypeJmp, %r11b
je .Ljmp_into_method
cmpb $RETURN_TYPE_JMP_STRET, %r11b
cmpb $returnTypeJmpStret, %r11b
je .Ljmp_into_method
movq -16(%rbp), %r11
call *%r11
.Lafter_send:
movq -8(%rbp), %rdi
movq %rax, OFFSET_GPR_OUT(%rdi)
movq %rdx, OFFSET_GPR_OUT+8(%rdi)
movaps %xmm0, OFFSET_SSE_INOUT(%rdi)
movaps %xmm1, OFFSET_SSE_INOUT+16(%rdi)
movq %rax, offsetGPROut(%rdi)
movq %rdx, offsetGPROut+8(%rdi)
movaps %xmm0, offsetSSEInOut(%rdi)
movaps %xmm1, offsetSSEInOut+16(%rdi)
movb OFFSET_RETURN_TYPE(%rdi), %r11b
movb offsetReturnType(%rdi), %r11b
cmpb $RETURN_TYPE_X87, %r11b
cmpb $returnTypeX87, %r11b
je .Lpop_long_double
cmpb $RETURN_TYPE_COMPLEX_X87, %r11b
cmpb $returnTypeComplexX87, %r11b
je .Lpop_complex_long_double
.Lreturn:
movq %rbp, %rsp
popq %rbp
ret
.Lfix_align:
xorq %r11, %r11
pushq %r11
jmp .Lfill_stack
.Llookup_stret:
movq OFFSET_GPR_IN+16(%rdi), %rsi
movq OFFSET_GPR_IN+8(%rdi), %rdi
movq offsetGPRIn+16(%rdi), %rsi
movq offsetGPRIn+8(%rdi), %rdi
call objc_msg_lookup_stret@PLT
jmp .Lafter_lookup
.Ljmp_into_method:
movq -16(%rbp), %r11
jmp *%r11
.Lpop_long_double:
fstpt OFFSET_X87_OUT(%rdi)
fstpt offsetX87Out(%rdi)
jmp .Lreturn
.Lpop_complex_long_double:
fstpt OFFSET_X87_OUT(%rdi)
fstpt OFFSET_X87_OUT+16(%rdi)
fstpt offsetX87Out(%rdi)
fstpt offsetX87Out+16(%rdi)
jmp .Lreturn
#ifdef OF_LINUX
.section .note.GNU-stack, "", %progbits
#endif
|