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
31 ;/****************************************************************************
33 ; * ROUTINE : horizontal_line_4_5_scale_armv4
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).
44 ; * FUNCTION : Copies horizontal line of pixels from source to
45 ; * destination scaling up by 4 to 5.
47 ; * SPECIAL NOTES : None.
49 ; ****************************************************************************/
50 ;void horizontal_line_4_5_scale_armv4
53 ; r1 = UINT32 source_width
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
68 and r4
, r3
, mask ; a = src[0]
69 and r5
, mask, r3
, lsr #
8 ; b = src[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
79 and r8
, mask, r3
, lsr #
24 ; d = src[3]
83 orr r7
, r8
, r7
, lsl #
16 ; c | d
84 mul r7
, c102_154
, r7
; c * 154 + 102 * d
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
105 and r5
, mask, r3
, lsl #
8
108 orr r6
, r4
, r5
, lsl #
16 ; b | a
111 and r7
, mask, r3
, lsl #
16
112 orr r5
, r5
, r7
, lsl #
16 ; c | b
115 and r8
, mask, r3
, lsl #
24
119 orr r7
, r8
, r7
, lsl #
16 ; c | d
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.
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
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
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]
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
180 orr r7
, r8
, r7
, lsl #
16 ; c | d
184 ldrb r9
, [r3
, r1
] ; e = des [dest_pitch * 5]
185 mul r7
, c102_154
, r7
; c * 154 + 102 * d
187 orr r9
, r9
, r8
, lsl #
16 ; d | e
191 mul r9
, c51_205
, r9
; d * 205 + 51 * e
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).
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}
241 ldrb r3
, [src
], #
1 ; a
242 ldrb r4
, [src
], #
1 ; b
246 mul r4
, r12
, r4
; b * 171
247 mla r6
, lr
, r3
, r4
; a * 85
248 mla r7
, lr
, r5
, r4
; c * 85
261 ldrb r4
, [src
, #
1] ; b
265 mul r4
, r12
, r4
; b * 171
266 mla r6
, lr
, r5
, r4
; a * 85 + b *171
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.
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
297 ; r1 = UINT32 dest_pitch
298 ; r2 = UINT32 dest_width
300 |vertical_band_2_3_scale_armv4|
PROC
301 stmdb
sp!, {r4 - r8, lr}
304 add r3
, r1
, r1
, lsl #
1 ; 3 * dest_pitch
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]
312 mul r5
, r12
, r5
; b * 171
313 mla r6
, lr
, r4
, r5
; a * 85
314 mla r8
, lr
, r7
, r5
; c * 85
322 strb r8
, [src
, r1
, lsl #
1]
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).
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]
368 ldrb r8
, [src
], #
1 ; b = src[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
378 ldrb r4
, [src
], #
1 ; d = src[3]
382 orr r7
, r8
, r9
, lsl #
16 ; c | b
383 mul r7
, c51_205
, r7
; c * 205 + 154 * b
388 orr r9
, r4
, r9
, lsl #
16 ; c | d
389 mul r9
, c102_154
, r9
; c * 154 + 102 * d
401 ldrb r5
, [src
], #
1 ; b = src[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
414 orr r7
, r8
, r9
, lsl #
16 ; c | b
415 mul r7
, c51_205
, r7
; c * 205 + 154 * b
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.
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
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
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]
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
474 orr r3
, r5
, r7
, lsl #
16 ; c | b
478 mul r5
, c51_205
, r3
; c * 205 + 154 * b
480 orr r3
, r8
, r7
, lsl #
16 ; c | d
484 mul r7
, c102_154
, r3
; c * 154 + 102 * d
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).
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}
535 ldrb r4
, [src
], #
1 ; a = src[0]
539 ldrb r8
, [src
], #
1 ; b = src[1]
540 ldrb r7
, [src
], #
1 ; c = src[2]
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
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
562 mov r7
, r7
, asr #
8 ; (a*64 + b*192 + 128) >> 8
567 ldrb r8
, [src
], #
1 ; b = src[1]
568 ldrb r7
, [src
], #
1 ; c = src[2]
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
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
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.
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
608 ; r1 = UINT32 dest_pitch
609 ; r2 = UINT32 dest_width
611 |vertical_band_3_4_scale_armv4|
PROC
612 stmdb
sp!, {r4 - r11, lr}
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]
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
636 ldrb r4
, [r3
, r1
] ; a = des [dest_pitch*4]
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
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).
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}
694 orr r5
, r3
, r5
, lsl #
8
702 orr r5
, r4
, r4
, lsl #
8
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.
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
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
753 and r4
, mask, r4
, lsr #
8
754 and r5
, mask, r5
, lsr #
8
765 orr r5
, r6
, r4
, lsl #
8
771 ldmia
sp!, {r4 - r7, pc}
772 ENDP ;|vertical_band_3_5_scale_armv4|