1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 	.text
23*b1cdbd2cSJim Jagielski 	.align 2
24*b1cdbd2cSJim Jagielski .globl privateSnippetExecutor
25*b1cdbd2cSJim Jagielski 	.type	privateSnippetExecutor, @function
26*b1cdbd2cSJim Jagielski privateSnippetExecutor:
27*b1cdbd2cSJim Jagielski .LFB3:
28*b1cdbd2cSJim Jagielski 	pushq	%rbp
29*b1cdbd2cSJim Jagielski .LCFI0:
30*b1cdbd2cSJim Jagielski 	movq	%rsp, %rbp
31*b1cdbd2cSJim Jagielski .LCFI1:
32*b1cdbd2cSJim Jagielski 	subq	$160, %rsp
33*b1cdbd2cSJim Jagielski .LCFI2:
34*b1cdbd2cSJim Jagielski 	movq	%r10, -152(%rbp)		# Save (nVtableOffset << 32) + nFunctionIndex
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski 	movq	%rdi, -112(%rbp)		# Save GP registers
37*b1cdbd2cSJim Jagielski 	movq	%rsi, -104(%rbp)
38*b1cdbd2cSJim Jagielski 	movq	%rdx, -96(%rbp)
39*b1cdbd2cSJim Jagielski 	movq	%rcx, -88(%rbp)
40*b1cdbd2cSJim Jagielski 	movq	%r8 , -80(%rbp)
41*b1cdbd2cSJim Jagielski 	movq	%r9 , -72(%rbp)
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski 	movsd	%xmm0, -64(%rbp)		# Save FP registers
44*b1cdbd2cSJim Jagielski 	movsd	%xmm1, -56(%rbp)
45*b1cdbd2cSJim Jagielski 	movsd	%xmm2, -48(%rbp)
46*b1cdbd2cSJim Jagielski 	movsd	%xmm3, -40(%rbp)
47*b1cdbd2cSJim Jagielski 	movsd	%xmm4, -32(%rbp)
48*b1cdbd2cSJim Jagielski 	movsd	%xmm5, -24(%rbp)
49*b1cdbd2cSJim Jagielski 	movsd	%xmm6, -16(%rbp)
50*b1cdbd2cSJim Jagielski 	movsd	%xmm7, -8(%rbp)
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 	leaq	-144(%rbp), %r9			# 6th param: sal_uInt64 * pRegisterReturn
53*b1cdbd2cSJim Jagielski 	leaq	16(%rbp), %r8			# 5rd param: void ** ovrflw
54*b1cdbd2cSJim Jagielski 	leaq	-64(%rbp), %rcx			# 4th param: void ** fpreg
55*b1cdbd2cSJim Jagielski 	leaq	-112(%rbp), %rdx		# 3rd param: void ** gpreg
56*b1cdbd2cSJim Jagielski 	movl	-148(%rbp), %esi		# 2nd param: sal_int32 nVtableOffset
57*b1cdbd2cSJim Jagielski 	movl	-152(%rbp), %edi		# 1st param: sal_int32 nFunctionIndex
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski 	call	cpp_vtable_call
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 	cmp	$10, %rax					# typelib_TypeClass_FLOAT
62*b1cdbd2cSJim Jagielski 	je	.Lfloat
63*b1cdbd2cSJim Jagielski 	cmp	$11, %rax					# typelib_TypeClass_DOUBLE
64*b1cdbd2cSJim Jagielski 	je	.Lfloat
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 	movq	-144(%rbp), %rax		# Return value (int case)
67*b1cdbd2cSJim Jagielski 	movq	-136(%rbp), %rdx		# Return value (int case)
68*b1cdbd2cSJim Jagielski 	movq	-144(%rbp), %xmm0		# Return value (int case)
69*b1cdbd2cSJim Jagielski 	movq	-136(%rbp), %xmm1		# Return value (int case)
70*b1cdbd2cSJim Jagielski 	jmp	.Lfinish
71*b1cdbd2cSJim Jagielski .Lfloat:
72*b1cdbd2cSJim Jagielski 	movlpd	-144(%rbp), %xmm0		# Return value (float/double case)
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski .Lfinish:
75*b1cdbd2cSJim Jagielski 	leave
76*b1cdbd2cSJim Jagielski 	ret
77*b1cdbd2cSJim Jagielski .LFE3:
78*b1cdbd2cSJim Jagielski 	.size	privateSnippetExecutor, .-privateSnippetExecutor
79*b1cdbd2cSJim Jagielski 	# see http://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html
80*b1cdbd2cSJim Jagielski 	# for details of the .eh_frame, the "Common Information Entry" and "Frame Description Entry" formats
81*b1cdbd2cSJim Jagielski 	# and http://mentorembedded.github.io/cxx-abi/exceptions.pdf for more info
82*b1cdbd2cSJim Jagielski 	.section	.eh_frame,"a",@progbits
83*b1cdbd2cSJim Jagielski .Lframe1:
84*b1cdbd2cSJim Jagielski 	.long	.LECIE1-.LSCIE1
85*b1cdbd2cSJim Jagielski .LSCIE1:
86*b1cdbd2cSJim Jagielski 	.long	0x0
87*b1cdbd2cSJim Jagielski 	.byte	0x1
88*b1cdbd2cSJim Jagielski 	.string	"zR"
89*b1cdbd2cSJim Jagielski 	.uleb128 0x1
90*b1cdbd2cSJim Jagielski 	.sleb128 -8
91*b1cdbd2cSJim Jagielski 	.byte	0x10
92*b1cdbd2cSJim Jagielski 	.uleb128 0x1
93*b1cdbd2cSJim Jagielski 	.byte	0x1b
94*b1cdbd2cSJim Jagielski 	.byte	0xc
95*b1cdbd2cSJim Jagielski 	.uleb128 0x7
96*b1cdbd2cSJim Jagielski 	.uleb128 0x8
97*b1cdbd2cSJim Jagielski 	.byte	0x90
98*b1cdbd2cSJim Jagielski 	.uleb128 0x1
99*b1cdbd2cSJim Jagielski 	.align 8
100*b1cdbd2cSJim Jagielski .LECIE1:
101*b1cdbd2cSJim Jagielski .LSFDE1:
102*b1cdbd2cSJim Jagielski 	.long	.LEFDE1-.LASFDE1
103*b1cdbd2cSJim Jagielski .LASFDE1:
104*b1cdbd2cSJim Jagielski 	.long	.LASFDE1-.Lframe1
105*b1cdbd2cSJim Jagielski 	.long	.LFB3-.
106*b1cdbd2cSJim Jagielski 	.long	.LFE3-.LFB3
107*b1cdbd2cSJim Jagielski 	.uleb128 0x0
108*b1cdbd2cSJim Jagielski 	.byte	0x4
109*b1cdbd2cSJim Jagielski 	.long	.LCFI0-.LFB3
110*b1cdbd2cSJim Jagielski 	.byte	0xe
111*b1cdbd2cSJim Jagielski 	.uleb128 0x10
112*b1cdbd2cSJim Jagielski 	.byte	0x86
113*b1cdbd2cSJim Jagielski 	.uleb128 0x2
114*b1cdbd2cSJim Jagielski 	.byte	0x4
115*b1cdbd2cSJim Jagielski 	.long	.LCFI1-.LCFI0
116*b1cdbd2cSJim Jagielski 	.byte	0xd
117*b1cdbd2cSJim Jagielski 	.uleb128 0x6
118*b1cdbd2cSJim Jagielski 	.align 8
119*b1cdbd2cSJim Jagielski .LEFDE1:
120*b1cdbd2cSJim Jagielski 	.section	.note.GNU-stack,"",@progbits
121