ObjFW  Check-in [6d5cc25f0c]

Overview
Comment:Merge trunk into branch "tagged-pointers"
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | tagged-pointers
Files: files | file ages | folders
SHA3-256: 6d5cc25f0c3bc8be2e01b956f83fc1a091b105daa0e571c7890a61d1340c0980
User & Date: js on 2020-07-01 21:32:58
Other Links: branch diff | manifest | tags
Context
2020-07-04
00:24
Only use 4 bits to classify tagged pointers check-in: 943cf97843 user: js tags: tagged-pointers
2020-07-01
21:32
Merge trunk into branch "tagged-pointers" check-in: 6d5cc25f0c user: js tags: tagged-pointers
21:06
apple-forwarding-x86_64.S: Don't use jmp short check-in: 1a4eba3a16 user: js tags: trunk
2020-06-30
21:24
lookup-asm-x86-win32.S: Support tagged pointers check-in: b1ee7629b5 user: js tags: tagged-pointers
Changes

Modified .travis.yml from [839879cad6] to [f5a0aabab2].

221
222
223
224
225
226
227
228

229
230
231
232
233
234

235
236
237
238
239
240

241
242
243
244
245
246
247
221
222
223
224
225
226
227

228
229
230
231
232
233

234
235
236
237
238
239

240
241
242
243
244
245
246
247







-
+





-
+





-
+







    - os: linux
      dist: trusty
      env:
        - config=amigaos

    # Nintendo 3DS
    - os: linux
      dist: trusty
      dist: bionic
      env:
        - config=nintendo_3ds

    # Nintendo DS
    - os: linux
      dist: trusty
      dist: bionic
      env:
        - config=nintendo_ds

    # Nintendo Wii
    - os: linux
      dist: trusty
      dist: bionic
      env:
        - config=wii

before_install:
  - if [ "$TRAVIS_OS_NAME" = "linux" -a -z "$config" ]; then
            case "$TRAVIS_CPU_ARCH" in
                    amd64 | s390x)
266
267
268
269
270
271
272

273
274



275
276
277
278
279
280
281
266
267
268
269
270
271
272
273


274
275
276
277
278
279
280
281
282
283







+
-
-
+
+
+







            if grep precise /etc/lsb-release >/dev/null; then
                    sudo ipx_internal_net add 1234 123456;
            fi;
    fi

  - if [ "$config" = "nintendo_3ds" -o "$config" = "nintendo_ds"
        -o "$config" = "wii" ]; then
            deb=devkitpro-pacman.amd64.deb;
            wget https://github.com/devkitPro/pacman/releases/download/devkitpro-pacman-1.0.1/devkitpro-pacman.deb;
            sudo dpkg -i devkitpro-pacman.deb;
            wget https://github.com/devkitPro/pacman/releases/download/v1.0.2/$deb;
            sudo apt install gdebi;
            sudo gdebi -n $deb;
    fi

  - if [ "$config" = "nintendo_3ds" ]; then
            sudo dkp-pacman --noconfirm -Syu 3ds-dev;
    fi

  - if [ "$config" = "nintendo_ds" ]; then

Modified src/forwarding/apple-forwarding-i386.S from [b4b70f083a] to [288bef5c12].

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
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



139
140
141
142
143
144
145

146
147







+
+




-
+



-
-
+
+






-
-
+
+

-
-
+
+




-
-
+
+


-
-
-
+
+
+
+
+


-
+


-
-
-
-
-
-
+
+
+
+
+
+
+
+


-
+

-
+


-
+

-
-
-
+
+
+




-
-
-
+
+
+




-
-
+
+

-
-
+
+




-
-
+
+


-
-
-
+
+
+
+
+


-
+


-
-
-
-
-
-
+
+
+
+
+
+
+
+


-
+

-
+


-
+

-
-
-
+
+
+




-
-
-
+
+
+




-
+

 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

.intel_syntax noprefix

.globl _of_forward
.globl _of_forward_stret

.section __TEXT, __cstring, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
	.asciz "forwardingTargetForSelector:"

.section __OBJC, __message_refs, literal_pointers, no_dead_strip
sel_forwardingTargetForSelector_:
	.long str_forwardingTargetForSelector_
Lsel_forwardingTargetForSelector_:
	.long Lstr_forwardingTargetForSelector_

.section __OBJC, __image_info
	.long 0, 0

