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 .global privateSnippetExecutor 23*b1cdbd2cSJim Jagielski .type privateSnippetExecutor,2 24*b1cdbd2cSJim Jagielski privateSnippetExecutor: 25*b1cdbd2cSJim Jagielski ! save %sp, -96, %sp already done in code snippet 26*b1cdbd2cSJim Jagielski st %i0, [%fp+68] 27*b1cdbd2cSJim Jagielski st %i1, [%fp+72] 28*b1cdbd2cSJim Jagielski st %i2, [%fp+76] 29*b1cdbd2cSJim Jagielski st %i3, [%fp+80] 30*b1cdbd2cSJim Jagielski st %i4, [%fp+84] 31*b1cdbd2cSJim Jagielski st %i5, [%fp+88] 32*b1cdbd2cSJim Jagielski ! %o0: functionIndex, stored by code snippet 33*b1cdbd2cSJim Jagielski ! %o1: vtableOffset, stored by code snippet 34*b1cdbd2cSJim Jagielski call cpp_vtable_call 35*b1cdbd2cSJim Jagielski add %fp, 68, %o2 36*b1cdbd2cSJim Jagielski .privateSnippetExecutorExceptionPosition: 37*b1cdbd2cSJim Jagielski subcc %o0, 11, %g0 38*b1cdbd2cSJim Jagielski be .double 39*b1cdbd2cSJim Jagielski subcc %o0, 10, %g0 40*b1cdbd2cSJim Jagielski be .float 41*b1cdbd2cSJim Jagielski ld [%fp+72], %i0 42*b1cdbd2cSJim Jagielski ld [%fp+76], %i1 43*b1cdbd2cSJim Jagielski ret 44*b1cdbd2cSJim Jagielski restore 45*b1cdbd2cSJim Jagielski .double: 46*b1cdbd2cSJim Jagielski ldd [%fp+72], %f0 47*b1cdbd2cSJim Jagielski ret 48*b1cdbd2cSJim Jagielski restore 49*b1cdbd2cSJim Jagielski .float: 50*b1cdbd2cSJim Jagielski ld [%fp+72], %f0 51*b1cdbd2cSJim Jagielski ret 52*b1cdbd2cSJim Jagielski restore 53*b1cdbd2cSJim Jagielski .size privateSnippetExecutor,(.-privateSnippetExecutor) 54*b1cdbd2cSJim Jagielski .align 8 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski .global callVirtualMethod 58*b1cdbd2cSJim Jagielski .type callVirtualMethod,2 59*b1cdbd2cSJim Jagielski callVirtualMethod: 60*b1cdbd2cSJim Jagielski ! allocate FIRST stack to have own local registers 61*b1cdbd2cSJim Jagielski sethi %hi(-96), %g1 62*b1cdbd2cSJim Jagielski or %g1, %lo(-96), %g1 63*b1cdbd2cSJim Jagielski subcc %g1, %o5, %g1 64*b1cdbd2cSJim Jagielski subcc %g1, %o5, %g1 65*b1cdbd2cSJim Jagielski subcc %g1, %o5, %g1 66*b1cdbd2cSJim Jagielski subcc %g1, %o5, %g1 67*b1cdbd2cSJim Jagielski save %sp, %g1, %sp 68*b1cdbd2cSJim Jagielski ! copy stack longs if necessary 69*b1cdbd2cSJim Jagielski subcc %i5, 6, %l5 70*b1cdbd2cSJim Jagielski ble .copyRegisters 71*b1cdbd2cSJim Jagielski nop 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski ! prepare source location 74*b1cdbd2cSJim Jagielski add %i4, 24, %l4 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski ! prepare real stack 77*b1cdbd2cSJim Jagielski add %sp, 92, %l3 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski .copyLong: 80*b1cdbd2cSJim Jagielski ld [%l4+0], %l0 81*b1cdbd2cSJim Jagielski st %l0, [%l3] 82*b1cdbd2cSJim Jagielski add %l4, 4, %l4 83*b1cdbd2cSJim Jagielski add %l3, 4, %l3 84*b1cdbd2cSJim Jagielski deccc %l5 85*b1cdbd2cSJim Jagielski bne .copyLong 86*b1cdbd2cSJim Jagielski nop 87*b1cdbd2cSJim Jagielski .copyRegisters: 88*b1cdbd2cSJim Jagielski mov %i5, %l5 89*b1cdbd2cSJim Jagielski mov %i4, %l4 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski ld [%l4], %o0 92*b1cdbd2cSJim Jagielski add %l4, 4, %l4 93*b1cdbd2cSJim Jagielski deccc %l5 94*b1cdbd2cSJim Jagielski ble .doCall 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski ld [%l4], %o1 97*b1cdbd2cSJim Jagielski add %l4, 4, %l4 98*b1cdbd2cSJim Jagielski deccc %l5 99*b1cdbd2cSJim Jagielski ble .doCall 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski ld [%l4], %o2 102*b1cdbd2cSJim Jagielski add %l4, 4, %l4 103*b1cdbd2cSJim Jagielski deccc %l5 104*b1cdbd2cSJim Jagielski ble .doCall 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski ld [%l4], %o3 107*b1cdbd2cSJim Jagielski add %l4, 4, %l4 108*b1cdbd2cSJim Jagielski deccc %l5 109*b1cdbd2cSJim Jagielski ble .doCall 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski ld [%l4], %o4 112*b1cdbd2cSJim Jagielski add %l4, 4, %l4 113*b1cdbd2cSJim Jagielski deccc %l5 114*b1cdbd2cSJim Jagielski ble .doCall 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski ld [%l4], %o5 117*b1cdbd2cSJim Jagielski add %l4, 4, %l4 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski ! prepare complex return pointer 120*b1cdbd2cSJim Jagielski st %i2, [%sp+64] 121*b1cdbd2cSJim Jagielski .doCall: 122*b1cdbd2cSJim Jagielski ! get virtual table entry 123*b1cdbd2cSJim Jagielski mov %i1, %l1 124*b1cdbd2cSJim Jagielski add %l1, 2, %l1 125*b1cdbd2cSJim Jagielski sll %l1, 2, %l1 126*b1cdbd2cSJim Jagielski ld [%i0], %l3 127*b1cdbd2cSJim Jagielski add %l3, %l1, %l1 128*b1cdbd2cSJim Jagielski ld [%l1], %l0 129*b1cdbd2cSJim Jagielski jmpl %l0,%o7 130*b1cdbd2cSJim Jagielski nop 131*b1cdbd2cSJim Jagielski .callVirtualMethodExceptionPosition: 132*b1cdbd2cSJim Jagielski ! handle returns 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski !byte types 135*b1cdbd2cSJim Jagielski subcc %i3, 2, %l3 ! typelib_TypeClass_BOOLEAN 136*b1cdbd2cSJim Jagielski be .handleByte 137*b1cdbd2cSJim Jagielski subcc %i3, 3, %l3 ! typelib_TypeClass_BYTE 138*b1cdbd2cSJim Jagielski be .handleByte 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski ! half word types 141*b1cdbd2cSJim Jagielski subcc %i3, 4, %l3 ! typelib_TypeClass_SHORT 142*b1cdbd2cSJim Jagielski be .handleShort 143*b1cdbd2cSJim Jagielski subcc %i3, 5, %l3 ! typelib_TypeClass_UNSIGNED_SHORT 144*b1cdbd2cSJim Jagielski be .handleShort 145*b1cdbd2cSJim Jagielski subcc %i3, 1, %l3 ! typelib_TypeClass_CHAR (sal_Unicode==sal_uInt16) 146*b1cdbd2cSJim Jagielski be .handleShort 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski ! word types 149*b1cdbd2cSJim Jagielski subcc %i3, 6, %l3 ! typelib_TypeClass_LONG 150*b1cdbd2cSJim Jagielski be .handleWord 151*b1cdbd2cSJim Jagielski subcc %i3, 7, %l3 ! typelib_TypeClass_UNSIGNED_LONG 152*b1cdbd2cSJim Jagielski be .handleWord 153*b1cdbd2cSJim Jagielski subcc %i3, 15, %l3 ! typelib_TypeClass_ENUM 154*b1cdbd2cSJim Jagielski be .handleWord 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski ! double word types 157*b1cdbd2cSJim Jagielski subcc %i3, 8, %l3 ! typelib_TypeClass_HYPER 158*b1cdbd2cSJim Jagielski be .handleDoubleWord 159*b1cdbd2cSJim Jagielski subcc %i3, 9, %l3 ! typelib_TypeClass_UNSIGNED_HYPER 160*b1cdbd2cSJim Jagielski be .handleDoubleWord 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski ! float 163*b1cdbd2cSJim Jagielski subcc %i3, 10, %l3 ! typelib_TypeClass_FLOAT 164*b1cdbd2cSJim Jagielski be .handleFloat 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski ! double 167*b1cdbd2cSJim Jagielski subcc %i3, 11, %l3 ! typelib_TypeClass_DOUBLE 168*b1cdbd2cSJim Jagielski be .handleDouble 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski ! default: return void 171*b1cdbd2cSJim Jagielski nop ! empty prefetch 172*b1cdbd2cSJim Jagielski ba .doRestore 173*b1cdbd2cSJim Jagielski nop 174*b1cdbd2cSJim Jagielski .handleByte: 175*b1cdbd2cSJim Jagielski stb %o0, [%i2] 176*b1cdbd2cSJim Jagielski ba .doRestore 177*b1cdbd2cSJim Jagielski nop 178*b1cdbd2cSJim Jagielski .handleShort: 179*b1cdbd2cSJim Jagielski sth %o0, [%i2] 180*b1cdbd2cSJim Jagielski ba .doRestore 181*b1cdbd2cSJim Jagielski nop 182*b1cdbd2cSJim Jagielski .handleWord: 183*b1cdbd2cSJim Jagielski st %o0, [%i2] 184*b1cdbd2cSJim Jagielski ba .doRestore 185*b1cdbd2cSJim Jagielski nop 186*b1cdbd2cSJim Jagielski .handleDoubleWord: 187*b1cdbd2cSJim Jagielski st %o0, [%i2] 188*b1cdbd2cSJim Jagielski st %o1, [%i2+4] 189*b1cdbd2cSJim Jagielski ba .doRestore 190*b1cdbd2cSJim Jagielski nop 191*b1cdbd2cSJim Jagielski .handleFloat: 192*b1cdbd2cSJim Jagielski st %f0, [%i2] 193*b1cdbd2cSJim Jagielski ba .doRestore 194*b1cdbd2cSJim Jagielski nop 195*b1cdbd2cSJim Jagielski .handleDouble: 196*b1cdbd2cSJim Jagielski std %f0, [%fp-8] 197*b1cdbd2cSJim Jagielski ldd [%fp-8], %o0 198*b1cdbd2cSJim Jagielski st %o0, [%i2] 199*b1cdbd2cSJim Jagielski st %o1, [%i2+4] 200*b1cdbd2cSJim Jagielski ba .doRestore 201*b1cdbd2cSJim Jagielski nop 202*b1cdbd2cSJim Jagielski .doRestore: 203*b1cdbd2cSJim Jagielski ret 204*b1cdbd2cSJim Jagielski restore ! stack frame for own locals 205*b1cdbd2cSJim Jagielski .size callVirtualMethod,(.-callVirtualMethod) 206*b1cdbd2cSJim Jagielski .align 8 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski .rethrow_handler: 209*b1cdbd2cSJim Jagielski call __1cG__CrunMex_rethrow_q6F_v_ 210*b1cdbd2cSJim Jagielski nop 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski .section ".exception_ranges",#alloc 213*b1cdbd2cSJim Jagielski .word %r_disp32(.privateSnippetExecutorExceptionPosition) 214*b1cdbd2cSJim Jagielski .word 0 215*b1cdbd2cSJim Jagielski .word .rethrow_handler-.privateSnippetExecutorExceptionPosition 216*b1cdbd2cSJim Jagielski .word 0,0 217*b1cdbd2cSJim Jagielski .word %r_disp32(.callVirtualMethodExceptionPosition) 218*b1cdbd2cSJim Jagielski .word 0 219*b1cdbd2cSJim Jagielski .word .rethrow_handler-.callVirtualMethodExceptionPosition 220*b1cdbd2cSJim Jagielski .word 0,0 221