ObjFW  Check-in [b177aa1b8b]

Overview
Comment:Convert all x86_64/Win64 ASM to Intel syntax

GAS has decent support for Intel syntax these days, so there is little
reason to stick with AT&T syntax.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: b177aa1b8b078c69f38ddb81cdc35ed8bd8ddaa992f2d9c6abd7895f4e6d303c
User & Date: js on 2020-06-30 20:50:42
Other Links: manifest | tags
Context
2020-06-30
22:44
Convert apple-forwarding-x86_64.S to Intel syntax check-in: fd8b23c282 user: js tags: trunk
20:52
Merge trunk into branch "tagged-pointers" check-in: c4a12e3fa1 user: js tags: tagged-pointers
20:50
Convert all x86_64/Win64 ASM to Intel syntax check-in: b177aa1b8b user: js tags: trunk
19:52
Don't use -no-integrated-as on Darwin check-in: f4e99b94d2 user: js tags: trunk
Changes

Modified src/forwarding/forwarding-x86_64-win64.S from [ec2efee322] to [b1b62864b4].

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







+
+





-
-
+
+


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



-
-
+
+


-
-
+
+

-
-
+
+


-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
+
+

-
-
+
+




-
-
+
+


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

-
+


-
-
+
+


-
-
+
+

-
-
+
+


-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
-
+
+
+

-
-
+
+




-
+







 * 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
of_forward:
	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
	mov	rdx, offset 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]
	mov	rdx, offset 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]
	mov	rdx, offset 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	of_method_not_found

of_forward_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
	mov	rdx, offset 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]
	mov	rdx, offset 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]
	mov	rdx, offset 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	of_method_not_found_stret

init:
	leaq	module(%rip), %rcx
	mov	rcx, offset module
	jmp	__objc_exec_class

.section .ctors, "aw"
	.quad init

.section .rodata
str_forwardingTargetForSelector_:

Modified src/runtime/lookup-asm/lookup-asm-x86_64-elf.S from [edf654aa73] to [d030c5228c].

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







-
+

-
+















-
+



-
+







.Lmain_\name:
	mov	rax, [rsi]
	movzx	ecx, ah
	movzx	edx, al
#ifdef OF_SELUID24
	shr	eax, 16

	mov	r8, [r8+rax*8]
	mov	r8,  [r8+rax*8]
#endif
	mov	r8, [r8+rcx*8]
	mov	r8,  [r8+rcx*8]
	mov	rax, [r8+rdx*8]

	test	rax, rax
	jz	short \not_found@PLT

	ret
.type \name, %function
.size \name, .-\name
.endm

.macro generate_lookup_super name lookup
\name:
	mov	r8, rdi
	mov	rdi, [rdi]
	test	rdi, rdi
	jz	ret_nil
	jz	short ret_nil

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

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

Modified src/runtime/lookup-asm/lookup-asm-x86_64-win64.S from [71fe436f5b] to [47f8ccf7d6].

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







+
+








-
-
+
+

-
-
+
+


-
-
+
+

-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
-
+
+




-
-
+
+





-
-
-
-
+
+
+
+

-
-
-
+
+
+








-
+



-
+

 * 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 not_found
\name:
	testq	%rcx, %rcx
	jz	ret_nil
	test	%rcx, %rcx
	jz	short ret_nil

	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+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
	jz	0f
	test	rax, rax
	jz	short 0f

	ret

0:
	movq	%r10, %rcx
	movq	%r11, %rdx
	mov	rcx, r10
	mov	rdx, r11
	jmp	\not_found
.endm

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

	movq	8(%r8), %r8
	movq	56(%r8), %r8
	jmp	.Lmain_\lookup
	mov	r8, [r8+8]
	mov	r8, [r8+56]
	jmp	short .Lmain_\lookup
.endm

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
	mov	rax, offset nil_method
	ret

nil_method:
	xorq	%rax, %rax
	xor	rax, rax
	ret