Mercurial > cgi-bin > hgwebdir.cgi > PR > Applications > VSs > VSs__H264__App
diff libavcodec/arm/dsputil_arm.S @ 2:897f711a7157
rearrange to work with autoconf
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Tue, 25 Sep 2012 15:55:33 +0200 |
| parents | |
| children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libavcodec/arm/dsputil_arm.S Tue Sep 25 15:55:33 2012 +0200 1.3 @@ -0,0 +1,712 @@ 1.4 +@ 1.5 +@ ARMv4 optimized DSP utils 1.6 +@ Copyright (c) 2004 AGAWA Koji <i (AT) atty (DOT) jp> 1.7 +@ 1.8 +@ This file is part of FFmpeg. 1.9 +@ 1.10 +@ FFmpeg is free software; you can redistribute it and/or 1.11 +@ modify it under the terms of the GNU Lesser General Public 1.12 +@ License as published by the Free Software Foundation; either 1.13 +@ version 2.1 of the License, or (at your option) any later version. 1.14 +@ 1.15 +@ FFmpeg is distributed in the hope that it will be useful, 1.16 +@ but WITHOUT ANY WARRANTY; without even the implied warranty of 1.17 +@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1.18 +@ Lesser General Public License for more details. 1.19 +@ 1.20 +@ You should have received a copy of the GNU Lesser General Public 1.21 +@ License along with FFmpeg; if not, write to the Free Software 1.22 +@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 1.23 +@ 1.24 + 1.25 +#include "config.h" 1.26 +#include "asm.S" 1.27 + 1.28 + preserve8 1.29 + 1.30 +#if !HAVE_PLD 1.31 +.macro pld reg 1.32 +.endm 1.33 +#endif 1.34 + 1.35 +#if HAVE_ARMV5TE 1.36 +function ff_prefetch_arm, export=1 1.37 + subs r2, r2, #1 1.38 + pld [r0] 1.39 + add r0, r0, r1 1.40 + bne ff_prefetch_arm 1.41 + bx lr 1.42 +endfunc 1.43 +#endif 1.44 + 1.45 +.macro ALIGN_QWORD_D shift, Rd0, Rd1, Rd2, Rd3, Rn0, Rn1, Rn2, Rn3, Rn4 1.46 + mov \Rd0, \Rn0, lsr #(\shift * 8) 1.47 + mov \Rd1, \Rn1, lsr #(\shift * 8) 1.48 + mov \Rd2, \Rn2, lsr #(\shift * 8) 1.49 + mov \Rd3, \Rn3, lsr #(\shift * 8) 1.50 + orr \Rd0, \Rd0, \Rn1, lsl #(32 - \shift * 8) 1.51 + orr \Rd1, \Rd1, \Rn2, lsl #(32 - \shift * 8) 1.52 + orr \Rd2, \Rd2, \Rn3, lsl #(32 - \shift * 8) 1.53 + orr \Rd3, \Rd3, \Rn4, lsl #(32 - \shift * 8) 1.54 +.endm 1.55 +.macro ALIGN_DWORD shift, R0, R1, R2 1.56 + mov \R0, \R0, lsr #(\shift * 8) 1.57 + orr \R0, \R0, \R1, lsl #(32 - \shift * 8) 1.58 + mov \R1, \R1, lsr #(\shift * 8) 1.59 + orr \R1, \R1, \R2, lsl #(32 - \shift * 8) 1.60 +.endm 1.61 +.macro ALIGN_DWORD_D shift, Rdst0, Rdst1, Rsrc0, Rsrc1, Rsrc2 1.62 + mov \Rdst0, \Rsrc0, lsr #(\shift * 8) 1.63 + mov \Rdst1, \Rsrc1, lsr #(\shift * 8) 1.64 + orr \Rdst0, \Rdst0, \Rsrc1, lsl #(32 - (\shift * 8)) 1.65 + orr \Rdst1, \Rdst1, \Rsrc2, lsl #(32 - (\shift * 8)) 1.66 +.endm 1.67 + 1.68 +.macro RND_AVG32 Rd0, Rd1, Rn0, Rn1, Rm0, Rm1, Rmask 1.69 + @ Rd = (Rn | Rm) - (((Rn ^ Rm) & ~0x01010101) >> 1) 1.70 + @ Rmask = 0xFEFEFEFE 1.71 + @ Rn = destroy 1.72 + eor \Rd0, \Rn0, \Rm0 1.73 + eor \Rd1, \Rn1, \Rm1 1.74 + orr \Rn0, \Rn0, \Rm0 1.75 + orr \Rn1, \Rn1, \Rm1 1.76 + and \Rd0, \Rd0, \Rmask 1.77 + and \Rd1, \Rd1, \Rmask 1.78 + sub \Rd0, \Rn0, \Rd0, lsr #1 1.79 + sub \Rd1, \Rn1, \Rd1, lsr #1 1.80 +.endm 1.81 + 1.82 +.macro NO_RND_AVG32 Rd0, Rd1, Rn0, Rn1, Rm0, Rm1, Rmask 1.83 + @ Rd = (Rn & Rm) - (((Rn ^ Rm) & ~0x01010101) >> 1) 1.84 + @ Rmask = 0xFEFEFEFE 1.85 + @ Rn = destroy 1.86 + eor \Rd0, \Rn0, \Rm0 1.87 + eor \Rd1, \Rn1, \Rm1 1.88 + and \Rn0, \Rn0, \Rm0 1.89 + and \Rn1, \Rn1, \Rm1 1.90 + and \Rd0, \Rd0, \Rmask 1.91 + and \Rd1, \Rd1, \Rmask 1.92 + add \Rd0, \Rn0, \Rd0, lsr #1 1.93 + add \Rd1, \Rn1, \Rd1, lsr #1 1.94 +.endm 1.95 + 1.96 +.macro JMP_ALIGN tmp, reg 1.97 + ands \tmp, \reg, #3 1.98 + bic \reg, \reg, #3 1.99 + beq 1f 1.100 + subs \tmp, \tmp, #1 1.101 + beq 2f 1.102 + subs \tmp, \tmp, #1 1.103 + beq 3f 1.104 + b 4f 1.105 +.endm 1.106 + 1.107 +@ ---------------------------------------------------------------- 1.108 + .align 5 1.109 +function ff_put_pixels16_arm, export=1 1.110 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.111 + @ block = word aligned, pixles = unaligned 1.112 + pld [r1] 1.113 + push {r4-r11, lr} 1.114 + JMP_ALIGN r5, r1 1.115 +1: 1.116 + ldm r1, {r4-r7} 1.117 + add r1, r1, r2 1.118 + stm r0, {r4-r7} 1.119 + pld [r1] 1.120 + subs r3, r3, #1 1.121 + add r0, r0, r2 1.122 + bne 1b 1.123 + pop {r4-r11, pc} 1.124 + .align 5 1.125 +2: 1.126 + ldm r1, {r4-r8} 1.127 + add r1, r1, r2 1.128 + ALIGN_QWORD_D 1, r9, r10, r11, r12, r4, r5, r6, r7, r8 1.129 + pld [r1] 1.130 + subs r3, r3, #1 1.131 + stm r0, {r9-r12} 1.132 + add r0, r0, r2 1.133 + bne 2b 1.134 + pop {r4-r11, pc} 1.135 + .align 5 1.136 +3: 1.137 + ldm r1, {r4-r8} 1.138 + add r1, r1, r2 1.139 + ALIGN_QWORD_D 2, r9, r10, r11, r12, r4, r5, r6, r7, r8 1.140 + pld [r1] 1.141 + subs r3, r3, #1 1.142 + stm r0, {r9-r12} 1.143 + add r0, r0, r2 1.144 + bne 3b 1.145 + pop {r4-r11, pc} 1.146 + .align 5 1.147 +4: 1.148 + ldm r1, {r4-r8} 1.149 + add r1, r1, r2 1.150 + ALIGN_QWORD_D 3, r9, r10, r11, r12, r4, r5, r6, r7, r8 1.151 + pld [r1] 1.152 + subs r3, r3, #1 1.153 + stm r0, {r9-r12} 1.154 + add r0, r0, r2 1.155 + bne 4b 1.156 + pop {r4-r11,pc} 1.157 +endfunc 1.158 + 1.159 +@ ---------------------------------------------------------------- 1.160 + .align 5 1.161 +function ff_put_pixels8_arm, export=1 1.162 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.163 + @ block = word aligned, pixles = unaligned 1.164 + pld [r1] 1.165 + push {r4-r5,lr} 1.166 + JMP_ALIGN r5, r1 1.167 +1: 1.168 + ldm r1, {r4-r5} 1.169 + add r1, r1, r2 1.170 + subs r3, r3, #1 1.171 + pld [r1] 1.172 + stm r0, {r4-r5} 1.173 + add r0, r0, r2 1.174 + bne 1b 1.175 + pop {r4-r5,pc} 1.176 + .align 5 1.177 +2: 1.178 + ldm r1, {r4-r5, r12} 1.179 + add r1, r1, r2 1.180 + ALIGN_DWORD 1, r4, r5, r12 1.181 + pld [r1] 1.182 + subs r3, r3, #1 1.183 + stm r0, {r4-r5} 1.184 + add r0, r0, r2 1.185 + bne 2b 1.186 + pop {r4-r5,pc} 1.187 + .align 5 1.188 +3: 1.189 + ldm r1, {r4-r5, r12} 1.190 + add r1, r1, r2 1.191 + ALIGN_DWORD 2, r4, r5, r12 1.192 + pld [r1] 1.193 + subs r3, r3, #1 1.194 + stm r0, {r4-r5} 1.195 + add r0, r0, r2 1.196 + bne 3b 1.197 + pop {r4-r5,pc} 1.198 + .align 5 1.199 +4: 1.200 + ldm r1, {r4-r5, r12} 1.201 + add r1, r1, r2 1.202 + ALIGN_DWORD 3, r4, r5, r12 1.203 + pld [r1] 1.204 + subs r3, r3, #1 1.205 + stm r0, {r4-r5} 1.206 + add r0, r0, r2 1.207 + bne 4b 1.208 + pop {r4-r5,pc} 1.209 +endfunc 1.210 + 1.211 +@ ---------------------------------------------------------------- 1.212 + .align 5 1.213 +function ff_put_pixels8_x2_arm, export=1 1.214 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.215 + @ block = word aligned, pixles = unaligned 1.216 + pld [r1] 1.217 + push {r4-r10,lr} 1.218 + ldr r12, =0xfefefefe 1.219 + JMP_ALIGN r5, r1 1.220 +1: 1.221 + ldm r1, {r4-r5, r10} 1.222 + add r1, r1, r2 1.223 + ALIGN_DWORD_D 1, r6, r7, r4, r5, r10 1.224 + pld [r1] 1.225 + RND_AVG32 r8, r9, r4, r5, r6, r7, r12 1.226 + subs r3, r3, #1 1.227 + stm r0, {r8-r9} 1.228 + add r0, r0, r2 1.229 + bne 1b 1.230 + pop {r4-r10,pc} 1.231 + .align 5 1.232 +2: 1.233 + ldm r1, {r4-r5, r10} 1.234 + add r1, r1, r2 1.235 + ALIGN_DWORD_D 1, r6, r7, r4, r5, r10 1.236 + ALIGN_DWORD_D 2, r8, r9, r4, r5, r10 1.237 + pld [r1] 1.238 + RND_AVG32 r4, r5, r6, r7, r8, r9, r12 1.239 + subs r3, r3, #1 1.240 + stm r0, {r4-r5} 1.241 + add r0, r0, r2 1.242 + bne 2b 1.243 + pop {r4-r10,pc} 1.244 + .align 5 1.245 +3: 1.246 + ldm r1, {r4-r5, r10} 1.247 + add r1, r1, r2 1.248 + ALIGN_DWORD_D 2, r6, r7, r4, r5, r10 1.249 + ALIGN_DWORD_D 3, r8, r9, r4, r5, r10 1.250 + pld [r1] 1.251 + RND_AVG32 r4, r5, r6, r7, r8, r9, r12 1.252 + subs r3, r3, #1 1.253 + stm r0, {r4-r5} 1.254 + add r0, r0, r2 1.255 + bne 3b 1.256 + pop {r4-r10,pc} 1.257 + .align 5 1.258 +4: 1.259 + ldm r1, {r4-r5, r10} 1.260 + add r1, r1, r2 1.261 + ALIGN_DWORD_D 3, r6, r7, r4, r5, r10 1.262 + pld [r1] 1.263 + RND_AVG32 r8, r9, r6, r7, r5, r10, r12 1.264 + subs r3, r3, #1 1.265 + stm r0, {r8-r9} 1.266 + add r0, r0, r2 1.267 + bne 4b 1.268 + pop {r4-r10,pc} 1.269 +endfunc 1.270 + 1.271 + .align 5 1.272 +function ff_put_no_rnd_pixels8_x2_arm, export=1 1.273 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.274 + @ block = word aligned, pixles = unaligned 1.275 + pld [r1] 1.276 + push {r4-r10,lr} 1.277 + ldr r12, =0xfefefefe 1.278 + JMP_ALIGN r5, r1 1.279 +1: 1.280 + ldm r1, {r4-r5, r10} 1.281 + add r1, r1, r2 1.282 + ALIGN_DWORD_D 1, r6, r7, r4, r5, r10 1.283 + pld [r1] 1.284 + NO_RND_AVG32 r8, r9, r4, r5, r6, r7, r12 1.285 + subs r3, r3, #1 1.286 + stm r0, {r8-r9} 1.287 + add r0, r0, r2 1.288 + bne 1b 1.289 + pop {r4-r10,pc} 1.290 + .align 5 1.291 +2: 1.292 + ldm r1, {r4-r5, r10} 1.293 + add r1, r1, r2 1.294 + ALIGN_DWORD_D 1, r6, r7, r4, r5, r10 1.295 + ALIGN_DWORD_D 2, r8, r9, r4, r5, r10 1.296 + pld [r1] 1.297 + NO_RND_AVG32 r4, r5, r6, r7, r8, r9, r12 1.298 + subs r3, r3, #1 1.299 + stm r0, {r4-r5} 1.300 + add r0, r0, r2 1.301 + bne 2b 1.302 + pop {r4-r10,pc} 1.303 + .align 5 1.304 +3: 1.305 + ldm r1, {r4-r5, r10} 1.306 + add r1, r1, r2 1.307 + ALIGN_DWORD_D 2, r6, r7, r4, r5, r10 1.308 + ALIGN_DWORD_D 3, r8, r9, r4, r5, r10 1.309 + pld [r1] 1.310 + NO_RND_AVG32 r4, r5, r6, r7, r8, r9, r12 1.311 + subs r3, r3, #1 1.312 + stm r0, {r4-r5} 1.313 + add r0, r0, r2 1.314 + bne 3b 1.315 + pop {r4-r10,pc} 1.316 + .align 5 1.317 +4: 1.318 + ldm r1, {r4-r5, r10} 1.319 + add r1, r1, r2 1.320 + ALIGN_DWORD_D 3, r6, r7, r4, r5, r10 1.321 + pld [r1] 1.322 + NO_RND_AVG32 r8, r9, r6, r7, r5, r10, r12 1.323 + subs r3, r3, #1 1.324 + stm r0, {r8-r9} 1.325 + add r0, r0, r2 1.326 + bne 4b 1.327 + pop {r4-r10,pc} 1.328 +endfunc 1.329 + 1.330 + 1.331 +@ ---------------------------------------------------------------- 1.332 + .align 5 1.333 +function ff_put_pixels8_y2_arm, export=1 1.334 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.335 + @ block = word aligned, pixles = unaligned 1.336 + pld [r1] 1.337 + push {r4-r11,lr} 1.338 + mov r3, r3, lsr #1 1.339 + ldr r12, =0xfefefefe 1.340 + JMP_ALIGN r5, r1 1.341 +1: 1.342 + ldm r1, {r4-r5} 1.343 + add r1, r1, r2 1.344 +6: ldm r1, {r6-r7} 1.345 + add r1, r1, r2 1.346 + pld [r1] 1.347 + RND_AVG32 r8, r9, r4, r5, r6, r7, r12 1.348 + ldm r1, {r4-r5} 1.349 + add r1, r1, r2 1.350 + stm r0, {r8-r9} 1.351 + add r0, r0, r2 1.352 + pld [r1] 1.353 + RND_AVG32 r8, r9, r6, r7, r4, r5, r12 1.354 + subs r3, r3, #1 1.355 + stm r0, {r8-r9} 1.356 + add r0, r0, r2 1.357 + bne 6b 1.358 + pop {r4-r11,pc} 1.359 + .align 5 1.360 +2: 1.361 + ldm r1, {r4-r6} 1.362 + add r1, r1, r2 1.363 + pld [r1] 1.364 + ALIGN_DWORD 1, r4, r5, r6 1.365 +6: ldm r1, {r7-r9} 1.366 + add r1, r1, r2 1.367 + pld [r1] 1.368 + ALIGN_DWORD 1, r7, r8, r9 1.369 + RND_AVG32 r10, r11, r4, r5, r7, r8, r12 1.370 + stm r0, {r10-r11} 1.371 + add r0, r0, r2 1.372 + ldm r1, {r4-r6} 1.373 + add r1, r1, r2 1.374 + pld [r1] 1.375 + ALIGN_DWORD 1, r4, r5, r6 1.376 + subs r3, r3, #1 1.377 + RND_AVG32 r10, r11, r7, r8, r4, r5, r12 1.378 + stm r0, {r10-r11} 1.379 + add r0, r0, r2 1.380 + bne 6b 1.381 + pop {r4-r11,pc} 1.382 + .align 5 1.383 +3: 1.384 + ldm r1, {r4-r6} 1.385 + add r1, r1, r2 1.386 + pld [r1] 1.387 + ALIGN_DWORD 2, r4, r5, r6 1.388 +6: ldm r1, {r7-r9} 1.389 + add r1, r1, r2 1.390 + pld [r1] 1.391 + ALIGN_DWORD 2, r7, r8, r9 1.392 + RND_AVG32 r10, r11, r4, r5, r7, r8, r12 1.393 + stm r0, {r10-r11} 1.394 + add r0, r0, r2 1.395 + ldm r1, {r4-r6} 1.396 + add r1, r1, r2 1.397 + pld [r1] 1.398 + ALIGN_DWORD 2, r4, r5, r6 1.399 + subs r3, r3, #1 1.400 + RND_AVG32 r10, r11, r7, r8, r4, r5, r12 1.401 + stm r0, {r10-r11} 1.402 + add r0, r0, r2 1.403 + bne 6b 1.404 + pop {r4-r11,pc} 1.405 + .align 5 1.406 +4: 1.407 + ldm r1, {r4-r6} 1.408 + add r1, r1, r2 1.409 + pld [r1] 1.410 + ALIGN_DWORD 3, r4, r5, r6 1.411 +6: ldm r1, {r7-r9} 1.412 + add r1, r1, r2 1.413 + pld [r1] 1.414 + ALIGN_DWORD 3, r7, r8, r9 1.415 + RND_AVG32 r10, r11, r4, r5, r7, r8, r12 1.416 + stm r0, {r10-r11} 1.417 + add r0, r0, r2 1.418 + ldm r1, {r4-r6} 1.419 + add r1, r1, r2 1.420 + pld [r1] 1.421 + ALIGN_DWORD 3, r4, r5, r6 1.422 + subs r3, r3, #1 1.423 + RND_AVG32 r10, r11, r7, r8, r4, r5, r12 1.424 + stm r0, {r10-r11} 1.425 + add r0, r0, r2 1.426 + bne 6b 1.427 + pop {r4-r11,pc} 1.428 +endfunc 1.429 + 1.430 + .align 5 1.431 +function ff_put_no_rnd_pixels8_y2_arm, export=1 1.432 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.433 + @ block = word aligned, pixles = unaligned 1.434 + pld [r1] 1.435 + push {r4-r11,lr} 1.436 + mov r3, r3, lsr #1 1.437 + ldr r12, =0xfefefefe 1.438 + JMP_ALIGN r5, r1 1.439 +1: 1.440 + ldm r1, {r4-r5} 1.441 + add r1, r1, r2 1.442 +6: ldm r1, {r6-r7} 1.443 + add r1, r1, r2 1.444 + pld [r1] 1.445 + NO_RND_AVG32 r8, r9, r4, r5, r6, r7, r12 1.446 + ldm r1, {r4-r5} 1.447 + add r1, r1, r2 1.448 + stm r0, {r8-r9} 1.449 + add r0, r0, r2 1.450 + pld [r1] 1.451 + NO_RND_AVG32 r8, r9, r6, r7, r4, r5, r12 1.452 + subs r3, r3, #1 1.453 + stm r0, {r8-r9} 1.454 + add r0, r0, r2 1.455 + bne 6b 1.456 + pop {r4-r11,pc} 1.457 + .align 5 1.458 +2: 1.459 + ldm r1, {r4-r6} 1.460 + add r1, r1, r2 1.461 + pld [r1] 1.462 + ALIGN_DWORD 1, r4, r5, r6 1.463 +6: ldm r1, {r7-r9} 1.464 + add r1, r1, r2 1.465 + pld [r1] 1.466 + ALIGN_DWORD 1, r7, r8, r9 1.467 + NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12 1.468 + stm r0, {r10-r11} 1.469 + add r0, r0, r2 1.470 + ldm r1, {r4-r6} 1.471 + add r1, r1, r2 1.472 + pld [r1] 1.473 + ALIGN_DWORD 1, r4, r5, r6 1.474 + subs r3, r3, #1 1.475 + NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12 1.476 + stm r0, {r10-r11} 1.477 + add r0, r0, r2 1.478 + bne 6b 1.479 + pop {r4-r11,pc} 1.480 + .align 5 1.481 +3: 1.482 + ldm r1, {r4-r6} 1.483 + add r1, r1, r2 1.484 + pld [r1] 1.485 + ALIGN_DWORD 2, r4, r5, r6 1.486 +6: ldm r1, {r7-r9} 1.487 + add r1, r1, r2 1.488 + pld [r1] 1.489 + ALIGN_DWORD 2, r7, r8, r9 1.490 + NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12 1.491 + stm r0, {r10-r11} 1.492 + add r0, r0, r2 1.493 + ldm r1, {r4-r6} 1.494 + add r1, r1, r2 1.495 + pld [r1] 1.496 + ALIGN_DWORD 2, r4, r5, r6 1.497 + subs r3, r3, #1 1.498 + NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12 1.499 + stm r0, {r10-r11} 1.500 + add r0, r0, r2 1.501 + bne 6b 1.502 + pop {r4-r11,pc} 1.503 + .align 5 1.504 +4: 1.505 + ldm r1, {r4-r6} 1.506 + add r1, r1, r2 1.507 + pld [r1] 1.508 + ALIGN_DWORD 3, r4, r5, r6 1.509 +6: ldm r1, {r7-r9} 1.510 + add r1, r1, r2 1.511 + pld [r1] 1.512 + ALIGN_DWORD 3, r7, r8, r9 1.513 + NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12 1.514 + stm r0, {r10-r11} 1.515 + add r0, r0, r2 1.516 + ldm r1, {r4-r6} 1.517 + add r1, r1, r2 1.518 + pld [r1] 1.519 + ALIGN_DWORD 3, r4, r5, r6 1.520 + subs r3, r3, #1 1.521 + NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12 1.522 + stm r0, {r10-r11} 1.523 + add r0, r0, r2 1.524 + bne 6b 1.525 + pop {r4-r11,pc} 1.526 +endfunc 1.527 + 1.528 + .ltorg 1.529 + 1.530 +@ ---------------------------------------------------------------- 1.531 +.macro RND_XY2_IT align, rnd 1.532 + @ l1= (a & 0x03030303) + (b & 0x03030303) ?(+ 0x02020202) 1.533 + @ h1= ((a & 0xFCFCFCFCUL) >> 2) + ((b & 0xFCFCFCFCUL) >> 2) 1.534 +.if \align == 0 1.535 + ldm r1, {r6-r8} 1.536 +.elseif \align == 3 1.537 + ldm r1, {r5-r7} 1.538 +.else 1.539 + ldm r1, {r8-r10} 1.540 +.endif 1.541 + add r1, r1, r2 1.542 + pld [r1] 1.543 +.if \align == 0 1.544 + ALIGN_DWORD_D 1, r4, r5, r6, r7, r8 1.545 +.elseif \align == 1 1.546 + ALIGN_DWORD_D 1, r4, r5, r8, r9, r10 1.547 + ALIGN_DWORD_D 2, r6, r7, r8, r9, r10 1.548 +.elseif \align == 2 1.549 + ALIGN_DWORD_D 2, r4, r5, r8, r9, r10 1.550 + ALIGN_DWORD_D 3, r6, r7, r8, r9, r10 1.551 +.elseif \align == 3 1.552 + ALIGN_DWORD_D 3, r4, r5, r5, r6, r7 1.553 +.endif 1.554 + ldr r14, =0x03030303 1.555 + tst r3, #1 1.556 + and r8, r4, r14 1.557 + and r9, r5, r14 1.558 + and r10, r6, r14 1.559 + and r11, r7, r14 1.560 + andeq r14, r14, r14, \rnd #1 1.561 + add r8, r8, r10 1.562 + add r9, r9, r11 1.563 + ldr r12, =0xfcfcfcfc >> 2 1.564 + addeq r8, r8, r14 1.565 + addeq r9, r9, r14 1.566 + and r4, r12, r4, lsr #2 1.567 + and r5, r12, r5, lsr #2 1.568 + and r6, r12, r6, lsr #2 1.569 + and r7, r12, r7, lsr #2 1.570 + add r10, r4, r6 1.571 + add r11, r5, r7 1.572 + subs r3, r3, #1 1.573 +.endm 1.574 + 1.575 +.macro RND_XY2_EXPAND align, rnd 1.576 + RND_XY2_IT \align, \rnd 1.577 +6: push {r8-r11} 1.578 + RND_XY2_IT \align, \rnd 1.579 + pop {r4-r7} 1.580 + add r4, r4, r8 1.581 + add r5, r5, r9 1.582 + ldr r14, =0x0f0f0f0f 1.583 + add r6, r6, r10 1.584 + add r7, r7, r11 1.585 + and r4, r14, r4, lsr #2 1.586 + and r5, r14, r5, lsr #2 1.587 + add r4, r4, r6 1.588 + add r5, r5, r7 1.589 + stm r0, {r4-r5} 1.590 + add r0, r0, r2 1.591 + bge 6b 1.592 + pop {r4-r11,pc} 1.593 +.endm 1.594 + 1.595 + .align 5 1.596 +function ff_put_pixels8_xy2_arm, export=1 1.597 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.598 + @ block = word aligned, pixles = unaligned 1.599 + pld [r1] 1.600 + push {r4-r11,lr} @ R14 is also called LR 1.601 + JMP_ALIGN r5, r1 1.602 +1: RND_XY2_EXPAND 0, lsl 1.603 + .align 5 1.604 +2: RND_XY2_EXPAND 1, lsl 1.605 + .align 5 1.606 +3: RND_XY2_EXPAND 2, lsl 1.607 + .align 5 1.608 +4: RND_XY2_EXPAND 3, lsl 1.609 +endfunc 1.610 + 1.611 + .align 5 1.612 +function ff_put_no_rnd_pixels8_xy2_arm, export=1 1.613 + @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h) 1.614 + @ block = word aligned, pixles = unaligned 1.615 + pld [r1] 1.616 + push {r4-r11,lr} 1.617 + JMP_ALIGN r5, r1 1.618 +1: RND_XY2_EXPAND 0, lsr 1.619 + .align 5 1.620 +2: RND_XY2_EXPAND 1, lsr 1.621 + .align 5 1.622 +3: RND_XY2_EXPAND 2, lsr 1.623 + .align 5 1.624 +4: RND_XY2_EXPAND 3, lsr 1.625 +endfunc 1.626 + 1.627 + .align 5 1.628 +@ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, int stride) 1.629 +function ff_add_pixels_clamped_arm, export=1 1.630 + push {r4-r10} 1.631 + mov r10, #8 1.632 +1: 1.633 + ldr r4, [r1] /* load dest */ 1.634 + /* block[0] and block[1]*/ 1.635 + ldrsh r5, [r0] 1.636 + ldrsh r7, [r0, #2] 1.637 + and r6, r4, #0xFF 1.638 + and r8, r4, #0xFF00 1.639 + add r6, r5, r6 1.640 + add r8, r7, r8, lsr #8 1.641 + mvn r5, r5 1.642 + mvn r7, r7 1.643 + tst r6, #0x100 1.644 + movne r6, r5, lsr #24 1.645 + tst r8, #0x100 1.646 + movne r8, r7, lsr #24 1.647 + mov r9, r6 1.648 + ldrsh r5, [r0, #4] /* moved form [A] */ 1.649 + orr r9, r9, r8, lsl #8 1.650 + /* block[2] and block[3] */ 1.651 + /* [A] */ 1.652 + ldrsh r7, [r0, #6] 1.653 + and r6, r4, #0xFF0000 1.654 + and r8, r4, #0xFF000000 1.655 + add r6, r5, r6, lsr #16 1.656 + add r8, r7, r8, lsr #24 1.657 + mvn r5, r5 1.658 + mvn r7, r7 1.659 + tst r6, #0x100 1.660 + movne r6, r5, lsr #24 1.661 + tst r8, #0x100 1.662 + movne r8, r7, lsr #24 1.663 + orr r9, r9, r6, lsl #16 1.664 + ldr r4, [r1, #4] /* moved form [B] */ 1.665 + orr r9, r9, r8, lsl #24 1.666 + /* store dest */ 1.667 + ldrsh r5, [r0, #8] /* moved form [C] */ 1.668 + str r9, [r1] 1.669 + 1.670 + /* load dest */ 1.671 + /* [B] */ 1.672 + /* block[4] and block[5] */ 1.673 + /* [C] */ 1.674 + ldrsh r7, [r0, #10] 1.675 + and r6, r4, #0xFF 1.676 + and r8, r4, #0xFF00 1.677 + add r6, r5, r6 1.678 + add r8, r7, r8, lsr #8 1.679 + mvn r5, r5 1.680 + mvn r7, r7 1.681 + tst r6, #0x100 1.682 + movne r6, r5, lsr #24 1.683 + tst r8, #0x100 1.684 + movne r8, r7, lsr #24 1.685 + mov r9, r6 1.686 + ldrsh r5, [r0, #12] /* moved from [D] */ 1.687 + orr r9, r9, r8, lsl #8 1.688 + /* block[6] and block[7] */ 1.689 + /* [D] */ 1.690 + ldrsh r7, [r0, #14] 1.691 + and r6, r4, #0xFF0000 1.692 + and r8, r4, #0xFF000000 1.693 + add r6, r5, r6, lsr #16 1.694 + add r8, r7, r8, lsr #24 1.695 + mvn r5, r5 1.696 + mvn r7, r7 1.697 + tst r6, #0x100 1.698 + movne r6, r5, lsr #24 1.699 + tst r8, #0x100 1.700 + movne r8, r7, lsr #24 1.701 + orr r9, r9, r6, lsl #16 1.702 + add r0, r0, #16 /* moved from [E] */ 1.703 + orr r9, r9, r8, lsl #24 1.704 + subs r10, r10, #1 /* moved from [F] */ 1.705 + /* store dest */ 1.706 + str r9, [r1, #4] 1.707 + 1.708 + /* [E] */ 1.709 + /* [F] */ 1.710 + add r1, r1, r2 1.711 + bne 1b 1.712 + 1.713 + pop {r4-r10} 1.714 + bx lr 1.715 +endfunc
