ObjFW  Check-in [da613d0cb5]

Overview
Comment:Move AMD64/ELF assembly back to AT&T syntax

Support for the Intel syntax is too buggy in toolchains to be usable.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: da613d0cb5e488ea71238bf901ae83f08e1721455b7ece50d0c7afc07b413c35
User & Date: js on 2023-10-31 20:38:35
Other Links: manifest | tags
Context
2023-10-31
22:14
OFMatrix4x4: Add #pragma GCC target("3dnow") check-in: fa3c89f802 user: js tags: trunk
20:38
Move AMD64/ELF assembly back to AT&T syntax check-in: da613d0cb5 user: js tags: trunk
20:27
OFMatrix4x4: Partially unroll multiplication loop check-in: d53c87e7bb user: js tags: trunk
Changes

Modified src/forwarding/forwarding-amd64-elf.S from [c81bf7cc2c] to [75e33865ae].

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


183
184

185
186
187
188
189



190
191
192


193
194
195
196
197
198
199

200
201
202
203
204
205
206
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
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 OFForward
.globl OFForward_stret

.section .text
OFForward:
	push	rbp
	mov	rbp, rsp
	pushq	%rbp
	movq	%rsp, %rbp

	/* Save all arguments */
	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
	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)

	call	object_getClass@PLT

	mov	rdi, rax
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	movq	%rax, %rdi
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rsi
	call	class_respondsToSelector@PLT

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

	mov	rdi, [rbp - 0x10]
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	movq	-0x10(%rbp), %rdi
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rsi
	call	objc_msg_lookup@PLT

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

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

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

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

	/* Restore all arguments */
	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]
	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

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

	jmp	r11
	jmpq	*%r11

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

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

	jmp	OFMethodNotFound@PLT
.type OFForward, %function
.size OFForward, .-OFForward

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

	/* Save all arguments */
	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
	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)

	mov	rdi, rsi
	movq	%rsi, %rdi
	call	object_getClass@PLT

	mov	rdi, rax
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	movq	%rax, %rdi
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rsi
	call	class_respondsToSelector@PLT

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

	mov	rdi, [rbp - 0x18]
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	movq	-0x18(%rbp), %rdi
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rsi
	call	objc_msg_lookup@PLT

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

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

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

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

	/* Restore all arguments */
	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]
	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

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

	jmp	r11
	jmpq	*%r11

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

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

	jmp	OFMethodNotFound_stret@PLT
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret

.Linit:
	lea	rdi, [rip + .Lmodule]
	leaq	.Lmodule(%rip), %rdi
	jmp	__objc_exec_class@PLT

#ifdef OF_SOLARIS
.section .init_array, "aw"
#else
.section .ctors, "aw", %progbits
#endif

Modified src/runtime/lookup-asm/lookup-asm-amd64-elf.S from [c80a243830] to [59baaa9e46].

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







-
-








-
+


-
+


-
-
+
+


-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
+





-
-
-
-
+
+
+
+

-
-
-
+
+
+








-
-
-
+
+
+


-
-
+
+











-
+



-
+





 * file.
 */

#include "config.h"

#include "platform.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
.macro GENERATE_LOOKUP name notFound
\name:
	test	rdi, rdi
	testq	%rdi, %rdi
	jz	.LreturnNilMethod

	test	dil, 1
	testb	$1, %dil
	jnz	.LtaggedPointer_\name

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

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

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

	test	rax, rax
	testq	%rax, %rax
	jz	\notFound@PLT

	ret

.LtaggedPointer_\name:
	mov	rax, [rip + objc_taggedPointerSecret@GOTPCREL]
	xor	rdi, [rax]
	and	dil, 0xE
	movzx	r8d, dil
	movq	objc_taggedPointerSecret@GOTPCREL(%rip), %rax
	xorq	(%rax), %rdi
	andb	$0xE, %dil
	movzbl	%dil, %r8d

	mov	rax, [rip + objc_taggedPointerClasses@GOTPCREL]
	mov	r8, [rax + 4 * r8]
	mov	r8, [r8 + 64]
	movq	objc_taggedPointerClasses@GOTPCREL(%rip), %rax
	movq	(%rax,%r8,4), %r8
	movq	64(%r8), %r8

	jmp	.Lmain_\name
.type \name, %function
.size \name, .-\name
.endm

.macro GENERATE_LOOKUP_SUPER name lookup
\name:
	mov	r8, rdi
	mov	rdi, [rdi]
	test	rdi, rdi
	movq	%rdi, %r8
	movq	(%rdi), %rdi
	testq	%rdi, %rdi
	jz	.LreturnNilMethod

	mov	r8, [r8 + 8]
	mov	r8, [r8 + 64]
	movq	8(%r8), %r8
	movq	64(%r8), %r8
	jmp	.Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm

GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret

.LreturnNilMethod:
	lea	rax, [rip + .LnilMethod]
	leaq	.LnilMethod(%rip), %rax
	ret

.LnilMethod:
	xor	rax, rax
	xorq	%rax, %rax
	ret

#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif