ObjFW  Check-in [71d8f813ef]

Overview
Comment:Remove unnecessary `short` from assembly
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 71d8f813efdaea4acdc0f958a22b71ba7f62d1c4edeaf17f4fe2cdb06f219e29
User & Date: js on 2023-10-28 18:45:35
Other Links: manifest | tags
Context
2023-10-28
18:50
Fix accidentally left over movq check-in: 7a1b76cbec user: js tags: trunk
18:45
Remove unnecessary `short` from assembly check-in: 71d8f813ef user: js tags: trunk
18:35
Use more local labels in assembly check-in: cb18f26404 user: js tags: trunk
Changes

Modified src/forwarding/forwarding-amd64-elf.S from [60cb5f07a9] to [c81bf7cc2c].

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







-
+











-
+

-
+







	call	object_getClass@PLT

	mov	rdi, rax
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	call	class_respondsToSelector@PLT

	test	rax, rax
	jz	short 0f
	jz	0f

	mov	rdi, [rbp - 0x10]
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	call	objc_msg_lookup@PLT

	mov	rdi, [rbp - 0x10]
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	mov	rdx, [rbp - 0x18]
	call	rax

	test	rax, rax
	jz	short 0f
	jz	0f
	cmp	rax, [rbp - 0x10]
	je	short 0f
	je	0f

	mov	[rbp - 0x10], rax

	mov	rdi, rax
	mov	rsi, [rbp - 0x18]
	call	objc_msg_lookup@PLT
	mov	r11, rax
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
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







-
+











-
+

-
+







	call	object_getClass@PLT

	mov	rdi, rax
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	call	class_respondsToSelector@PLT

	test	rax, rax
	jz	short 0f
	jz	0f

	mov	rdi, [rbp - 0x18]
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	call	objc_msg_lookup@PLT

	mov	rdi, [rbp - 0x18]
	lea	rsi, [rip + .Lsel_forwardingTargetForSelector_]
	mov	rdx, [rbp - 0x20]
	call	rax

	test	rax, rax
	jz	short 0f
	jz	0f
	cmp	rax, [rbp - 0x18]
	je	short 0f
	je	0f

	mov	[rbp - 0x18], rax

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

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

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







-
+











-
+

-
+







	call	object_getClass

	mov	rcx, rax
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	call	class_respondsToSelector

	test	rax, rax
	jz	short 0f
	jz	0f

	mov	rcx, [rbp - 0x30]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	call	objc_msg_lookup

	mov	rcx, [rbp - 0x30]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	mov	r8, [rbp - 0x38]
	call	rax

	test	rax, rax
	jz	short 0f
	jz	0f
	cmp	rax, [rbp - 0x30]
	je	short 0f
	je	0f

	mov	[rbp - 0x30], rax

	mov	rcx, rax
	mov	rdx, [rbp - 0x38]
	call	objc_msg_lookup
	mov	r11, rax
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
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







-
+











-
+

-
+







	call	object_getClass

	mov	rcx, rax
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	call	class_respondsToSelector

	test	rax, rax
	jz	short 0f
	jz	0f

	mov	rcx, [rbp - 0x38]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	call	objc_msg_lookup

	mov	rcx, [rbp - 0x38]
	lea	rdx, [rip + .Lsel_forwardingTargetForSelector_]
	mov	r8, [rbp - 0x40]
	call	rax

	test	rax, rax
	jz	short 0f
	jz	0f
	cmp	rax, [rbp - 0x38]
	je	short 0f
	je	0f

	mov	[rbp - 0x38], rax

	mov	rcx, rax
	mov	rdx, [rbp - 0x40]
	call	objc_msg_lookup_stret
	mov	r11, rax

Modified src/forwarding/forwarding-x86-elf.S from [7d07165df3] to [6488f750ac].

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







-
+
















-
+

-
+








	mov	[esp], eax
	lea	eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
	mov	[esp + 4], eax
	call	class_respondsToSelector@PLT

	test	eax, eax
	jz	short 0f
	jz	0f

	mov	eax, [ebp + 8]
	mov	[esp], eax
	lea	eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
	mov	[esp + 4], eax
	call	objc_msg_lookup@PLT

	mov	edx, [ebp + 8]
	mov	[esp], edx
	lea	edx, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
	mov	[esp + 4], edx
	mov	edx, [ebp + 12]
	mov	[esp + 8], edx
	call	eax

	test	eax, eax
	jz	short 0f
	jz	0f
	cmp	eax, [ebp + 8]
	je	short 0f
	je	0f

	mov	[ebp + 8], eax
	mov	[esp], eax
	mov	eax, [ebp + 12]
	mov	[esp + 4], eax
	call	objc_msg_lookup@PLT

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







