| /* Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed 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. |
| */ |
| |
| /* |
| * File: OP_EXECUTE_INLINE_RANGE.S |
| * |
| * Code: Executes a "native inline" instruction. Uses no substitutions. |
| * |
| * For: execute-inline |
| * |
| * Description: Executes a "native inline" instruction. This instruction |
| * is generated by the optimizer. |
| * |
| * Format: |
| * |
| * Syntax: AA, {vCCCC..v(CCCC+AA-1)}, inline@BBBB |
| */ |
| |
| FETCH 1, %ecx # %ecx<- BBBB |
| movl rGLUE, %eax # %eax<- MterpGlue pointer |
| addl $$offGlue_retval, %eax # %eax<- &glue->retval |
| EXPORT_PC |
| movl %eax, -8(%esp) # push parameter glue->retval |
| lea -24(%esp), %esp |
| jmp .L${opcode}_continue |
| %break |
| |
| /* |
| * Extract args, call function. |
| * rINST = #of args (0-4) |
| * %ecx = call index |
| */ |
| |
| .L${opcode}_continue: |
| FETCH 2, %edx # %edx<- FEDC |
| cmp $$1, rINST # determine number of arguments |
| jl 0f # handle zero args |
| je 1f # handle one arg |
| cmp $$3, rINST |
| jl 2f # handle two args |
| je 3f # handle three args |
| 4: |
| movl 12(rFP, %edx, 4), rINST # rINST<- vF |
| movl rINST, 12(%esp) # push parameter vF |
| 3: |
| movl 8(rFP, %edx, 4), rINST # rINST<- vE |
| movl rINST, 8(%esp) # push parameter E |
| 2: |
| movl 4(rFP, %edx, 4), rINST # rINST<- vD |
| movl rINST, 4(%esp) # push parameter D |
| 1: |
| movl (rFP, %edx, 4), %edx # rINST<- vC |
| movl %edx, (%esp) # push parameter C |
| 0: |
| shl $$4, %ecx |
| movl $$gDvmInlineOpsTable, %eax # %eax<- address for table of inline operations |
| call *(%eax, %ecx) # call function |
| |
| cmp $$0, %eax # check boolean result of inline |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| lea 24(%esp), %esp # update stack pointer |
| je common_exceptionThrown # handle exception |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |