| !\************************************************************** |
| ! * |
| ! * 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. |
| ! * |
| ! *************************************************************/ |
| |
| .global privateSnippetExecutor |
| .type privateSnippetExecutor,2 |
| privateSnippetExecutor: |
| ! save %sp, -96, %sp already done in code snippet |
| st %i0, [%fp+68] |
| st %i1, [%fp+72] |
| st %i2, [%fp+76] |
| st %i3, [%fp+80] |
| st %i4, [%fp+84] |
| st %i5, [%fp+88] |
| ! %o0: functionIndex, stored by code snippet |
| ! %o1: vtableOffset, stored by code snippet |
| call cpp_vtable_call |
| add %fp, 68, %o2 |
| .privateSnippetExecutorExceptionPosition: |
| subcc %o0, 11, %g0 |
| be .double |
| subcc %o0, 10, %g0 |
| be .float |
| ld [%fp+72], %i0 |
| ld [%fp+76], %i1 |
| ret |
| restore |
| .double: |
| ldd [%fp+72], %f0 |
| ret |
| restore |
| .float: |
| ld [%fp+72], %f0 |
| ret |
| restore |
| .size privateSnippetExecutor,(.-privateSnippetExecutor) |
| .align 8 |
| |
| |
| .global callVirtualMethod |
| .type callVirtualMethod,2 |
| callVirtualMethod: |
| ! allocate FIRST stack to have own local registers |
| sethi %hi(-96), %g1 |
| or %g1, %lo(-96), %g1 |
| subcc %g1, %o5, %g1 |
| subcc %g1, %o5, %g1 |
| subcc %g1, %o5, %g1 |
| subcc %g1, %o5, %g1 |
| save %sp, %g1, %sp |
| ! copy stack longs if necessary |
| subcc %i5, 6, %l5 |
| ble .copyRegisters |
| nop |
| |
| ! prepare source location |
| add %i4, 24, %l4 |
| |
| ! prepare real stack |
| add %sp, 92, %l3 |
| |
| .copyLong: |
| ld [%l4+0], %l0 |
| st %l0, [%l3] |
| add %l4, 4, %l4 |
| add %l3, 4, %l3 |
| deccc %l5 |
| bne .copyLong |
| nop |
| .copyRegisters: |
| mov %i5, %l5 |
| mov %i4, %l4 |
| |
| ld [%l4], %o0 |
| add %l4, 4, %l4 |
| deccc %l5 |
| ble .doCall |
| |
| ld [%l4], %o1 |
| add %l4, 4, %l4 |
| deccc %l5 |
| ble .doCall |
| |
| ld [%l4], %o2 |
| add %l4, 4, %l4 |
| deccc %l5 |
| ble .doCall |
| |
| ld [%l4], %o3 |
| add %l4, 4, %l4 |
| deccc %l5 |
| ble .doCall |
| |
| ld [%l4], %o4 |
| add %l4, 4, %l4 |
| deccc %l5 |
| ble .doCall |
| |
| ld [%l4], %o5 |
| add %l4, 4, %l4 |
| |
| ! prepare complex return pointer |
| st %i2, [%sp+64] |
| .doCall: |
| ! get virtual table entry |
| mov %i1, %l1 |
| add %l1, 2, %l1 |
| sll %l1, 2, %l1 |
| ld [%i0], %l3 |
| add %l3, %l1, %l1 |
| ld [%l1], %l0 |
| jmpl %l0,%o7 |
| nop |
| .callVirtualMethodExceptionPosition: |
| ! handle returns |
| |
| !byte types |
| subcc %i3, 2, %l3 ! typelib_TypeClass_BOOLEAN |
| be .handleByte |
| subcc %i3, 3, %l3 ! typelib_TypeClass_BYTE |
| be .handleByte |
| |
| ! half word types |
| subcc %i3, 4, %l3 ! typelib_TypeClass_SHORT |
| be .handleShort |
| subcc %i3, 5, %l3 ! typelib_TypeClass_UNSIGNED_SHORT |
| be .handleShort |
| subcc %i3, 1, %l3 ! typelib_TypeClass_CHAR (sal_Unicode==sal_uInt16) |
| be .handleShort |
| |
| ! word types |
| subcc %i3, 6, %l3 ! typelib_TypeClass_LONG |
| be .handleWord |
| subcc %i3, 7, %l3 ! typelib_TypeClass_UNSIGNED_LONG |
| be .handleWord |
| subcc %i3, 15, %l3 ! typelib_TypeClass_ENUM |
| be .handleWord |
| |
| ! double word types |
| subcc %i3, 8, %l3 ! typelib_TypeClass_HYPER |
| be .handleDoubleWord |
| subcc %i3, 9, %l3 ! typelib_TypeClass_UNSIGNED_HYPER |
| be .handleDoubleWord |
| |
| ! float |
| subcc %i3, 10, %l3 ! typelib_TypeClass_FLOAT |
| be .handleFloat |
| |
| ! double |
| subcc %i3, 11, %l3 ! typelib_TypeClass_DOUBLE |
| be .handleDouble |
| |
| ! default: return void |
| nop ! empty prefetch |
| ba .doRestore |
| nop |
| .handleByte: |
| stb %o0, [%i2] |
| ba .doRestore |
| nop |
| .handleShort: |
| sth %o0, [%i2] |
| ba .doRestore |
| nop |
| .handleWord: |
| st %o0, [%i2] |
| ba .doRestore |
| nop |
| .handleDoubleWord: |
| st %o0, [%i2] |
| st %o1, [%i2+4] |
| ba .doRestore |
| nop |
| .handleFloat: |
| st %f0, [%i2] |
| ba .doRestore |
| nop |
| .handleDouble: |
| std %f0, [%fp-8] |
| ldd [%fp-8], %o0 |
| st %o0, [%i2] |
| st %o1, [%i2+4] |
| ba .doRestore |
| nop |
| .doRestore: |
| ret |
| restore ! stack frame for own locals |
| .size callVirtualMethod,(.-callVirtualMethod) |
| .align 8 |
| |
| .rethrow_handler: |
| call __1cG__CrunMex_rethrow_q6F_v_ |
| nop |
| |
| .section ".exception_ranges",#alloc |
| .word %r_disp32(.privateSnippetExecutorExceptionPosition) |
| .word 0 |
| .word .rethrow_handler-.privateSnippetExecutorExceptionPosition |
| .word 0,0 |
| .word %r_disp32(.callVirtualMethodExceptionPosition) |
| .word 0 |
| .word .rethrow_handler-.callVirtualMethodExceptionPosition |
| .word 0,0 |