-
+




-
+











-
+

-
+








	mov	[esp], eax
	lea	eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
	mov	[esp + 4], eax
	call	class_respondsToSelector@PLT

	test	eax, eax
	jz	short 0f
	jz	0f

	mov	eax, [ebp + 12]
	mov	[esp], eax
	lea	eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
	mov	[esp  + 4], eax
	mov	[esp + 4], eax
	call	objc_msg_lookup@PLT

	mov	edx, [ebp + 12]
	mov	[esp], edx
	lea	edx, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
	mov	[esp + 4], edx
	mov	edx, [ebp + 16]
	mov	[esp + 8], edx
	call	eax

	test	eax, eax
	jz	short 0f
	jz	0f
	cmp	eax, [ebp + 12]
	je	short 0f
	je	0f

	mov	[ebp + 12], eax
	mov	[esp], eax
	mov	eax, [ebp + 16]
	mov	[esp + 4], eax
	call	objc_msg_lookup_stret@PLT

Modified src/forwarding/forwarding-x86-win32.S from [a9803a8051] to [e2482c7f1d].

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







-
+
















-
+

-
+








	mov	[esp], eax
	mov	eax, offset .Lsel_forwardingTargetForSelector_
	mov	[esp + 4], eax
	call	_class_respondsToSelector

	test	eax, eax
	jz	short 0f
	jz	0f

	mov	eax, [ebp + 8]
	mov	[esp], eax
	mov	eax, offset .Lsel_forwardingTargetForSelector_
	mov	[esp + 4], eax
	call	_objc_msg_lookup

	mov	edx, [ebp + 8]
	mov	[esp], edx
	mov	edx, offset .Lsel_forwardingTargetForSelector_
	mov	[esp + 4], edx
	mov	edx, [ebp + 12]
	mov	[esp + 8], edx
	call	eax

	test	eax, eax
	jz	short 0f
	jz	0f
	cmp	eax, [ebp + 8]
	je	short 0f
	je	0f

	mov	[ebp + 8], eax
	mov	[esp], eax
	mov	eax, [ebp + 12]
	mov	[esp + 4], eax
	call	_objc_msg_lookup

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







-
+
















-
+

-
+




-
+








	mov	[esp], eax
	mov	eax, offset .Lsel_forwardingTargetForSelector_
	mov	[esp + 4], eax
	call	_class_respondsToSelector

	test	eax, eax
	jz	short 0f
	jz	0f

	mov	eax, [ebp + 12]
	mov	[esp], eax
	mov	eax, offset .Lsel_forwardingTargetForSelector_
	mov	[esp + 4], eax
	call	_objc_msg_lookup

	mov	edx, [ebp + 12]
	mov	[esp], edx
	mov	edx, offset .Lsel_forwardingTargetForSelector_
	mov	[esp + 4], edx
	mov	edx, [ebp + 16]
	mov	[esp + 8], edx
	call	eax

	test	eax, eax
	jz	short 0f
	jz	0f
	cmp	eax, [ebp + 12]
	je	short 0f
	je	0f

	mov	[ebp + 12], eax
	mov	[esp], eax
	mov	eax, [ebp + 16]
	mov	[esp  + 4], eax
	mov	[esp + 4], eax
	call	_objc_msg_lookup_stret

	add	esp, 20
	pop	ebx
	pop	ebp

	jmp	eax

Modified src/platform/x86/OFAtomic.h from [19cc36e8a6] to [5dfd999b87].

233
234
235
236
237
238
239
240

241
242
243
244
245
246
247
233
234
235
236
237
238
239

240
241
242
243
244
245
246
247







-
+







	__asm__ __volatile__ (
	    "0:\n\t"
	    "mov{l}	{ %2, %0 | %0, %2 }\n\t"
	    "mov{l}	{ %0, %%eax | eax, %0 }\n\t"
	    "or{l}	{ %1, %0 | %0, %1 }\n\t"
	    "lock\n\t"
	    "cmpxchg{l}	{ %0, %2 | %2, %0 }\n\t"
	    "jne	{ | short } 0b"
	    "jne	0b"
	    : "=&r"(i)
	    : "r"(i), "m"(*p)
	    : "eax", "cc"
	);

	return i;
}
256
257
258
259
260
261
262
263

264
265
266
267
268
269
270
256
257
258
259
260
261
262

263
264
265
266
267
268
269
270







