blob: cb9c0e6e72d5cd25614282db1af5e7483c32a1a5 [file] [log] [blame]
//**************************************************************
/ *
/ * Licensed to the Apache Software Foundation (ASF) under one
/ * or more contributor license agreements. See the NOTICE file
/ * distributed with this work for additional information
/ * regarding copyright ownership. The ASF licenses this file
/ * to you under the Apache License, Version 2.0 (the
/ * "License"); you may not use this file except in compliance
/ * with the License. You may obtain a copy of the License at
/ *
/ * http://www.apache.org/licenses/LICENSE-2.0
/ *
/ * Unless required by applicable law or agreed to in writing,
/ * software distributed under the License is distributed on an
/ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
/ * KIND, either express or implied. See the License for the
/ * specific language governing permissions and limitations
/ * under the License.
/ *
/ *************************************************************/
.align 4
.globl privateSnippetExecutorGeneral
privateSnippetExecutorGeneral:
movl %esp,%ecx
pushl %ebp / proper stack frame needed for exception handling
movl %esp,%ebp
andl $0xFFFFFFF8,%esp / align following 64bit arg
subl $0x8,%esp / 64bit nRegReturn
pushl %ecx / 32bit pCallStack
pushl %edx / 32bit nVtableOffset
pushl %eax / 32bit nFunctionIndex
call cpp_vtable_call
movl 12(%esp),%eax / 64 bit nRegReturn, lower half
leave
ret
.type privateSnippetExecutorGeneral, @function
.size privateSnippetExecutorGeneral, .-privateSnippetExecutorGeneral
.align 4
.globl privateSnippetExecutorVoid
privateSnippetExecutorVoid:
movl %esp,%ecx
pushl %ebp / proper stack frame needed for exception handling
movl %esp,%ebp
andl $0xFFFFFFF8,%esp / align following 64bit arg
subl $0x8,%esp / 64bit nRegReturn
pushl %ecx / 32bit pCallStack
pushl %edx / 32bit nVtableOffset
pushl %eax / 32bit nFunctionIndex
call cpp_vtable_call
leave
ret
.type privateSnippetExecutorVoid, @function
.size privateSnippetExecutorVoid, .-privateSnippetExecutorVoid
.align 4
.globl privateSnippetExecutorHyper
privateSnippetExecutorHyper:
movl %esp,%ecx
pushl %ebp / proper stack frame needed for exception handling
movl %esp,%ebp
andl $0xFFFFFFF8,%esp / align following 64bit arg
subl $0x8,%esp / 64bit nRegReturn
pushl %ecx / 32bit pCallStack
pushl %edx / 32bit nVtableOffset
pushl %eax / 32bit nFunctionIndex
call cpp_vtable_call
movl 12(%esp),%eax / 64 bit nRegReturn, lower half
movl 16(%esp),%edx / 64 bit nRegReturn, upper half
leave
ret
.type privateSnippetExecutorHyper, @function
.size privateSnippetExecutorHyper, .-privateSnippetExecutorHyper
.align 4
.globl privateSnippetExecutorFloat
privateSnippetExecutorFloat:
movl %esp,%ecx
pushl %ebp / proper stack frame needed for exception handling
movl %esp,%ebp
andl $0xFFFFFFF8,%esp / align following 64bit arg
subl $0x8,%esp / 64bit nRegReturn
pushl %ecx / 32bit pCallStack
pushl %edx / 32bit nVtableOffset
pushl %eax / 32bit nFunctionIndex
call cpp_vtable_call
flds 12(%esp) / 64 bit nRegReturn, lower half
leave
ret
.type privateSnippetExecutorFloat, @function
.size privateSnippetExecutorFloat, .-privateSnippetExecutorFloat
.align 4
.globl privateSnippetExecutorDouble
privateSnippetExecutorDouble:
movl %esp,%ecx
pushl %ebp / proper stack frame needed for exception handling
movl %esp,%ebp
andl $0xFFFFFFF8,%esp / align following 64bit arg
subl $0x8,%esp / 64bit nRegReturn
pushl %ecx / 32bit pCallStack
pushl %edx / 32bit nVtableOffset
pushl %eax / 32bit nFunctionIndex
call cpp_vtable_call
fldl 12(%esp) / 64 bit nRegReturn
leave
ret
.type privateSnippetExecutorDouble, @function
.size privateSnippetExecutorDouble, .-privateSnippetExecutorDouble
.align 4
.globl privateSnippetExecutorStruct
privateSnippetExecutorStruct:
movl %esp,%ecx
pushl %ebp / proper stack frame needed for exception handling
movl %esp,%ebp
andl $0xFFFFFFF8,%esp / align following 64bit arg
subl $0x8,%esp / 64bit nRegReturn
pushl %ecx / 32bit pCallStack
pushl %edx / 32bit nVtableOffset
pushl %eax / 32bit nFunctionIndex
call cpp_vtable_call
movl 12(%esp),%eax / 64 bit nRegReturn, lower half
leave
ret $4
.type privateSnippetExecutorStruct, @function
.size privateSnippetExecutorStruct, .-privateSnippetExecutorStruct
.align 4
.globl callVirtualMethod
callVirtualMethod:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl %edx, -4(%ebp)
movl %ecx, -8(%ebp)
movl %eax, -12(%ebp)
movl %esp, -16(%ebp)
movl %ebx, -20(%ebp)
/ set ebx to GOT
.L_GOT_BEGIN_2:
call .L_GOT_END_2
.L_GOT_END_2:
popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-.L_GOT_END_2],%ebx
.callBeginPosition:
movl 28(%ebp), %eax
movl %eax, %edx
dec %edx
shl $2, %edx
add 24(%ebp), %edx
.copyLong:
movl 0(%edx), %ecx
sub $4, %edx
push %ecx
dec %eax
jne .copyLong
.doCall:
movl 8(%ebp), %edx
movl 0(%edx), %edx
movl 12(%ebp), %eax
add $2, %eax
shl $2, %eax
add %eax, %edx
movl 0(%edx), %edx
call *%edx
.callVirtualMethodExceptionPosition:
/ handle returns
movl 20(%ebp), %ecx
/ byte types
cmp $2, %ecx / typelib_TypeClass_BOOLEAN
je .handleByte
cmp $3, %ecx
je .handleByte / typelib_TypeClass_BYTE
/ half word types
cmp $4, %ecx / typelib_TypeClass_SHORT
je .handleShort
cmp $5, %ecx / typelib_TypeClass_UNSIGNED_SHORT
je .handleShort
/ word types
cmp $6, %ecx / typelib_TypeClass_LONG
je .handleWord
cmp $7, %ecx / typelib_TypeClass_UNSIGNED_LONG
je .handleWord
cmp $1, %ecx / typelib_TypeClass_CHAR (wchar_t)
je .handleWord
cmp $15, %ecx / typelib_TypeClass_ENUM
je .handleWord
/ double word types
cmp $8, %ecx / typelib_TypeClass_HYPER
je .handleDoubleWord
cmp $9, %ecx / typelib_TypeClass_UNSIGNED_HYPER
je .handleDoubleWord
/ float
cmp $10, %ecx / typelib_TypeClass_FLOAT
je .handleFloat
/ double
cmp $11, %ecx / typelib_TypeClass_DOUBLE
je .handleDouble
/ default: return void
jmp .doRestore
.handleByte:
movl 16(%ebp), %ecx
movb %al, 0(%ecx)
jmp .doRestore
.handleShort:
movl 16(%ebp), %ecx
movw %ax, 0(%ecx)
jmp .doRestore
.handleWord:
movl 16(%ebp), %ecx
movl %eax, 0(%ecx)
jmp .doRestore
.handleDoubleWord:
movl 16(%ebp), %ecx
movl %eax, 0(%ecx)
movl %edx, 4(%ecx)
jmp .doRestore
.handleFloat:
movl 16(%ebp), %ecx
fstps 0(%ecx)
jmp .doRestore
.handleDouble:
movl 16(%ebp), %ecx
fstpl 0(%ecx)
jmp .doRestore
.doRestore:
movl -4(%ebp), %edx
movl -8(%ebp), %ecx
movl -12(%ebp), %eax
movl -20(%ebp), %ebx
movl %ebp, %esp
popl %ebp
ret
.type callVirtualMethod, @function
.size callVirtualMethod, .-callVirtualMethod
.globl callVirtualMethodExceptionHandler
callVirtualMethodExceptionHandler:
movl -4(%ebp), %edx
movl -8(%ebp), %ecx
movl -12(%ebp), %eax
movl -16(%ebp), %esp
movl -20(%ebp), %ebx
call __1cG__CrunMex_rethrow_q6F_v_@PLT
ret
.type callVirtualMethodExceptionHandler, @function
.size callVirtualMethodExceptionHandler, .-callVirtualMethodExceptionHandler
.section .exception_ranges,"aw"
.align 4
.4byte .callBeginPosition@rel
.4byte .callVirtualMethodExceptionPosition-.callBeginPosition
.4byte callVirtualMethodExceptionHandler-.callBeginPosition
.zero 8