11b362b15af34006e6a11974088a46d42b903418eJohann;
21b362b15af34006e6a11974088a46d42b903418eJohann;  Copyright (c) 2011 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann;
41b362b15af34006e6a11974088a46d42b903418eJohann;  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann;  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann;  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann;  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann;  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann;
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann    EXPORT  |vp8_intra4x4_predict_armv6|
131b362b15af34006e6a11974088a46d42b903418eJohann
141b362b15af34006e6a11974088a46d42b903418eJohann    ARM
151b362b15af34006e6a11974088a46d42b903418eJohann    REQUIRE8
161b362b15af34006e6a11974088a46d42b903418eJohann    PRESERVE8
171b362b15af34006e6a11974088a46d42b903418eJohann
181b362b15af34006e6a11974088a46d42b903418eJohann    AREA ||.text||, CODE, READONLY, ALIGN=2
191b362b15af34006e6a11974088a46d42b903418eJohann
201b362b15af34006e6a11974088a46d42b903418eJohann
211b362b15af34006e6a11974088a46d42b903418eJohann;void vp8_intra4x4_predict_armv6(unsigned char *Above, unsigned char *yleft,
221b362b15af34006e6a11974088a46d42b903418eJohann;                                B_PREDICTION_MODE left_stride, int b_mode,
231b362b15af34006e6a11974088a46d42b903418eJohann;                                unsigned char *dst, int dst_stride,
241b362b15af34006e6a11974088a46d42b903418eJohann;                                unsigned char top_left)
251b362b15af34006e6a11974088a46d42b903418eJohann
261b362b15af34006e6a11974088a46d42b903418eJohann; r0: *Above
271b362b15af34006e6a11974088a46d42b903418eJohann; r1: *yleft
281b362b15af34006e6a11974088a46d42b903418eJohann; r2: left_stride
291b362b15af34006e6a11974088a46d42b903418eJohann; r3: b_mode
301b362b15af34006e6a11974088a46d42b903418eJohann; sp + #40: dst
311b362b15af34006e6a11974088a46d42b903418eJohann; sp + #44: dst_stride
321b362b15af34006e6a11974088a46d42b903418eJohann; sp + #48: top_left
331b362b15af34006e6a11974088a46d42b903418eJohann|vp8_intra4x4_predict_armv6| PROC
341b362b15af34006e6a11974088a46d42b903418eJohann    push        {r4-r12, lr}
351b362b15af34006e6a11974088a46d42b903418eJohann
361b362b15af34006e6a11974088a46d42b903418eJohann    cmp         r3, #10
371b362b15af34006e6a11974088a46d42b903418eJohann    addlt       pc, pc, r3, lsl #2       ; position independent switch
381b362b15af34006e6a11974088a46d42b903418eJohann    pop         {r4-r12, pc}             ; default
391b362b15af34006e6a11974088a46d42b903418eJohann    b           b_dc_pred
401b362b15af34006e6a11974088a46d42b903418eJohann    b           b_tm_pred
411b362b15af34006e6a11974088a46d42b903418eJohann    b           b_ve_pred
421b362b15af34006e6a11974088a46d42b903418eJohann    b           b_he_pred
431b362b15af34006e6a11974088a46d42b903418eJohann    b           b_ld_pred
441b362b15af34006e6a11974088a46d42b903418eJohann    b           b_rd_pred
451b362b15af34006e6a11974088a46d42b903418eJohann    b           b_vr_pred
461b362b15af34006e6a11974088a46d42b903418eJohann    b           b_vl_pred
471b362b15af34006e6a11974088a46d42b903418eJohann    b           b_hd_pred
481b362b15af34006e6a11974088a46d42b903418eJohann    b           b_hu_pred
491b362b15af34006e6a11974088a46d42b903418eJohann
501b362b15af34006e6a11974088a46d42b903418eJohannb_dc_pred
511b362b15af34006e6a11974088a46d42b903418eJohann    ; load values
521b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r8, [r0]                 ; Above
531b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1], r2             ; Left[0]
541b362b15af34006e6a11974088a46d42b903418eJohann    mov         r9, #0
551b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2             ; Left[1]
561b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2             ; Left[2]
571b362b15af34006e6a11974088a46d42b903418eJohann    usad8       r12, r8, r9
581b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1]                 ; Left[3]
591b362b15af34006e6a11974088a46d42b903418eJohann
601b362b15af34006e6a11974088a46d42b903418eJohann    ; calculate dc
611b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r5
621b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r6
631b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r7
641b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r12
651b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, #4
661b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
671b362b15af34006e6a11974088a46d42b903418eJohann    mov         r12, r4, asr #3         ; (expected_dc + 4) >> 3
681b362b15af34006e6a11974088a46d42b903418eJohann
691b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r12, r12, lsl #8
701b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
711b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r12, r12, lsl #16
721b362b15af34006e6a11974088a46d42b903418eJohann
731b362b15af34006e6a11974088a46d42b903418eJohann    ; store values
741b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
751b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
761b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
771b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3]
781b362b15af34006e6a11974088a46d42b903418eJohann
791b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
801b362b15af34006e6a11974088a46d42b903418eJohann
811b362b15af34006e6a11974088a46d42b903418eJohannb_tm_pred
821b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r8, [r0]                ; Above
831b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r9, [sp, #48]           ; top_left
841b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1], r2            ; Left[0]
851b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2            ; Left[1]
861b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2            ; Left[2]
871b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1]                ; Left[3]
881b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
891b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
901b362b15af34006e6a11974088a46d42b903418eJohann
911b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r9, lsl #16     ; [tl|tl]
921b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r10, r8                 ; a[2|0]
931b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r11, r8, ror #8         ; a[3|1]
941b362b15af34006e6a11974088a46d42b903418eJohann    ssub16      r10, r10, r9            ; a[2|0] - [tl|tl]
951b362b15af34006e6a11974088a46d42b903418eJohann    ssub16      r11, r11, r9            ; a[3|1] - [tl|tl]
961b362b15af34006e6a11974088a46d42b903418eJohann
971b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r4, lsl #16     ; l[0|0]
981b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r5, lsl #16     ; l[1|1]
991b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r6, lsl #16     ; l[2|2]
1001b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r7, lsl #16     ; l[3|3]
1011b362b15af34006e6a11974088a46d42b903418eJohann
1021b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r1, r4, r10             ; l[0|0] + a[2|0] - [tl|tl]
1031b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r2, r4, r11             ; l[0|0] + a[3|1] - [tl|tl]
1041b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r1, #8, r1
1051b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r2, #8, r2
1061b362b15af34006e6a11974088a46d42b903418eJohann
1071b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r4, r5, r10             ; l[1|1] + a[2|0] - [tl|tl]
1081b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r5, r5, r11             ; l[1|1] + a[3|1] - [tl|tl]
1091b362b15af34006e6a11974088a46d42b903418eJohann
1101b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r1, r2, lsl #8     ; [3|2|1|0]
1111b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
1121b362b15af34006e6a11974088a46d42b903418eJohann
1131b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r4, #8, r4
1141b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r5, #8, r5
1151b362b15af34006e6a11974088a46d42b903418eJohann
1161b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r1, r6, r10             ; l[2|2] + a[2|0] - [tl|tl]
1171b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r2, r6, r11             ; l[2|2] + a[3|1] - [tl|tl]
1181b362b15af34006e6a11974088a46d42b903418eJohann
1191b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r4, r5, lsl #8     ; [3|2|1|0]
1201b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
1211b362b15af34006e6a11974088a46d42b903418eJohann
1221b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r1, #8, r1
1231b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r2, #8, r2
1241b362b15af34006e6a11974088a46d42b903418eJohann
1251b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r4, r7, r10             ; l[3|3] + a[2|0] - [tl|tl]
1261b362b15af34006e6a11974088a46d42b903418eJohann    sadd16      r5, r7, r11             ; l[3|3] + a[3|1] - [tl|tl]
1271b362b15af34006e6a11974088a46d42b903418eJohann
1281b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r1, r2, lsl #8     ; [3|2|1|0]
1291b362b15af34006e6a11974088a46d42b903418eJohann
1301b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r4, #8, r4
1311b362b15af34006e6a11974088a46d42b903418eJohann    usat16      r5, #8, r5
1321b362b15af34006e6a11974088a46d42b903418eJohann
1331b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
1341b362b15af34006e6a11974088a46d42b903418eJohann
1351b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r4, r5, lsl #8     ; [3|2|1|0]
1361b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3]
1371b362b15af34006e6a11974088a46d42b903418eJohann
1381b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
1391b362b15af34006e6a11974088a46d42b903418eJohann
1401b362b15af34006e6a11974088a46d42b903418eJohannb_ve_pred
1411b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r8, [r0]                ; a[3|2|1|0]
1421b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r11, c00FF00FF
1431b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r9, [sp, #48]           ; top_left
1441b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r10, [r0, #4]           ; a[4]
1451b362b15af34006e6a11974088a46d42b903418eJohann
1461b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, c00020002
1471b362b15af34006e6a11974088a46d42b903418eJohann
1481b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r4, r8                  ; a[2|0]
1491b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r5, r8, ror #8          ; a[3|1]
1501b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r2, [sp, #44]           ; dst_stride
1511b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r9, r9, r5, lsl #16     ; a[1|-1]
1521b362b15af34006e6a11974088a46d42b903418eJohann
1531b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r4, lsl #1      ;[a[1]+2*a[2]       | tl+2*a[0]       ]
1541b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r9, r9, r5              ;[a[1]+2*a[2]+a[3]  | tl+2*a[0]+a[1]  ]
1551b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
1561b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r9, r9, r0              ;[a[1]+2*a[2]+a[3]+2| tl+2*a[0]+a[1]+2]
1571b362b15af34006e6a11974088a46d42b903418eJohann
1581b362b15af34006e6a11974088a46d42b903418eJohann    add         r0, r0, r10, lsl #16    ;[a[4]+2            |                 2]
1591b362b15af34006e6a11974088a46d42b903418eJohann    add         r0, r0, r4, asr #16     ;[a[4]+2            |            a[2]+2]
1601b362b15af34006e6a11974088a46d42b903418eJohann    add         r0, r0, r5, lsl #1      ;[a[4]+2*a[3]+2     |     a[2]+2*a[1]+2]
1611b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r4, r4, r0              ;[a[4]+2*a[3]+a[2]+2|a[2]+2*a[1]+a[0]+2]
1621b362b15af34006e6a11974088a46d42b903418eJohann
1631b362b15af34006e6a11974088a46d42b903418eJohann    and         r9, r11, r9, asr #2
1641b362b15af34006e6a11974088a46d42b903418eJohann    and         r4, r11, r4, asr #2
1651b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r4, lsl #8
1661b362b15af34006e6a11974088a46d42b903418eJohann
1671b362b15af34006e6a11974088a46d42b903418eJohann    ; store values
1681b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3], r2
1691b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3], r2
1701b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3], r2
1711b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3]
1721b362b15af34006e6a11974088a46d42b903418eJohann
1731b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
1741b362b15af34006e6a11974088a46d42b903418eJohann
1751b362b15af34006e6a11974088a46d42b903418eJohann
1761b362b15af34006e6a11974088a46d42b903418eJohannb_he_pred
1771b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1], r2            ; Left[0]
1781b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r8, [sp, #48]           ; top_left
1791b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2            ; Left[1]
1801b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2            ; Left[2]
1811b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1]                ; Left[3]
1821b362b15af34006e6a11974088a46d42b903418eJohann
1831b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r4              ; tl   + l[0]
1841b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r4, r5              ; l[0] + l[1]
1851b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r5, r6             ; l[1] + l[2]
1861b362b15af34006e6a11974088a46d42b903418eJohann    add         r11, r6, r7             ; l[2] + l[3]
1871b362b15af34006e6a11974088a46d42b903418eJohann
1881b362b15af34006e6a11974088a46d42b903418eJohann    mov         r0, #2<<14
1891b362b15af34006e6a11974088a46d42b903418eJohann
1901b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r9              ; tl + 2*l[0] + l[1]
1911b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r9, r10             ; l[0] + 2*l[1] + l[2]
1921b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r10, r11            ; l[1] + 2*l[2] + l[3]
1931b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r11, r7, lsl #1     ; l[2] + 2*l[3] + l[3]
1941b362b15af34006e6a11974088a46d42b903418eJohann
1951b362b15af34006e6a11974088a46d42b903418eJohann
1961b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r0, r8, lsl #14     ; (tl + 2*l[0] + l[1])>>2 in top half
1971b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r0, r4, lsl #14     ; (l[0] + 2*l[1] + l[2])>>2 in top half
1981b362b15af34006e6a11974088a46d42b903418eJohann    add         r10,r0, r5, lsl #14     ; (l[1] + 2*l[2] + l[3])>>2 in top half
1991b362b15af34006e6a11974088a46d42b903418eJohann    add         r11,r0, r6, lsl #14     ; (l[2] + 2*l[3] + l[3])>>2 in top half
2001b362b15af34006e6a11974088a46d42b903418eJohann
2011b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r8, r8, r8, asr #16     ; l[-|0|-|0]
2021b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r9, r9, r9, asr #16     ; l[-|1|-|1]
2031b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r10, r10, r10, asr #16  ; l[-|2|-|2]
2041b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r11, r11, r11, asr #16  ; l[-|3|-|3]
2051b362b15af34006e6a11974088a46d42b903418eJohann
2061b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
2071b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
2081b362b15af34006e6a11974088a46d42b903418eJohann
2091b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r8, lsl #8      ; l[0|0|0|0]
2101b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r9, lsl #8      ; l[1|1|1|1]
2111b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r10, r10, lsl #8   ; l[2|2|2|2]
2121b362b15af34006e6a11974088a46d42b903418eJohann    add         r11, r11, r11, lsl #8   ; l[3|3|3|3]
2131b362b15af34006e6a11974088a46d42b903418eJohann
2141b362b15af34006e6a11974088a46d42b903418eJohann    ; store values
2151b362b15af34006e6a11974088a46d42b903418eJohann    str         r8, [r3], r0
2161b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3], r0
2171b362b15af34006e6a11974088a46d42b903418eJohann    str         r10, [r3], r0
2181b362b15af34006e6a11974088a46d42b903418eJohann    str         r11, [r3]
2191b362b15af34006e6a11974088a46d42b903418eJohann
2201b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
2211b362b15af34006e6a11974088a46d42b903418eJohann
2221b362b15af34006e6a11974088a46d42b903418eJohannb_ld_pred
2231b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r4, [r0]                ; Above[0-3]
2241b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r12, c00020002
2251b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r5, [r0, #4]            ; Above[4-7]
2261b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr,  c00FF00FF
2271b362b15af34006e6a11974088a46d42b903418eJohann
2281b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r6, r4                  ; a[2|0]
2291b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r7, r4, ror #8          ; a[3|1]
2301b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r8, r5                  ; a[6|4]
2311b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r9, r5, ror #8          ; a[7|5]
2321b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r10, r6, r8             ; a[2|4]
2331b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r11, r7, r9             ; a[3|5]
2341b362b15af34006e6a11974088a46d42b903418eJohann
2351b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r6, r7, lsl #1      ; [a2+2*a3      |      a0+2*a1]
2361b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r10, ror #16    ; [a2+2*a3+a4   |   a0+2*a1+a2]
2371b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r4, r4, r12             ; [a2+2*a3+a4+2 | a0+2*a1+a2+2]
2381b362b15af34006e6a11974088a46d42b903418eJohann
2391b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r7, r10, ror #15    ; [a3+2*a4      |      a1+2*a2]
2401b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r11, ror #16    ; [a3+2*a4+a5   |   a1+2*a2+a3]
2411b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r5, r5, r12             ; [a3+2*a4+a5+2 | a1+2*a2+a3+2]
2421b362b15af34006e6a11974088a46d42b903418eJohann
2431b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r7, r9, r8, asr #16
2441b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r8, r9, lsl #1      ; [a6+2*a7      |      a4+2*a5]
2451b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r6, r6, r7              ; [a6+2*a7+a7   |   a4+2*a5+a6]
2461b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r6, r6, r12             ; [a6+2*a7+a7+2 | a4+2*a5+a6+2]
2471b362b15af34006e6a11974088a46d42b903418eJohann
2481b362b15af34006e6a11974088a46d42b903418eJohann    uxth        r7, r9                  ; [                         a5]
2491b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r8, asr #15     ; [                    a5+2*a6]
2501b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r9, asr #16     ; [                 a5+2*a6+a7]
2511b362b15af34006e6a11974088a46d42b903418eJohann    uxtah       r7, r7, r12             ; [               a5+2*a6+a7+2]
2521b362b15af34006e6a11974088a46d42b903418eJohann
2531b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
2541b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
2551b362b15af34006e6a11974088a46d42b903418eJohann
2561b362b15af34006e6a11974088a46d42b903418eJohann    ; scale down
2571b362b15af34006e6a11974088a46d42b903418eJohann    and         r4, lr, r4, asr #2
2581b362b15af34006e6a11974088a46d42b903418eJohann    and         r5, lr, r5, asr #2
2591b362b15af34006e6a11974088a46d42b903418eJohann    and         r6, lr, r6, asr #2
2601b362b15af34006e6a11974088a46d42b903418eJohann    mov         r7, r7, asr #2
2611b362b15af34006e6a11974088a46d42b903418eJohann
2621b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r4, r5, lsl #8      ; [3|2|1|0]
2631b362b15af34006e6a11974088a46d42b903418eJohann    str         r8, [r3], r0
2641b362b15af34006e6a11974088a46d42b903418eJohann
2651b362b15af34006e6a11974088a46d42b903418eJohann    mov         r9, r8, lsr #8
2661b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r6, lsl #24     ; [4|3|2|1]
2671b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3], r0
2681b362b15af34006e6a11974088a46d42b903418eJohann
2691b362b15af34006e6a11974088a46d42b903418eJohann    mov         r10, r9, lsr #8
2701b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r10, r7, lsl #24   ; [5|4|3|2]
2711b362b15af34006e6a11974088a46d42b903418eJohann    str         r10, [r3], r0
2721b362b15af34006e6a11974088a46d42b903418eJohann
2731b362b15af34006e6a11974088a46d42b903418eJohann    mov         r6, r6, lsr #16
2741b362b15af34006e6a11974088a46d42b903418eJohann    mov         r11, r10, lsr #8
2751b362b15af34006e6a11974088a46d42b903418eJohann    add         r11, r11, r6, lsl #24   ; [6|5|4|3]
2761b362b15af34006e6a11974088a46d42b903418eJohann    str         r11, [r3]
2771b362b15af34006e6a11974088a46d42b903418eJohann
2781b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
2791b362b15af34006e6a11974088a46d42b903418eJohann
2801b362b15af34006e6a11974088a46d42b903418eJohannb_rd_pred
2811b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1], r2            ; l[0] = pp[3]
2821b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr, [r0]                ; Above = pp[8|7|6|5]
2831b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r8, [sp, #48]           ; tl   = pp[4]
2841b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2            ; l[1] = pp[2]
2851b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2            ; l[2] = pp[1]
2861b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1], r2            ; l[3] = pp[0]
2871b362b15af34006e6a11974088a46d42b903418eJohann
2881b362b15af34006e6a11974088a46d42b903418eJohann
2891b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r9, lr                  ; p[7|5]
2901b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r10, lr, ror #8         ; p[8|6]
2911b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r6, lsl #16     ; p[2|0]
2921b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r7, lsl #16     ; p[3|1]
2931b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r8, lsl #16     ; p[4|2]
2941b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r7, r7, r9, lsl #16     ; p[5|3]
2951b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r8, r8, r10, lsl #16    ; p[6|4]
2961b362b15af34006e6a11974088a46d42b903418eJohann
2971b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r12, c00020002
2981b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr,  c00FF00FF
2991b362b15af34006e6a11974088a46d42b903418eJohann
3001b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r5, lsl #1      ; [p2+2*p3      |      p0+2*p1]
3011b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r6              ; [p2+2*p3+p4   |   p0+2*p1+p2]
3021b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r4, r4, r12             ; [p2+2*p3+p4+2 | p0+2*p1+p2+2]
3031b362b15af34006e6a11974088a46d42b903418eJohann
3041b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r6, lsl #1      ; [p3+2*p4      |      p1+2*p2]
3051b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r7              ; [p3+2*p4+p5   |   p1+2*p2+p3]
3061b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r5, r5, r12             ; [p3+2*p4+p5+2 | p1+2*p2+p3+2]
3071b362b15af34006e6a11974088a46d42b903418eJohann
3081b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r7, r8, lsl #1      ; [p5+2*p6      |      p3+2*p4]
3091b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r9              ; [p5+2*p6+p7   |   p3+2*p4+p5]
3101b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r6, r6, r12             ; [p5+2*p6+p7+2 | p3+2*p4+p5+2]
3111b362b15af34006e6a11974088a46d42b903418eJohann
3121b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r8, r9, lsl #1      ; [p6+2*p7      |      p4+2*p5]
3131b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r10             ; [p6+2*p7+p8   |   p4+2*p5+p6]
3141b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r7, r7, r12             ; [p6+2*p7+p8+2 | p4+2*p5+p6+2]
3151b362b15af34006e6a11974088a46d42b903418eJohann
3161b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
3171b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
3181b362b15af34006e6a11974088a46d42b903418eJohann
3191b362b15af34006e6a11974088a46d42b903418eJohann    ; scale down
3201b362b15af34006e6a11974088a46d42b903418eJohann    and         r7, lr, r7, asr #2
3211b362b15af34006e6a11974088a46d42b903418eJohann    and         r6, lr, r6, asr #2
3221b362b15af34006e6a11974088a46d42b903418eJohann    and         r5, lr, r5, asr #2
3231b362b15af34006e6a11974088a46d42b903418eJohann    and         r4, lr, r4, asr #2
3241b362b15af34006e6a11974088a46d42b903418eJohann
3251b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r6, r7, lsl #8      ; [6|5|4|3]
3261b362b15af34006e6a11974088a46d42b903418eJohann    str         r8, [r3], r0
3271b362b15af34006e6a11974088a46d42b903418eJohann
3281b362b15af34006e6a11974088a46d42b903418eJohann    mov         r9, r8, lsl #8          ; [5|4|3|-]
3291b362b15af34006e6a11974088a46d42b903418eJohann    uxtab       r9, r9, r4, ror #16     ; [5|4|3|2]
3301b362b15af34006e6a11974088a46d42b903418eJohann    str         r9, [r3], r0
3311b362b15af34006e6a11974088a46d42b903418eJohann
3321b362b15af34006e6a11974088a46d42b903418eJohann    mov         r10, r9, lsl #8         ; [4|3|2|-]
3331b362b15af34006e6a11974088a46d42b903418eJohann    uxtab       r10, r10, r5            ; [4|3|2|1]
3341b362b15af34006e6a11974088a46d42b903418eJohann    str         r10, [r3], r0
3351b362b15af34006e6a11974088a46d42b903418eJohann
3361b362b15af34006e6a11974088a46d42b903418eJohann    mov         r11, r10, lsl #8        ; [3|2|1|-]
3371b362b15af34006e6a11974088a46d42b903418eJohann    uxtab       r11, r11, r4            ; [3|2|1|0]
3381b362b15af34006e6a11974088a46d42b903418eJohann    str         r11, [r3]
3391b362b15af34006e6a11974088a46d42b903418eJohann
3401b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
3411b362b15af34006e6a11974088a46d42b903418eJohann
3421b362b15af34006e6a11974088a46d42b903418eJohannb_vr_pred
3431b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1], r2            ; l[0] = pp[3]
3441b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr, [r0]                ; Above = pp[8|7|6|5]
3451b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r8, [sp, #48]           ; tl   = pp[4]
3461b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2            ; l[1] = pp[2]
3471b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2            ; l[2] = pp[1]
3481b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1]                ; l[3] = pp[0]
3491b362b15af34006e6a11974088a46d42b903418eJohann
3501b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r7, lsl #16     ; p[3|1]
3511b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r8, lsl #16     ; p[4|2]
3521b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r9, lr                  ; p[7|5]
3531b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r10, lr, ror #8         ; p[8|6]
3541b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r7, r7, r9, lsl #16     ; p[5|3]
3551b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r8, r8, r10, lsl #16    ; p[6|4]
3561b362b15af34006e6a11974088a46d42b903418eJohann
3571b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r4,  c00010001
3581b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r12, c00020002
3591b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr,  c00FF00FF
3601b362b15af34006e6a11974088a46d42b903418eJohann
3611b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r6, lsl #1      ; [p3+2*p4      |      p1+2*p2]
3621b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r7              ; [p3+2*p4+p5   |   p1+2*p2+p3]
3631b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r5, r5, r12             ; [p3+2*p4+p5+2 | p1+2*p2+p3+2]
3641b362b15af34006e6a11974088a46d42b903418eJohann
3651b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r7, lsl #1      ; [p4+2*p5      |      p2+2*p3]
3661b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r8              ; [p4+2*p5+p6   |   p2+2*p3+p4]
3671b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r6, r6, r12             ; [p4+2*p5+p6+2 | p2+2*p3+p4+2]
3681b362b15af34006e6a11974088a46d42b903418eJohann
3691b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r11, r8, r9             ; [p6+p7        |        p4+p5]
3701b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r11, r11, r4            ; [(p6+p7+1)>>1 | (p4+p5+1)>>1]
3711b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [F|E]
3721b362b15af34006e6a11974088a46d42b903418eJohann
3731b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r8, lsl #1      ; [p5+2*p6      |      p3+2*p4]
3741b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r9              ; [p5+2*p6+p7   |   p3+2*p4+p5]
3751b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r7, r7, r12             ; [p5+2*p6+p7+2 | p3+2*p4+p5+2]
3761b362b15af34006e6a11974088a46d42b903418eJohann
3771b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r2, r9, r10             ; [p7+p8        |        p5+p6]
3781b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r2, r2, r4              ; [(p7+p8+1)>>1 | (p5+p6+1)>>1]
3791b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [J|I]
3801b362b15af34006e6a11974088a46d42b903418eJohann
3811b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r9, lsl #1      ; [p6+2*p7      |      p4+2*p5]
3821b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r10             ; [p6+2*p7+p8   |   p4+2*p5+p6]
3831b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r8, r8, r12             ; [p6+2*p7+p8+2 | p4+2*p5+p6+2]
3841b362b15af34006e6a11974088a46d42b903418eJohann
3851b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
3861b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
3871b362b15af34006e6a11974088a46d42b903418eJohann
3881b362b15af34006e6a11974088a46d42b903418eJohann    ; scale down
3891b362b15af34006e6a11974088a46d42b903418eJohann    and         r5, lr, r5, asr #2      ; [B|A]
3901b362b15af34006e6a11974088a46d42b903418eJohann    and         r6, lr, r6, asr #2      ; [D|C]
3911b362b15af34006e6a11974088a46d42b903418eJohann    and         r7, lr, r7, asr #2      ; [H|G]
3921b362b15af34006e6a11974088a46d42b903418eJohann    and         r8, lr, r8, asr #2      ; [L|K]
3931b362b15af34006e6a11974088a46d42b903418eJohann
3941b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r11, r2, lsl #8    ; [J|F|I|E]
3951b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
3961b362b15af34006e6a11974088a46d42b903418eJohann
3971b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r7, r8, lsl #8     ; [L|H|K|G]
3981b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
3991b362b15af34006e6a11974088a46d42b903418eJohann
4001b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r2, r6, r2, lsl #16     ; [-|I|-|C]
4011b362b15af34006e6a11974088a46d42b903418eJohann    add         r2, r2, r11, lsl #8     ; [F|I|E|C]
4021b362b15af34006e6a11974088a46d42b903418eJohann
4031b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r12, r6, r5             ; [-|D|-|A]
4041b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r10, r7, r5, asr #16    ; [-|H|-|B]
4051b362b15af34006e6a11974088a46d42b903418eJohann    str         r2, [r3], r0
4061b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r12, r10, lsl #8   ; [H|D|B|A]
4071b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3]
4081b362b15af34006e6a11974088a46d42b903418eJohann
4091b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
4101b362b15af34006e6a11974088a46d42b903418eJohann
4111b362b15af34006e6a11974088a46d42b903418eJohannb_vl_pred
4121b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r4, [r0]                ; [3|2|1|0] = Above[0-3]
4131b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r12, c00020002
4141b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r5, [r0, #4]            ; [7|6|5|4] = Above[4-7]
4151b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr,  c00FF00FF
4161b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r2,  c00010001
4171b362b15af34006e6a11974088a46d42b903418eJohann
4181b362b15af34006e6a11974088a46d42b903418eJohann    mov         r0, r4, lsr #16         ; [-|-|3|2]
4191b362b15af34006e6a11974088a46d42b903418eJohann    add         r0, r0, r5, lsl #16     ; [5|4|3|2]
4201b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r6, r4                  ; [2|0]
4211b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r7, r4, ror #8          ; [3|1]
4221b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r8, r0                  ; [4|2]
4231b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r9, r0, ror #8          ; [5|3]
4241b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r10, r5                 ; [6|4]
4251b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r11, r5, ror #8         ; [7|5]
4261b362b15af34006e6a11974088a46d42b903418eJohann
4271b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r4, r6, r7              ; [p2+p3        |        p0+p1]
4281b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r4, r4, r2              ; [(p2+p3+1)>>1 | (p0+p1+1)>>1]
4291b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [B|A]
4301b362b15af34006e6a11974088a46d42b903418eJohann
4311b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r6, r7, lsl #1      ; [p2+2*p3      |      p0+2*p1]
4321b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r8              ; [p2+2*p3+p4   |   p0+2*p1+p2]
4331b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r5, r5, r12             ; [p2+2*p3+p4+2 | p0+2*p1+p2+2]
4341b362b15af34006e6a11974088a46d42b903418eJohann
4351b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r6, r7, r8              ; [p3+p4        |        p1+p2]
4361b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r6, r6, r2              ; [(p3+p4+1)>>1 | (p1+p2+1)>>1]
4371b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [F|E]
4381b362b15af34006e6a11974088a46d42b903418eJohann
4391b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r8, lsl #1      ; [p3+2*p4      |      p1+2*p2]
4401b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r9              ; [p3+2*p4+p5   |   p1+2*p2+p3]
4411b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r7, r7, r12             ; [p3+2*p4+p5+2 | p1+2*p2+p3+2]
4421b362b15af34006e6a11974088a46d42b903418eJohann
4431b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r9, lsl #1      ; [p4+2*p5      |      p2+2*p3]
4441b362b15af34006e6a11974088a46d42b903418eJohann    add         r8, r8, r10             ; [p4+2*p5+p6   |   p2+2*p3+p4]
4451b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r8, r8, r12             ; [p4+2*p5+p6+2 | p2+2*p3+p4+2]
4461b362b15af34006e6a11974088a46d42b903418eJohann
4471b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r10, lsl #1     ; [p5+2*p6      |      p3+2*p4]
4481b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r9, r11             ; [p5+2*p6+p7   |   p3+2*p4+p5]
4491b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r9, r9, r12             ; [p5+2*p6+p7+2 | p3+2*p4+p5+2]
4501b362b15af34006e6a11974088a46d42b903418eJohann
4511b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r0, [sp, #44]           ; dst_stride
4521b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
4531b362b15af34006e6a11974088a46d42b903418eJohann
4541b362b15af34006e6a11974088a46d42b903418eJohann    ; scale down
4551b362b15af34006e6a11974088a46d42b903418eJohann    and         r5, lr, r5, asr #2      ; [D|C]
4561b362b15af34006e6a11974088a46d42b903418eJohann    and         r7, lr, r7, asr #2      ; [H|G]
4571b362b15af34006e6a11974088a46d42b903418eJohann    and         r8, lr, r8, asr #2      ; [I|D]
4581b362b15af34006e6a11974088a46d42b903418eJohann    and         r9, lr, r9, asr #2      ; [J|H]
4591b362b15af34006e6a11974088a46d42b903418eJohann
4601b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r4, r6, lsl #8     ; [F|B|E|A]
4611b362b15af34006e6a11974088a46d42b903418eJohann    str         r10, [r3], r0
4621b362b15af34006e6a11974088a46d42b903418eJohann
4631b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r7, lsl #8      ; [H|C|G|D]
4641b362b15af34006e6a11974088a46d42b903418eJohann    str         r5, [r3], r0
4651b362b15af34006e6a11974088a46d42b903418eJohann
4661b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r12, r8, r4, asr #16    ; [-|I|-|B]
4671b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r10, r9, r8             ; [-|J|-|D]
4681b362b15af34006e6a11974088a46d42b903418eJohann
4691b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r6, r12, lsl #8    ; [I|F|B|E]
4701b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], r0
4711b362b15af34006e6a11974088a46d42b903418eJohann
4721b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r7, r10, lsl #8    ; [J|H|D|G]
4731b362b15af34006e6a11974088a46d42b903418eJohann    str         r10, [r3]
4741b362b15af34006e6a11974088a46d42b903418eJohann
4751b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
4761b362b15af34006e6a11974088a46d42b903418eJohann
4771b362b15af34006e6a11974088a46d42b903418eJohannb_hd_pred
4781b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1], r2            ; l[0] = pp[3]
4791b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr, [r0]                ; Above = pp[8|7|6|5]
4801b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r8, [sp, #48]           ; tl   = pp[4]
4811b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2            ; l[1] = pp[2]
4821b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2            ; l[2] = pp[1]
4831b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1]                ; l[3] = pp[0]
4841b362b15af34006e6a11974088a46d42b903418eJohann
4851b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r9, lr                  ; p[7|5]
4861b362b15af34006e6a11974088a46d42b903418eJohann    uxtb16      r10, lr, ror #8         ; p[8|6]
4871b362b15af34006e6a11974088a46d42b903418eJohann
4881b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r5, lsl #16     ; p[1|0]
4891b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r6, lsl #16     ; p[2|1]
4901b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r7, lsl #16     ; p[3|2]
4911b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r8, lsl #16     ; p[4|3]
4921b362b15af34006e6a11974088a46d42b903418eJohann
4931b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r12, c00020002
4941b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr,  c00FF00FF
4951b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r2,  c00010001
4961b362b15af34006e6a11974088a46d42b903418eJohann
4971b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r8, r7, r9              ; p[4|5]
4981b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r1, r9, r10             ; p[7|6]
4991b362b15af34006e6a11974088a46d42b903418eJohann    pkhbt       r10, r8, r10, lsl #16   ; p[6|5]
5001b362b15af34006e6a11974088a46d42b903418eJohann
5011b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r11, r4, r5             ; [p1+p2        |        p0+p1]
5021b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r11, r11, r2            ; [(p1+p2+1)>>1 | (p0+p1+1)>>1]
5031b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [B|A]
5041b362b15af34006e6a11974088a46d42b903418eJohann
5051b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r5, lsl #1      ; [p1+2*p2      |      p0+2*p1]
5061b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r6              ; [p1+2*p2+p3   |   p0+2*p1+p2]
5071b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r4, r4, r12             ; [p1+2*p2+p3+2 | p0+2*p1+p2+2]
5081b362b15af34006e6a11974088a46d42b903418eJohann
5091b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r0, r6, r7              ; [p3+p4        |        p2+p3]
5101b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r0, r0, r2              ; [(p3+p4+1)>>1 | (p2+p3+1)>>1]
5111b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [F|E]
5121b362b15af34006e6a11974088a46d42b903418eJohann
5131b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r6, r7, lsl #1      ; [p3+2*p4      |      p2+2*p3]
5141b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r8, ror #16     ; [p3+2*p4+p5   |   p2+2*p3+p4]
5151b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r5, r5, r12             ; [p3+2*p4+p5+2 | p2+2*p3+p4+2]
5161b362b15af34006e6a11974088a46d42b903418eJohann
5171b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r12, r8, ror #16    ; [p5+2         |         p4+2]
5181b362b15af34006e6a11974088a46d42b903418eJohann    add         r6, r6, r10, lsl #1     ; [p5+2+2*p6    |    p4+2+2*p5]
5191b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r6, r6, r1              ; [p5+2+2*p6+p7 | p4+2+2*p5+p6]
5201b362b15af34006e6a11974088a46d42b903418eJohann
5211b362b15af34006e6a11974088a46d42b903418eJohann    ; scale down
5221b362b15af34006e6a11974088a46d42b903418eJohann    and         r4, lr, r4, asr #2      ; [D|C]
5231b362b15af34006e6a11974088a46d42b903418eJohann    and         r5, lr, r5, asr #2      ; [H|G]
5241b362b15af34006e6a11974088a46d42b903418eJohann    and         r6, lr, r6, asr #2      ; [J|I]
5251b362b15af34006e6a11974088a46d42b903418eJohann
5261b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr, [sp, #44]           ; dst_stride
5271b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
5281b362b15af34006e6a11974088a46d42b903418eJohann
5291b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r2, r0, r6              ; [-|F|-|I]
5301b362b15af34006e6a11974088a46d42b903418eJohann    pkhtb       r12, r6, r5, asr #16    ; [-|J|-|H]
5311b362b15af34006e6a11974088a46d42b903418eJohann    add         r12, r12, r2, lsl #8    ; [F|J|I|H]
5321b362b15af34006e6a11974088a46d42b903418eJohann    add         r2, r0, r5, lsl #8      ; [H|F|G|E]
5331b362b15af34006e6a11974088a46d42b903418eJohann    mov         r12, r12, ror #24       ; [J|I|H|F]
5341b362b15af34006e6a11974088a46d42b903418eJohann    str         r12, [r3], lr
5351b362b15af34006e6a11974088a46d42b903418eJohann
5361b362b15af34006e6a11974088a46d42b903418eJohann    mov         r7, r11, asr #16        ; [-|-|-|B]
5371b362b15af34006e6a11974088a46d42b903418eJohann    str         r2, [r3], lr
5381b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r0, lsl #16     ; [-|E|-|B]
5391b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r4, asr #8      ; [-|E|D|B]
5401b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r7, r5, lsl #24     ; [G|E|D|B]
5411b362b15af34006e6a11974088a46d42b903418eJohann    str         r7, [r3], lr
5421b362b15af34006e6a11974088a46d42b903418eJohann
5431b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r11, r4, lsl #8     ; [D|B|C|A]
5441b362b15af34006e6a11974088a46d42b903418eJohann    str         r5, [r3]
5451b362b15af34006e6a11974088a46d42b903418eJohann
5461b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
5471b362b15af34006e6a11974088a46d42b903418eJohann
5481b362b15af34006e6a11974088a46d42b903418eJohann
5491b362b15af34006e6a11974088a46d42b903418eJohann
5501b362b15af34006e6a11974088a46d42b903418eJohannb_hu_pred
5511b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r4, [r1], r2            ; Left[0]
5521b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r12, c00020002
5531b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r5, [r1], r2            ; Left[1]
5541b362b15af34006e6a11974088a46d42b903418eJohann    ldr         lr,  c00FF00FF
5551b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r6, [r1], r2            ; Left[2]
5561b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r2,  c00010001
5571b362b15af34006e6a11974088a46d42b903418eJohann    ldrb        r7, [r1]                ; Left[3]
5581b362b15af34006e6a11974088a46d42b903418eJohann
5591b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r5, lsl #16     ; [1|0]
5601b362b15af34006e6a11974088a46d42b903418eJohann    add         r5, r5, r6, lsl #16     ; [2|1]
5611b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r6, r7, lsl #16     ; [3|2]
5621b362b15af34006e6a11974088a46d42b903418eJohann
5631b362b15af34006e6a11974088a46d42b903418eJohann    uadd16      r8, r4, r5              ; [p1+p2        |        p0+p1]
5641b362b15af34006e6a11974088a46d42b903418eJohann    uhadd16     r8, r8, r2              ; [(p1+p2+1)>>1 | (p0+p1+1)>>1]
5651b362b15af34006e6a11974088a46d42b903418eJohann                                        ; [B|A]
5661b362b15af34006e6a11974088a46d42b903418eJohann
5671b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r5, lsl #1      ; [p1+2*p2      |      p0+2*p1]
5681b362b15af34006e6a11974088a46d42b903418eJohann    add         r4, r4, r9              ; [p1+2*p2+p3   |   p0+2*p1+p2]
5691b362b15af34006e6a11974088a46d42b903418eJohann    uxtab16     r4, r4, r12             ; [p1+2*p2+p3+2 | p0+2*p1+p2+2]
5701b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r2, [sp, #44]           ; dst_stride
5711b362b15af34006e6a11974088a46d42b903418eJohann    ldr         r3, [sp, #40]           ; dst
5721b362b15af34006e6a11974088a46d42b903418eJohann    and         r4, lr, r4, asr #2      ; [D|C]
5731b362b15af34006e6a11974088a46d42b903418eJohann
5741b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r6, r7             ; [p2+p3]
5751b362b15af34006e6a11974088a46d42b903418eJohann    add         r11, r10, r7, lsl #1    ; [p2+3*p3]
5761b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r10, #1
5771b362b15af34006e6a11974088a46d42b903418eJohann    add         r11, r11, #2
5781b362b15af34006e6a11974088a46d42b903418eJohann    mov         r10, r10, asr #1        ; [E]
5791b362b15af34006e6a11974088a46d42b903418eJohann    mov         r11, r11, asr #2        ; [F]
5801b362b15af34006e6a11974088a46d42b903418eJohann
5811b362b15af34006e6a11974088a46d42b903418eJohann    add         r9, r7, r9, asr #8      ; [-|-|G|G]
5821b362b15af34006e6a11974088a46d42b903418eJohann    add         r0, r8, r4, lsl #8      ; [D|B|C|A]
5831b362b15af34006e6a11974088a46d42b903418eJohann    add         r7, r9, r9, lsl #16     ; [G|G|G|G]
5841b362b15af34006e6a11974088a46d42b903418eJohann
5851b362b15af34006e6a11974088a46d42b903418eJohann    str         r0, [r3], r2
5861b362b15af34006e6a11974088a46d42b903418eJohann
5871b362b15af34006e6a11974088a46d42b903418eJohann    mov         r1, r8, asr #16         ; [-|-|-|B]
5881b362b15af34006e6a11974088a46d42b903418eJohann    add         r1, r1, r4, asr #8      ; [-|-|D|B]
5891b362b15af34006e6a11974088a46d42b903418eJohann    add         r1, r1, r10, lsl #16    ; [-|E|D|B]
5901b362b15af34006e6a11974088a46d42b903418eJohann    add         r1, r1, r11, lsl #24    ; [F|E|D|B]
5911b362b15af34006e6a11974088a46d42b903418eJohann    str         r1, [r3], r2
5921b362b15af34006e6a11974088a46d42b903418eJohann
5931b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r11, lsl #8        ; [-|-|F|E]
5941b362b15af34006e6a11974088a46d42b903418eJohann    add         r10, r10, r9, lsl #16   ; [G|G|F|E]
5951b362b15af34006e6a11974088a46d42b903418eJohann    str         r10, [r3], r2
5961b362b15af34006e6a11974088a46d42b903418eJohann
5971b362b15af34006e6a11974088a46d42b903418eJohann    str         r7, [r3]
5981b362b15af34006e6a11974088a46d42b903418eJohann
5991b362b15af34006e6a11974088a46d42b903418eJohann    pop        {r4-r12, pc}
6001b362b15af34006e6a11974088a46d42b903418eJohann
6011b362b15af34006e6a11974088a46d42b903418eJohann    ENDP
6021b362b15af34006e6a11974088a46d42b903418eJohann
6031b362b15af34006e6a11974088a46d42b903418eJohann; constants
6041b362b15af34006e6a11974088a46d42b903418eJohannc00010001
6051b362b15af34006e6a11974088a46d42b903418eJohann    DCD         0x00010001
6061b362b15af34006e6a11974088a46d42b903418eJohannc00020002
6071b362b15af34006e6a11974088a46d42b903418eJohann    DCD         0x00020002
6081b362b15af34006e6a11974088a46d42b903418eJohannc00FF00FF
6091b362b15af34006e6a11974088a46d42b903418eJohann    DCD         0x00FF00FF
6101b362b15af34006e6a11974088a46d42b903418eJohann
6111b362b15af34006e6a11974088a46d42b903418eJohann    END
612