Merge "Remove a second check for invalid ptr in vp8_get_compressed_data"
[libvpx.git] / vpx_scale / arm / armv4 / gen_scalers_armv4.asm
blobe495184e7b249e86b60305984091a4833d1c788d
2 ; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 ; Use of this source code is governed by a BSD-style license
5 ; that can be found in the LICENSE file in the root of the source
6 ; tree. An additional intellectual property rights grant can be found
7 ; in the file PATENTS. All contributing project authors may
8 ; be found in the AUTHORS file in the root of the source tree.
12 EXPORT |horizontal_line_4_5_scale_armv4|
13 EXPORT |vertical_band_4_5_scale_armv4|
14 EXPORT |horizontal_line_2_3_scale_armv4|
15 EXPORT |vertical_band_2_3_scale_armv4|
16 EXPORT |horizontal_line_3_5_scale_armv4|
17 EXPORT |vertical_band_3_5_scale_armv4|
18 EXPORT |horizontal_line_3_4_scale_armv4|
19 EXPORT |vertical_band_3_4_scale_armv4|
20 EXPORT |horizontal_line_1_2_scale_armv4|
21 EXPORT |vertical_band_1_2_scale_armv4|
23 AREA |.text|, CODE, READONLY ; name this block of code
25 src RN r0
26 srcw RN r1
27 dest RN r2
28 mask RN r12
29 c51_205 RN r10
30 c102_154 RN r11
31 ;/****************************************************************************
32 ; *
33 ; * ROUTINE : horizontal_line_4_5_scale_armv4
34 ; *
35 ; * INPUTS : const unsigned char *source : Pointer to source data.
36 ; * unsigned int source_width : Stride of source.
37 ; * unsigned char *dest : Pointer to destination data.
38 ; * unsigned int dest_width : Stride of destination (NOT USED).
39 ; *
40 ; * OUTPUTS : None.
41 ; *
42 ; * RETURNS : void
43 ; *
44 ; * FUNCTION : Copies horizontal line of pixels from source to
45 ; * destination scaling up by 4 to 5.
46 ; *
47 ; * SPECIAL NOTES : None.
48 ; *
49 ; ****************************************************************************/
50 ;void horizontal_line_4_5_scale_armv4
52 ; r0 = UINT8 *source
53 ; r1 = UINT32 source_width
54 ; r2 = UINT8 *dest
55 ; r3 = UINT32 dest_width
57 |horizontal_line_4_5_scale_armv4| PROC
58 stmdb sp!, {r4 - r11, lr}
60 mov mask, #255 ; mask for selection
61 ldr c51_205, =0x3300cd
62 ldr c102_154, =0x66009a
64 ldr r3, [src], #4
66 hl45_loop
68 and r4, r3, mask ; a = src[0]
69 and r5, mask, r3, lsr #8 ; b = src[1]
70 strb r4, [dest], #1
72 orr r6, r4, r5, lsl #16 ; b | a
73 and r7, mask, r3, lsr #16 ; c = src[2]
74 mul r6, c51_205, r6 ; a * 51 + 205 * b
76 orr r5, r5, r7, lsl #16 ; c | b
77 mul r5, c102_154, r5 ; b * 102 + 154 * c
78 add r6, r6, #0x8000
79 and r8, mask, r3, lsr #24 ; d = src[3]
80 mov r6, r6, lsr #24
81 strb r6, [dest], #1
83 orr r7, r8, r7, lsl #16 ; c | d
84 mul r7, c102_154, r7 ; c * 154 + 102 * d
85 add r5, r5, #0x8000
86 ldr r3, [src], #4
87 mov r5, r5, lsr #24
88 strb r5, [dest], #1
90 add r7, r7, #0x8000
91 and r9, mask, r3 ; e = src[4]
92 orr r9, r9, r8, lsl #16 ; d | e
93 mul r9, c51_205, r9 ; d * 205 + 51 * e
94 mov r7, r7, lsr #24
95 strb r7, [dest], #1
97 add r9, r9, #0x8000
98 subs srcw, srcw, #4
99 mov r9, r9, lsr #24
100 strb r9, [dest], #1
102 bne hl45_loop
104 and r4, r3, mask
105 and r5, mask, r3, lsl #8
106 strb r4, [dest], #1
108 orr r6, r4, r5, lsl #16 ; b | a
109 mul r6, c51_205, r6
111 and r7, mask, r3, lsl #16
112 orr r5, r5, r7, lsl #16 ; c | b
113 mul r5, c102_154, r5
114 add r6, r6, #0x8000
115 and r8, mask, r3, lsl #24
116 mov r6, r6, lsr #24
117 strb r6, [dest], #1
119 orr r7, r8, r7, lsl #16 ; c | d
120 mul r7, c102_154, r7
121 add r5, r5, #0x8000
122 mov r5, r5, lsr #24
123 strb r5, [dest], #1
125 add r7, r7, #0x8000
126 mov r7, r7, lsr #24
127 strb r7, [dest], #1
129 ldrb r3, [src]
130 strb r3, [dest], #1
132 ldmia sp!, {r4 - r11, pc}
133 ENDP ;|vp8cx_horizontal_line_4_5_scale_c|
135 ;/****************************************************************************
137 ; * ROUTINE : vertical_band_4_5_scale_armv4
139 ; * INPUTS : unsigned char *dest : Pointer to destination data.
140 ; * unsigned int dest_pitch : Stride of destination data.
141 ; * unsigned int dest_width : Width of destination data.
143 ; * OUTPUTS : None.
145 ; * RETURNS : void
147 ; * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The
148 ; * height of the band scaled is 4-pixels.
150 ; * SPECIAL NOTES : The routine uses the first line of the band below
151 ; * the current band.
153 ; ****************************************************************************/
154 ;void vertical_band_4_5_scale_armv4
156 ; r0 = UINT8 *dest
157 ; r1 = UINT32 dest_pitch
158 ; r2 = UINT32 dest_width
160 |vertical_band_4_5_scale_armv4| PROC
161 stmdb sp!, {r4 - r11, lr}
163 ldr c51_205, =0x3300cd
164 ldr c102_154, =0x66009a
166 vl45_loop
167 mov r3, src
168 ldrb r4, [r3], r1 ; a = des [0]
169 ldrb r5, [r3], r1 ; b = des [dest_pitch]
170 ldrb r7, [r3], r1 ; c = des[dest_pitch*2]
171 add lr, src, r1
173 orr r6, r4, r5, lsl #16 ; b | a
174 mul r6, c51_205, r6 ; a * 51 + 205 * b
176 ldrb r8, [r3], r1 ; d = des[dest_pitch*3]
177 orr r5, r5, r7, lsl #16 ; c | b
178 mul r5, c102_154, r5 ; b * 102 + 154 * c
179 add r6, r6, #0x8000
180 orr r7, r8, r7, lsl #16 ; c | d
181 mov r6, r6, lsr #24
182 strb r6, [lr], r1
184 ldrb r9, [r3, r1] ; e = des [dest_pitch * 5]
185 mul r7, c102_154, r7 ; c * 154 + 102 * d
186 add r5, r5, #0x8000
187 orr r9, r9, r8, lsl #16 ; d | e
188 mov r5, r5, lsr #24
189 strb r5, [lr], r1
191 mul r9, c51_205, r9 ; d * 205 + 51 * e
192 add r7, r7, #0x8000
193 add src, src, #1
194 mov r7, r7, lsr #24
195 strb r7, [lr], r1
197 add r9, r9, #0x8000
198 subs r2, r2, #1
199 mov r9, r9, lsr #24
200 strb r9, [lr], r1
202 bne vl45_loop
204 ldmia sp!, {r4 - r11, pc}
205 ENDP ;|vertical_band_4_5_scale_armv4|
207 ;/****************************************************************************
209 ; * ROUTINE : horizontal_line_2_3_scale_armv4
211 ; * INPUTS : const unsigned char *source : Pointer to source data.
212 ; * unsigned int source_width : Stride of source.
213 ; * unsigned char *dest : Pointer to destination data.
214 ; * unsigned int dest_width : Stride of destination (NOT USED).
216 ; * OUTPUTS : None.
218 ; * RETURNS : void
220 ; * FUNCTION : Copies horizontal line of pixels from source to
221 ; * destination scaling up by 2 to 3.
223 ; * SPECIAL NOTES : None.
226 ; ****************************************************************************/
227 ;void horizontal_line_2_3_scale_armv4
229 ; const unsigned char *source,
230 ; unsigned int source_width,
231 ; unsigned char *dest,
232 ; unsigned int dest_width
234 |horizontal_line_2_3_scale_armv4| PROC
235 stmdb sp!, {r4 - r11, lr}
236 ldr lr, =85
237 ldr r12, =171
239 hl23_loop
241 ldrb r3, [src], #1 ; a
242 ldrb r4, [src], #1 ; b
243 ldrb r5, [src] ; c
245 strb r3, [dest], #1
246 mul r4, r12, r4 ; b * 171
247 mla r6, lr, r3, r4 ; a * 85
248 mla r7, lr, r5, r4 ; c * 85
250 add r6, r6, #128
251 mov r6, r6, lsr #8
252 strb r6, [dest], #1
254 add r7, r7, #128
255 mov r7, r7, lsr #8
256 strb r7, [dest], #1
258 subs srcw, srcw, #2
259 bne hl23_loop
261 ldrb r4, [src, #1] ; b
262 strb r5, [dest], #1
263 strb r4, [dest, #1]
265 mul r4, r12, r4 ; b * 171
266 mla r6, lr, r5, r4 ; a * 85 + b *171
268 add r6, r6, #128
269 mov r6, r6, lsr #8
270 strb r6, [dest]
272 ldmia sp!, {r4 - r11, pc}
273 ENDP ;|horizontal_line_2_3_scale_armv4|
275 ;/****************************************************************************
277 ; * ROUTINE : vertical_band_2_3_scale_armv4
279 ; * INPUTS : unsigned char *dest : Pointer to destination data.
280 ; * unsigned int dest_pitch : Stride of destination data.
281 ; * unsigned int dest_width : Width of destination data.
283 ; * OUTPUTS : None.
285 ; * RETURNS : void
287 ; * FUNCTION : Scales vertical band of pixels by scale 2 to 3. The
288 ; * height of the band scaled is 2-pixels.
290 ; * SPECIAL NOTES : The routine uses the first line of the band below
291 ; * the current band.
293 ; ****************************************************************************/
294 ;void vertical_band_2_3_scale_armv4
296 ; r0 = UINT8 *dest
297 ; r1 = UINT32 dest_pitch
298 ; r2 = UINT32 dest_width
300 |vertical_band_2_3_scale_armv4| PROC
301 stmdb sp!, {r4 - r8, lr}
302 ldr lr, =85
303 ldr r12, =171
304 add r3, r1, r1, lsl #1 ; 3 * dest_pitch
306 vl23_loop
307 ldrb r4, [src] ; a = des [0]
308 ldrb r5, [src, r1] ; b = des [dest_pitch]
309 ldrb r7, [src, r3] ; c = des [dest_pitch*3]
310 subs r2, r2, #1
312 mul r5, r12, r5 ; b * 171
313 mla r6, lr, r4, r5 ; a * 85
314 mla r8, lr, r7, r5 ; c * 85
316 add r6, r6, #128
317 mov r6, r6, lsr #8
318 strb r6, [src, r1]
320 add r8, r8, #128
321 mov r8, r8, lsr #8
322 strb r8, [src, r1, lsl #1]
324 add src, src, #1
326 bne vl23_loop
328 ldmia sp!, {r4 - r8, pc}
329 ENDP ;|vertical_band_2_3_scale_armv4|
331 ;/****************************************************************************
333 ; * ROUTINE : vp8cx_horizontal_line_3_5_scale_c
335 ; * INPUTS : const unsigned char *source : Pointer to source data.
336 ; * unsigned int source_width : Stride of source.
337 ; * unsigned char *dest : Pointer to destination data.
338 ; * unsigned int dest_width : Stride of destination (NOT USED).
340 ; * OUTPUTS : None.
342 ; * RETURNS : void
344 ; * FUNCTION : Copies horizontal line of pixels from source to
345 ; * destination scaling up by 3 to 5.
347 ; * SPECIAL NOTES : None.
350 ; ****************************************************************************/
351 ;void vp8cx_horizontal_line_3_5_scale_c
353 ; const unsigned char *source,
354 ; unsigned int source_width,
355 ; unsigned char *dest,
356 ; unsigned int dest_width
358 |horizontal_line_3_5_scale_armv4| PROC
359 stmdb sp!, {r4 - r11, lr}
361 ldr c51_205, =0x3300cd
362 ldr c102_154, =0x66009a
364 ldrb r4, [src], #1 ; a = src[0]
366 hl35_loop
368 ldrb r8, [src], #1 ; b = src[1]
369 strb r4, [dest], #1
371 orr r6, r4, r8, lsl #16 ; b | a
372 ldrb r9, [src], #1 ; c = src[2]
373 mul r6, c102_154, r6 ; a * 102 + 154 * b
375 orr r5, r9, r8, lsl #16 ; b | c
376 mul r5, c51_205, r5 ; b * 205 + 51 * c
377 add r6, r6, #0x8000
378 ldrb r4, [src], #1 ; d = src[3]
379 mov r6, r6, lsr #24
380 strb r6, [dest], #1
382 orr r7, r8, r9, lsl #16 ; c | b
383 mul r7, c51_205, r7 ; c * 205 + 154 * b
384 add r5, r5, #0x8000
385 mov r5, r5, lsr #24
386 strb r5, [dest], #1
388 orr r9, r4, r9, lsl #16 ; c | d
389 mul r9, c102_154, r9 ; c * 154 + 102 * d
390 add r7, r7, #0x8000
391 mov r7, r7, lsr #24
392 strb r7, [dest], #1
394 add r9, r9, #0x8000
395 subs srcw, srcw, #3
396 mov r9, r9, lsr #24
397 strb r9, [dest], #1
399 bpl hl35_loop
401 ldrb r5, [src], #1 ; b = src[1]
402 strb r4, [dest], #1
404 orr r6, r4, r8, lsl #16 ; b | a
405 ldrb r9, [src], #1 ; c = src[2]
406 mul r6, c102_154, r6 ; a * 102 + 154 * b
408 orr r5, r9, r8, lsl #16 ; b | c
409 mul r5, c51_205, r5 ; b * 205 + 51 * c
410 add r6, r6, #0x8000
411 mov r6, r6, lsr #24
412 strb r6, [dest], #1
414 orr r7, r8, r9, lsl #16 ; c | b
415 mul r7, c51_205, r7 ; c * 205 + 154 * b
416 add r5, r5, #0x8000
417 mov r5, r5, lsr #24
418 strb r5, [dest], #1
420 add r7, r7, #0x8000
421 mov r7, r7, lsr #24
422 strb r7, [dest], #1
423 strb r9, [dest], #1
425 ldmia sp!, {r4 - r11, pc}
426 ENDP ;|vp8cx_horizontal_line_3_5_scale_c|
429 ;/****************************************************************************
431 ; * ROUTINE : vp8cx_vertical_band_3_5_scale_c
433 ; * INPUTS : unsigned char *dest : Pointer to destination data.
434 ; * unsigned int dest_pitch : Stride of destination data.
435 ; * unsigned int dest_width : Width of destination data.
437 ; * OUTPUTS : None.
439 ; * RETURNS : void
441 ; * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The
442 ; * height of the band scaled is 3-pixels.
444 ; * SPECIAL NOTES : The routine uses the first line of the band below
445 ; * the current band.
447 ; ****************************************************************************/
448 ;void vertical_band_4_5_scale_armv4
450 ; r0 = UINT8 *dest
451 ; r1 = UINT32 dest_pitch
452 ; r2 = UINT32 dest_width
454 |vertical_band_3_5_scale_armv4| PROC
455 stmdb sp!, {r4 - r11, lr}
457 ldr c51_205, =0x3300cd
458 ldr c102_154, =0x66009a
460 vl35_loop
461 mov r3, src
462 ldrb r4, [r3], r1 ; a = des [0]
463 ldrb r5, [r3], r1 ; b = des [dest_pitch]
464 ldrb r7, [r3], r1 ; c = des[dest_pitch*2]
465 add lr, src, r1
467 orr r8, r4, r5, lsl #16 ; b | a
468 mul r6, c102_154, r8 ; a * 102 + 154 * b
470 ldrb r8, [r3, r1, lsl #1] ; d = des[dest_pitch*5]
471 orr r3, r7, r5, lsl #16 ; b | c
472 mul r9, c51_205, r3 ; b * 205 + 51 * c
473 add r6, r6, #0x8000
474 orr r3, r5, r7, lsl #16 ; c | b
475 mov r6, r6, lsr #24
476 strb r6, [lr], r1
478 mul r5, c51_205, r3 ; c * 205 + 154 * b
479 add r9, r9, #0x8000
480 orr r3, r8, r7, lsl #16 ; c | d
481 mov r9, r9, lsr #24
482 strb r9, [lr], r1
484 mul r7, c102_154, r3 ; c * 154 + 102 * d
485 add r5, r5, #0x8000
486 add src, src, #1
487 mov r5, r5, lsr #24
488 strb r5, [lr], r1
490 add r7, r7, #0x8000
491 subs r2, r2, #1
492 mov r7, r7, lsr #24
493 strb r7, [lr], r1
496 bne vl35_loop
498 ldmia sp!, {r4 - r11, pc}
499 ENDP ;|vertical_band_3_5_scale_armv4|
501 ;/****************************************************************************
503 ; * ROUTINE : horizontal_line_3_4_scale_armv4
505 ; * INPUTS : const unsigned char *source : Pointer to source data.
506 ; * unsigned int source_width : Stride of source.
507 ; * unsigned char *dest : Pointer to destination data.
508 ; * unsigned int dest_width : Stride of destination (NOT USED).
510 ; * OUTPUTS : None.
512 ; * RETURNS : void
514 ; * FUNCTION : Copies horizontal line of pixels from source to
515 ; * destination scaling up by 3 to 4.
517 ; * SPECIAL NOTES : None.
520 ; ****************************************************************************/
521 ;void horizontal_line_3_4_scale_armv4
523 ; const unsigned char *source,
524 ; unsigned int source_width,
525 ; unsigned char *dest,
526 ; unsigned int dest_width
528 |horizontal_line_3_4_scale_armv4| PROC
529 stmdb sp!, {r4 - r11, lr}
531 ldr r10, =64
532 ldr r11, =192
533 mov r9, #128
535 ldrb r4, [src], #1 ; a = src[0]
537 hl34_loop
539 ldrb r8, [src], #1 ; b = src[1]
540 ldrb r7, [src], #1 ; c = src[2]
541 strb r4, [dest], #1
543 mla r4, r10, r4, r9 ; a*64 + 128
544 mla r4, r11, r8, r4 ; a*64 + b*192 + 1
546 add r8, r8, #1 ; b + 1
547 add r8, r8, r7 ; b + c + 1
548 mov r8, r8, asr #1 ; (b + c + 1) >> 1
550 mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8
551 strb r4, [dest], #1
553 strb r8, [dest], #1
555 ldrb r4, [src], #1 ; [a+1]
557 mla r7, r11, r7, r9 ; c*192 + 128
558 mla r7, r4, r10, r7 ; a*64 + b*192 + 128
560 subs srcw, srcw, #3
562 mov r7, r7, asr #8 ; (a*64 + b*192 + 128) >> 8
563 strb r7, [dest], #1
565 bpl hl34_loop
567 ldrb r8, [src], #1 ; b = src[1]
568 ldrb r7, [src], #1 ; c = src[2]
569 strb r4, [dest], #1
571 mla r4, r10, r4, r9 ; a*64 + 128
572 mla r4, r11, r8, r4 ; a*64 + b*192 + 1
573 mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8
574 strb r4, [dest], #1
576 add r8, r8, #1 ; b + 1
577 add r8, r8, r7 ; b + c + 1
578 mov r8, r8, asr #1 ; (b + c + 1) >> 1
579 strb r8, [dest], #1
580 strb r7, [dest], #1
582 ldmia sp!, {r4 - r11, pc}
583 ENDP ;|vp8cx_horizontal_line_3_4_scale_c|
586 ;/****************************************************************************
588 ; * ROUTINE : vertical_band_3_4_scale_armv4
590 ; * INPUTS : unsigned char *dest : Pointer to destination data.
591 ; * unsigned int dest_pitch : Stride of destination data.
592 ; * unsigned int dest_width : Width of destination data.
594 ; * OUTPUTS : None.
596 ; * RETURNS : void
598 ; * FUNCTION : Scales vertical band of pixels by scale 3 to 4. The
599 ; * height of the band scaled is 3-pixels.
601 ; * SPECIAL NOTES : The routine uses the first line of the band below
602 ; * the current band.
604 ; ****************************************************************************/
605 ;void vertical_band_3_4_scale_armv4
607 ; r0 = UINT8 *dest
608 ; r1 = UINT32 dest_pitch
609 ; r2 = UINT32 dest_width
611 |vertical_band_3_4_scale_armv4| PROC
612 stmdb sp!, {r4 - r11, lr}
614 ldr r10, =64
615 ldr r11, =192
616 mov r9, #128
618 ; ldr r1,[r1]
619 vl34_loop
620 mov r3, src
621 ldrb r4, [r3], r1 ; a = des [0]
622 ldrb r5, [r3], r1 ; b = des [dest_pitch]
623 ldrb r7, [r3], r1 ; c = des [dest_pitch*2]
624 add lr, src, r1
626 mla r4, r10, r4, r9 ; a*64 + 128
627 mla r4, r11, r5, r4 ; a*64 + b*192 + 1
629 add r5, r5, #1 ; b + 1
630 add r5, r5, r7 ; b + c + 1
631 mov r5, r5, asr #1 ; (b + c + 1) >> 1
633 mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8
634 strb r4, [lr], r1
636 ldrb r4, [r3, r1] ; a = des [dest_pitch*4]
638 strb r5, [lr], r1
640 mla r7, r11, r7, r9 ; c*192 + 128
641 mla r7, r4, r10, r7 ; a*64 + b*192 + 128
642 mov r7, r7, asr #8 ; (a*64 + b*192 + 128) >> 8
644 add src, src, #1
645 subs r2, r2, #1
647 strb r7, [lr]
649 bne vl34_loop
651 ldmia sp!, {r4 - r11, pc}
652 ENDP ;|vertical_band_3_4_scale_armv4|
654 ;/****************************************************************************
656 ; * ROUTINE : vp8cx_horizontal_line_1_2_scale_c
658 ; * INPUTS : const unsigned char *source : Pointer to source data.
659 ; * unsigned int source_width : Stride of source.
660 ; * unsigned char *dest : Pointer to destination data.
661 ; * unsigned int dest_width : Stride of destination (NOT USED).
663 ; * OUTPUTS : None.
665 ; * RETURNS : void
667 ; * FUNCTION : Copies horizontal line of pixels from source to
668 ; * destination scaling up by 1 to 2.
670 ; * SPECIAL NOTES : None.
672 ; ****************************************************************************/
673 ;void vp8cx_horizontal_line_1_2_scale_c
675 ; const unsigned char *source,
676 ; unsigned int source_width,
677 ; unsigned char *dest,
678 ; unsigned int dest_width
680 |horizontal_line_1_2_scale_armv4| PROC
681 stmdb sp!, {r4 - r5, lr}
683 sub srcw, srcw, #1
685 ldrb r3, [src], #1
686 ldrb r4, [src], #1
687 hl12_loop
688 subs srcw, srcw, #1
690 add r5, r3, r4
691 add r5, r5, #1
692 mov r5, r5, lsr #1
694 orr r5, r3, r5, lsl #8
695 strh r5, [dest], #2
697 mov r3, r4
699 ldrneb r4, [src], #1
700 bne hl12_loop
702 orr r5, r4, r4, lsl #8
703 strh r5, [dest]
705 ldmia sp!, {r4 - r5, pc}
706 ENDP ;|vertical_band_3_5_scale_armv4|
708 ;/****************************************************************************
710 ; * ROUTINE : vp8cx_vertical_band_1_2_scale_c
712 ; * INPUTS : unsigned char *dest : Pointer to destination data.
713 ; * unsigned int dest_pitch : Stride of destination data.
714 ; * unsigned int dest_width : Width of destination data.
716 ; * OUTPUTS : None.
718 ; * RETURNS : void
720 ; * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The
721 ; * height of the band scaled is 1-pixel.
723 ; * SPECIAL NOTES : The routine uses the first line of the band below
724 ; * the current band.
726 ; ****************************************************************************/
727 ;void vp8cx_vertical_band_1_2_scale_c
729 ; r0 = UINT8 *dest
730 ; r1 = UINT32 dest_pitch
731 ; r2 = UINT32 dest_width
733 |vertical_band_1_2_scale_armv4| PROC
734 stmdb sp!, {r4 - r7, lr}
736 ldr mask, =0xff00ff ; mask for selection
737 ldr lr, = 0x010001
739 vl12_loop
740 mov r3, src
741 ldr r4, [r3], r1
742 ldr r5, [r3, r1]
744 add src, src, #4
745 subs r2, r2, #4
747 and r6, r4, mask
748 and r7, r5, mask
750 add r6, r7, r6
751 add r6, r6, lr
753 and r4, mask, r4, lsr #8
754 and r5, mask, r5, lsr #8
756 mov r6, r6, lsr #1
757 and r6, r6, mask
759 add r4, r5, r4
760 add r4, r4, lr
762 mov r4, r4, lsr #1
763 and r4, r4, mask
765 orr r5, r6, r4, lsl #8
767 str r5, [r3]
769 bpl vl12_loop
771 ldmia sp!, {r4 - r7, pc}
772 ENDP ;|vertical_band_3_5_scale_armv4|