1233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Copyright (c) 2010 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_build_intra_predictors_mby_neon_func|
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPORT  |vp8_build_intra_predictors_mby_s_neon_func|
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ARM
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan    REQUIRE8
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PRESERVE8
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan    AREA ||.text||, CODE, READONLY, ALIGN=2
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r0    unsigned char *y_buffer
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r1    unsigned char *ypred_ptr
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r2    int y_stride
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r3    int mode
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan; stack int Up
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan; stack int Left
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan|vp8_build_intra_predictors_mby_neon_func| PROC
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    push            {r4-r8, lr}
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #0
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_dc_pred
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #1
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_v_pred
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #2
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_h_pred
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #3
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_tm_pred
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan
39233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_dc_pred
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr             r4, [sp, #24]       ; Up
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr             r5, [sp, #28]       ; Left
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Default the DC average to 128
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r12, #128
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r12
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Zero out running sum
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r12, #0
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; compute shift and jump
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan    adds            r7, r4, r5
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             skip_dc_pred_up_left
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load above row, if it exists
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r4, #0
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             skip_dc_pred_up
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r6, r0, r2
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vld1.8          {q1}, [r6]
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpaddl.u8       q2, q1
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpaddl.u16      q3, q2
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpaddl.u32      q4, q3
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmov.32         r4, d8[0]
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmov.32         r6, d9[0]
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r4, r6
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Move back to interger registers
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan
71233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_dc_pred_up
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r5, #0
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             skip_dc_pred_left
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r0, r0, #1
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load left row, if it exists
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0]
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
119233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_dc_pred_left
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r7, r7, #3          ; Shift
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r4, r7, #1
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r5, #1
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5, lsl r4
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r5, r12, lsr r7     ; expected_dc
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r5
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
128233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_dc_pred_up_left
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
147233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_v_pred
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Copy down above row
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r6, r0, r2
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vld1.8          {q0}, [r6]
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan
170233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_h_pred
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load 4x yleft_col
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r0, r0, #1
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1]!
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1]!
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1]!
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1]!
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1]!
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1]!
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1]!
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1]!
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1]!
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1]!
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1]!
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1]!
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan
229233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_tm_pred
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load yabove_row
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r3, r0, r2
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vld1.8          {q8}, [r3]
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load ytop_left
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r3, r3, #1
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r7, [r3]
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q7, r7
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Compute yabove_row - ytop_left
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r3, #1
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmull.u8        q4, d16, d0
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmull.u8        q5, d17, d0
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsub.s16        q4, q4, q7
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsub.s16        q5, q5, q7
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load 4x yleft_col
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r0, r0, #1
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r12, #4
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan
254233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_tm_pred_loop
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q0, r3
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q1, r4
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q2, r5
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q3, r6
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q8, q0, q4
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q9, q0, q5
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q10, q1, q4
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q11, q1, q5
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q12, q2, q4
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q13, q2, q5
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q14, q3, q4
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q15, q3, q5
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d0, q8, #0
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d1, q9, #0
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d2, q10, #0
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d3, q11, #0
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d4, q12, #0
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d5, q13, #0
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d6, q14, #0
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d7, q15, #0
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1]!
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1]!
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1]!
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1]!
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs            r12, r12, #1
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne             case_tm_pred_loop
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
297233d2500723e5594f3e7c70896ffeeef32b9c950ywan
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ENDP
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
301233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r0    unsigned char *y_buffer
302233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r1    unsigned char *ypred_ptr
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r2    int y_stride
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r3    int mode
305233d2500723e5594f3e7c70896ffeeef32b9c950ywan; stack int Up
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan; stack int Left
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan|vp8_build_intra_predictors_mby_s_neon_func| PROC
309233d2500723e5594f3e7c70896ffeeef32b9c950ywan    push            {r4-r8, lr}
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan
311233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r1, r0      ;   unsigned char *ypred_ptr = x->dst.y_buffer; //x->Predictor;
312233d2500723e5594f3e7c70896ffeeef32b9c950ywan
313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #0
314233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_dc_pred_s
315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #1
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_v_pred_s
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #2
318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_h_pred_s
319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r3, #3
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             case_tm_pred_s
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan
322233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_dc_pred_s
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr             r4, [sp, #24]       ; Up
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr             r5, [sp, #28]       ; Left
325233d2500723e5594f3e7c70896ffeeef32b9c950ywan
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Default the DC average to 128
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r12, #128
328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r12
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Zero out running sum
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r12, #0
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; compute shift and jump
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    adds            r7, r4, r5
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             skip_dc_pred_up_left_s
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load above row, if it exists
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r4, #0
339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             skip_dc_pred_up_s
340233d2500723e5594f3e7c70896ffeeef32b9c950ywan
341233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r6, r0, r2
342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vld1.8          {q1}, [r6]
343233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpaddl.u8       q2, q1
344233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpaddl.u16      q3, q2
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpaddl.u32      q4, q3
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmov.32         r4, d8[0]
348233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmov.32         r6, d9[0]
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r4, r6
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan
352233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Move back to interger registers
353233d2500723e5594f3e7c70896ffeeef32b9c950ywan
354233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_dc_pred_up_s
355233d2500723e5594f3e7c70896ffeeef32b9c950ywan
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp             r5, #0
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq             skip_dc_pred_left_s
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r0, r0, #1
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load left row, if it exists
362233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
364233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
376233d2500723e5594f3e7c70896ffeeef32b9c950ywan
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
383233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
384233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
385233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0]
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r3
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r4
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5
400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r6
401233d2500723e5594f3e7c70896ffeeef32b9c950ywan
402233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_dc_pred_left_s
403233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r7, r7, #3          ; Shift
404233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r4, r7, #1
405233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r5, #1
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add             r12, r12, r5, lsl r4
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r5, r12, lsr r7     ; expected_dc
408233d2500723e5594f3e7c70896ffeeef32b9c950ywan
409233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r5
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan
411233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_dc_pred_up_left_s
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
415233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
416233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
417233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
425233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
427233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
430233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_v_pred_s
431233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Copy down above row
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r6, r0, r2
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vld1.8          {q0}, [r6]
434233d2500723e5594f3e7c70896ffeeef32b9c950ywan
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
437233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
438233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
439233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
443233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
445233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
447233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
449233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
451233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan
453233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_h_pred_s
454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load 4x yleft_col
455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r0, r0, #1
456233d2500723e5594f3e7c70896ffeeef32b9c950ywan
457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
459233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
461233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
462233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
463233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
466233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1], r2
467233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1], r2
468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1], r2
469233d2500723e5594f3e7c70896ffeeef32b9c950ywan
470233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
472233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
473233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
474233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
475233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
476233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
479233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1], r2
480233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1], r2
481233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1], r2
482233d2500723e5594f3e7c70896ffeeef32b9c950ywan
483233d2500723e5594f3e7c70896ffeeef32b9c950ywan
484233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
485233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
487233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
488233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
489233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
490233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
491233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
492233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
493233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1], r2
494233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1], r2
495233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1], r2
496233d2500723e5594f3e7c70896ffeeef32b9c950ywan
497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
498233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
499233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
500233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q1, r4
503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q2, r5
504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q3, r6
505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
506233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1], r2
507233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1], r2
508233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1], r2
509233d2500723e5594f3e7c70896ffeeef32b9c950ywan
510233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
511233d2500723e5594f3e7c70896ffeeef32b9c950ywan
512233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_tm_pred_s
513233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load yabove_row
514233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r3, r0, r2
515233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vld1.8          {q8}, [r3]
516233d2500723e5594f3e7c70896ffeeef32b9c950ywan
517233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load ytop_left
518233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r3, r3, #1
519233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r7, [r3]
520233d2500723e5594f3e7c70896ffeeef32b9c950ywan
521233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q7, r7
522233d2500723e5594f3e7c70896ffeeef32b9c950ywan
523233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Compute yabove_row - ytop_left
524233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r3, #1
525233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u8         q0, r3
526233d2500723e5594f3e7c70896ffeeef32b9c950ywan
527233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmull.u8        q4, d16, d0
528233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmull.u8        q5, d17, d0
529233d2500723e5594f3e7c70896ffeeef32b9c950ywan
530233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsub.s16        q4, q4, q7
531233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsub.s16        q5, q5, q7
532233d2500723e5594f3e7c70896ffeeef32b9c950ywan
533233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Load 4x yleft_col
534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub             r0, r0, #1
535233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov             r12, #4
536233d2500723e5594f3e7c70896ffeeef32b9c950ywan
537233d2500723e5594f3e7c70896ffeeef32b9c950ywancase_tm_pred_loop_s
538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r3, [r0], r2
539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r4, [r0], r2
540233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r5, [r0], r2
541233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb            r6, [r0], r2
542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q0, r3
543233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q1, r4
544233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q2, r5
545233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vdup.u16        q3, r6
546233d2500723e5594f3e7c70896ffeeef32b9c950ywan
547233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q8, q0, q4
548233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q9, q0, q5
549233d2500723e5594f3e7c70896ffeeef32b9c950ywan
550233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q10, q1, q4
551233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q11, q1, q5
552233d2500723e5594f3e7c70896ffeeef32b9c950ywan
553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q12, q2, q4
554233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q13, q2, q5
555233d2500723e5594f3e7c70896ffeeef32b9c950ywan
556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q14, q3, q4
557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqadd.s16       q15, q3, q5
558233d2500723e5594f3e7c70896ffeeef32b9c950ywan
559233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d0, q8, #0
560233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d1, q9, #0
561233d2500723e5594f3e7c70896ffeeef32b9c950ywan
562233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d2, q10, #0
563233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d3, q11, #0
564233d2500723e5594f3e7c70896ffeeef32b9c950ywan
565233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d4, q12, #0
566233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d5, q13, #0
567233d2500723e5594f3e7c70896ffeeef32b9c950ywan
568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d6, q14, #0
569233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vqshrun.s16     d7, q15, #0
570233d2500723e5594f3e7c70896ffeeef32b9c950ywan
571233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q0}, [r1], r2
572233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q1}, [r1], r2
573233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q2}, [r1], r2
574233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vst1.u8         {q3}, [r1], r2
575233d2500723e5594f3e7c70896ffeeef32b9c950ywan
576233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs            r12, r12, #1
577233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne             case_tm_pred_loop_s
578233d2500723e5594f3e7c70896ffeeef32b9c950ywan
579233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop             {r4-r8,pc}
580233d2500723e5594f3e7c70896ffeeef32b9c950ywan
581233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ENDP
582233d2500723e5594f3e7c70896ffeeef32b9c950ywan
583233d2500723e5594f3e7c70896ffeeef32b9c950ywan
584233d2500723e5594f3e7c70896ffeeef32b9c950ywan    END
585