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