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 25SNIP_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 39SNIP_END(_N_ColorMatrix_prefix_i) 40 41SNIP_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 56SNIP_END(_N_ColorMatrix_prefix_f) 57 58SNIP_START(_N_ColorMatrix_postfix1) 59 subs r3, r3, #1 60 #bne 1b 61SNIP_END(_N_ColorMatrix_postfix1) 62 63SNIP_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 78SNIP_END(_N_ColorMatrix_postfix2) 79 80SNIP_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]! 85SNIP_END(_N_ColorMatrix_load_u8_4) 86 87SNIP_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 93SNIP_END(_N_ColorMatrix_load_u8_3) 94 95SNIP_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 102SNIP_END(_N_ColorMatrix_load_u8_2) 103 104SNIP_START(_N_ColorMatrix_load_u8_1) 105 vld1.32 {d0[0]}, [r1]! 106 veor d1, d1 107 veor d2, d2 108 veor d3, d3 109SNIP_END(_N_ColorMatrix_load_u8_1) 110 111SNIP_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 128SNIP_END(_N_ColorMatrix_load_u8f_4) 129 130SNIP_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 145SNIP_END(_N_ColorMatrix_load_u8f_3) 146 147SNIP_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 160SNIP_END(_N_ColorMatrix_load_u8f_2) 161 162SNIP_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 170SNIP_END(_N_ColorMatrix_load_u8f_1) 171 172SNIP_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]! 177SNIP_END(_N_ColorMatrix_load_f32_4) 178 179SNIP_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 189SNIP_END(_N_ColorMatrix_load_f32_3) 190 191SNIP_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 198SNIP_END(_N_ColorMatrix_load_f32_2) 199 200SNIP_START(_N_ColorMatrix_load_f32_1) 201 vld1.32 {q0}, [r1]! 202 veor q1, q1 203 veor q2, q2 204 veor q3, q3 205SNIP_END(_N_ColorMatrix_load_f32_1) 206 207 208SNIP_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]! 214SNIP_END(_N_ColorMatrix_store_u8_4) 215 216SNIP_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]! 221SNIP_END(_N_ColorMatrix_store_u8_2) 222 223SNIP_START(_N_ColorMatrix_store_u8_1) 224 vst1.32 {d0[0]}, [r0]! 225SNIP_END(_N_ColorMatrix_store_u8_1) 226 227 228SNIP_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 249SNIP_END(_N_ColorMatrix_store_f32u_4) 250 251SNIP_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]! 262SNIP_END(_N_ColorMatrix_store_f32u_2) 263 264SNIP_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]! 269SNIP_END(_N_ColorMatrix_store_f32u_1) 270 271SNIP_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]! 276SNIP_END(_N_ColorMatrix_store_f32_4) 277 278SNIP_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]! 283SNIP_END(_N_ColorMatrix_store_f32_3) 284 285SNIP_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]! 290SNIP_END(_N_ColorMatrix_store_f32_2) 291 292SNIP_START(_N_ColorMatrix_store_f32_1) 293 vst1.32 {q0}, [r0]! 294SNIP_END(_N_ColorMatrix_store_f32_1) 295 296 297SNIP_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 */ 302SNIP_END(_N_ColorMatrix_unpack_u8_4) 303 304SNIP_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 309SNIP_END(_N_ColorMatrix_unpack_u8_3) 310 311SNIP_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 316SNIP_END(_N_ColorMatrix_unpack_u8_2) 317 318SNIP_START(_N_ColorMatrix_unpack_u8_1) 319 vmovl.u8 q12, d0 /* R */ 320 veor q13, q13 321 veor q14, q14 322 veor q15, q15 323SNIP_END(_N_ColorMatrix_unpack_u8_1) 324 325SNIP_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 334SNIP_END(_N_ColorMatrix_pack_u8_4) 335 336SNIP_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 343SNIP_END(_N_ColorMatrix_pack_u8_3) 344 345SNIP_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 350SNIP_END(_N_ColorMatrix_pack_u8_2) 351 352SNIP_START(_N_ColorMatrix_pack_u8_1) 353 vqrshrn.s32 d24, q8, #8 354 vqmovun.s16 d0, q12 355SNIP_END(_N_ColorMatrix_pack_u8_1) 356 357SNIP_START(_N_ColorMatrix_dot) 358 vmov.u8 d1, d0 359 vmov.u8 d2, d0 360SNIP_END(_N_ColorMatrix_dot) 361 362