.section __TEXT, __text, regular, pure_instructions
_of_forward:
	pushl	%ebp
	movl	%esp, %ebp
	push	ebp
	mov	ebp, esp

	pushl	%ebx
	subl	$20, %esp
	push	ebx
	sub	esp, 20

	call	get_eip
0:

	movl	8(%ebp), %eax
	movl	%eax, (%esp)
	mov	eax, [ebp+8]
	mov	[esp], eax
	call	_object_getClass

	movl	%eax, (%esp)
	movl	sel_forwardingTargetForSelector_-0b(%ebx), %eax
	movl	%eax, 4(%esp)
	mov	[esp], eax
	.att_syntax	/* Next line is broken in Intel syntax */
	movl	Lsel_forwardingTargetForSelector_-0b(%ebx), %eax
	.intel_syntax noprefix
	mov	[esp+4], eax
	call	_class_respondsToSelector

	testl	%eax, %eax
	test	eax, eax
	jz	0f

	movl	8(%ebp), %eax
	movl	%eax, (%esp)
	movl	sel_forwardingTargetForSelector_-0b(%ebx), %eax
	movl	%eax, 4(%esp)
	movl	12(%ebp), %eax
	movl	%eax, 8(%esp)
	mov	eax, [ebp+8]
	mov	[esp], eax
	.att_syntax	/* Next line is broken in Intel syntax */
	movl	Lsel_forwardingTargetForSelector_-0b(%ebx), %eax
	.intel_syntax noprefix
	mov	[esp+4], eax
	mov	eax, [ebp+12]
	mov	[esp+8], eax
	call	_objc_msgSend

	testl	%eax, %eax
	test	eax, eax
	jz	0f
	cmpl	8(%ebp), %eax
	cmp	eax, [ebp+8]
	je	0f

	movl	%eax, 8(%ebp)
	mov	[ebp+8], eax

	addl	$20, %esp
	popl	%ebx
	popl	%ebp
	add	esp, 20
	pop	ebx
	pop	ebp

	jmp	_objc_msgSend

0:
	addl	$20, %esp
	popl	%ebx
	popl	%ebp
	add	esp, 20
	pop	ebx
	pop	ebp

	jmp	_of_method_not_found

_of_forward_stret:
	pushl	%ebp
	movl	%esp, %ebp
	push	ebp
	mov	ebp, esp

	pushl	%ebx
	subl	$20, %esp
	push	ebx
	sub	esp, 20

	call	get_eip
0:

	movl	12(%ebp), %eax
	movl	%eax, (%esp)
	mov	eax, [ebp+12]
	mov	[esp], eax
	call	_object_getClass

	movl	%eax, (%esp)
	movl	sel_forwardingTargetForSelector_-0b(%ebx), %eax
	movl	%eax, 4(%esp)
	mov	[esp], eax
	.att_syntax	/* Next line is broken in Intel syntax */
	movl	Lsel_forwardingTargetForSelector_-0b(%ebx), %eax
	.intel_syntax noprefix
	mov	[esp+4], eax
	call	_class_respondsToSelector

	testl	%eax, %eax
	test	eax, eax
	jz	0f

	movl	12(%ebp), %eax
	movl	%eax, (%esp)
	movl	sel_forwardingTargetForSelector_-0b(%ebx), %eax
	movl	%eax, 4(%esp)
	movl	16(%ebp), %eax
	movl	%eax, 8(%esp)
	mov	eax, [ebp+12]
	mov	[esp], eax
	.att_syntax	/* Next line is broken in Intel syntax */
	movl	Lsel_forwardingTargetForSelector_-0b(%ebx), %eax
	.intel_syntax noprefix
	mov	[esp+4], eax
	mov	eax, [ebp+16]
	mov	[esp+8], eax
	call	_objc_msgSend

	testl	%eax, %eax
	test	eax, eax
	jz	0f
	cmpl	12(%ebp), %eax
	cmp	eax, [ebp+12]
	je	0f

	movl	%eax, 12(%ebp)
	mov	[ebp+12], eax

	addl	$20, %esp
	popl	%ebx
	popl	%ebp
	add	esp, 20
	pop	ebx
	pop	ebp

	jmp	_objc_msgSend_stret

0:
	addl	$20, %esp
	popl	%ebx
	popl	%ebp
	add	esp, 20
	pop	ebx
	pop	ebp

	jmp	_of_method_not_found_stret

