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 #include <machine/cpu-features.h>
     18 #include <machine/asm.h>
     19 
     20 #define SNIP_START(x) \
     21     .globl x; x:
     22 
     23 #define SNIP_END(x) \
     24     .globl x##_end; x##_end: \
     25     .globl x##_len; x##_len: \
     26     .word x##_end-x
     27 
     28 SNIP_START(_N_ColorMatrix_prefix_i)
     29     stmfd           sp!, {r4, lr}
     30     vpush           {q4-q7}
     31     vld1.16 {q2}, [r2]!
     32     vld1.16 {q3}, [r2]!
     33     vld1.32 {q4}, [r2]!
     34     vld1.32 {q5}, [r2]!
     35     vld1.32 {q6}, [r2]!
     36     vld1.32 {q7}, [r2]!
     37     veor q0, q0
     38     veor q1, q1
     39     veor q9, q9
     40     veor q10, q10
     41     veor q11, q11
     42 SNIP_END(_N_ColorMatrix_prefix_i)
     43 
     44 SNIP_START(_N_ColorMatrix_prefix_f)
     45     stmfd           sp!, {r4, lr}
     46     vpush           {q4-q7}
     47     add r2, #96
     48     vld1.32 {q4}, [r2]!
     49     vld1.32 {q5}, [r2]!
     50     vld1.32 {q6}, [r2]!
     51     vld1.32 {q7}, [r2]!
     52     vld1.32 {q8}, [r2]!
     53     vld1.32 {q9}, [r2]!
     54     vld1.32 {q10}, [r2]!
     55     vld1.32 {q11}, [r2]!
     56     veor q1, q1
     57     veor q2, q2
     58     veor q3, q3
     59 SNIP_END(_N_ColorMatrix_prefix_f)
     60 
     61 SNIP_START(_N_ColorMatrix_postfix1)
     62     subs r3, r3, #1
     63     #bne 1b
     64 SNIP_END(_N_ColorMatrix_postfix1)
     65 
     66 SNIP_START(_N_ColorMatrix_postfix2)
     67 
     68     #mov r0, #0
     69     #ldr r0, [r0]
     70 
     71     #vqadd.s32 q0,q0,q0
     72     #vadd.f32 q0,q0,q0
     73     #vmul.f32 q0,q0,d0[0]
     74     #vmla.f32 q0,q0,d0[0]
     75     #vmov q0, q0
     76 
     77 
     78     vpop            {q4-q7}
     79     ldmfd           sp!, {r4, lr}
     80     bx              lr
     81 SNIP_END(_N_ColorMatrix_postfix2)
     82 
     83 SNIP_START(_N_ColorMatrix_load_u8_4)
     84     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
     85     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
     86     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
     87     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
     88 SNIP_END(_N_ColorMatrix_load_u8_4)
     89 
     90 SNIP_START(_N_ColorMatrix_load_u8_3)
     91     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
     92     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
     93     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
     94     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
     95     veor d3, d3
     96 SNIP_END(_N_ColorMatrix_load_u8_3)
     97 
     98 SNIP_START(_N_ColorMatrix_load_u8_2)
     99     vld2.8 {d0[0],d1[0]}, [r1]!
    100     vld2.8 {d0[1],d1[1]}, [r1]!
    101     vld2.8 {d0[2],d1[2]}, [r1]!
    102     vld2.8 {d0[3],d1[3]}, [r1]!
    103     veor d2, d2
    104     veor d3, d3
    105 SNIP_END(_N_ColorMatrix_load_u8_2)
    106 
    107 SNIP_START(_N_ColorMatrix_load_u8_1)
    108     vld1.32 {d0[0]}, [r1]!
    109     veor d1, d1
    110     veor d2, d2
    111     veor d3, d3
    112 SNIP_END(_N_ColorMatrix_load_u8_1)
    113 
    114 SNIP_START(_N_ColorMatrix_load_u8f_4)
    115     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
    116     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
    117     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
    118     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
    119     vmovl.u8 q3, d3
    120     vmovl.u8 q2, d2
    121     vmovl.u8 q1, d1
    122     vmovl.u8 q0, d0
    123     vmovl.u16 q3, d6
    124     vmovl.u16 q2, d4
    125     vmovl.u16 q1, d2
    126     vmovl.u16 q0, d0
    127     vcvt.f32.s32 q3, q3
    128     vcvt.f32.s32 q2, q2
    129     vcvt.f32.s32 q1, q1
    130     vcvt.f32.s32 q0, q0
    131 SNIP_END(_N_ColorMatrix_load_u8f_4)
    132 
    133 SNIP_START(_N_ColorMatrix_load_u8f_3)
    134     vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
    135     vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
    136     vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
    137     vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
    138     vmovl.u8 q2, d2
    139     vmovl.u8 q1, d1
    140     vmovl.u8 q0, d0
    141     vmovl.u16 q2, d4
    142     vmovl.u16 q1, d2
    143     vmovl.u16 q0, d0
    144     vcvt.f32.s32 q2, q2
    145     vcvt.f32.s32 q1, q1
    146     vcvt.f32.s32 q0, q0
    147     veor q3, q3
    148 SNIP_END(_N_ColorMatrix_load_u8f_3)
    149 
    150 SNIP_START(_N_ColorMatrix_load_u8f_2)
    151     vld2.8 {d0[0],d1[0]}, [r1]!
    152     vld2.8 {d0[1],d1[1]}, [r1]!
    153     vld2.8 {d0[2],d1[2]}, [r1]!
    154     vld2.8 {d0[3],d1[3]}, [r1]!
    155     vmovl.u8 q1, d1
    156     vmovl.u8 q0, d0
    157     vmovl.u16 q1, d2
    158     vmovl.u16 q0, d0
    159     vcvt.f32.s32 q1, q1
    160     vcvt.f32.s32 q0, q0
    161     veor q2, q2
    162     veor q3, q3
    163 SNIP_END(_N_ColorMatrix_load_u8f_2)
    164 
    165 SNIP_START(_N_ColorMatrix_load_u8f_1)
    166     vld1.32 {d0[0]}, [r1]!
    167     vmovl.u8 q0, d0
    168     vmovl.u16 q0, d0
    169     vcvt.f32.s32 q0, q0
    170     veor q1, q1
    171     veor q2, q2
    172     veor q3, q3
    173 SNIP_END(_N_ColorMatrix_load_u8f_1)
    174 
    175 SNIP_START(_N_ColorMatrix_load_f32_4)
    176     vld4.32 {d0[0],d2[0],d4[0],d6[0]}, [r1]!
    177     vld4.32 {d0[1],d2[1],d4[1],d6[1]}, [r1]!
    178     vld4.32 {d1[0],d3[0],d5[0],d7[0]}, [r1]!
    179     vld4.32 {d1[1],d3[1],d5[1],d7[1]}, [r1]!
    180 SNIP_END(_N_ColorMatrix_load_f32_4)
    181 
    182 SNIP_START(_N_ColorMatrix_load_f32_3)
    183     vld3.32 {d0[0],d2[0],d4[0]}, [r1]!
    184     add r1, r1, #4
    185     vld3.32 {d0[1],d2[1],d4[1]}, [r1]!
    186     add r1, r1, #4
    187     vld3.32 {d1[0],d3[0],d5[0]}, [r1]!
    188     add r1, r1, #4
    189     vld3.32 {d1[1],d3[1],d5[1]}, [r1]!
    190     add r1, r1, #4
    191     veor q3, q3
    192 SNIP_END(_N_ColorMatrix_load_f32_3)
    193 
    194 SNIP_START(_N_ColorMatrix_load_f32_2)
    195     vld2.32 {d0[0],d2[0]}, [r1]!
    196     vld2.32 {d0[1],d2[1]}, [r1]!
    197     vld2.32 {d1[0],d3[0]}, [r1]!
    198     vld2.32 {d1[1],d3[1]}, [r1]!
    199     veor q2, q2
    200     veor q3, q3
    201 SNIP_END(_N_ColorMatrix_load_f32_2)
    202 
    203 SNIP_START(_N_ColorMatrix_load_f32_1)
    204     vld1.32 {q0}, [r1]!
    205     veor q1, q1
    206     veor q2, q2
    207     veor q3, q3
    208 SNIP_END(_N_ColorMatrix_load_f32_1)
    209 
    210 
    211 SNIP_START(_N_ColorMatrix_store_u8_4)
    212 #mov r0, #0
    213     vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
    214     vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
    215     vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
    216     vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
    217 SNIP_END(_N_ColorMatrix_store_u8_4)
    218 
    219 SNIP_START(_N_ColorMatrix_store_u8_2)
    220     vst2.8 {d0[0],d1[0]}, [r0]!
    221     vst2.8 {d0[1],d1[1]}, [r0]!
    222     vst2.8 {d0[2],d1[2]}, [r0]!
    223     vst2.8 {d0[3],d1[3]}, [r0]!
    224 SNIP_END(_N_ColorMatrix_store_u8_2)
    225 
    226 SNIP_START(_N_ColorMatrix_store_u8_1)
    227     vst1.32 {d0[0]}, [r0]!
    228 SNIP_END(_N_ColorMatrix_store_u8_1)
    229 
    230 
    231 SNIP_START(_N_ColorMatrix_store_f32u_4)
    232     vcvt.s32.f32 q0, q0
    233     vcvt.s32.f32 q1, q1
    234     vcvt.s32.f32 q2, q2
    235     vcvt.s32.f32 q3, q3
    236     vqmovn.s32 d0, q0
    237     vqmovn.s32 d2, q1
    238     vqmovn.s32 d4, q2
    239     vqmovn.s32 d6, q3
    240     vqmovun.s16 d0, q0
    241     vqmovun.s16 d1, q1
    242     vqmovun.s16 d2, q2
    243     vqmovun.s16 d3, q3
    244     vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
    245     vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
    246     vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
    247     vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
    248 
    249     #mov r0, #0
    250     #ldr r0, [r0]
    251 
    252 SNIP_END(_N_ColorMatrix_store_f32u_4)
    253 
    254 SNIP_START(_N_ColorMatrix_store_f32u_2)
    255     vcvt.s32.f32 q0, q0
    256     vcvt.s32.f32 q1, q1
    257     vqmovn.s32 d0, q0
    258     vqmovn.s32 d2, q1
    259     vqmovun.s16 d0, q0
    260     vqmovun.s16 d1, q1
    261     vst2.8 {d0[0],d1[0]}, [r0]!
    262     vst2.8 {d0[1],d1[1]}, [r0]!
    263     vst2.8 {d0[2],d1[2]}, [r0]!
    264     vst2.8 {d0[3],d1[3]}, [r0]!
    265 SNIP_END(_N_ColorMatrix_store_f32u_2)
    266 
    267 SNIP_START(_N_ColorMatrix_store_f32u_1)
    268     vcvt.s32.f32 q0, q0
    269     vqmovn.s32 d0, q0
    270     vqmovun.s16 d0, q0
    271     vst1.32 {d0[0]}, [r0]!
    272 SNIP_END(_N_ColorMatrix_store_f32u_1)
    273 
    274 SNIP_START(_N_ColorMatrix_store_f32_4)
    275     vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
    276     vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
    277     vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
    278     vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
    279 SNIP_END(_N_ColorMatrix_store_f32_4)
    280 
    281 SNIP_START(_N_ColorMatrix_store_f32_3)
    282     vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
    283     vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
    284     vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
    285     vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
    286 SNIP_END(_N_ColorMatrix_store_f32_3)
    287 
    288 SNIP_START(_N_ColorMatrix_store_f32_2)
    289     vst2.32 {d0[0],d2[0]}, [r0]!
    290     vst2.32 {d0[1],d2[1]}, [r0]!
    291     vst2.32 {d1[0],d3[0]}, [r0]!
    292     vst2.32 {d1[1],d3[1]}, [r0]!
    293 SNIP_END(_N_ColorMatrix_store_f32_2)
    294 
    295 SNIP_START(_N_ColorMatrix_store_f32_1)
    296     vst1.32 {q0}, [r0]!
    297 SNIP_END(_N_ColorMatrix_store_f32_1)
    298 
    299 
    300 SNIP_START(_N_ColorMatrix_unpack_u8_4)
    301     vmovl.u8 q12, d0  /* R */
    302     vmovl.u8 q13, d1  /* G */
    303     vmovl.u8 q14, d2  /* B */
    304     vmovl.u8 q15, d3  /* A */
    305 SNIP_END(_N_ColorMatrix_unpack_u8_4)
    306 
    307 SNIP_START(_N_ColorMatrix_unpack_u8_3)
    308     vmovl.u8 q12, d0  /* R */
    309     vmovl.u8 q13, d1  /* G */
    310     vmovl.u8 q14, d2  /* B */
    311     veor q15, q15
    312 SNIP_END(_N_ColorMatrix_unpack_u8_3)
    313 
    314 SNIP_START(_N_ColorMatrix_unpack_u8_2)
    315     vmovl.u8 q12, d0  /* R */
    316     vmovl.u8 q13, d1  /* G */
    317     veor q14, q14
    318     veor q15, q15
    319 SNIP_END(_N_ColorMatrix_unpack_u8_2)
    320 
    321 SNIP_START(_N_ColorMatrix_unpack_u8_1)
    322     vmovl.u8 q12, d0  /* R */
    323     veor q13, q13
    324     veor q14, q14
    325     veor q15, q15
    326 SNIP_END(_N_ColorMatrix_unpack_u8_1)
    327 
    328 SNIP_START(_N_ColorMatrix_pack_u8_4)
    329     vrshrn.i32 d24, q8, #8
    330     vrshrn.i32 d26, q9, #8
    331     vrshrn.i32 d28, q10, #8
    332     vrshrn.i32 d30, q11, #8
    333     vqmovun.s16 d0, q12
    334     vqmovun.s16 d1, q13
    335     vqmovun.s16 d2, q14
    336     vqmovun.s16 d3, q15
    337 SNIP_END(_N_ColorMatrix_pack_u8_4)
    338 
    339 SNIP_START(_N_ColorMatrix_pack_u8_3)
    340     vrshrn.i32 d24, q8, #8
    341     vrshrn.i32 d26, q9, #8
    342     vrshrn.i32 d28, q10, #8
    343     vqmovun.s16 d0, q12
    344     vqmovun.s16 d1, q13
    345     vqmovun.s16 d2, q14
    346 SNIP_END(_N_ColorMatrix_pack_u8_3)
    347 
    348 SNIP_START(_N_ColorMatrix_pack_u8_2)
    349     vrshrn.i32 d24, q8, #8
    350     vrshrn.i32 d26, q9, #8
    351     vqmovun.s16 d0, q12
    352     vqmovun.s16 d1, q13
    353 SNIP_END(_N_ColorMatrix_pack_u8_2)
    354 
    355 SNIP_START(_N_ColorMatrix_pack_u8_1)
    356     vrshrn.i32 d24, q8, #8
    357     vqmovun.s16 d0, q12
    358 SNIP_END(_N_ColorMatrix_pack_u8_1)
    359 
    360 SNIP_START(_N_ColorMatrix_dot)
    361     vmov.u8 d1, d0
    362     vmov.u8 d2, d0
    363 SNIP_END(_N_ColorMatrix_dot)
    364 
    365