ObjFW  Check-in [ba2d42d150]

Overview
Comment:Move AMD64/Win64 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: ba2d42d1509be1be3f7fe2beb7a63ba0e87c731d32d3e3f4bc4d395703ac3813
User & Date: js on 2023-10-31 22:38:47
Other Links: manifest | tags
Context
2023-10-31
22:45
Move x86/Win32 assembly back to AT&T syntax check-in: 14d5bc2bbc user: js tags: trunk
22:38
Move AMD64/Win64 assembly back to AT&T syntax check-in: ba2d42d150 user: js tags: trunk
22:27
Move x86/ELF assembly back to AT&T syntax check-in: 4c866f0320 user: js tags: trunk
Changes

Modified src/forwarding/forwarding-amd64-win64.S from [43dda63d1e] to [85508aab1a].

11
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
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
11
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
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 OFForward
.globl OFForward_stret

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

	/* Save all arguments */
	sub	rsp, 0x90	/* 16-byte alignment */
	mov	[rbp - 0x28], rax
	mov	[rbp - 0x30], rcx
	mov	[rbp - 0x38], rdx
	mov	[rbp - 0x40], r8
	mov	[rbp - 0x48], r9
	movaps	[rbp - 0x60], xmm0
	movaps	[rbp - 0x70], xmm1
	movaps	[rbp - 0x80], xmm2
	movaps	[rbp - 0x90], xmm3
	subq	$0x90, %rsp	/* 16-byte alignment */
	movq	%rax, -0x28(%rbp)
	movq	%rcx, -0x30(%rbp)
	movq	%rdx, -0x38(%rbp)
	movq	%r8, -0x40(%rbp)
	movq	%r9, -0x48(%rbp)
	movaps	%xmm0, -0x60(%rbp)
	movaps	%xmm1, -0x70(%rbp)
	movaps	%xmm2, -0x80(%rbp)
	movaps	%xmm3, -0x90(%rbp)

	call	object_getClass

	mov	rcx, rax
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	movq	%rax, %rcx
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rdx
	call	class_respondsToSelector

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

	mov	rcx, [rbp - 0x30]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	movq	-0x30(%rbp), %rcx
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rdx
	call	objc_msg_lookup

	mov	rcx, [rbp - 0x30]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	mov	r8, [rbp - 0x38]
	call	rax
	movq	-0x30(%rbp), %rcx
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rdx
	movq	-0x38(%rbp), %r8
	call	*%rax

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

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

	mov	rcx, rax
	mov	rdx, [rbp - 0x38]
	movq	%rax, %rcx
	movq	-0x38(%rbp), %rdx
	call	objc_msg_lookup
	mov	r11, rax
	movq	%rax, %r11

	/* Restore all arguments */
	movaps	xmm3, [rbp - 0x90]
	movaps	xmm2, [rbp - 0x80]
	movaps	xmm1, [rbp - 0x70]
	movaps	xmm0, [rbp - 0x60]
	mov	r9, [rbp - 0x48]
	mov	r8, [rbp - 0x40]
	mov	rdx, [rbp - 0x38]
	mov	rcx, [rbp - 0x30]
	mov	rax, [rbp - 0x28]
	movaps	-0x90(%rbp), %xmm3
	movaps	-0x80(%rbp), %xmm2
	movaps	-0x70(%rbp), %xmm1
	movaps	-0x60(%rbp), %xmm0
	movq	-0x48(%rbp), %r9
	movq	-0x40(%rbp), %r8
	movq	-0x38(%rbp), %rdx
	movq	-0x30(%rbp), %rcx
	movq	-0x28(%rbp), %rax

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

	jmp	r11
	jmpq	*%r11

0:
	mov	rcx, [rbp - 0x30]
	mov	rdx, [rbp - 0x38]
	movq	-0x30(%rbp), %rcx
	movq	-0x38(%rbp), %rdx

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

	jmp	OFMethodNotFound