get_eip:
	movl	(%esp), %ebx
	mov	ebx, [esp]
	ret

Modified src/forwarding/apple-forwarding-x86_64.S from [b46de1999b] to [5b8fcf7945].

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
139
140
141



142
143
144

145
146

147
148
149

150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165














166
167
168


169
170
171
172
173
174
175



176
177
178


179
180
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
139
140



141
142
143
144
145

146
147

148
149
150

151
152
153














154
155
156
157
158
159
160
161
162
163
164
165
166
167
168


169
170
171
172
173
174



175
176
177
178


179
180
181
182







+
+
















-
-
+
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



-
-
+
+


-
+


-
-
-
+
+
+


-
+

-
+


-
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+




-
-
+
+

-
-
+
+




-
-
+
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+


-
-
+
+

-
+


-
-
-
+
+
+


-
+

-
+


-
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+




-
-
-
+
+
+

-
-
+
+


 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

.intel_syntax noprefix

.globl _of_forward
.globl _of_forward_stret

.section __TEXT, __objc_methname, cstring_literals
str_forwardingTargetForSelector_:
	.asciz "forwardingTargetForSelector:"

.section __DATA, __objc_selrefs, literal_pointers, no_dead_strip
sel_forwardingTargetForSelector_:
	.quad str_forwardingTargetForSelector_

.section __DATA, __objc_imageinfo, regular, no_dead_strip
	.long 0, 0

.section __TEXT, __text, regular, pure_instructions
_of_forward:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	/* Save all arguments */
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	%rax, -0x8(%rbp)
	movq	%rdi, -0x10(%rbp)
	movq	%rsi, -0x18(%rbp)
	movq	%rdx, -0x20(%rbp)
	movq	%rcx, -0x28(%rbp)
	movq	%r8, -0x30(%rbp)
	movq	%r9, -0x38(%rbp)
	movaps	%xmm0, -0x50(%rbp)
	movaps	%xmm1, -0x60(%rbp)
	movaps	%xmm2, -0x70(%rbp)
	movaps	%xmm3, -0x80(%rbp)
	movaps	%xmm4, -0x90(%rbp)
	movaps	%xmm5, -0xA0(%rbp)
	movaps	%xmm6, -0xB0(%rbp)
	movaps	%xmm7, -0xC0(%rbp)
	sub	rsp, 0xC0	/* 16-byte alignment */
	mov	[rbp-0x08], rax
	mov	[rbp-0x10], rdi
	mov	[rbp-0x18], rsi
	mov	[rbp-0x20], rdx
	mov	[rbp-0x28], rcx
	mov	[rbp-0x30], r8
	mov	[rbp-0x38], r9
	movaps	[rbp-0x50], xmm0
	movaps	[rbp-0x60], xmm1
	movaps	[rbp-0x70], xmm2
	movaps	[rbp-0x80], xmm3
	movaps	[rbp-0x90], xmm4
	movaps	[rbp-0xA0], xmm5
	movaps	[rbp-0xB0], xmm6
	movaps	[rbp-0xC0], xmm7

	call	_object_getClass

	movq	%rax, %rdi
	movq	sel_forwardingTargetForSelector_(%rip), %rsi
	mov	rdi, rax
	mov	rsi, [rip+sel_forwardingTargetForSelector_]
	call	_class_respondsToSelector

	testq	%rax, %rax
	test	rax, rax
	jz	0f

	movq	-0x10(%rbp), %rdi
	movq	sel_forwardingTargetForSelector_(%rip), %rsi
	movq	-0x18(%rbp), %rdx
	mov	rdi, [rbp-0x10]
	mov	rsi, [rip+sel_forwardingTargetForSelector_]
	mov	rdx, [rbp-0x18]
	call	_objc_msgSend

	testq	%rax, %rax
	test	rax, rax
	jz	0f
	cmpq	-0x10(%rbp), %rax
	cmp	rax, [rbp-0x10]
	je	0f

	movq	%rax, %rdi
	mov	rdi, rax

	/* Restore all arguments, except %rdi */
	movaps	-0xC0(%rbp), %xmm7
	movaps	-0xB0(%rbp), %xmm6
	movaps	-0xA0(%rbp), %xmm5
	movaps	-0x90(%rbp), %xmm4
	movaps	-0x80(%rbp), %xmm3
	movaps	-0x70(%rbp), %xmm2
	movaps	-0x60(%rbp), %xmm1
	movaps	-0x50(%rbp), %xmm0
	movq	-0x38(%rbp), %r9
	movq	-0x30(%rbp), %r8
	movq	-0x28(%rbp), %rcx
	movq	-0x20(%rbp), %rdx
	movq	-0x18(%rbp), %rsi
	movq	-0x8(%rbp), %rax
	movaps	xmm7, [rbp-0xC0]
	movaps	xmm6, [rbp-0xB0]
	movaps	xmm5, [rbp-0xA0]
	movaps	xmm4, [rbp-0x90]
	movaps	xmm3, [rbp-0x80]
	movaps	xmm2, [rbp-0x70]
	movaps	xmm1, [rbp-0x60]
	movaps	xmm0, [rbp-0x50]
	mov	r9,   [rbp-0x38]
	mov	r8,   [rbp-0x30]
	mov	rcx,  [rbp-0x28]
	mov	rdx,  [rbp-0x20]
	mov	rsi,  [rbp-0x18]
	mov	rax,  [rbp-0x08]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmp	_objc_msgSend

0:
	movq	-0x10(%rbp), %rdi
	movq	-0x18(%rbp), %rsi
	mov	rdi, [rbp-0x10]
	mov	rsi, [rbp-0x18]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmp	_of_method_not_found

_of_forward_stret:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	/* Save all arguments */
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	%rax, -0x8(%rbp)
	movq	%rdi, -0x10(%rbp)
	movq	%rsi, -0x18(%rbp)
	movq	%rdx, -0x20(%rbp)
	movq	%rcx, -0x28(%rbp)
	movq	%r8, -0x30(%rbp)
	movq	%r9, -0x38(%rbp)
	movaps	%xmm0, -0x50(%rbp)
	movaps	%xmm1, -0x60(%rbp)
	movaps	%xmm2, -0x70(%rbp)
	movaps	%xmm3, -0x80(%rbp)
	movaps	%xmm4, -0x90(%rbp)
	movaps	%xmm5, -0xA0(%rbp)
	movaps	%xmm6, -0xB0(%rbp)
	movaps	%xmm7, -0xC0(%rbp)
	sub	rsp, 0xC0	/* 16-byte alignment */
	mov	[rbp-0x08], rax
	mov	[rbp-0x10], rdi
	mov	[rbp-0x18], rsi
	mov	[rbp-0x20], rdx
	mov	[rbp-0x28], rcx
	mov	[rbp-0x30], r8
	mov	[rbp-0x38], r9
	movaps	[rbp-0x50], xmm0
	movaps	[rbp-0x60], xmm1
	movaps	[rbp-0x70], xmm2
	movaps	[rbp-0x80], xmm3
	movaps	[rbp-0x90], xmm4
	movaps	[rbp-0xA0], xmm5
	movaps	[rbp-0xB0], xmm6
	movaps	[rbp-0xC0], xmm7

	movq	%rsi, %rdi
	mov	rdi, rsi
	call	_object_getClass

	movq	%rax, %rdi
	movq	sel_forwardingTargetForSelector_(%rip), %rsi
	mov	rdi, rax
	mov	rsi, [rip+sel_forwardingTargetForSelector_]
	call	_class_respondsToSelector
	testq	%rax, %rax
	test	rax, rax
	jz	0f

	movq	-0x18(%rbp), %rdi
	movq	sel_forwardingTargetForSelector_(%rip), %rsi
	movq	-0x20(%rbp), %rdx
	mov	rdi, [rbp-0x18]
	mov	rsi, [rip+sel_forwardingTargetForSelector_]
	mov	rdx, [rbp-0x20]
	call	_objc_msgSend

	testq	%rax, %rax
	test	rax, rax
	jz	0f
	cmpq	-0x18(%rbp), %rax
	cmp	rax, [rbp-0x18]
	je	0f

	movq	%rax, %rsi
	mov	rsi, rax

	/* Restore all arguments, except %rsi */
	movaps	-0xC0(%rbp), %xmm7
	movaps	-0xB0(%rbp), %xmm6
	movaps	-0xA0(%rbp), %xmm5
	movaps	-0x90(%rbp), %xmm4
	movaps	-0x80(%rbp), %xmm3
	movaps	-0x70(%rbp), %xmm2
	movaps	-0x60(%rbp), %xmm1
	movaps	-0x50(%rbp), %xmm0
	movq	-0x38(%rbp), %r9
	movq	-0x30(%rbp), %r8
	movq	-0x28(%rbp), %rcx
	movq	-0x20(%rbp), %rdx
	movq	-0x10(%rbp), %rdi
	movq	-0x8(%rbp), %rax
	movaps	xmm7, [rbp-0xC0]
	movaps	xmm6, [rbp-0xB0]
	movaps	xmm5, [rbp-0xA0]
	movaps	xmm4, [rbp-0x90]
	movaps	xmm3, [rbp-0x80]
	movaps	xmm2, [rbp-0x70]
	movaps	xmm1, [rbp-0x60]
	movaps	xmm0, [rbp-0x50]
	mov	r9,   [rbp-0x38]
	mov	r8,   [rbp-0x30]
	mov	rcx,  [rbp-0x28]
	mov	rdx,  [rbp-0x20]
	mov	rdi,  [rbp-0x10]
	mov	rax,  [rbp-0x08]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmp	_objc_msgSend_stret

