diff options
Diffstat (limited to 'vm/mterp/x86-atom/OP_EXECUTE_INLINE_RANGE.S')
-rw-r--r-- | vm/mterp/x86-atom/OP_EXECUTE_INLINE_RANGE.S | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/vm/mterp/x86-atom/OP_EXECUTE_INLINE_RANGE.S b/vm/mterp/x86-atom/OP_EXECUTE_INLINE_RANGE.S new file mode 100644 index 0000000..cd5a048 --- /dev/null +++ b/vm/mterp/x86-atom/OP_EXECUTE_INLINE_RANGE.S @@ -0,0 +1,75 @@ + /* 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 |