Home | History | Annotate | Download | only in x86-atom
      1    /* Copyright (C) 2008 The Android Open Source Project
      2     *
      3     * Licensed under the Apache License, Version 2.0 (the "License");
      4     * you may not use this file except in compliance with the License.
      5     * You may obtain a copy of the License at
      6     *
      7     * http://www.apache.org/licenses/LICENSE-2.0
      8     *
      9     * Unless required by applicable law or agreed to in writing, software
     10     * distributed under the License is distributed on an "AS IS" BASIS,
     11     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12     * See the License for the specific language governing permissions and
     13     * limitations under the License.
     14     */
     15 
     16    /*
     17     * File: OP_NEW_INSTANCE.S
     18     *
     19     * Code: Create a new instance of a given type. Uses no substitutions.
     20     *
     21     * For: new-instance
     22     *
     23     * Description: Construct a new instance of the indicated type,
     24     *              storing a reference to it in the destination.
     25     *              The type must refer to a non-array class.
     26     *
     27     *
     28     *
     29     * Format: AA|op BBBB (21c)
     30     *
     31     * Syntax: op vAA, type@BBBB
     32     *         op vAA, field@BBBB
     33     *         op vAA, string@BBBB
     34     */
     35 
     36     movl        rGLUE, %ecx             # %ecx<- pMterpGlue
     37     movl        offGlue_methodClassDex(%ecx), %ecx # %ecx<- glue->pDvmDex
     38     FETCH       1, %edx                 # %edx<- BBBB
     39     movl        offDvmDex_pResClasses(%ecx), %ecx # %ecx<- glue->pDvmDex->pResClasses
     40     movl        (%ecx, %edx, 4), %edx   # %edx<- vB
     41     EXPORT_PC                           # required for resolve
     42     cmp         $$0, %edx               # check for null
     43     je          .L${opcode}_resolve     # need to resolve
     44 
     45    /*
     46     *  %edx holds class object
     47     */
     48 
     49 .L${opcode}_resolved:
     50     movzbl      offClassObject_status(%edx), %eax # %eax<- class status
     51     cmp         $$CLASS_INITIALIZED, %eax # check if class is initialized
     52     jne         .L${opcode}_needinit    # initialize class
     53 
     54    /*
     55     *  %edx holds class object
     56     */
     57 
     58 .L${opcode}_initialized:
     59     testl       $$(ACC_INTERFACE|ACC_ABSTRACT), offClassObject_accessFlags(%edx)
     60     mov         $$ALLOC_DONT_TRACK, %eax # %eax<- flag for alloc call
     61     je          .L${opcode}_finish      # continue
     62     jmp         .L${opcode}_abstract    # handle abstract or interface
     63 
     64    /*
     65     *  %edx holds class object
     66     *  %eax holds flags for alloc call
     67     */
     68 
     69 %break
     70 .balign 32
     71 .L${opcode}_finish:
     72     movl        %edx, -8(%esp)          # push parameter object
     73     movl        %eax, -4(%esp)          # push parameter flags
     74     lea         -8(%esp), %esp
     75     call        dvmAllocObject          # call: (ClassObject* clazz, int flags)
     76                                         # return: Object*
     77     cmp         $$0, %eax               # check for failure
     78     lea         8(%esp), %esp
     79     je          common_exceptionThrown  # handle exception
     80     SET_VREG    %eax, rINST             # vAA<- pObject
     81     FINISH      2                       # jump to next instruction
     82 
     83    /*
     84     * Class initialization required.
     85     *
     86     *  %edx holds class object
     87     */
     88 
     89 .L${opcode}_needinit:
     90     movl        %edx, -4(%esp)          # push parameter object
     91     lea         -4(%esp), %esp
     92     call        dvmInitClass            # call: (ClassObject* clazz)
     93                                         # return: bool
     94     lea         4(%esp), %esp
     95     cmp         $$0, %eax               # check for failure
     96     movl        -4(%esp), %edx          # %edx<- object
     97     je          common_exceptionThrown  # handle exception
     98     testl       $$(ACC_INTERFACE|ACC_ABSTRACT), offClassObject_accessFlags(%edx)
     99     mov         $$ALLOC_DONT_TRACK, %eax # %eax<- flag for alloc call
    100     je          .L${opcode}_finish      # continue
    101     jmp         .L${opcode}_abstract    # handle abstract or interface
    102 
    103    /*
    104     * Resolution required.  This is the least-likely path.
    105     *
    106     *  BBBB in %eax
    107     */
    108 
    109 .L${opcode}_resolve:
    110 
    111 
    112     movl        rGLUE, %ecx             # %ecx<- pMterpGlue
    113     FETCH       1, %eax                 # %eax<- BBBB
    114     movl        offGlue_method(%ecx), %ecx # %ecx<- glue->method
    115     movl        offMethod_clazz(%ecx), %ecx # %ecx<- glue->method->clazz
    116     movl        %ecx, -12(%esp)         # push parameter clazz
    117     movl        $$0, -4(%esp)           # push parameter false
    118     movl        %eax, -8(%esp)          # push parameter BBBB
    119     lea         -12(%esp), %esp
    120     call        dvmResolveClass         # call: (const ClassObject* referrer,
    121                                         #       u4 classIdx, bool fromUnverifiedConstant)
    122                                         # return: ClassObject*
    123     lea         12(%esp), %esp
    124     movl        %eax, %edx              # %edx<- pObject
    125     cmp         $$0, %edx               # check for failure
    126     jne         .L${opcode}_resolved    # continue
    127     jmp         common_exceptionThrown  # handle exception
    128 
    129    /*
    130     * We can't instantiate an abstract class or interface, so throw an
    131     * InstantiationError with the class descriptor as the message.
    132     *
    133     *  %edx holds class object
    134     */
    135 
    136 .L${opcode}_abstract:
    137     movl        offClassObject_descriptor(%edx), %ecx # %ecx<- descriptor
    138     movl        %ecx, -4(%esp)          # push parameter descriptor
    139     movl        $$.LstrInstantiationErrorPtr, -8(%esp) # push parameter message
    140     lea         -8(%esp), %esp
    141     call        dvmThrowExceptionWithClassMessage # call: (const char* exceptionDescriptor,
    142                                                   #        const char* messageDescriptor)
    143                                                   # return: void
    144     jmp         common_exceptionThrown  # handle exception
    145 
    146 .LstrInstantiationErrorPtr:
    147 .asciz      "Ljava/lang/InstantiationError;"
    148