0:
	movq	-0x10(%rbp), %rdi
	movq	-0x18(%rbp), %rsi
	movq	-0x20(%rbp), %rdx
	mov	rdi, [rbp-0x10]
	mov	rsi, [rbp-0x18]
	mov	rdx, [rbp-0x20]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmp	_of_method_not_found_stret

Modified src/forwarding/forwarding-x86_64-macho.S from [42dfac05fa] to [4631e2d50d].

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


143
144
145
146
147
148




149
150

151
152

153
154
155

156
157
158


159
160

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177















178
179
180


181
182

183
184
185
186
187



188
189
190


191
192
193
194
195

196
197
198
199
200
201
202
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


143
144
145
146




147
148
149
150
151

152
153

154
155
156

157
158


159
160
161

162
163
164















165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180


181
182
183

184
185
186



187
188
189
190


191
192
193
194
195
196

197
198
199
200
201
202
203
204







+
+





-
-
+
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



-
-
+
+


-
+


-
-
+
+


-
-
-
-
+
+
+
+

-
+

-
+


-
+

-
-
+
+

-
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+

-
+


-
-
+
+

-
-
+
+




-
-
+
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+


-
-
+
+


-
+


-
-
+
+


-
-
-
-
+
+
+
+

-
+

-
+


-
+

-
-
+
+

-
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+

-
+


-
-
-
+
+
+

-
-
+
+




-
+







 * file.
 */

#include "config.h"

#include "platform.h"

.intel_syntax noprefix

.globl _of_forward
.globl _of_forward_stret

