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