-
+







		__asm__ __volatile__ (
		    "0:\n\t"
		    "mov{q}	{ %2, %0 | %0, %2 }\n\t"
		    "mov{q}	{ %0, %%rax | rax, %0 }\n\t"
		    "or{q}	{ %1, %0 | %0, %1 }\n\t"
		    "lock\n\t"
		    "cmpxchg{q}	{ %0, %2 | %2, %0 }\n\t"
		    "jne	{ | short } 0b"
		    "jne	0b"
		    : "=&r"(i)
		    : "r"(i), "m"(*p)
		    : "rax", "cc"
		);
#endif
	else
		abort();
278
279
280
281
282
283
284
285

286
287
288
289
290
291
292
278
279
280
281
282
283
284

285
286
287
288
289
290
291
292







-
+







	__asm__ __volatile__ (
	    "0:\n\t"
	    "mov{l}	{ %2, %0 | %0, %2 }\n\t"
	    "mov{l}	{ %0, %%eax | eax, %0 }\n\t"
	    "and{l}	{ %1, %0 | %0, %1 }\n\t"
	    "lock\n\t"
	    "cmpxchg{l}	{ %0, %2 | %2, %0 }\n\t"
	    "jne	{ | short } 0b"
	    "jne	0b"
	    : "=&r"(i)
	    : "r"(i), "m"(*p)
	    : "eax", "cc"
	);

	return i;
}
301
302
303
304
305
306
307
308

309
310
311
312
313
314
315
301
302
303
304
305
306
307

308
309
310
311
312
313
314
315







-
+







		__asm__ __volatile__ (
		    "0:\n\t"
		    "mov{q}	{ %2, %0 | %0, %2 }\n\t"
		    "mov{q}	{ %0, %%rax | rax, %0 }\n\t"
		    "and{q}	{ %1, %0 | %0, %1 }\n\t"
		    "lock\n\t"
		    "cmpxchg{q}	{ %0, %2 | %2, %0 }\n\t"
		    "jne	{ | short } 0b"
		    "jne	0b"
		    : "=&r"(i)
		    : "r"(i), "m"(*p)
		    : "rax", "cc"
		);
#endif
	else
		abort();
323
324
325
326
327
328
329
330

331
332
333
334
335
336
337
323
324
325
326
327
328
329

330
331
332
333
334
335
336
337







-
+







	__asm__ __volatile__ (
	    "0:\n\t"
	    "mov{l}	{ %2, %0 | %0, %2 }\n\t"
	    "mov{l}	{ %0, %%eax | eax, %0 }\n\t"
	    "xor{l}	{ %1, %0 | %0, %1 }\n\t"
	    "lock\n\t"
	    "cmpxchg{l}	{ %0, %2 | %2, %0 }\n\t"
	    "jne	{ | short } 0b"
	    "jne	0b"
	    : "=&r"(i)
	    : "r"(i), "m"(*p)
	    : "eax", "cc"
	);

	return i;
}
346
347
348
349
350
351
352
353

354
355
356
357
358
359
360
346
347
348
349
350
351
352

353
354
355
356
357
358
359
360







-
+







		__asm__ __volatile__ (
		    "0:\n\t"
		    "mov{q}	{ %2, %0 | %0, %2 }\n\t"
		    "mov{q}	{ %0, %%rax | rax, %0 }\n\t"
		    "xor{q}	{ %1, %0 | %0, %1 }\n\t"
		    "lock\n\t"
		    "cmpxchg{q}	{ %0, %2 | %2, %0 }\n\t"
		    "jne	{ | short } 0b"
		    "jne	0b"
		    : "=&r"(i)
		    : "r"(i), "m"(*p)
		    : "rax", "cc"
		);
#endif
	else
		abort();

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

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







-
+


-
+

















-
+













-
+









-
+



-
+







.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret

.section .text
.macro GENERATE_LOOKUP name notFound
\name:
	test	rdi, rdi
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	test	dil, 1
	jnz	short .LtaggedPointer_\name
	jnz	.LtaggedPointer_\name

	mov	r8, [rdi]
	mov	r8, [r8 + 64]

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

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

	test	rax, rax
	jz	short \notFound@PLT
	jz	\notFound@PLT

	ret

.LtaggedPointer_\name:
	mov	rax, [rip + objc_taggedPointerSecret@GOTPCREL]
	xor	rdi, [rax]
	and	dil, 0xE
	movzx	r8d, dil

	mov	rax, [rip + objc_taggedPointerClasses@GOTPCREL]
	mov	r8, [rax + 4 * r8]
	mov	r8, [r8 + 64]

	jmp	short .Lmain_\name
	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
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	mov	r8, [r8 + 8]
	mov	r8, [r8 + 64]
	jmp	short .Lmain_\lookup
	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

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

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







-
+


-
+




















-
+






-
+










-
+







