summaryrefslogtreecommitdiff
path: root/bridges/source/cpp_uno/cc50_solaris_intel/call.s
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/source/cpp_uno/cc50_solaris_intel/call.s')
-rw-r--r--bridges/source/cpp_uno/cc50_solaris_intel/call.s248
1 files changed, 248 insertions, 0 deletions
diff --git a/bridges/source/cpp_uno/cc50_solaris_intel/call.s b/bridges/source/cpp_uno/cc50_solaris_intel/call.s
new file mode 100644
index 000000000000..95bf79632031
--- /dev/null
+++ b/bridges/source/cpp_uno/cc50_solaris_intel/call.s
@@ -0,0 +1,248 @@
+ .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