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
139
140
|
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
139
140
|
-
+
-
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
|
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
andq $-16, %rsp
movq %rdi, -8(%rbp)
movb 225(%rdi), %r11b
movb OFFSET_RETURN_TYPE(%rdi), %r11b
cmpb $RETURN_TYPE_STRET, %r11b
je .lookup_stret
cmpb $RETURN_TYPE_JMP_STRET, %r11b
je .lookup_stret
movq 8(%rdi), %rsi
movq 0(%rdi), %rdi
movq OFFSET_GPR_IN+8(%rdi), %rsi
movq OFFSET_GPR_IN+0(%rdi), %rdi
call objc_msg_lookup@PLT
.after_lookup:
movq %rax, -16(%rbp)
movq -8(%rbp), %rdi
leaq 240(%rdi), %rdx
movq 232(%rdi), %rcx
leaq OFFSET_STACK(%rdi), %rdx
movq OFFSET_STACK_SIZE(%rdi), %rcx
testq $1, %rcx
jnz .fix_align
.fill_stack:
testq %rcx, %rcx
jz .stack_filled
decq %rcx
movq (%rdx,%rcx,8), %r11
pushq %r11
jmp .fill_stack
.stack_filled:
movb 224(%rdi), %al
movb OFFSET_NUM_SSE_USED(%rdi), %al
movdqa 176(%rdi), %xmm7
movdqa 160(%rdi), %xmm6
movdqa 144(%rdi), %xmm5
movdqa 128(%rdi), %xmm4
movdqa 112(%rdi), %xmm3
movdqa 96(%rdi), %xmm2
movdqa 80(%rdi), %xmm1
movdqa 64(%rdi), %xmm0
movdqa OFFSET_SSE_INOUT+112(%rdi), %xmm7
movdqa OFFSET_SSE_INOUT+96(%rdi), %xmm6
movdqa OFFSET_SSE_INOUT+80(%rdi), %xmm5
movdqa OFFSET_SSE_INOUT+64(%rdi), %xmm4
movdqa OFFSET_SSE_INOUT+48(%rdi), %xmm3
movdqa OFFSET_SSE_INOUT+32(%rdi), %xmm2
movdqa OFFSET_SSE_INOUT+16(%rdi), %xmm1
movdqa OFFSET_SSE_INOUT(%rdi), %xmm0
movq 40(%rdi), %r9
movq 32(%rdi), %r8
movq 24(%rdi), %rcx
movq 16(%rdi), %rdx
movq 8(%rdi), %rsi
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
movb 225(%rdi), %r11b
movq 0(%rdi), %rdi
movb OFFSET_RETURN_TYPE(%rdi), %r11b
movq OFFSET_GPR_IN(%rdi), %rdi
cmpb $RETURN_TYPE_JMP, %r11b
je .jmp_into_method
cmpb $RETURN_TYPE_JMP_STRET, %r11b
je .jmp_into_method
movq -16(%rbp), %r11
call *%r11
.after_send:
movq -8(%rbp), %rdi
movq %rax, 48(%rdi)
movq %rdx, 56(%rdi)
movdqa %xmm0, 64(%rdi)
movdqa %xmm1, 80(%rdi)
movq %rax, OFFSET_GPR_OUT(%rdi)
movq %rdx, OFFSET_GPR_OUT+8(%rdi)
movdqa %xmm0, OFFSET_SSE_INOUT(%rdi)
movdqa %xmm1, OFFSET_SSE_INOUT+16(%rdi)
movb 225(%rdi), %r11b
movb OFFSET_RETURN_TYPE(%rdi), %r11b
cmpb $RETURN_TYPE_X87, %r11b
je .pop_long_double
cmpb $RETURN_TYPE_COMPLEX_X87, %r11b
je .pop_complex_long_double
.return:
movq %rbp, %rsp
popq %rbp
ret
.fix_align:
xorq %r11, %r11
pushq %r11
jmp .fill_stack
.lookup_stret:
movq 16(%rdi), %rsi
movq 8(%rdi), %rdi
movq OFFSET_GPR_IN+16(%rdi), %rsi
movq OFFSET_GPR_IN+8(%rdi), %rdi
call objc_msg_lookup_stret@PLT
jmp .after_lookup
.jmp_into_method:
movq -16(%rbp), %r11
jmp *%r11
.pop_long_double:
fstpt 192(%rdi)
fstpt OFFSET_X87_OUT(%rdi)
jmp .return
.pop_complex_long_double:
fstpt 192(%rdi)
fstpt 208(%rdi)
fstpt OFFSET_X87_OUT(%rdi)
fstpt OFFSET_X87_OUT+16(%rdi)
jmp .return
#ifdef OF_LINUX
.section .note.GNU-stack, "", %progbits
#endif
|