ObjFW  Diff

Differences From Artifact [0df35756bb]:

To Artifact [75f4b5e2f7]:


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







-
-






-
+

-
-
+
+

-
-
+
+

-
-
+
+


-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
+




-
-
-
-
-
+
+
+
+
+

-
-
-
+
+
+




-
+

-
-
-
-
+
+
+
+

-
-
+
+



-
-
-
-
+
+
+
+

-
-
+
+


-
-
+
+

 * 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, __text, regular, pure_instructions
.macro generate_lookup
.macro GENERATE_LOOKUP
$0:
	test	rdi, rdi
	jz	ret_nil
	testq	%rdi, %rdi
	jz	returnNilMethod

	bt	edi, 0
	jc	Ltagged_pointer_$0
	testb	$$1, %dil
	jnz	LtaggedPointer_$0

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

Lmain_$0:
	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+rax*8]
	movq	(%r8,%rax,8), %r8
#endif
	mov	r8, [r8+rcx*8]
	mov	rax, [r8+rdx*8]
	movq	(%r8,%rcx,8), %r8
	movq	(%r8,%rdx,8), %rax

	test	rax, rax
	testq	%rax, %rax
	jz	$1

	ret

Ltagged_pointer_$0:
	mov	rax, [rip+_objc_tagged_pointer_secret@GOTPCREL]
	xor	rdi, [rax]
	and	dil, 0xE
	movzx	r8, dil
LtaggedPointer_$0:
	movq	_objc_taggedPointerSecret@GOTPCREL(%rip), %rax
	xorq	(%rax), %rdi
	andb	$$0xE, %dil
	movzbl	%dil, %r8d

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

	jmp	Lmain_$0
.endmacro

.macro generate_lookup_super
.macro GENERATE_LOOKUP_SUPER
$0:
	mov	r8, rdi
	mov	rdi, [rdi]
	test	rdi, rdi
	jz	ret_nil
	movq	%rdi, %r8
	movq	(%rdi), %rdi
	testq	%rdi, %rdi
	jz	returnNilMethod

	mov	r8, [r8+8]
	mov	r8, [r8+64]
	movq	8(%r8), %r8
	movq	64(%r8), %r8
	jmp	Lmain_$1
.endmacro

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

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

nil_method:
	mov	rax, rdi
nilMethod:
	xorq	%rax, %rax
	ret