ObjFW  Check-in [adc1dedc5f]

Overview
Comment:Revert apple-call-x86_64.S back to AT&T syntax

Intel syntax is too buggy in the Apple assembler.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: adc1dedc5f94e03853c932805d744cbf43d2a30c2617f8179f470c9230bf85ff
User & Date: js on 2021-02-08 02:04:32
Other Links: manifest | tags
Context
2021-02-08
02:08
Revert call-x86_64-elf.S back to AT&T syntax check-in: 541b66cc87 user: js tags: trunk
02:04
Revert apple-call-x86_64.S back to AT&T syntax check-in: adc1dedc5f user: js tags: trunk
02:01
Revert forwarding-x86-elf.S back to AT&T syntax check-in: 0ce474546f user: js tags: trunk
2020-06-30
23:46
Convert apple-call-x86_64.S to Intel syntax check-in: bf1cc071e3 user: js tags: trunk
Changes

Modified src/invocation/apple-call-x86_64.S from [11cbf74197] to [bd0fafe6da].

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







-
-




-
-
+
+

-
-
-
+
+
+

-
-
+
+

-
+



-
+


-
-
-
+
+
+




-
+

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

-
-
-
-
-
+
+
+
+
+

-
-
+
+

-
+


-
+


-
+





-
-
-
-
-
+
+
+
+
+

-
+

-
+


-
+



-
-
+
+




-
-
+
+







-
+



-
-
+
+

 * file.
 */

#include "config.h"

#include "invoke-x86_64.h"

.intel_syntax noprefix

.globl _of_invocation_call

.section __TEXT, __text, regular, pure_instructions
_of_invocation_call:
	push	rbp
	mov	rbp, rsp
	pushq	%rbp
	movq	%rsp, %rbp

	sub	rsp, 16
	and	rsp, -16
	mov	[rbp-8], rdi
	subq	$16, %rsp
	andq	$-16, %rsp
	movq	%rdi, -8(%rbp)

	lea	rdx, [rdi+OFFSET_STACK]
	mov	rcx, [rdi+OFFSET_STACK_SIZE]
	leaq	OFFSET_STACK(%rdi), %rdx
	movq	OFFSET_STACK_SIZE(%rdi), %rcx

	test	rcx, 1
	testq	$1, %rcx
	jnz	Lfix_align

Lfill_stack:
	test	rcx, rcx
	testq	%rcx, %rcx
	jz	Lstack_filled

	dec	rcx
	mov	r11, [rdx+rcx*8]
	push	r11
	decq	%rcx
	movq	(%rdx,%rcx,8), %r11
	pushq	%r11

	jmp	Lfill_stack

Lstack_filled:
	mov	al, [rdi+OFFSET_NUM_SSE_USED]
	movb	OFFSET_NUM_SSE_USED(%rdi), %al

	movaps	xmm7, [rdi+OFFSET_SSE_INOUT+112]
	movaps	xmm6, [rdi+OFFSET_SSE_INOUT+96]
	movaps	xmm5, [rdi+OFFSET_SSE_INOUT+80]
	movaps	xmm4, [rdi+OFFSET_SSE_INOUT+64]
	movaps	xmm3, [rdi+OFFSET_SSE_INOUT+48]
	movaps	xmm2, [rdi+OFFSET_SSE_INOUT+32]
	movaps	xmm1, [rdi+OFFSET_SSE_INOUT+16]
	movaps	xmm0, [rdi+OFFSET_SSE_INOUT]
	movaps	OFFSET_SSE_INOUT+112(%rdi), %xmm7
	movaps	OFFSET_SSE_INOUT+96(%rdi), %xmm6
	movaps	OFFSET_SSE_INOUT+80(%rdi), %xmm5
	movaps	OFFSET_SSE_INOUT+64(%rdi), %xmm4
	movaps	OFFSET_SSE_INOUT+48(%rdi), %xmm3
	movaps	OFFSET_SSE_INOUT+32(%rdi), %xmm2
	movaps	OFFSET_SSE_INOUT+16(%rdi), %xmm1
	movaps	OFFSET_SSE_INOUT(%rdi), %xmm0

	mov	r9,  [rdi+OFFSET_GPR_IN+40]
	mov	r8,  [rdi+OFFSET_GPR_IN+32]
	mov	rcx, [rdi+OFFSET_GPR_IN+24]
	mov	rdx, [rdi+OFFSET_GPR_IN+16]
	mov	rsi, [rdi+OFFSET_GPR_IN+8]
	movq	OFFSET_GPR_IN+40(%rdi), %r9
	movq	OFFSET_GPR_IN+32(%rdi), %r8
	movq	OFFSET_GPR_IN+24(%rdi), %rcx
	movq	OFFSET_GPR_IN+16(%rdi), %rdx
	movq	OFFSET_GPR_IN+8(%rdi), %rsi

	mov	r11b, [rdi+OFFSET_RETURN_TYPE]
	mov	rdi,  [rdi+OFFSET_GPR_IN]
	movb	OFFSET_RETURN_TYPE(%rdi), %r11b
	movq	OFFSET_GPR_IN(%rdi), %rdi

	cmp	r11b, RETURN_TYPE_STRET
	cmpb	$RETURN_TYPE_STRET, %r11b
	je	Lcall_send_stret

	cmp	r11b, RETURN_TYPE_JMP
	cmpb	$RETURN_TYPE_JMP, %r11b
	je	_objc_msgSend

	cmp	r11b, RETURN_TYPE_JMP_STRET
	cmpb	$RETURN_TYPE_JMP_STRET, %r11b
	je	_objc_msgSend_stret

	call	_objc_msgSend

Lafter_send:
	mov	rdi, [rbp-8]
	mov	[rdi+OFFSET_GPR_OUT], rax
	mov	[rdi+OFFSET_GPR_OUT+8], rdx
	movaps	[rdi+OFFSET_SSE_INOUT], xmm0
	movaps	[rdi+OFFSET_SSE_INOUT+16], xmm1
	movq	-8(%rbp), %rdi
	movq	%rax, OFFSET_GPR_OUT(%rdi)
	movq	%rdx, OFFSET_GPR_OUT+8(%rdi)
	movaps	%xmm0, OFFSET_SSE_INOUT(%rdi)
	movaps	%xmm1, OFFSET_SSE_INOUT+16(%rdi)

	mov	r11b, [rdi+OFFSET_RETURN_TYPE]
	movb	OFFSET_RETURN_TYPE(%rdi), %r11b

	cmp	r11b, RETURN_TYPE_X87
	cmpb	$RETURN_TYPE_X87, %r11b
	je	Lpop_long_double

	cmp	r11b, RETURN_TYPE_COMPLEX_X87
	cmpb	$RETURN_TYPE_COMPLEX_X87, %r11b
	je	Lpop_complex_long_double

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

	ret

Lfix_align:
	xor	r11, r11
	push	r11
	xorq	%r11, %r11
	pushq	%r11
	jmp	Lfill_stack

Lcall_send_stret:
	call	_objc_msgSend_stret
	jmp	Lafter_send

Lpop_long_double:
	fstp	tbyte ptr [rdi+OFFSET_X87_OUT]
	fstpt	OFFSET_X87_OUT(%rdi)
	jmp	Lreturn

Lpop_complex_long_double:
	fstp	tbyte ptr [rdi+OFFSET_X87_OUT]
	fstp	tbyte ptr [rdi+OFFSET_X87_OUT+16]
	fstpt	OFFSET_X87_OUT(%rdi)
	fstpt	OFFSET_X87_OUT+16(%rdi)
	jmp	Lreturn