.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret

.section .text
.macro GENERATE_LOOKUP name notFound
\name:
	test	rcx, rcx
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	test	cl, 1
	jnz	short .LtaggedPointer_\name
	jnz	.LtaggedPointer_\name

	mov	r8, [rcx]
	mov	r8, [r8 + 56]

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

	mov	rax, [rdx]
	movzx	ecx, ah
	movzx	edx, al
#ifdef OF_SELUID24
	shr	eax, 16

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

	test	rax, rax
	jz	short 0f
	jz	0f

	ret

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

.LtaggedPointer_\name:
	xor	rcx, [rip + objc_taggedPointerSecret]
	and	cl, 0xE
	movzx	r8d, cl

	lea	rax, [rip + objc_taggedPointerClasses]
	mov	r8, [rax + 4 * r8]
	mov	r8, [r8 + 56]

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

.macro GENERATE_LOOKUP_SUPER name lookup

Modified src/runtime/lookup-asm/lookup-asm-x86-elf.S from [cd6507b46d] to [657ef9388f].

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







-
+


-
+

















-
+







.globl objc_msg_lookup_super_stret

.section .text
.macro GENERATE_LOOKUP name notFound
\name:
	mov	edx, [esp + 4]
	test	edx, edx
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	test	dl, 1
	jnz	short .LtaggedPointer_\name
	jnz	.LtaggedPointer_\name

	mov	edx, [edx]
	mov	edx, [edx + 32]

.Lmain_\name:
	mov	eax, [esp + 8]

#ifdef OF_SELUID24
	movzx	ecx, byte ptr [eax + 2]
	mov	edx, [edx + 4 * ecx]
#endif
	movzx	ecx, byte ptr [eax + 1]
	mov	edx, [edx + 4 * ecx]
	movzx	ecx, byte ptr [eax]
	mov	eax, [edx + 4 * ecx]

	test	eax, eax
	jz	short 0f
	jz	0f

	ret

0:
	call	.LgetEIP
	add	eax, offset _GLOBAL_OFFSET_TABLE_
	mov	eax, [eax + \notFound@GOT]
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
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







-
+









-
+




-
+







	and	dl, 0xE
	movzx	edx, dl

	mov	eax, [eax + objc_taggedPointerClasses@GOT]
	mov	edx, [eax + 2 * edx]
	mov	edx, [edx + 32]

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

.macro GENERATE_LOOKUP_SUPER name lookup
\name:
	mov	edx, [esp + 4]
	mov	eax, [edx]
	test	eax, eax
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	mov	[esp + 4], eax
	mov	edx, [edx + 4]
	mov	edx, [edx + 32]
	jmp	short .Lmain_\lookup
	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

Modified src/runtime/lookup-asm/lookup-asm-x86-win32.S from [d9ae57eae0] to [8858e35bdf].

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







-
+


-
+

















-
+











-
+











-
+


-
+

-
+







.globl _objc_msg_lookup_super_stret

.section .text
.macro GENERATE_LOOKUP name notFound
\name:
	mov	edx, [esp + 4]
	test	edx, edx
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	test	dl, 1
	jnz	short .LtaggedPointer_\name
	jnz	.LtaggedPointer_\name

	mov	edx, [edx]
	mov	edx, [edx + 32]

.Lmain_\name:
	mov	eax, [esp + 8]

#ifdef OF_SELUID24
	movzx	ecx, byte ptr [eax + 2]
	mov	edx, [edx + 4 * ecx]
#endif
	movzx	ecx, byte ptr [eax + 1]
	mov	edx, [edx + 4 * ecx]
	movzx	ecx, byte ptr [eax]
	mov	eax, [edx + 4 * ecx]

	test	eax, eax
	jz	short \notFound
	jz	\notFound

	ret

.LtaggedPointer_\name:
	xor	edx, _objc_taggedPointerSecret
	and	dl, 0xE
	movzx	edx, dl

	mov	edx, [_objc_taggedPointerClasses + 2 * edx]
	mov	edx, [edx + 32]

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

.macro GENERATE_LOOKUP_SUPER name lookup
\name:
	mov	edx, [esp + 4]
	mov	eax, [edx]
	test	eax, eax
	jz	short .LreturnNilMethod
	jz	.LreturnNilMethod

	mov	[esp + 4], eax
	mov	edx, [edx  + 4]
	mov	edx, [edx + 4]
	mov	edx, [edx + 32]
	jmp	short .Lmain_\lookup
	jmp	.Lmain_\lookup
.def \name
.scl 2
.type 32
.endef
.endm

GENERATE_LOOKUP _objc_msg_lookup _objc_methodNotFound