| 1 | @@\r |
| 2 | @@ Copyright (C) 2012 Roman Pauer\r |
| 3 | @@\r |
| 4 | @@ Permission is hereby granted, free of charge, to any person obtaining a copy of\r |
| 5 | @@ this software and associated documentation files (the "Software"), to deal in\r |
| 6 | @@ the Software without restriction, including without limitation the rights to\r |
| 7 | @@ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r |
| 8 | @@ of the Software, and to permit persons to whom the Software is furnished to do\r |
| 9 | @@ so, subject to the following conditions:\r |
| 10 | @@\r |
| 11 | @@ The above copyright notice and this permission notice shall be included in all\r |
| 12 | @@ copies or substantial portions of the Software.\r |
| 13 | @@\r |
| 14 | @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r |
| 15 | @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r |
| 16 | @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r |
| 17 | @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r |
| 18 | @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r |
| 19 | @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r |
| 20 | @@ SOFTWARE.\r |
| 21 | @@\r |
| 22 | \r |
| 23 | \r |
| 24 | @ A B C --\ E0 E1 E2\r |
| 25 | @ D E F --/ E3 E4 E5\r |
| 26 | @ G H I E6 E7 E8\r |
| 27 | \r |
| 28 | @ q0 = S1sl < A >\r |
| 29 | @ q1 = S2sl < D >\r |
| 30 | @ q2 = S3sl < G >\r |
| 31 | @ q3 = S1sr < C >\r |
| 32 | @ q4 = S2sr < F >\r |
| 33 | @ q5 = S3sr < I >\r |
| 34 | @ q6 =\r |
| 35 | @ q7 =\r |
| 36 | @ q8 = S1\r |
| 37 | @ q9 = S2\r |
| 38 | @ q10 = S3\r |
| 39 | @ q11 =\r |
| 40 | @ q12 = S2prev < E >\r |
| 41 | @ q13 =\r |
| 42 | @ q14 = S1prev < B >\r |
| 43 | @ q15 = S3prev < H >\r |
| 44 | \r |
| 45 | \r |
| 46 | .macro ___neon_scale3x_8_8_slice counter, dst1, dst2, dst3, reg1, dB0, dB1, dH0, dH1, first15, last16\r |
| 47 | \r |
| 48 | @ d12 = E0[0]\r |
| 49 | @ d13 = E1[0]\r |
| 50 | @ d14 = E2[0]\r |
| 51 | @ d15 = tmp0[0]\r |
| 52 | @ d22 = E3[0]\r |
| 53 | @ d23 = tmp1[0]\r |
| 54 | @ d24 = E4[0]\r |
| 55 | @ d25 = E4[1]\r |
| 56 | @ d26 = E5[0]\r |
| 57 | @ d27 = C0[0]\r |
| 58 | \r |
| 59 | @ q0 = tmp2\r |
| 60 | @ q3 = tmp3\r |
| 61 | @ q2 = tmp4\r |
| 62 | @ q5 = tmp5\r |
| 63 | \r |
| 64 | vceq.i8 d15, \dB0, \dH0 @ tmp0[0] = < B == H >\r |
| 65 | \r |
| 66 | vceq.i8 d23, d2, d8 @ tmp1[0] = < D == F >\r |
| 67 | \r |
| 68 | .if \first15\r |
| 69 | cmp \reg1, #8\r |
| 70 | .endif\r |
| 71 | \r |
| 72 | vceq.i8 q0, q12, q0 @ tmp2 = < E == A >\r |
| 73 | \r |
| 74 | vceq.i8 q3, q12, q3 @ tmp3 = < E == C >\r |
| 75 | \r |
| 76 | .if \first15\r |
| 77 | add \reg1, \reg1, \reg1, lsl #1 @ reg1 = 3 * (counter & 15)\r |
| 78 | .endif\r |
| 79 | \r |
| 80 | vorr d27, d15, d23 @ C0[0] = < B == H || D == F >\r |
| 81 | \r |
| 82 | vceq.i8 d22, d2, \dB0 @ E3[0] = < D == B >\r |
| 83 | \r |
| 84 | vceq.i8 d26, \dB0, d8 @ E5[0] = < B == F >\r |
| 85 | \r |
| 86 | vceq.i8 q2, q12, q2 @ tmp4 = < E == G >\r |
| 87 | \r |
| 88 | vceq.i8 q5, q12, q5 @ tmp5 = < E == I >\r |
| 89 | \r |
| 90 | .if \first15\r |
| 91 | sub \reg1, \reg1, #(3*8) @ reg1 -= 3*8\r |
| 92 | .endif\r |
| 93 | \r |
| 94 | vorn d15, d6, d22 @ tmp0[0] = < (E == C) || !(D == B) >\r |
| 95 | \r |
| 96 | vorn d23, d0, d26 @ tmp1[0] = < (E == A) || !(B == F) >\r |
| 97 | \r |
| 98 | vorn d12, d27, d22 @ E0[0] = < C0 || !(D == B) >\r |
| 99 | \r |
| 100 | vand d13, d15, d23 @ E1[0] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
| 101 | \r |
| 102 | vorn d14, d27, d26 @ E2[0] = < C0 || !(B == F) >\r |
| 103 | \r |
| 104 | vorr d13, d27, d13 @ E1[0] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
| 105 | \r |
| 106 | vbsl d12, d24, d2 @ E0[0] = < (C0 || !(D == B)) ? E : D >\r |
| 107 | \r |
| 108 | vbsl d14, d24, d8 @ E2[0] = < (C0 || !(B == F)) ? E : F >\r |
| 109 | \r |
| 110 | vbsl d13, d24, \dB0 @ E1[0] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
| 111 | \r |
| 112 | vceq.i8 d15, d2, \dH0 @ tmp0[0] = < D == H >\r |
| 113 | \r |
| 114 | vceq.i8 d23, \dH0, d8 @ tmp1[0] = < H == F >\r |
| 115 | \r |
| 116 | vorn d22, d4, d22 @ E3[0] = < (E == G) || !(D == B) >\r |
| 117 | vst3.8 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*8\r |
| 118 | \r |
| 119 | .if \first15\r |
| 120 | addls \dst1, \dst1, \reg1 @ dst1 += reg1\r |
| 121 | .endif\r |
| 122 | \r |
| 123 | vorn d26, d10, d26 @ E5[0] = < (E == I) || !(B == F) >\r |
| 124 | \r |
| 125 | @ d12 = tmp6[0]\r |
| 126 | @ d13 = tmp7[0]\r |
| 127 | \r |
| 128 | vorn d12, d0, d15 @ tmp6[0] = < (E == A) || !(D == H) >\r |
| 129 | \r |
| 130 | vorn d13, d6, d23 @ tmp7[0] = < (E == C) || !(H == F) >\r |
| 131 | \r |
| 132 | vand d22, d22, d12 @ E3[0] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
| 133 | \r |
| 134 | vand d26, d26, d13 @ E5[0] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
| 135 | \r |
| 136 | @ d12 = E6[0]\r |
| 137 | @ d13 = E7[0]\r |
| 138 | @ d14 = E8[0]\r |
| 139 | \r |
| 140 | vorr d22, d27, d22 @ E3[0] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
| 141 | \r |
| 142 | vorr d26, d27, d26 @ E5[0] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
| 143 | \r |
| 144 | vbsl d22, d24, d2 @ E3[0] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
| 145 | \r |
| 146 | vbsl d26, d24, d8 @ E5[0] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
| 147 | \r |
| 148 | vorn d13, d10, d15 @ E7[0] = < (E == I) || !(D == H) >\r |
| 149 | \r |
| 150 | vorn d12, d27, d15 @ E6[0] = < C0 || !(D == H) >\r |
| 151 | vst3.8 {d22,d24,d26}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*8\r |
| 152 | \r |
| 153 | .if \first15\r |
| 154 | addls \dst2, \dst2, \reg1 @ dst2 += reg1\r |
| 155 | .endif\r |
| 156 | \r |
| 157 | vorn d15, d4, d23 @ tmp0[0] = < (E == G) || !(H == F) >\r |
| 158 | \r |
| 159 | vorn d14, d27, d23 @ E8[0] = < C0 || !(H == F) >\r |
| 160 | \r |
| 161 | vand d13, d13, d15 @ E7[0] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
| 162 | \r |
| 163 | vbsl d12, d24, d2 @ E6[0] = < (C0 || !(D == H)) ? E : D >\r |
| 164 | \r |
| 165 | vorr d13, d27, d13 @ E7[0] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
| 166 | \r |
| 167 | vbsl d14, d24, d8 @ E8[0] = < (C0 || !(H == F)) ? E : F >\r |
| 168 | \r |
| 169 | vbsl d13, d24, \dH0 @ E7[0] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
| 170 | \r |
| 171 | @ d15 = tmp0[1]\r |
| 172 | @ d22 = tmp1[1]\r |
| 173 | @ d23 = E3[1]\r |
| 174 | @ d24 = E4[0]\r |
| 175 | @ d25 = E4[1]\r |
| 176 | @ d26 = C0[1]\r |
| 177 | @ d27 = E5[1]\r |
| 178 | \r |
| 179 | vceq.i8 d15, \dB1, \dH1 @ tmp0[1] = < B == H >\r |
| 180 | \r |
| 181 | vceq.i8 d22, d3, d9 @ tmp1[1] = < D == F >\r |
| 182 | \r |
| 183 | vceq.i8 d23, d3, \dB1 @ E3[1] = < D == B >\r |
| 184 | vst3.8 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*8\r |
| 185 | \r |
| 186 | .if \first15\r |
| 187 | addls \dst3, \dst3, \reg1 @ dst3 += reg1\r |
| 188 | bls 0f\r |
| 189 | .endif\r |
| 190 | \r |
| 191 | @ d12 = E0[1]\r |
| 192 | @ d13 = E1[1]\r |
| 193 | @ d14 = E2[1]\r |
| 194 | \r |
| 195 | vorr d26, d15, d22 @ C0[1] = < B == H || D == F >\r |
| 196 | \r |
| 197 | vceq.i8 d27, \dB1, d9 @ E5[1] = < B == F >\r |
| 198 | \r |
| 199 | vorn d15, d7, d23 @ tmp0[1] = < (E == C) || !(D == B) >\r |
| 200 | \r |
| 201 | vorn d22, d1, d27 @ tmp1[1] = < (E == A) || !(B == F) >\r |
| 202 | \r |
| 203 | vorn d12, d26, d23 @ E0[1] = < C0 || !(D == B) >\r |
| 204 | \r |
| 205 | vand d13, d15, d22 @ E1[1] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
| 206 | \r |
| 207 | vorn d14, d26, d27 @ E2[1] = < C0 || !(B == F) >\r |
| 208 | \r |
| 209 | vorr d13, d26, d13 @ E1[1] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
| 210 | \r |
| 211 | vbsl d12, d25, d3 @ E0[1] = < (C0 || !(D == B)) ? E : D >\r |
| 212 | \r |
| 213 | vbsl d14, d25, d9 @ E2[1] = < (C0 || !(B == F)) ? E : F >\r |
| 214 | \r |
| 215 | vbsl d13, d25, \dB1 @ E1[1] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
| 216 | \r |
| 217 | vceq.i8 d15, d3, \dH1 @ tmp0[1] = < D == H >\r |
| 218 | \r |
| 219 | vceq.i8 d22, \dH1, d9 @ tmp1[1] = < H == F >\r |
| 220 | \r |
| 221 | vorn d23, d5, d23 @ E3[1] = < (E == G) || !(D == B) >\r |
| 222 | .ifeq \first15\r |
| 223 | vst3.8 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*8\r |
| 224 | .else\r |
| 225 | vst3.8 {d12-d14}, [\dst1],\reg1 @ [dst] = E0,E1,E2; dst1 += reg1\r |
| 226 | .endif\r |
| 227 | \r |
| 228 | vorn d27, d11, d27 @ E5[1] = < (E == I) || !(B == F) >\r |
| 229 | \r |
| 230 | @ d12 = tmp6[1]\r |
| 231 | @ d13 = tmp7[1]\r |
| 232 | \r |
| 233 | vorn d12, d1, d15 @ tmp6[1] = < (E == A) || !(D == H) >\r |
| 234 | \r |
| 235 | vorn d13, d7, d22 @ tmp7[1] = < (E == C) || !(H == F) >\r |
| 236 | \r |
| 237 | vand d23, d23, d12 @ E3[1] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
| 238 | \r |
| 239 | vand d27, d27, d13 @ E5[1] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
| 240 | \r |
| 241 | @ d12 = E6[1]\r |
| 242 | @ d13 = E7[1]\r |
| 243 | @ d14 = E8[1]\r |
| 244 | \r |
| 245 | vorr d23, d26, d23 @ E3[1] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
| 246 | \r |
| 247 | vorr d27, d26, d27 @ E5[1] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
| 248 | \r |
| 249 | vbsl d23, d25, d3 @ E3[1] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
| 250 | \r |
| 251 | vbsl d27, d25, d9 @ E5[1] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
| 252 | \r |
| 253 | vorn d13, d11, d15 @ E7[1] = < (E == I) || !(D == H) >\r |
| 254 | \r |
| 255 | vorn d12, d26, d15 @ E6[1] = < C0 || !(D == H) >\r |
| 256 | .ifeq \first15\r |
| 257 | vst3.8 {d23,d25,d27}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*8\r |
| 258 | .else\r |
| 259 | vst3.8 {d23,d25,d27}, [\dst2],\reg1 @ [dst + dststride] = E3,E4,E5; dst2 += reg1\r |
| 260 | .endif\r |
| 261 | \r |
| 262 | vorn d15, d5, d22 @ tmp0[1] = < (E == G) || !(H == F) >\r |
| 263 | \r |
| 264 | vorn d14, d26, d22 @ E8[1] = < C0 || !(H == F) >\r |
| 265 | \r |
| 266 | vand d13, d13, d15 @ E7[1] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
| 267 | \r |
| 268 | vbsl d12, d25, d3 @ E6[1] = < (C0 || !(D == H)) ? E : D >\r |
| 269 | \r |
| 270 | vorr d13, d26, d13 @ E7[1] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
| 271 | \r |
| 272 | vbsl d14, d25, d9 @ E8[1] = < (C0 || !(H == F)) ? E : F >\r |
| 273 | \r |
| 274 | vbsl d13, d25, \dH1 @ E7[1] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
| 275 | \r |
| 276 | .ifeq \first15\r |
| 277 | \r |
| 278 | .ifeq \last16\r |
| 279 | sub \counter, \counter, #16 @ counter -= 16\r |
| 280 | cmp \counter, #16\r |
| 281 | .endif\r |
| 282 | \r |
| 283 | vst3.8 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*8\r |
| 284 | .else\r |
| 285 | vst3.8 {d12-d14}, [\dst3],\reg1 @ [dst + 2 * dststride] = E6,E7,E8; dst3 += reg1\r |
| 286 | \r |
| 287 | 0:\r |
| 288 | .endif\r |
| 289 | \r |
| 290 | .endm\r |
| 291 | \r |
| 292 | .macro __neon_scale3x_8_8_line src1, src2, src3, counter, dst1, dst2, dst3, reg1, qB, qH, dB0, dB1, dH0, dH1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 293 | \r |
| 294 | .ifeqs "\qB", "q14"\r |
| 295 | vld1.8 {d29[7]}, [\src1] @ S1prev[15] = src[-srcstride]\r |
| 296 | .endif\r |
| 297 | vld1.8 {d25[7]}, [\src2] @ S2prev[15] = src[0]\r |
| 298 | .ifeqs "\qH", "q15"\r |
| 299 | vld1.8 {d31[7]}, [\src3] @ S3prev[15] = src[srcstride]\r |
| 300 | .endif\r |
| 301 | andS \reg1, \counter, #15 @ reg1 = counter & 15\r |
| 302 | \r |
| 303 | .ifnes "\qB", "q14"\r |
| 304 | add \src1, \src1, \counter @ src1 += counter\r |
| 305 | .endif\r |
| 306 | .ifnes "\qH", "q15"\r |
| 307 | add \src3, \src3, \counter @ src3 += counter\r |
| 308 | .endif\r |
| 309 | beq 1f\r |
| 310 | \r |
| 311 | @ first 1-15 pixels - align counter to 16 bytes\r |
| 312 | \r |
| 313 | sub \reg1, \reg1, #1 @ reg1 = (counter & 15) - 1\r |
| 314 | \r |
| 315 | .ifeqs "\qB", "q14"\r |
| 316 | vld1.8 {q8}, [\src1] @ S1 = [src - srcstride]\r |
| 317 | add \src1, \src1, \reg1 @ src1 += (counter & 15) - 1\r |
| 318 | .endif\r |
| 319 | \r |
| 320 | vld1.8 {q9}, [\src2] @ S2 = [src ]\r |
| 321 | add \src2, \src2, \reg1 @ src2 += (counter & 15) - 1\r |
| 322 | \r |
| 323 | .ifeqs "\qH", "q15"\r |
| 324 | vld1.8 {q10}, [\src3] @ S3 = [src + srcstride]\r |
| 325 | add \src3, \src3, \reg1 @ src3 += (counter & 15) - 1\r |
| 326 | .endif\r |
| 327 | .ifeqs "\qB", "q14"\r |
| 328 | vext.8 q0, \qB, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < S >\r |
| 329 | \r |
| 330 | vmov \qB, q8 @ S1prev = S1 < T >\r |
| 331 | .endif\r |
| 332 | vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < V >\r |
| 333 | \r |
| 334 | vmov q12, q9 @ S2prev = S2 < C >\r |
| 335 | .ifeqs "\qH", "q15"\r |
| 336 | vext.8 q2, \qH, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < X >\r |
| 337 | \r |
| 338 | vmov \qH, q10 @ S3prev = S3 < Y >\r |
| 339 | .endif\r |
| 340 | .ifeqs "\qB", "q14"\r |
| 341 | vext.8 q3, \qB, q8, #1 @ S1sr = (S1prev >> 8) | ... < U >\r |
| 342 | .endif\r |
| 343 | \r |
| 344 | vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | ... < W >\r |
| 345 | \r |
| 346 | .ifeqs "\qH", "q15"\r |
| 347 | vext.8 q5, \qH, q10, #1 @ S3sr = (S3prev >> 8) | ... < Z >\r |
| 348 | .else\r |
| 349 | vmov q2, q1 @ S3sl = S2sl < X >\r |
| 350 | \r |
| 351 | vmov q5, q4 @ S3sr = S2sr < Z >\r |
| 352 | .endif\r |
| 353 | \r |
| 354 | .ifnes "\qB", "q14"\r |
| 355 | vmov q0, q1 @ S1sl = S2sl < S >\r |
| 356 | \r |
| 357 | vmov q3, q4 @ S1sr = S2sr < U >\r |
| 358 | .else\r |
| 359 | vld1.8 {d29[7]}, [\src1]! @ S1prev[15] = src[counter & 15 - 1 - srcstride]; src1++\r |
| 360 | .endif\r |
| 361 | \r |
| 362 | add \reg1, \reg1, #1 @ reg1 = counter & 15\r |
| 363 | \r |
| 364 | vld1.8 {d25[7]}, [\src2]! @ S2prev[15] = src[counter & 15 - 1]; src2++\r |
| 365 | \r |
| 366 | bic \counter, \counter, #15\r |
| 367 | \r |
| 368 | .ifeqs "\qH", "q15"\r |
| 369 | vld1.8 {d31[7]}, [\src3]! @ S3prev[15] = src[counter & 15 - 1 + srcstride]; src3++\r |
| 370 | .endif\r |
| 371 | \r |
| 372 | ___neon_scale3x_8_8_slice \counter, \dst1, \dst2, \dst3, \reg1, \dB0, \dB1, \dH0, \dH1, 1, 0\r |
| 373 | \r |
| 374 | \r |
| 375 | @ counter is aligned to 16 bytes\r |
| 376 | \r |
| 377 | 1:\r |
| 378 | .ifeqs "\qB", "q14"\r |
| 379 | vld1.8 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 16\r |
| 380 | .endif\r |
| 381 | vld1.8 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 16\r |
| 382 | .ifeqs "\qH", "q15"\r |
| 383 | vld1.8 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 16\r |
| 384 | .endif\r |
| 385 | \r |
| 386 | @ inner loop (16 pixels per iteration)\r |
| 387 | 2:\r |
| 388 | \r |
| 389 | .ifeqs "\qB", "q14"\r |
| 390 | vext.8 q0, \qB, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < A >\r |
| 391 | vmov \qB, q8 @ S1prev = S1 < B >\r |
| 392 | .endif\r |
| 393 | \r |
| 394 | vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < D >\r |
| 395 | vmov q12, q9 @ S2prev = S2 < E >\r |
| 396 | \r |
| 397 | .ifeqs "\qH", "q15"\r |
| 398 | vext.8 q2, \qH, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < G >\r |
| 399 | vmov \qH, q10 @ S3prev = S3 < H >\r |
| 400 | .endif\r |
| 401 | \r |
| 402 | .ifeqs "\qB", "q14"\r |
| 403 | vld1.8 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 16\r |
| 404 | vext.8 q3, \qB, q8, #1 @ S1sr = (S1prev >> 8) | S1[0] < C >\r |
| 405 | .endif\r |
| 406 | \r |
| 407 | vld1.8 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 16\r |
| 408 | vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | S2[0] < F >\r |
| 409 | \r |
| 410 | .ifeqs "\qH", "q15"\r |
| 411 | vld1.8 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 16\r |
| 412 | vext.8 q5, \qH, q10, #1 @ S3sr = (S3prev >> 8) | S3[0] < I >\r |
| 413 | .else\r |
| 414 | vmov q2, q1 @ S3sl = S2sl < G >\r |
| 415 | \r |
| 416 | vmov q5, q4 @ S3sr = S2sr < I >\r |
| 417 | .endif\r |
| 418 | \r |
| 419 | .ifnes "\qB", "q14"\r |
| 420 | vmov q0, q1 @ S1sl = S2sl < A >\r |
| 421 | \r |
| 422 | vmov q3, q4 @ S1sr = S2sr < C >\r |
| 423 | .endif\r |
| 424 | \r |
| 425 | ___neon_scale3x_8_8_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 0\r |
| 426 | \r |
| 427 | bhi 2b\r |
| 428 | \r |
| 429 | @ last 16 pixels\r |
| 430 | \r |
| 431 | .ifeqs "\qB", "q14"\r |
| 432 | vext.8 q0, \qB, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < A >\r |
| 433 | vmov \qB, q8 @ S1prev = S1 < B >\r |
| 434 | .endif\r |
| 435 | \r |
| 436 | vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < D >\r |
| 437 | vmov q12, q9 @ S2prev = S2 < E >\r |
| 438 | \r |
| 439 | .ifeqs "\qH", "q15"\r |
| 440 | vext.8 q2, \qH, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < G >\r |
| 441 | vmov \qH, q10 @ S3prev = S3 < H >\r |
| 442 | .endif\r |
| 443 | \r |
| 444 | .ifeqs "\qB", "q14"\r |
| 445 | vshr.u64 d16, d17, #(64-8) @ S1[0] = S1[15] | ...\r |
| 446 | .endif\r |
| 447 | \r |
| 448 | vshr.u64 d18, d19, #(64-8) @ S2[0] = S2[15] | ...\r |
| 449 | \r |
| 450 | .ifeqs "\qH", "q15"\r |
| 451 | vshr.u64 d20, d21, #(64-8) @ S3[0] = S3[15] | ...\r |
| 452 | .endif\r |
| 453 | .ifeqs "\qB", "q14"\r |
| 454 | vext.8 q3, \qB, q8, #1 @ S1sr = (S1prev >> 8) | S1[0] < C >\r |
| 455 | .endif\r |
| 456 | \r |
| 457 | vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | S2[0] < F >\r |
| 458 | \r |
| 459 | .ifeqs "\qH", "q15"\r |
| 460 | vext.8 q5, \qH, q10, #1 @ S3sr = (S3prev >> 8) | S3[0] < I >\r |
| 461 | .else\r |
| 462 | vmov q2, q1 @ S3sl = S2sl < G >\r |
| 463 | \r |
| 464 | vmov q5, q4 @ S3sr = S2sr < I >\r |
| 465 | .endif\r |
| 466 | \r |
| 467 | .ifnes "\qB", "q14"\r |
| 468 | vmov q0, q1 @ S1sl = S2sl < A >\r |
| 469 | \r |
| 470 | vmov q3, q4 @ S1sr = S2sr < C >\r |
| 471 | .endif\r |
| 472 | \r |
| 473 | ___neon_scale3x_8_8_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 1\r |
| 474 | \r |
| 475 | .endm\r |
| 476 | \r |
| 477 | .macro _neon_scale3x_8_8_line_first src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 478 | __neon_scale3x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q12, q15, d24, d25, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
| 479 | .endm\r |
| 480 | \r |
| 481 | .macro _neon_scale3x_8_8_line_middle src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 482 | __neon_scale3x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q15, d28, d29, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
| 483 | .endm\r |
| 484 | \r |
| 485 | .macro _neon_scale3x_8_8_line_last src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 486 | __neon_scale3x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q12, d28, d29, d24, d25, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
| 487 | .endm\r |
| 488 | \r |
| 489 | .macro neon_scale3x_8_8_line part, src1, src2, src3, counter, dst1, dst2, dst3, reg1, srcalign16, dstalign8\r |
| 490 | .ifeq \srcalign16\r |
| 491 | \r |
| 492 | .ifeq \dstalign8\r |
| 493 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1, \dst2, \dst3\r |
| 494 | .else\r |
| 495 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1:64, \dst2:64, \dst3:64\r |
| 496 | .endif\r |
| 497 | \r |
| 498 | .else\r |
| 499 | \r |
| 500 | .ifeq \dstalign8\r |
| 501 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1, \dst2, \dst3\r |
| 502 | .else\r |
| 503 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1:64, \dst2:64, \dst3:64\r |
| 504 | .endif\r |
| 505 | \r |
| 506 | .endif\r |
| 507 | .endm\r |
| 508 | \r |
| 509 | \r |
| 510 | .macro ___neon_scale3x_16_16_slice counter, dst1, dst2, dst3, reg1, dB0, dB1, dH0, dH1, first7, last8\r |
| 511 | \r |
| 512 | @ d12 = E0[0]\r |
| 513 | @ d13 = E1[0]\r |
| 514 | @ d14 = E2[0]\r |
| 515 | @ d15 = tmp0[0]\r |
| 516 | @ d22 = E3[0]\r |
| 517 | @ d23 = tmp1[0]\r |
| 518 | @ d24 = E4[0]\r |
| 519 | @ d25 = E4[1]\r |
| 520 | @ d26 = E5[0]\r |
| 521 | @ d27 = C0[0]\r |
| 522 | \r |
| 523 | @ q0 = tmp2\r |
| 524 | @ q3 = tmp3\r |
| 525 | @ q2 = tmp4\r |
| 526 | @ q5 = tmp5\r |
| 527 | \r |
| 528 | vceq.i16 d15, \dB0, \dH0 @ tmp0[0] = < B == H >\r |
| 529 | \r |
| 530 | vceq.i16 d23, d2, d8 @ tmp1[0] = < D == F >\r |
| 531 | \r |
| 532 | .if \first7\r |
| 533 | cmp \reg1, #4\r |
| 534 | .endif\r |
| 535 | \r |
| 536 | vceq.i16 q0, q12, q0 @ tmp2 = < E == A >\r |
| 537 | \r |
| 538 | vceq.i16 q3, q12, q3 @ tmp3 = < E == C >\r |
| 539 | \r |
| 540 | .if \first7\r |
| 541 | lsl \reg1, #1 @ reg1 = 2 * (counter & 7)\r |
| 542 | .endif\r |
| 543 | \r |
| 544 | vorr d27, d15, d23 @ C0[0] = < B == H || D == F >\r |
| 545 | \r |
| 546 | vceq.i16 d22, d2, \dB0 @ E3[0] = < D == B >\r |
| 547 | \r |
| 548 | vceq.i16 d26, \dB0, d8 @ E5[0] = < B == F >\r |
| 549 | \r |
| 550 | vceq.i16 q2, q12, q2 @ tmp4 = < E == G >\r |
| 551 | \r |
| 552 | vceq.i16 q5, q12, q5 @ tmp5 = < E == I >\r |
| 553 | \r |
| 554 | .if \first7\r |
| 555 | add \reg1, \reg1, \reg1, lsl #1 @ reg1 = 2 * 3 * (counter & 7)\r |
| 556 | .endif\r |
| 557 | \r |
| 558 | vorn d15, d6, d22 @ tmp0[0] = < (E == C) || !(D == B) >\r |
| 559 | \r |
| 560 | vorn d23, d0, d26 @ tmp1[0] = < (E == A) || !(B == F) >\r |
| 561 | \r |
| 562 | vorn d12, d27, d22 @ E0[0] = < C0 || !(D == B) >\r |
| 563 | \r |
| 564 | .if \first7\r |
| 565 | sub \reg1, \reg1, #(3*2*4) @ reg1 -= 3*2*4\r |
| 566 | .endif\r |
| 567 | \r |
| 568 | vand d13, d15, d23 @ E1[0] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
| 569 | \r |
| 570 | vorn d14, d27, d26 @ E2[0] = < C0 || !(B == F) >\r |
| 571 | \r |
| 572 | vorr d13, d27, d13 @ E1[0] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
| 573 | \r |
| 574 | vbsl d12, d24, d2 @ E0[0] = < (C0 || !(D == B)) ? E : D >\r |
| 575 | \r |
| 576 | vbsl d14, d24, d8 @ E2[0] = < (C0 || !(B == F)) ? E : F >\r |
| 577 | \r |
| 578 | vbsl d13, d24, \dB0 @ E1[0] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
| 579 | \r |
| 580 | vceq.i16 d15, d2, \dH0 @ tmp0[0] = < D == H >\r |
| 581 | \r |
| 582 | vceq.i16 d23, \dH0, d8 @ tmp1[0] = < H == F >\r |
| 583 | \r |
| 584 | vorn d22, d4, d22 @ E3[0] = < (E == G) || !(D == B) >\r |
| 585 | vst3.16 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*2*4\r |
| 586 | \r |
| 587 | .if \first7\r |
| 588 | addls \dst1, \dst1, \reg1 @ dst1 += reg1\r |
| 589 | .endif\r |
| 590 | \r |
| 591 | vorn d26, d10, d26 @ E5[0] = < (E == I) || !(B == F) >\r |
| 592 | \r |
| 593 | @ d12 = tmp6[0]\r |
| 594 | @ d13 = tmp7[0]\r |
| 595 | \r |
| 596 | vorn d12, d0, d15 @ tmp6[0] = < (E == A) || !(D == H) >\r |
| 597 | \r |
| 598 | vorn d13, d6, d23 @ tmp7[0] = < (E == C) || !(H == F) >\r |
| 599 | \r |
| 600 | vand d22, d22, d12 @ E3[0] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
| 601 | \r |
| 602 | vand d26, d26, d13 @ E5[0] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
| 603 | \r |
| 604 | @ d12 = E6[0]\r |
| 605 | @ d13 = E7[0]\r |
| 606 | @ d14 = E8[0]\r |
| 607 | \r |
| 608 | vorr d22, d27, d22 @ E3[0] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
| 609 | \r |
| 610 | vorr d26, d27, d26 @ E5[0] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
| 611 | \r |
| 612 | vbsl d22, d24, d2 @ E3[0] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
| 613 | \r |
| 614 | vbsl d26, d24, d8 @ E5[0] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
| 615 | \r |
| 616 | vorn d13, d10, d15 @ E7[0] = < (E == I) || !(D == H) >\r |
| 617 | \r |
| 618 | vorn d12, d27, d15 @ E6[0] = < C0 || !(D == H) >\r |
| 619 | vst3.16 {d22,d24,d26}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*2*4\r |
| 620 | \r |
| 621 | .if \first7\r |
| 622 | addls \dst2, \dst2, \reg1 @ dst2 += reg1\r |
| 623 | .endif\r |
| 624 | \r |
| 625 | vorn d15, d4, d23 @ tmp0[0] = < (E == G) || !(H == F) >\r |
| 626 | \r |
| 627 | vorn d14, d27, d23 @ E8[0] = < C0 || !(H == F) >\r |
| 628 | \r |
| 629 | vand d13, d13, d15 @ E7[0] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
| 630 | \r |
| 631 | vbsl d12, d24, d2 @ E6[0] = < (C0 || !(D == H)) ? E : D >\r |
| 632 | \r |
| 633 | vorr d13, d27, d13 @ E7[0] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
| 634 | \r |
| 635 | vbsl d14, d24, d8 @ E8[0] = < (C0 || !(H == F)) ? E : F >\r |
| 636 | \r |
| 637 | vbsl d13, d24, \dH0 @ E7[0] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
| 638 | \r |
| 639 | @ d15 = tmp0[1]\r |
| 640 | @ d22 = tmp1[1]\r |
| 641 | @ d23 = E3[1]\r |
| 642 | @ d24 = E4[0]\r |
| 643 | @ d25 = E4[1]\r |
| 644 | @ d26 = C0[1]\r |
| 645 | @ d27 = E5[1]\r |
| 646 | \r |
| 647 | vceq.i16 d15, \dB1, \dH1 @ tmp0[1] = < B == H >\r |
| 648 | \r |
| 649 | vceq.i16 d22, d3, d9 @ tmp1[1] = < D == F >\r |
| 650 | \r |
| 651 | vceq.i16 d23, d3, \dB1 @ E3[1] = < D == B >\r |
| 652 | vst3.16 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*2*4\r |
| 653 | \r |
| 654 | .if \first7\r |
| 655 | addls \dst3, \dst3, \reg1 @ dst3 += reg1\r |
| 656 | bls 0f\r |
| 657 | .endif\r |
| 658 | \r |
| 659 | @ d12 = E0[1]\r |
| 660 | @ d13 = E1[1]\r |
| 661 | @ d14 = E2[1]\r |
| 662 | \r |
| 663 | vorr d26, d15, d22 @ C0[1] = < B == H || D == F >\r |
| 664 | \r |
| 665 | vceq.i16 d27, \dB1, d9 @ E5[1] = < B == F >\r |
| 666 | \r |
| 667 | vorn d15, d7, d23 @ tmp0[1] = < (E == C) || !(D == B) >\r |
| 668 | \r |
| 669 | vorn d22, d1, d27 @ tmp1[1] = < (E == A) || !(B == F) >\r |
| 670 | \r |
| 671 | vorn d12, d26, d23 @ E0[1] = < C0 || !(D == B) >\r |
| 672 | \r |
| 673 | vand d13, d15, d22 @ E1[1] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
| 674 | \r |
| 675 | vorn d14, d26, d27 @ E2[1] = < C0 || !(B == F) >\r |
| 676 | \r |
| 677 | vorr d13, d26, d13 @ E1[1] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
| 678 | \r |
| 679 | vbsl d12, d25, d3 @ E0[1] = < (C0 || !(D == B)) ? E : D >\r |
| 680 | \r |
| 681 | vbsl d14, d25, d9 @ E2[1] = < (C0 || !(B == F)) ? E : F >\r |
| 682 | \r |
| 683 | vbsl d13, d25, \dB1 @ E1[1] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
| 684 | \r |
| 685 | vceq.i16 d15, d3, \dH1 @ tmp0[1] = < D == H >\r |
| 686 | \r |
| 687 | vceq.i16 d22, \dH1, d9 @ tmp1[1] = < H == F >\r |
| 688 | \r |
| 689 | vorn d23, d5, d23 @ E3[1] = < (E == G) || !(D == B) >\r |
| 690 | .ifeq \first7\r |
| 691 | vst3.16 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*2*4\r |
| 692 | .else\r |
| 693 | vst3.16 {d12-d14}, [\dst1], \reg1 @ [dst] = E0,E1,E2; dst1 += reg1\r |
| 694 | .endif\r |
| 695 | \r |
| 696 | vorn d27, d11, d27 @ E5[1] = < (E == I) || !(B == F) >\r |
| 697 | \r |
| 698 | @ d12 = tmp6[1]\r |
| 699 | @ d13 = tmp7[1]\r |
| 700 | \r |
| 701 | vorn d12, d1, d15 @ tmp6[1] = < (E == A) || !(D == H) >\r |
| 702 | \r |
| 703 | vorn d13, d7, d22 @ tmp7[1] = < (E == C) || !(H == F) >\r |
| 704 | \r |
| 705 | vand d23, d23, d12 @ E3[1] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
| 706 | \r |
| 707 | vand d27, d27, d13 @ E5[1] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
| 708 | \r |
| 709 | @ d12 = E6[1]\r |
| 710 | @ d13 = E7[1]\r |
| 711 | @ d14 = E8[1]\r |
| 712 | \r |
| 713 | vorr d23, d26, d23 @ E3[1] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
| 714 | \r |
| 715 | vorr d27, d26, d27 @ E5[1] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
| 716 | \r |
| 717 | vbsl d23, d25, d3 @ E3[1] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
| 718 | \r |
| 719 | vbsl d27, d25, d9 @ E5[1] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
| 720 | \r |
| 721 | vorn d13, d11, d15 @ E7[1] = < (E == I) || !(D == H) >\r |
| 722 | \r |
| 723 | vorn d12, d26, d15 @ E6[1] = < C0 || !(D == H) >\r |
| 724 | .ifeq \first7\r |
| 725 | vst3.16 {d23,d25,d27}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*2*4\r |
| 726 | .else\r |
| 727 | vst3.16 {d23,d25,d27}, [\dst2], \reg1 @ [dst + dststride] = E3,E4,E5; dst2 += reg1\r |
| 728 | .endif\r |
| 729 | \r |
| 730 | vorn d15, d5, d22 @ tmp0[1] = < (E == G) || !(H == F) >\r |
| 731 | \r |
| 732 | vorn d14, d26, d22 @ E8[1] = < C0 || !(H == F) >\r |
| 733 | \r |
| 734 | vand d13, d13, d15 @ E7[1] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
| 735 | \r |
| 736 | vbsl d12, d25, d3 @ E6[1] = < (C0 || !(D == H)) ? E : D >\r |
| 737 | \r |
| 738 | vorr d13, d26, d13 @ E7[1] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
| 739 | \r |
| 740 | vbsl d14, d25, d9 @ E8[1] = < (C0 || !(H == F)) ? E : F >\r |
| 741 | \r |
| 742 | vbsl d13, d25, \dH1 @ E7[1] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
| 743 | \r |
| 744 | .ifeq \first7\r |
| 745 | \r |
| 746 | .ifeq \last8\r |
| 747 | sub \counter, \counter, #8 @ counter -= 8\r |
| 748 | cmp \counter, #8\r |
| 749 | .endif\r |
| 750 | \r |
| 751 | vst3.16 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*2*4\r |
| 752 | .else\r |
| 753 | vst3.16 {d12-d14}, [\dst3], \reg1 @ [dst + 2 * dststride] = E6,E7,E8; dst3 += reg1\r |
| 754 | \r |
| 755 | 0:\r |
| 756 | .endif\r |
| 757 | \r |
| 758 | .endm\r |
| 759 | \r |
| 760 | .macro __neon_scale3x_16_16_line src1, src2, src3, counter, dst1, dst2, dst3, reg1, qB, qH, dB0, dB1, dH0, dH1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 761 | \r |
| 762 | .ifeqs "\qB", "q14"\r |
| 763 | vld1.16 {d29[3]}, [\src1] @ S1prev[7] = src[-srcstride]\r |
| 764 | .endif\r |
| 765 | vld1.16 {d25[3]}, [\src2] @ S2prev[7] = src[0]\r |
| 766 | .ifeqs "\qH", "q15"\r |
| 767 | vld1.16 {d31[3]}, [\src3] @ S3prev[7] = src[srcstride]\r |
| 768 | .endif\r |
| 769 | andS \reg1, \counter, #7 @ reg1 = counter & 7\r |
| 770 | \r |
| 771 | .ifnes "\qB", "q14"\r |
| 772 | add \src1, \src1, \counter, lsl #1 @ src1 += 2 * counter\r |
| 773 | .endif\r |
| 774 | .ifnes "\qH", "q15"\r |
| 775 | add \src3, \src3, \counter, lsl #1 @ src3 += 2 * counter\r |
| 776 | .endif\r |
| 777 | beq 1f\r |
| 778 | \r |
| 779 | @ first 1-7 pixels - align counter to 16 bytes\r |
| 780 | \r |
| 781 | sub \reg1, \reg1, #1 @ reg1 = (counter & 7) - 1\r |
| 782 | \r |
| 783 | .ifeqs "\qB", "q14"\r |
| 784 | vld1.16 {q8}, [\src1] @ S1 = [src - srcstride]\r |
| 785 | add \src1, \src1, \reg1, lsl #1 @ src1 += 2 * ((counter & 7) - 1)\r |
| 786 | .endif\r |
| 787 | \r |
| 788 | vld1.16 {q9}, [\src2] @ S2 = [src ]\r |
| 789 | add \src2, \src2, \reg1, lsl #1 @ src2 += 2 * ((counter & 7) - 1)\r |
| 790 | \r |
| 791 | .ifeqs "\qH", "q15"\r |
| 792 | vld1.16 {q10}, [\src3] @ S3 = [src + srcstride]\r |
| 793 | add \src3, \src3, \reg1, lsl #1 @ src3 += 2 * ((counter & 7) - 1)\r |
| 794 | .endif\r |
| 795 | .ifeqs "\qB", "q14"\r |
| 796 | vext.8 q0, \qB, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < S >\r |
| 797 | \r |
| 798 | vmov \qB, q8 @ S1prev = S1 < T >\r |
| 799 | .endif\r |
| 800 | vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < V >\r |
| 801 | \r |
| 802 | vmov q12, q9 @ S2prev = S2 < C >\r |
| 803 | .ifeqs "\qH", "q15"\r |
| 804 | vext.8 q2, \qH, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < X >\r |
| 805 | \r |
| 806 | vmov \qH, q10 @ S3prev = S3 < Y >\r |
| 807 | .endif\r |
| 808 | .ifeqs "\qB", "q14"\r |
| 809 | vext.8 q3, \qB, q8, #2 @ S1sr = (S1prev >> 16) | ... < U >\r |
| 810 | .endif\r |
| 811 | \r |
| 812 | vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | ... < W >\r |
| 813 | \r |
| 814 | .ifeqs "\qH", "q15"\r |
| 815 | vext.8 q5, \qH, q10, #2 @ S3sr = (S3prev >> 16) | ... < Z >\r |
| 816 | .else\r |
| 817 | vmov q2, q1 @ S3sl = S2sl < X >\r |
| 818 | \r |
| 819 | vmov q5, q4 @ S3sr = S2sr < Z >\r |
| 820 | .endif\r |
| 821 | \r |
| 822 | .ifnes "\qB", "q14"\r |
| 823 | vmov q0, q1 @ S1sl = S2sl < S >\r |
| 824 | \r |
| 825 | vmov q3, q4 @ S1sr = S2sr < U >\r |
| 826 | .else\r |
| 827 | vld1.16 {d29[3]}, [\src1]! @ S1prev[7] = src[counter & 7 - 1 - srcstride]; src1 += 2\r |
| 828 | .endif\r |
| 829 | \r |
| 830 | add \reg1, \reg1, #1 @ reg1 = counter & 7\r |
| 831 | \r |
| 832 | vld1.16 {d25[3]}, [\src2]! @ S2prev[7] = src[counter & 7 - 1]; src2 += 2\r |
| 833 | \r |
| 834 | bic \counter, \counter, #7\r |
| 835 | \r |
| 836 | .ifeqs "\qH", "q15"\r |
| 837 | vld1.16 {d31[3]}, [\src3]! @ S3prev[7] = src[counter & 7 - 1 + srcstride]; src3 += 2\r |
| 838 | .endif\r |
| 839 | \r |
| 840 | ___neon_scale3x_16_16_slice \counter, \dst1, \dst2, \dst3, \reg1, \dB0, \dB1, \dH0, \dH1, 1, 0\r |
| 841 | \r |
| 842 | \r |
| 843 | @ counter is aligned to 16 bytes\r |
| 844 | \r |
| 845 | 1:\r |
| 846 | .ifeqs "\qB", "q14"\r |
| 847 | vld1.16 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 2*8\r |
| 848 | .endif\r |
| 849 | vld1.16 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 2*8\r |
| 850 | .ifeqs "\qH", "q15"\r |
| 851 | vld1.16 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 2*8\r |
| 852 | .endif\r |
| 853 | \r |
| 854 | @ inner loop (8 pixels per iteration)\r |
| 855 | 2:\r |
| 856 | \r |
| 857 | .ifeqs "\qB", "q14"\r |
| 858 | vext.8 q0, \qB, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < A >\r |
| 859 | vmov \qB, q8 @ S1prev = S1 < B >\r |
| 860 | .endif\r |
| 861 | \r |
| 862 | vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < D >\r |
| 863 | vmov q12, q9 @ S2prev = S2 < E >\r |
| 864 | \r |
| 865 | .ifeqs "\qH", "q15"\r |
| 866 | vext.8 q2, \qH, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < G >\r |
| 867 | vmov \qH, q10 @ S3prev = S3 < H >\r |
| 868 | .endif\r |
| 869 | \r |
| 870 | .ifeqs "\qB", "q14"\r |
| 871 | vld1.16 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 2*8\r |
| 872 | vext.8 q3, \qB, q8, #2 @ S1sr = (S1prev >> 16) | S1[0] < C >\r |
| 873 | .endif\r |
| 874 | \r |
| 875 | vld1.16 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 2*8\r |
| 876 | vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | S2[0] < F >\r |
| 877 | \r |
| 878 | .ifeqs "\qH", "q15"\r |
| 879 | vld1.16 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 2*8\r |
| 880 | vext.8 q5, \qH, q10, #2 @ S3sr = (S3prev >> 16) | S3[0] < I >\r |
| 881 | .else\r |
| 882 | vmov q2, q1 @ S3sl = S2sl < G >\r |
| 883 | \r |
| 884 | vmov q5, q4 @ S3sr = S2sr < I >\r |
| 885 | .endif\r |
| 886 | \r |
| 887 | .ifnes "\qB", "q14"\r |
| 888 | vmov q0, q1 @ S1sl = S2sl < A >\r |
| 889 | \r |
| 890 | vmov q3, q4 @ S1sr = S2sr < C >\r |
| 891 | .endif\r |
| 892 | \r |
| 893 | ___neon_scale3x_16_16_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 0\r |
| 894 | \r |
| 895 | bhi 2b\r |
| 896 | \r |
| 897 | @ last 8 pixels\r |
| 898 | \r |
| 899 | .ifeqs "\qB", "q14"\r |
| 900 | vext.8 q0, \qB, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < A >\r |
| 901 | vmov \qB, q8 @ S1prev = S1 < B >\r |
| 902 | .endif\r |
| 903 | \r |
| 904 | vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < D >\r |
| 905 | vmov q12, q9 @ S2prev = S2 < E >\r |
| 906 | \r |
| 907 | .ifeqs "\qH", "q15"\r |
| 908 | vext.8 q2, \qH, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < G >\r |
| 909 | vmov \qH, q10 @ S3prev = S3 < H >\r |
| 910 | .endif\r |
| 911 | \r |
| 912 | .ifeqs "\qB", "q14"\r |
| 913 | vshr.u64 d16, d17, #(64-16) @ S1[0] = S1[7] | ...\r |
| 914 | .endif\r |
| 915 | \r |
| 916 | vshr.u64 d18, d19, #(64-16) @ S2[0] = S2[7] | ...\r |
| 917 | \r |
| 918 | .ifeqs "\qH", "q15"\r |
| 919 | vshr.u64 d20, d21, #(64-16) @ S3[0] = S3[7] | ...\r |
| 920 | .endif\r |
| 921 | .ifeqs "\qB", "q14"\r |
| 922 | vext.8 q3, \qB, q8, #2 @ S1sr = (S1prev >> 16) | S1[0] < C >\r |
| 923 | .endif\r |
| 924 | \r |
| 925 | vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | S2[0] < F >\r |
| 926 | \r |
| 927 | .ifeqs "\qH", "q15"\r |
| 928 | vext.8 q5, \qH, q10, #2 @ S3sr = (S3prev >> 16) | S3[0] < I >\r |
| 929 | .else\r |
| 930 | vmov q2, q1 @ S3sl = S2sl < G >\r |
| 931 | \r |
| 932 | vmov q5, q4 @ S3sr = S2sr < I >\r |
| 933 | .endif\r |
| 934 | \r |
| 935 | .ifnes "\qB", "q14"\r |
| 936 | vmov q0, q1 @ S1sl = S2sl < A >\r |
| 937 | \r |
| 938 | vmov q3, q4 @ S1sr = S2sr < C >\r |
| 939 | .endif\r |
| 940 | \r |
| 941 | ___neon_scale3x_16_16_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 1\r |
| 942 | \r |
| 943 | .endm\r |
| 944 | \r |
| 945 | .macro _neon_scale3x_16_16_line_first src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 946 | __neon_scale3x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q12, q15, d24, d25, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
| 947 | .endm\r |
| 948 | \r |
| 949 | .macro _neon_scale3x_16_16_line_middle src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 950 | __neon_scale3x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q15, d28, d29, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
| 951 | .endm\r |
| 952 | \r |
| 953 | .macro _neon_scale3x_16_16_line_last src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
| 954 | __neon_scale3x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q12, d28, d29, d24, d25, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
| 955 | .endm\r |
| 956 | \r |
| 957 | .macro neon_scale3x_16_16_line part, src1, src2, src3, counter, dst1, dst2, dst3, reg1, srcalign16, dstalign8\r |
| 958 | .ifeq \srcalign16\r |
| 959 | \r |
| 960 | .ifeq \dstalign8\r |
| 961 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1, \dst2, \dst3\r |
| 962 | .else\r |
| 963 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1:64, \dst2:64, \dst3:64\r |
| 964 | .endif\r |
| 965 | \r |
| 966 | .else\r |
| 967 | \r |
| 968 | .ifeq \dstalign8\r |
| 969 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1, \dst2, \dst3\r |
| 970 | .else\r |
| 971 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1:64, \dst2:64, \dst3:64\r |
| 972 | .endif\r |
| 973 | \r |
| 974 | .endif\r |
| 975 | .endm\r |
| 976 | \r |