.def OFForward
.scl 2
.type 32
.endef

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

	/* Save all arguments */
	sub	rsp, 0x90	/* 16-byte alignment */
	mov	[rbp - 0x28], rax
	mov	[rbp - 0x30], rcx
	mov	[rbp - 0x38], rdx
	mov	[rbp - 0x40], r8
	mov	[rbp - 0x48], r9
	movaps	[rbp - 0x60], xmm0
	movaps	[rbp - 0x70], xmm1
	movaps	[rbp - 0x80], xmm2
	movaps	[rbp - 0x90], xmm3
	subq	$0x90, %rsp	/* 16-byte alignment */
	movq	%rax, -0x28(%rbp)
	movq	%rcx, -0x30(%rbp)
	movq	%rdx, -0x38(%rbp)
	movq	%r8, -0x40(%rbp)
	movq	%r9, -0x48(%rbp)
	movaps	%xmm0, -0x60(%rbp)
	movaps	%xmm1, -0x70(%rbp)
	movaps	%xmm2, -0x80(%rbp)
	movaps	%xmm3, -0x90(%rbp)

	mov	rcx, rdx
	movq	%rdx, %rcx
	call	object_getClass

	mov	rcx, rax
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	movq	%rax, %rcx
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rdx
	call	class_respondsToSelector

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

	mov	rcx, [rbp - 0x38]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	movq	-0x38(%rbp), %rcx
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rdx
	call	objc_msg_lookup

	mov	rcx, [rbp - 0x38]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	mov	r8, [rbp - 0x40]
	call	rax
	movq	-0x38(%rbp), %rcx
	leaq	.Lsel_forwardingTargetForSelector_(%rip), %rdx
	movq	-0x40(%rbp), %r8
	call	*%rax

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

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

	mov	rcx, rax
	mov	rdx, [rbp - 0x40]
	movq	%rax, %rcx
	movq	-0x40(%rbp), %rdx
	call	objc_msg_lookup_stret
	mov	r11, rax
	movq	%rax, %r11

	/* Restore all arguments */
	movaps	xmm3, [rbp - 0x90]
	movaps	xmm2, [rbp - 0x80]
	movaps	xmm1, [rbp - 0x70]
	movaps	xmm0, [rbp - 0x60]
	mov	r9, [rbp - 0x48]
	mov	r8, [rbp - 0x40]
	mov	rdx, [rbp - 0x38]
	mov	rcx, [rbp - 0x30]
	mov	rax, [rbp - 0x28]
	movaps	-0x90(%rbp), %xmm3
	movaps	-0x80(%rbp), %xmm2
	movaps	-0x70(%rbp), %xmm1
	movaps	-0x60(%rbp), %xmm0
	movq	-0x48(%rbp), %r9
	movq	-0x40(%rbp), %r8
	movq	-0x38(%rbp), %rdx
	movq	-0x30(%rbp), %rcx
	movq	-0x28(%rbp), %rax

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

	jmp	r11
	jmpq	*%r11

0:
	mov	rcx, [rbp - 0x30]
	mov	rdx, [rbp - 0x38]
	mov	r8, [rbp - 0x40]
	movq	-0x30(%rbp), %rcx
	movq	-0x38(%rbp), %rdx
	movq	-0x40(%rbp), %r8

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

	jmp	OFMethodNotFound_stret
.def OFForward_stret
.scl 2
.type 32
.endef

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

.section .ctors, "aw"
	.quad .Linit

.section .rodata
.Lstr_forwardingTargetForSelector_:

Modified src/runtime/lookup-asm/lookup-asm-amd64-win64.S from [aebc3c4fb2] to [e18eba8eb1].

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




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







-
-








-
+


-
+


-
-
+
+


-
-
+
+

-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
+





-
-
+
+



-
-
-
+
+
+

-
-
-
+
+
+










-
-
-
-
+
+
+
+

-
-
-
+
+
+












-
+



-
+

 * 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
.macro GENERATE_LOOKUP name notFound
\name:
	test	rcx, rcx
	testq	%rcx, %rcx
	jz	.LreturnNilMethod

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

	mov	r8, [rcx]
	mov	r8, [r8 + 56]
	movq	(%rcx), %r8
	movq	56(%r8), %r8

.Lmain_\name:
	mov	r10, rcx
	mov	r11, rdx
	movq	%rcx, %r10
	movq	%rdx, %r11

	mov	rax, [rdx]
	movzx	ecx, ah
	movzx	edx, al
	movq	(%rdx), %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	0f

	ret

0:
	mov	rcx, r10
	mov	rdx, r11
	movq	%r10, %rcx
	movq	%r11, %rdx
	jmp	\notFound

.LtaggedPointer_\name:
	xor	rcx, [rip + objc_taggedPointerSecret]
	and	cl, 0xE
	movzx	r8d, cl
	xorq	objc_taggedPointerSecret(%rip), %rcx
	andb	$0xE, %cl
	movzbl	%cl, %r8d

	lea	rax, [rip + objc_taggedPointerClasses]
	mov	r8, [rax + 4 * r8]
	mov	r8, [r8 + 56]
	leaq	objc_taggedPointerClasses(%rip), %rax
	movq	(%rax,%r8,4), %r8
	movq	56(%r8), %r8

	jmp	.Lmain_\name
.def \name
.scl 2
.type 32
.endef
.endm

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

	mov	r8, [r8 + 8]
	mov	r8, [r8 + 56]
	jmp	short .Lmain_\lookup
	movq	8(%r8), %r8
	movq	56(%r8), %r8
	jmp	.Lmain_\lookup
.def \name
.scl 2
.type 32
.endef
.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