Home | History | Annotate | Download | only in assembler
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29     .text
     30     .align
     31 
     32     .global asm_test_jacket
     33 
     34     // Set the register and flag values
     35     // Calls the asm function
     36     // Reads the register/flag values to output register
     37 
     38     // Parameters
     39     // X0 - Function to jump
     40     // X1 - register values array
     41     // X2 - flag values array
     42 asm_test_jacket:
     43     // Save registers to stack
     44     stp    x29, x30, [sp,#-16]!
     45     stp    x27, x28, [sp,#-16]!
     46 
     47     mov x30, x0
     48     mov x28, x1
     49     mov x27, x2
     50 
     51     //Set the flags based on flag array
     52     //EQ
     53     ldr w0, [x27,#0]
     54     cmp w0, #1
     55     b.ne bt_aeq
     56     cmp w0,#1
     57     b bt_end
     58 bt_aeq:
     59 
     60     //NE
     61     ldr w0, [x27,#4]
     62     cmp w0, #1
     63     b.ne bt_ane
     64     cmp w0,#2
     65     b bt_end
     66 bt_ane:
     67 
     68     //CS
     69     ldr w0, [x27,#8]
     70     cmp w0, #1
     71     b.ne bt_acs
     72     cmp w0,#0
     73     b bt_end
     74 bt_acs:
     75 
     76     //CC
     77     ldr w0, [x27,#12]
     78     cmp w0, #1
     79     b.ne bt_acc
     80     cmp w0,#2
     81     b bt_end
     82 bt_acc:
     83 
     84     //MI
     85     ldr w0, [x27,#16]
     86     cmp w0, #1
     87     b.ne bt_ami
     88     subs w0,w0,#2
     89     b bt_end
     90 bt_ami:
     91 
     92     //PL
     93     ldr w0, [x27,#20]
     94     cmp w0, #1
     95     b.ne bt_apl
     96     subs w0,w0,#0
     97     b bt_end
     98 bt_apl:
     99     //HI - (C==1) && (Z==0)
    100     ldr w0, [x27,#32]
    101     cmp w0, #1
    102     b.ne bt_ahi
    103     cmp w0,#0
    104     b bt_end
    105 bt_ahi:
    106 
    107     //LS - (C==0) || (Z==1)
    108     ldr w0, [x27,#36]
    109     cmp w0, #1
    110     b.ne bt_als
    111     cmp w0,#1
    112     b bt_end
    113 bt_als:
    114 
    115     //GE
    116     ldr w0, [x27,#40]
    117     cmp w0, #1
    118     b.ne bt_age
    119     cmp w0,#0
    120     b bt_end
    121 bt_age:
    122 
    123     //LT
    124     ldr w0, [x27,#44]
    125     cmp w0, #1
    126     b.ne bt_alt
    127     cmp w0,#2
    128     b bt_end
    129 bt_alt:
    130 
    131     //GT
    132     ldr w0, [x27,#48]
    133     cmp w0, #1
    134     b.ne bt_agt
    135     cmp w0,#0
    136     b bt_end
    137 bt_agt:
    138 
    139     //LE
    140     ldr w0, [x27,#52]
    141     cmp w0, #1
    142     b.ne bt_ale
    143     cmp w0,#2
    144     b bt_end
    145 bt_ale:
    146 
    147 
    148 bt_end:
    149 
    150     // Load the registers from reg array
    151     ldr x0, [x28,#0]
    152     ldr x1, [x28,#8]
    153     ldr x2, [x28,#16]
    154     ldr x3, [x28,#24]
    155     ldr x4, [x28,#32]
    156     ldr x5, [x28,#40]
    157     ldr x6, [x28,#48]
    158     ldr x7, [x28,#56]
    159     ldr x8, [x28,#64]
    160     ldr x9, [x28,#72]
    161     ldr x10, [x28,#80]
    162     ldr x11, [x28,#88]
    163     ldr x12, [x28,#96]
    164     ldr x14, [x28,#112]
    165 
    166     // Call the function
    167     blr X30
    168 
    169     // Save the registers to reg array
    170     str x0, [x28,#0]
    171     str x1, [x28,#8]
    172     str x2, [x28,#16]
    173     str x3, [x28,#24]
    174     str x4, [x28,#32]
    175     str x5, [x28,#40]
    176     str x6, [x28,#48]
    177     str x7, [x28,#56]
    178     str x8, [x28,#64]
    179     str x9, [x28,#72]
    180     str x10, [x28,#80]
    181     str x11, [x28,#88]
    182     str x12, [x28,#96]
    183     str x14, [x28,#112]
    184 
    185     //Set the flags array based on result flags
    186     movz w0, #0
    187     movz w1, #1
    188     csel w2, w1, w0, EQ
    189     str w2, [x27,#0]
    190     csel w2, w1, w0, NE
    191     str w2, [x27,#4]
    192     csel w2, w1, w0, CS
    193     str w2, [x27,#8]
    194     csel w2, w1, w0, CC
    195     str w2, [x27,#12]
    196     csel w2, w1, w0, MI
    197     str w2, [x27,#16]
    198     csel w2, w1, w0, PL
    199     str w2, [x27,#20]
    200     csel w2, w1, w0, VS
    201     str w2, [x27,#24]
    202     csel w2, w1, w0, VC
    203     str w2, [x27,#28]
    204     csel w2, w1, w0, HI
    205     str w2, [x27,#32]
    206     csel w2, w1, w0, LS
    207     str w2, [x27,#36]
    208     csel w2, w1, w0, GE
    209     str w2, [x27,#40]
    210     csel w2, w1, w0, LT
    211     str w2, [x27,#44]
    212     csel w2, w1, w0, GT
    213     str w2, [x27,#48]
    214     csel w2, w1, w0, LE
    215     str w2, [x27,#52]
    216 
    217     // Restore registers from stack
    218     ldp    x27, x28, [sp],#16
    219     ldp    x29, x30, [sp],#16
    220     ret
    221 
    222