Home | History | Annotate | Download | only in cpu_ref
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define SNIP_START(x) \
     18     .globl x; x:
     19 
     20 #define SNIP_END(x) \
     21     .globl x##_end; x##_end: \
     22     .globl x##_len; x##_len: \
     23     .word x##_end-x
     24 
     25 SNIP_START(_N_ColorMatrix_prefix_i)
     26     stmfd           sp!, {r4, lr}
     27     vpush           {q4-q7}
     28     vld1.16 {q2}, [r2]!
     29     vld1.16 {q3}, [r2]!
     30     vld1.32 {d8[],d9[]}, [r2]!
     31     vld1.32 {d10[],d11[]}, [r2]!
     32     vld1.32 {d12[],d13[]}, [r2]!
     33     vld1.32 {d14[],d15[]}, [r2]!
     34     veor q0, q0
     35     veor q1, q1
     36     veor q9, q9
     37     veor q10, q10
     38     veor q11, q11
     39 SNIP_END(_N_ColorMatrix_prefix_i)
     40 
     41 SNIP_START(_N_ColorMatrix_prefix_f)
     42     stmfd           sp!, {r4, lr}
     43     vpush           {q4-q7}
     44     add r2, #48
     45     vld1.32 {q4}, [r2]!
     46     vld1.32 {q5}, [r2]!
     47     vld1.32 {q6}, [r2]!
     48     vld1.32 {q7}, [r2]!
     49     vld1.32 {d16[],d17[]}, [r2]!
     50     vld1.32 {d18[],d19[]}, [r2]!
     51     vld1.32 {d20[],d21[]}, [r2]!
     52     vld1.32 {d22[],d23[]}, [r2]!
     53     veor q1, q1
     54     veor q2, q2
     55     veor q3, q3
     56 SNIP_END(_N_ColorMatrix_prefix_f)
     57 
     58 SNIP_START(_N_ColorMatrix_postfix1)
     59     subs r3, r3, #1
     60     #bne 1b
     61 SNIP_END(_N_ColorMatrix_postfix1)
     62 
     63 SNIP_START(_N_ColorMatrix_postfix2)
     64 
     65     #mov r0, #0
     66     #ldr r0, [r0]
     67 
     68     #vqadd.s32 q0,q0,q0
     69     #vadd.f32 q0,q0,q0
     70     #vmul.f32 q0,q0,d0[0]
     71     #vmla.f32 q0,q0,d0[0]
     72     #vmov q0, q0
     73 
     74 
     75     vpop            {q4-q7}
     76     ldmfd           sp!, {r4, lr}
     77     bx              lr
     78 SNIP_END(_N_ColorMatrix_postfix2)
     79 
     80 SNIP_START(_N_ColorMatrix_load_u8_4)
     81     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
     82     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
     83     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
     84     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
     85 SNIP_END(_N_ColorMatrix_load_u8_4)
     86 
     87 SNIP_START(_N_ColorMatrix_load_u8_3)
     88     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
     89     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
     90     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
     91     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
     92     veor d3, d3
     93 SNIP_END(_N_ColorMatrix_load_u8_3)
     94 
     95 SNIP_START(_N_ColorMatrix_load_u8_2)
     96     vld2.8 {d0[0],d1[0]}, [r1]!
     97     vld2.8 {d0[1],d1[1]}, [r1]!
     98     vld2.8 {d0[2],d1[2]}, [r1]!
     99     vld2.8 {d0[3],d1[3]}, [r1]!
    100     veor d2, d2
    101     veor d3, d3
    102 SNIP_END(_N_ColorMatrix_load_u8_2)
    103 
    104 SNIP_START(_N_ColorMatrix_load_u8_1)
    105     vld1.32 {d0[0]}, [r1]!
    106     veor d1, d1
    107     veor d2, d2
    108     veor d3, d3
    109 SNIP_END(_N_ColorMatrix_load_u8_1)
    110 
    111 SNIP_START(_N_ColorMatrix_load_u8f_4)
    112     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
    113     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
    114     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
    115     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
    116     vmovl.u8 q3, d3
    117     vmovl.u8 q2, d2
    118     vmovl.u8 q1, d1
    119     vmovl.u8 q0, d0
    120     vmovl.u16 q3, d6
    121     vmovl.u16 q2, d4
    122     vmovl.u16 q1, d2
    123     vmovl.u16 q0, d0
    124     vcvt.f32.s32 q3, q3
    125     vcvt.f32.s32 q2, q2
    126     vcvt.f32.s32 q1, q1
    127     vcvt.f32.s32 q0, q0
    128 SNIP_END(_N_ColorMatrix_load_u8f_4)
    129 
    130 SNIP_START(_N_ColorMatrix_load_u8f_3)
    131     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
    132     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
    133     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
    134     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
    135     vmovl.u8 q2, d2
    136     vmovl.u8 q1, d1
    137     vmovl.u8 q0, d0
    138     vmovl.u16 q2, d4
    139     vmovl.u16 q1, d2
    140     vmovl.u16 q0, d0
    141     vcvt.f32.s32 q2, q2
    142     vcvt.f32.s32 q1, q1
    143     vcvt.f32.s32 q0, q0
    144     veor q3, q3
    145 SNIP_END(_N_ColorMatrix_load_u8f_3)
    146 
    147 SNIP_START(_N_ColorMatrix_load_u8f_2)
    148     vld2.8 {d0[0],d1[0]}, [r1]!
    149     vld2.8 {d0[1],d1[1]}, [r1]!
    150     vld2.8 {d0[2],d1[2]}, [r1]!
    151     vld2.8 {d0[3],d1[3]}, [r1]!
    152     vmovl.u8 q1, d1
    153     vmovl.u8 q0, d0
    154     vmovl.u16 q1, d2
    155     vmovl.u16 q0, d0
    156     vcvt.f32.s32 q1, q1
    157     vcvt.f32.s32 q0, q0
    158     veor q2, q2
    159     veor q3, q3
    160 SNIP_END(_N_ColorMatrix_load_u8f_2)
    161 
    162 SNIP_START(_N_ColorMatrix_load_u8f_1)
    163     vld1.32 {d0[0]}, [r1]!
    164     vmovl.u8 q0, d0
    165     vmovl.u16 q0, d0
    166     vcvt.f32.s32 q0, q0
    167     veor q1, q1
    168     veor q2, q2
    169     veor q3, q3
    170 SNIP_END(_N_ColorMatrix_load_u8f_1)
    171 
    172 SNIP_START(_N_ColorMatrix_load_f32_4)
    173     vld4.32 {d0[0],d2[0],d4[0],d6[0]}, [r1]!
    174     vld4.32 {d0[1],d2[1],d4[1],d6[1]}, [r1]!
    175     vld4.32 {d1[0],d3[0],d5[0],d7[0]}, [r1]!
    176     vld4.32 {d1[1],d3[1],d5[1],d7[1]}, [r1]!
    177 SNIP_END(_N_ColorMatrix_load_f32_4)
    178 
    179 SNIP_START(_N_ColorMatrix_load_f32_3)
    180     vld3.32 {d0[0],d2[0],d4[0]}, [r1]!
    181     add r1, r1, #4
    182     vld3.32 {d0[1],d2[1],d4[1]}, [r1]!
    183     add r1, r1, #4
    184     vld3.32 {d1[0],d3[0],d5[0]}, [r1]!
    185     add r1, r1, #4
    186     vld3.32 {d1[1],d3[1],d5[1]}, [r1]!
    187     add r1, r1, #4
    188     veor q3, q3
    189 SNIP_END(_N_ColorMatrix_load_f32_3)
    190 
    191 SNIP_START(_N_ColorMatrix_load_f32_2)
    192     vld2.32 {d0[0],d2[0]}, [r1]!
    193     vld2.32 {d0[1],d2[1]}, [r1]!
    194     vld2.32 {d1[0],d3[0]}, [r1]!
    195     vld2.32 {d1[1],d3[1]}, [r1]!
    196     veor q2, q2
    197     veor q3, q3
    198 SNIP_END(_N_ColorMatrix_load_f32_2)
    199 
    200 SNIP_START(_N_ColorMatrix_load_f32_1)
    201     vld1.32 {q0}, [r1]!
    202     veor q1, q1
    203     veor q2, q2
    204     veor q3, q3
    205 SNIP_END(_N_ColorMatrix_load_f32_1)
    206 
    207 
    208 SNIP_START(_N_ColorMatrix_store_u8_4)
    209 #mov r0, #0
    210     vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
    211     vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
    212     vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
    213     vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
    214 SNIP_END(_N_ColorMatrix_store_u8_4)
    215 
    216 SNIP_START(_N_ColorMatrix_store_u8_2)
    217     vst2.8 {d0[0],d1[0]}, [r0]!
    218     vst2.8 {d0[1],d1[1]}, [r0]!
    219     vst2.8 {d0[2],d1[2]}, [r0]!
    220     vst2.8 {d0[3],d1[3]}, [r0]!
    221 SNIP_END(_N_ColorMatrix_store_u8_2)
    222 
    223 SNIP_START(_N_ColorMatrix_store_u8_1)
    224     vst1.32 {d0[0]}, [r0]!
    225 SNIP_END(_N_ColorMatrix_store_u8_1)
    226 
    227 
    228 SNIP_START(_N_ColorMatrix_store_f32u_4)
    229     vcvt.s32.f32 q0, q0
    230     vcvt.s32.f32 q1, q1
    231     vcvt.s32.f32 q2, q2
    232     vcvt.s32.f32 q3, q3
    233     vqmovn.s32 d0, q0
    234     vqmovn.s32 d2, q1
    235     vqmovn.s32 d4, q2
    236     vqmovn.s32 d6, q3
    237     vqmovun.s16 d0, q0
    238     vqmovun.s16 d1, q1
    239     vqmovun.s16 d2, q2
    240     vqmovun.s16 d3, q3
    241     vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
    242     vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
    243     vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
    244     vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
    245 
    246     #mov r0, #0
    247     #ldr r0, [r0]
    248 
    249 SNIP_END(_N_ColorMatrix_store_f32u_4)
    250 
    251 SNIP_START(_N_ColorMatrix_store_f32u_2)
    252     vcvt.s32.f32 q0, q0
    253     vcvt.s32.f32 q1, q1
    254     vqmovn.s32 d0, q0
    255     vqmovn.s32 d2, q1
    256     vqmovun.s16 d0, q0
    257     vqmovun.s16 d1, q1
    258     vst2.8 {d0[0],d1[0]}, [r0]!
    259     vst2.8 {d0[1],d1[1]}, [r0]!
    260     vst2.8 {d0[2],d1[2]}, [r0]!
    261     vst2.8 {d0[3],d1[3]}, [r0]!
    262 SNIP_END(_N_ColorMatrix_store_f32u_2)
    263 
    264 SNIP_START(_N_ColorMatrix_store_f32u_1)
    265     vcvt.s32.f32 q0, q0
    266     vqmovn.s32 d0, q0
    267     vqmovun.s16 d0, q0
    268     vst1.32 {d0[0]}, [r0]!
    269 SNIP_END(_N_ColorMatrix_store_f32u_1)
    270 
    271 SNIP_START(_N_ColorMatrix_store_f32_4)
    272     vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
    273     vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
    274     vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
    275     vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
    276 SNIP_END(_N_ColorMatrix_store_f32_4)
    277 
    278 SNIP_START(_N_ColorMatrix_store_f32_3)
    279     vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
    280     vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
    281     vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
    282     vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
    283 SNIP_END(_N_ColorMatrix_store_f32_3)
    284 
    285 SNIP_START(_N_ColorMatrix_store_f32_2)
    286     vst2.32 {d0[0],d2[0]}, [r0]!
    287     vst2.32 {d0[1],d2[1]}, [r0]!
    288     vst2.32 {d1[0],d3[0]}, [r0]!
    289     vst2.32 {d1[1],d3[1]}, [r0]!
    290 SNIP_END(_N_ColorMatrix_store_f32_2)
    291 
    292 SNIP_START(_N_ColorMatrix_store_f32_1)
    293     vst1.32 {q0}, [r0]!
    294 SNIP_END(_N_ColorMatrix_store_f32_1)
    295 
    296 
    297 SNIP_START(_N_ColorMatrix_unpack_u8_4)
    298     vmovl.u8 q12, d0  /* R */
    299     vmovl.u8 q13, d1  /* G */
    300     vmovl.u8 q14, d2  /* B */
    301     vmovl.u8 q15, d3  /* A */
    302 SNIP_END(_N_ColorMatrix_unpack_u8_4)
    303 
    304 SNIP_START(_N_ColorMatrix_unpack_u8_3)
    305     vmovl.u8 q12, d0  /* R */
    306     vmovl.u8 q13, d1  /* G */
    307     vmovl.u8 q14, d2  /* B */
    308     veor q15, q15
    309 SNIP_END(_N_ColorMatrix_unpack_u8_3)
    310 
    311 SNIP_START(_N_ColorMatrix_unpack_u8_2)
    312     vmovl.u8 q12, d0  /* R */
    313     vmovl.u8 q13, d1  /* G */
    314     veor q14, q14
    315     veor q15, q15
    316 SNIP_END(_N_ColorMatrix_unpack_u8_2)
    317 
    318 SNIP_START(_N_ColorMatrix_unpack_u8_1)
    319     vmovl.u8 q12, d0  /* R */
    320     veor q13, q13
    321     veor q14, q14
    322     veor q15, q15
    323 SNIP_END(_N_ColorMatrix_unpack_u8_1)
    324 
    325 SNIP_START(_N_ColorMatrix_pack_u8_4)
    326     vqrshrn.s32 d24, q8, #8
    327     vqrshrn.s32 d26, q9, #8
    328     vqrshrn.s32 d28, q10, #8
    329     vqrshrn.s32 d30, q11, #8
    330     vqmovun.s16 d0, q12
    331     vqmovun.s16 d1, q13
    332     vqmovun.s16 d2, q14
    333     vqmovun.s16 d3, q15
    334 SNIP_END(_N_ColorMatrix_pack_u8_4)
    335 
    336 SNIP_START(_N_ColorMatrix_pack_u8_3)
    337     vqrshrn.s32 d24, q8, #8
    338     vqrshrn.s32 d26, q9, #8
    339     vqrshrn.s32 d28, q10, #8
    340     vqmovun.s16 d0, q12
    341     vqmovun.s16 d1, q13
    342     vqmovun.s16 d2, q14
    343 SNIP_END(_N_ColorMatrix_pack_u8_3)
    344 
    345 SNIP_START(_N_ColorMatrix_pack_u8_2)
    346     vqrshrn.s32 d24, q8, #8
    347     vqrshrn.s32 d26, q9, #8
    348     vqmovun.s16 d0, q12
    349     vqmovun.s16 d1, q13
    350 SNIP_END(_N_ColorMatrix_pack_u8_2)
    351 
    352 SNIP_START(_N_ColorMatrix_pack_u8_1)
    353     vqrshrn.s32 d24, q8, #8
    354     vqmovun.s16 d0, q12
    355 SNIP_END(_N_ColorMatrix_pack_u8_1)
    356 
    357 SNIP_START(_N_ColorMatrix_dot)
    358     vmov.u8 d1, d0
    359     vmov.u8 d2, d0
    360 SNIP_END(_N_ColorMatrix_dot)
    361 
    362