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
139
140
|
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
139
140
141
142
|
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
|
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#include "invoke-x86_64.h"
.intel_syntax noprefix
.globl of_invocation_call
.section .text
of_invocation_call:
pushq %rbp
movq %rsp, %rbp
pushq rbp
mov rbp, rsp
subq $16, %rsp
andq $-16, %rsp
movq %rdi, -8(%rbp)
sub rsp, 16
and rsp, -16
mov [rbp-8], rdi
movb OFFSET_RETURN_TYPE(%rdi), %r11b
cmpb $RETURN_TYPE_STRET, %r11b
je .lookup_stret
cmpb $RETURN_TYPE_JMP_STRET, %r11b
je .lookup_stret
mov r11b, [rdi+OFFSET_RETURN_TYPE]
cmp r11b, RETURN_TYPE_STRET
je short .Llookup_stret
cmp r11b, RETURN_TYPE_JMP_STRET
je short .Llookup_stret
movq OFFSET_GPR_IN+8(%rdi), %rsi
movq OFFSET_GPR_IN+0(%rdi), %rdi
mov rsi, [rdi+OFFSET_GPR_IN+8]
mov rdi, [rdi+OFFSET_GPR_IN]
call objc_msg_lookup@PLT
.after_lookup:
movq %rax, -16(%rbp)
movq -8(%rbp), %rdi
.Lafter_lookup:
mov [rbp-16], rax
mov rdi, [rbp-8]
leaq OFFSET_STACK(%rdi), %rdx
movq OFFSET_STACK_SIZE(%rdi), %rcx
lea rdx, [rdi+OFFSET_STACK]
mov rcx, [rdi+OFFSET_STACK_SIZE]
testq $1, %rcx
jnz .fix_align
test rcx, $1
jnz short .Lfix_align
.fill_stack:
testq %rcx, %rcx
jz .stack_filled
.Lfill_stack:
test rcx, rcx
jz short .Lstack_filled
decq %rcx
movq (%rdx,%rcx,8), %r11
pushq %r11
dec rcx
mov r11, [rdx+rcx*8]
push r11
jmp .fill_stack
jmp short .Lfill_stack
.stack_filled:
movb OFFSET_NUM_SSE_USED(%rdi), %al
mov al, [rdi+OFFSET_NUM_SSE_USED]
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 xmm7, [rdi+OFFSET_SSE_INOUT+112]
movaps xmm6, [rdi+OFFSET_SSE_INOUT+96]
movaps xmm5, [rdi+OFFSET_SSE_INOUT+80]
movaps xmm4, [rdi+OFFSET_SSE_INOUT+64]
movaps xmm3, [rdi+OFFSET_SSE_INOUT+48]
movaps xmm2, [rdi+OFFSET_SSE_INOUT+32]
movaps xmm1, [rdi+OFFSET_SSE_INOUT+16]
movaps xmm0, [rdi+OFFSET_SSE_INOUT]
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
mov r9, [rdi+OFFSET_GPR_IN+40]
mov r8, [rdi+OFFSET_GPR_IN+32]
mov rcx, [rdi+OFFSET_GPR_IN+24]
mov rdx, [rdi+OFFSET_GPR_IN+16]
mov rsi, [rdi+OFFSET_GPR_IN+8]
movb OFFSET_RETURN_TYPE(%rdi), %r11b
movq OFFSET_GPR_IN(%rdi), %rdi
mov r11b, [rdi+OFFSET_RETURN_TYPE]
mov rdi, [rdi+OFFSET_GPR_IN]
cmpb $RETURN_TYPE_JMP, %r11b
je .jmp_into_method
cmpb $RETURN_TYPE_JMP_STRET, %r11b
je .jmp_into_method
cmp r11b, RETURN_TYPE_JMP
je short .Ljmp_into_method
cmp r11b, RETURN_TYPE_JMP_STRET
je short .Ljmp_into_method
movq -16(%rbp), %r11
call *%r11
mov r11, [rbp-16]
call r11
.after_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)
.Lafter_send:
mov rdi, [rbp-8]
mov [rdi+OFFSET_GPR_OUT], rax
mov [rdi+OFFSET_GPR_OUT+8], rdx
movaps [rdi+OFFSET_SSE_INOUT], xmm0
movaps [rdi+OFFSET_SSE_INOUT+16], xmm1
movb OFFSET_RETURN_TYPE(%rdi), %r11b
mov r11b, [rdi+OFFSET_RETURN_TYPE]
cmpb $RETURN_TYPE_X87, %r11b
je .pop_long_double
cmp r11b, RETURN_TYPE_X87
je short .Lpop_long_double
cmpb $RETURN_TYPE_COMPLEX_X87, %r11b
je .pop_complex_long_double
cmp r11b, RETURN_TYPE_COMPLEX_X87
je short .Lpop_complex_long_double
.return:
movq %rbp, %rsp
popq %rbp
.Lreturn:
mov rsp, rbp
pop rbp
ret
.fix_align:
xorq %r11, %r11
pushq %r11
jmp .fill_stack
.Lfix_align:
xor r11, r11
push r11
jmp short .Lfill_stack
.lookup_stret:
movq OFFSET_GPR_IN+16(%rdi), %rsi
movq OFFSET_GPR_IN+8(%rdi), %rdi
.Llookup_stret:
mov rsi, [rdi+OFFSET_GPR_IN+16]
mov rdi, [rdi+OFFSET_GPR_IN+8]
call objc_msg_lookup_stret@PLT
jmp .after_lookup
jmp short .Lafter_lookup
.jmp_into_method:
movq -16(%rbp), %r11
jmp *%r11
.Ljmp_into_method:
mov r11, [rbp-16]
jmp r11
.pop_long_double:
fstpt OFFSET_X87_OUT(%rdi)
jmp .return
.Lpop_long_double:
fstp tbyte ptr [rdi+OFFSET_X87_OUT]
jmp short .Lreturn
.pop_complex_long_double:
fstpt OFFSET_X87_OUT(%rdi)
fstpt OFFSET_X87_OUT+16(%rdi)
jmp .return
fstp tbyte ptr [rdi+OFFSET_X87_OUT]
fstp tbyte ptr [rdi+OFFSET_X87_OUT+16]
jmp short .Lreturn
#ifdef OF_LINUX
.section .note.GNU-stack, "", %progbits
#endif
|