.section __TEXT, __text, regular, pure_instructions
_of_forward:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	/* Save all arguments */
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	%rax, -0x8(%rbp)
	movq	%rdi, -0x10(%rbp)
	movq	%rsi, -0x18(%rbp)
	movq	%rdx, -0x20(%rbp)
	movq	%rcx, -0x28(%rbp)
	movq	%r8, -0x30(%rbp)
	movq	%r9, -0x38(%rbp)
	movaps	%xmm0, -0x50(%rbp)
	movaps	%xmm1, -0x60(%rbp)
	movaps	%xmm2, -0x70(%rbp)
	movaps	%xmm3, -0x80(%rbp)
	movaps	%xmm4, -0x90(%rbp)
	movaps	%xmm5, -0xA0(%rbp)
	movaps	%xmm6, -0xB0(%rbp)
	movaps	%xmm7, -0xC0(%rbp)
	sub	rsp, 0xC0	/* 16-byte alignment */
	mov	[rbp-0x08], rax
	mov	[rbp-0x10], rdi
	mov	[rbp-0x18], rsi
	mov	[rbp-0x20], rdx
	mov	[rbp-0x28], rcx
	mov	[rbp-0x30], r8
	mov	[rbp-0x38], r9
	movaps	[rbp-0x50], xmm0
	movaps	[rbp-0x60], xmm1
	movaps	[rbp-0x70], xmm2
	movaps	[rbp-0x80], xmm3
	movaps	[rbp-0x90], xmm4
	movaps	[rbp-0xA0], xmm5
	movaps	[rbp-0xB0], xmm6
	movaps	[rbp-0xC0], xmm7

	call	_object_getClass

	movq	%rax, %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	mov	rdi, rax
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	call	_class_respondsToSelector

	testq	%rax, %rax
	test	rax, rax
	jz	0f

	movq	-0x10(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	mov	rdi, [rbp-0x10]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	call	_objc_msg_lookup

	movq	-0x10(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	movq	-0x18(%rbp), %rdx
	call	*%rax
	mov	rdi, [rbp-0x10]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	mov	rdx, [rbp-0x18]
	call	rax

	testq	%rax, %rax
	test	rax, rax
	jz	0f
	cmpq	-0x10(%rbp), %rax
	cmp	rax, [rbp-0x10]
	je	0f

	movq	%rax, -0x10(%rbp)
	mov	[rbp-0x10], rax

	movq	%rax, %rdi
	movq	-0x18(%rbp), %rsi
	mov	rdi, rax
	mov	rsi, [rbp-0x18]
	call	_objc_msg_lookup
	movq	%rax, %r11
	mov	r11, rax

	/* Restore all arguments */
	movaps	-0xC0(%rbp), %xmm7
	movaps	-0xB0(%rbp), %xmm6
	movaps	-0xA0(%rbp), %xmm5
	movaps	-0x90(%rbp), %xmm4
	movaps	-0x80(%rbp), %xmm3
	movaps	-0x70(%rbp), %xmm2
	movaps	-0x60(%rbp), %xmm1
	movaps	-0x50(%rbp), %xmm0
	movq	-0x38(%rbp), %r9
	movq	-0x30(%rbp), %r8
	movq	-0x28(%rbp), %rcx
	movq	-0x20(%rbp), %rdx
	movq	-0x18(%rbp), %rsi
	movq	-0x10(%rbp), %rdi
	movq	-0x8(%rbp), %rax
	movaps	xmm7, [rbp-0xC0]
	movaps	xmm6, [rbp-0xB0]
	movaps	xmm5, [rbp-0xA0]
	movaps	xmm4, [rbp-0x90]
	movaps	xmm3, [rbp-0x80]
	movaps	xmm2, [rbp-0x70]
	movaps	xmm1, [rbp-0x60]
	movaps	xmm0, [rbp-0x50]
	mov	r9,   [rbp-0x38]
	mov	r8,   [rbp-0x30]
	mov	rcx,  [rbp-0x28]
	mov	rdx,  [rbp-0x20]
	mov	rsi,  [rbp-0x18]
	mov	rdi,  [rbp-0x10]
	mov	rax,  [rbp-0x08]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmpq	*%r11
	jmp	r11

0:
	movq	-0x10(%rbp), %rdi
	movq	-0x18(%rbp), %rsi
	mov	rdi, [rbp-0x10]
	mov	rsi, [rbp-0x18]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmp	_of_method_not_found

_of_forward_stret:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	/* Save all arguments */
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	%rax, -0x8(%rbp)
	movq	%rdi, -0x10(%rbp)
	movq	%rsi, -0x18(%rbp)
	movq	%rdx, -0x20(%rbp)
	movq	%rcx, -0x28(%rbp)
	movq	%r8, -0x30(%rbp)
	movq	%r9, -0x38(%rbp)
	movaps	%xmm0, -0x50(%rbp)
	movaps	%xmm1, -0x60(%rbp)
	movaps	%xmm2, -0x70(%rbp)
	movaps	%xmm3, -0x80(%rbp)
	movaps	%xmm4, -0x90(%rbp)
	movaps	%xmm5, -0xA0(%rbp)
	movaps	%xmm6, -0xB0(%rbp)
	movaps	%xmm7, -0xC0(%rbp)
	sub	rsp, 0xC0	/* 16-byte alignment */
	mov	[rbp-0x08], rax
	mov	[rbp-0x10], rdi
	mov	[rbp-0x18], rsi
	mov	[rbp-0x20], rdx
	mov	[rbp-0x28], rcx
	mov	[rbp-0x30], r8
	mov	[rbp-0x38], r9
	movaps	[rbp-0x50], xmm0
	movaps	[rbp-0x60], xmm1
	movaps	[rbp-0x70], xmm2
	movaps	[rbp-0x80], xmm3
	movaps	[rbp-0x90], xmm4
	movaps	[rbp-0xA0], xmm5
	movaps	[rbp-0xB0], xmm6
	movaps	[rbp-0xC0], xmm7

	movq	%rsi, %rdi
	mov	rdi, rsi
	call	_object_getClass

	movq	%rax, %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	mov	rdi, rax
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	call	_class_respondsToSelector

	testq	%rax, %rax
	test	rax, rax
	jz	0f

	movq	-0x18(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	mov	rdi, [rbp-0x18]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	call	_objc_msg_lookup

	movq	-0x18(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	movq	-0x20(%rbp), %rdx
	call	*%rax
	mov	rdi, [rbp-0x18]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	mov	rdx, [rbp-0x20]
	call	rax

	testq	%rax, %rax
	test	rax, rax
	jz	0f
	cmpq	-0x18(%rbp), %rax
	cmp	rax, [rbp-0x18]
	je	0f

	movq	%rax, -0x18(%rbp)
	mov	[rbp-0x18], rax

	movq	%rax, %rdi
	movq	-0x20(%rbp), %rsi
	mov	rdi, rax
	mov	rsi, [rbp-0x20]
	call	_objc_msg_lookup_stret
	movq	%rax, %r11
	mov	r11, rax

	/* Restore all arguments */
	movaps	-0xC0(%rbp), %xmm7
	movaps	-0xB0(%rbp), %xmm6
	movaps	-0xA0(%rbp), %xmm5
	movaps	-0x90(%rbp), %xmm4
	movaps	-0x80(%rbp), %xmm3
	movaps	-0x70(%rbp), %xmm2
	movaps	-0x60(%rbp), %xmm1
	movaps	-0x50(%rbp), %xmm0
	movq	-0x38(%rbp), %r9
	movq	-0x30(%rbp), %r8
	movq	-0x28(%rbp), %rcx
	movq	-0x20(%rbp), %rdx
	movq	-0x18(%rbp), %rsi
	movq	-0x10(%rbp), %rdi
	movq	-0x8(%rbp), %rax
	movaps	xmm7, [rbp-0xC0]
	movaps	xmm6, [rbp-0xB0]
	movaps	xmm5, [rbp-0xA0]
	movaps	xmm4, [rbp-0x90]
	movaps	xmm3, [rbp-0x80]
	movaps	xmm2, [rbp-0x70]
	movaps	xmm1, [rbp-0x60]
	movaps	xmm0, [rbp-0x50]
	mov	r9,   [rbp-0x38]
	mov	r8,   [rbp-0x30]
	mov	rcx,  [rbp-0x28]
	mov	rdx,  [rbp-0x20]
	mov	rsi,  [rbp-0x18]
	mov	rdi,  [rbp-0x10]
	mov	rax,  [rbp-0x08]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmpq	*%r11
	jmp	r11

0:
	movq	-0x10(%rbp), %rdi
	movq	-0x18(%rbp), %rsi
	movq	-0x20(%rbp), %rdx
	mov	rdi, [rbp-0x10]
	mov	rsi, [rbp-0x18]
	mov	rdx, [rbp-0x20]

	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	jmp	_of_method_not_found_stret

init:
	leaq	module(%rip), %rdi
	lea	rdi, [rip+module]
	jmp	___objc_exec_class

.section __DATA, __mod_init_func, mod_init_funcs
	.quad init

.section __TEXT, __cstring, cstring_literals
str_forwardingTargetForSelector_:

Modified src/invocation/apple-call-x86_64.S from [faa19cc12c] to [3884ee11f3].

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
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







+
+





-
-
+
+

-
-
-
+
+
+

-
-
+
+

-
+



-
+


-
-
-
+
+
+




-
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
+
+

-
+


-
+


-
+





-
-
-
-
-
+
+
+
+
+

-
+

-
+


-
+



-
-
+
+




-
-
+
+







-
+



-
-
+
+

 * 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, __text, regular, pure_instructions
_of_invocation_call:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	subq	$16, %rsp
	andq	$-16, %rsp
	movq	%rdi, -8(%rbp)
	sub	rsp, 16
	and	rsp, -16
	mov	[rbp-8], rdi

	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
	test	rcx, 1
	jnz	Lfix_align

Lfill_stack:
	testq	%rcx, %rcx
	test	rcx, rcx
	jz	Lstack_filled

	decq	%rcx
	movq	(%rdx,%rcx,8), %r11
	pushq	%r11
	dec	rcx
	mov	r11, [rdx+rcx*8]
	push	r11

	jmp	Lfill_stack

Lstack_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_STRET, %r11b
	cmp	r11b, RETURN_TYPE_STRET
	je	Lcall_send_stret

	cmpb	$RETURN_TYPE_JMP, %r11b
	cmp	r11b, RETURN_TYPE_JMP
	je	_objc_msgSend

	cmpb	$RETURN_TYPE_JMP_STRET, %r11b
	cmp	r11b, RETURN_TYPE_JMP_STRET
	je	_objc_msgSend_stret

	call	_objc_msgSend

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)
	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
	cmp	r11b, RETURN_TYPE_X87
	je	Lpop_long_double

	cmpb	$RETURN_TYPE_COMPLEX_X87, %r11b
	cmp	r11b, RETURN_TYPE_COMPLEX_X87
	je	Lpop_complex_long_double

Lreturn:
	movq	%rbp, %rsp
	popq	%rbp
	mov	rsp, rbp
	pop	rbp

	ret

Lfix_align:
	xorq	%r11, %r11
	pushq	%r11
	xor	r11, r11
	push	r11
	jmp	Lfill_stack

Lcall_send_stret:
	call	_objc_msgSend_stret
	jmp	Lafter_send

Lpop_long_double:
	fstpt	OFFSET_X87_OUT(%rdi)
	fstp	tbyte ptr [rdi+OFFSET_X87_OUT]
	jmp	Lreturn

Lpop_complex_long_double:
	fstpt	OFFSET_X87_OUT(%rdi)
	fstpt	OFFSET_X87_OUT+16(%rdi)
	fstp	tbyte ptr [rdi+OFFSET_X87_OUT]
	fstp	tbyte ptr [rdi+OFFSET_X87_OUT+16]
	jmp	Lreturn

Modified src/invocation/call-x86_64-elf.S from [5b83df7d17] to [10e2914d71].

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
.Lstack_filled:
	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
.Lpop_complex_long_double:
	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

Modified src/runtime/lookup-asm/lookup-asm-x86_64-macho.S from [31f7e82d2f] to [679535bcad].

12
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
12
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







+
+









-
+


-
-
+
+


-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
+







-
-
-
+
+
+


-
-
+
+









-
+



-
+

 * Alternatively, it may be distributed under the terms of the GNU General
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

.intel_syntax noprefix

.globl _objc_msg_lookup
.globl _objc_msg_lookup_stret
.globl _objc_msg_lookup_super
.globl _objc_msg_lookup_super_stret

.section __TEXT, __text, regular, pure_instructions
.macro generate_lookup
$0:
	testq	%rdi, %rdi
	test	rdi, rdi
	jz	ret_nil

	movq	(%rdi), %r8
	movq	64(%r8), %r8
	mov	r8, [rdi]
	mov	r8, [r8+64]

Lmain_$0:
	movq	(%rsi), %rax
	movzbl	%ah, %ecx
	movzbl	%al, %edx
	mov	rax, [rsi]
	movzx	ecx, ah
	movzx	edx, al
#ifdef OF_SELUID24
	shrl	$$16, %eax
	shr	eax, 16

	movq	(%r8,%rax,8), %r8
	mov	r8, [r8+rax*8]
#endif
	movq	(%r8,%rcx,8), %r8
	movq	(%r8,%rdx,8), %rax
	mov	r8, [r8+rcx*8]
	mov	rax, [r8+rdx*8]

	testq	%rax, %rax
	test	rax, rax
	jz	$1

	ret
.endmacro

.macro generate_lookup_super
$0:
	movq	%rdi, %r8
	movq	(%rdi), %rdi
	testq	%rdi, %rdi
	mov	r8, rdi
	mov	rdi, [rdi]
	test	rdi, rdi
	jz	ret_nil

	movq	8(%r8), %r8
	movq	64(%r8), %r8
	mov	r8, [r8+8]
	mov	r8, [r8+64]
	jmp	Lmain_$1
.endmacro

generate_lookup _objc_msg_lookup, _objc_method_not_found
generate_lookup _objc_msg_lookup_stret, _objc_method_not_found_stret
generate_lookup_super _objc_msg_lookup_super, _objc_msg_lookup
generate_lookup_super _objc_msg_lookup_super_stret, _objc_msg_lookup_stret

ret_nil:
	leaq	nil_method(%rip), %rax
	lea	rax, [rip+nil_method]
	ret

nil_method:
	movq	%rdi, %rax
	mov	rax, rdi
	ret