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