ObjFW  Check-in [70a7617023]

Overview
Comment:Move AMD64/Win64 assembly back to Intel syntax

This used to be in Intel syntax, but was moved back to AT&T syntax for
consistency with the Mach-O version, where the assembler doesn't support
the Intel syntax properly. However, it makes more sense to use Intel
syntax where possible.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 70a7617023068e74749c43f3dbe453a6d0588982122358ff975c1da47a2edd8d
User & Date: js on 2023-10-25 00:23:15
Other Links: manifest | tags
Context
2023-10-25
00:50
Move x86/Win32 assembly back to Intel syntax check-in: 357bcde965 user: js tags: trunk
00:23
Move AMD64/Win64 assembly back to Intel syntax check-in: 70a7617023 user: js tags: trunk
2023-10-24
23:56
Move AMD64/ELF assembly back to Intel syntax check-in: ec513d0c55 user: js tags: trunk
Changes

Modified src/forwarding/forwarding-amd64-win64.S from [ae09f773a9] to [66e90d878f].

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







+
+





-
-
+
+


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



-
-
+
+


-
-
+
+

-
-
+
+


-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
+
+

-
-
+
+








-
-
+
+


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

-
+


-
-
+
+


-
-
+
+

-
-
+
+


-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
-
+
+
+

-
-
+
+








-
+







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

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

	call	object_getClass

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

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

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

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

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

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

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

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

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

	jmpq	*%r11
	jmp	r11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	jmpq	*%r11
	jmp	r11

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

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

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

init:
	leaq	module(%rip), %rcx
	lea	rcx, [rip + module]
	jmp	__objc_exec_class

.section .ctors, "aw"
	.quad init

.section .rodata
str_forwardingTargetForSelector_:

Modified src/runtime/lookup-asm/lookup-asm-amd64-win64.S from [13eae8467e] to [56a0df9bbf].

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







+
+








-
-
+
+

-
-
+
+

-
-
+
+


-
-
+
+

-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
-
+
+




-
-
-
+
+
+


-
-
-
+
+
+

-
-
-
+
+
+

-
+








-
-
-
-
+
+
+
+

-
-
-
+
+
+












-
+



-
+

 * 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:
	testq	%rcx, %rcx
	jz	returnNilMethod
	test	rcx, rcx
	jz	short returnNilMethod

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

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

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

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

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

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

	ret

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

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

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

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

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

	movq	8(%r8), %r8
	movq	56(%r8), %r8
	jmp	.Lmain_\lookup
	mov	r8, [r8 + 8]
	mov	r8, [r8 + 56]
	jmp	short .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

returnNilMethod:
	leaq	nilMethod(%rip), %rax
	lea	rax, [rip + nilMethod]
	ret

nilMethod:
	xorq	%rax, %rax
	xor	rax, rax
	ret