1233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Copyright (c) 2011 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPORT  |vp8_mse16x16_armv6|
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ARM
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan    AREA ||.text||, CODE, READONLY, ALIGN=2
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r0    unsigned char *src_ptr
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r1    int source_stride
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r2    unsigned char *ref_ptr
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r3    int  recon_stride
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan; stack unsigned int *sse
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan;note: Based on vp8_variance16x16_armv6. In this function, sum is never used.
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan;      So, we can remove this part of calculation.
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan|vp8_mse16x16_armv6| PROC
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan    push    {r4-r9, lr}
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pld     [r0, r1, lsl #0]
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pld     [r2, r3, lsl #0]
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r12, #16            ; set loop counter to 16 (=block height)
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r4, #0              ; initialize sse = 0
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan
37233d2500723e5594f3e7c70896ffeeef32b9c950ywanloop
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; 1st 4 pixels
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r5, [r0, #0x0]      ; load 4 src pixels
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [r2, #0x0]      ; load 4 ref pixels
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     lr, #0              ; constant zero
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r8, r5, r6          ; calculate difference
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pld     [r0, r1, lsl #1]
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r7, r8, lr          ; select bytes with positive difference
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r9, r6, r5          ; calculate difference with reversed operands
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pld     [r2, r3, lsl #1]
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r8, r9, lr          ; select bytes with negative difference
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate partial sums
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r5, r7, lr          ; calculate sum of positive differences
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r6, r8, lr          ; calculate sum of negative differences
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    orr     r8, r8, r7          ; differences of all 4 pixels
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r5, [r0, #0x4]      ; load 4 src pixels
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate sse
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r6, r8              ; byte (two pixels) to halfwords
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r7, r8, ror #8      ; another two pixels to halfwords
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r6, r6, r4      ; dual signed multiply, add and accumulate (1)
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; 2nd 4 pixels
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [r2, #0x4]      ; load 4 ref pixels
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r7, r7, r4      ; dual signed multiply, add and accumulate (2)
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r8, r5, r6          ; calculate difference
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r7, r8, lr          ; select bytes with positive difference
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r9, r6, r5          ; calculate difference with reversed operands
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r8, r9, lr          ; select bytes with negative difference
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate partial sums
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r5, r7, lr          ; calculate sum of positive differences
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r6, r8, lr          ; calculate sum of negative differences
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan    orr     r8, r8, r7          ; differences of all 4 pixels
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r5, [r0, #0x8]      ; load 4 src pixels
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate sse
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r6, r8              ; byte (two pixels) to halfwords
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r7, r8, ror #8      ; another two pixels to halfwords
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r6, r6, r4      ; dual signed multiply, add and accumulate (1)
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; 3rd 4 pixels
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [r2, #0x8]      ; load 4 ref pixels
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r7, r7, r4      ; dual signed multiply, add and accumulate (2)
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r8, r5, r6          ; calculate difference
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r7, r8, lr          ; select bytes with positive difference
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r9, r6, r5          ; calculate difference with reversed operands
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r8, r9, lr          ; select bytes with negative difference
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate partial sums
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r5, r7, lr          ; calculate sum of positive differences
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r6, r8, lr          ; calculate sum of negative differences
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    orr     r8, r8, r7          ; differences of all 4 pixels
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r5, [r0, #0xc]      ; load 4 src pixels
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate sse
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r6, r8              ; byte (two pixels) to halfwords
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r7, r8, ror #8      ; another two pixels to halfwords
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r6, r6, r4      ; dual signed multiply, add and accumulate (1)
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; 4th 4 pixels
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [r2, #0xc]      ; load 4 ref pixels
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r7, r7, r4      ; dual signed multiply, add and accumulate (2)
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r8, r5, r6          ; calculate difference
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r0, r0, r1          ; set src_ptr to next row
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r7, r8, lr          ; select bytes with positive difference
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usub8   r9, r6, r5          ; calculate difference with reversed operands
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r2, r2, r3          ; set dst_ptr to next row
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sel     r8, r9, lr          ; select bytes with negative difference
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate partial sums
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r5, r7, lr          ; calculate sum of positive differences
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    usad8   r6, r8, lr          ; calculate sum of negative differences
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    orr     r8, r8, r7          ; differences of all 4 pixels
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs    r12, r12, #1        ; next row
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; calculate sse
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r6, r8              ; byte (two pixels) to halfwords
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uxtb16  r7, r8, ror #8      ; another two pixels to halfwords
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r6, r6, r4      ; dual signed multiply, add and accumulate (1)
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    smlad   r4, r7, r7, r4      ; dual signed multiply, add and accumulate (2)
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne     loop
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; return stuff
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r1, [sp, #28]       ; get address of sse
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r0, r4              ; return sse
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r4, [r1]            ; store sse
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop     {r4-r9, pc}
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ENDP
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    END
139