Home | History | Annotate | Download | only in symbian
      1 ;
      2 ;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3 ;
      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.
      9 ;
     10 
     11 
     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|
     22 
     23     AREA    |.text|, CODE, READONLY  ; name this block of code
     24 
     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
     51 ;(
     52 ;   r0 = UINT8 *source
     53 ;   r1 = UINT32 source_width
     54 ;   r2 = UINT8 *dest
     55 ;   r3 = UINT32 dest_width
     56 ;)
     57 |horizontal_line_4_5_scale_armv4| PROC
     58     stmdb   sp!, {r4 - r11, lr}
     59 
     60     mov     mask, #255              ; mask for selection
     61     ldr     c51_205, =0x3300cd
     62     ldr     c102_154, =0x66009a
     63 
     64     ldr     r3, [src], #4
     65 
     66 hl45_loop
     67 
     68     and     r4, r3, mask            ; a = src[0]
     69     and     r5, mask, r3, lsr #8    ; b = src[1]
     70     strb    r4, [dest], #1
     71 
     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
     75 
     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
     82 
     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
     89 
     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
     96 
     97     add     r9, r9, #0x8000
     98     subs    srcw, srcw, #4
     99     mov     r9, r9, lsr #24
    100     strb    r9, [dest], #1
    101 
    102     bne     hl45_loop
    103 
    104     and     r4, r3, mask
    105     and     r5, mask, r3, lsl #8
    106     strb    r4, [dest], #1
    107 
    108     orr     r6, r4, r5, lsl #16     ; b | a
    109     mul     r6, c51_205, r6
    110 
    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
    118 
    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
    124 
    125     add     r7, r7, #0x8000
    126     mov     r7, r7, lsr #24
    127     strb    r7, [dest], #1
    128 
    129     ldrb    r3, [src]
    130     strb    r3, [dest], #1
    131 
    132     ldmia   sp!, {r4 - r11, pc}
    133     ENDP    ;|vp8cx_horizontal_line_4_5_scale_c|
    134 
    135 ;/****************************************************************************
    136 ; *
    137 ; *  ROUTINE       : vertical_band_4_5_scale_armv4
    138 ; *
    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.
    142 ; *
    143 ; *  OUTPUTS       : None.
    144 ; *
    145 ; *  RETURNS       : void
    146 ; *
    147 ; *  FUNCTION      : Scales vertical band of pixels by scale 4 to 5. The
    148 ; *                  height of the band scaled is 4-pixels.
    149 ; *
    150 ; *  SPECIAL NOTES : The routine uses the first line of the band below
    151 ; *                  the current band.
    152 ; *
    153 ; ****************************************************************************/
    154 ;void vertical_band_4_5_scale_armv4
    155 ;(
    156 ;   r0 = UINT8 *dest
    157 ;   r1 = UINT32 dest_pitch
    158 ;   r2 = UINT32 dest_width
    159 ;)
    160 |vertical_band_4_5_scale_armv4| PROC
    161     stmdb   sp!, {r4 - r11, lr}
    162 
    163     ldr     c51_205, =0x3300cd
    164     ldr     c102_154, =0x66009a
    165 
    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
    172 
    173     orr     r6, r4, r5, lsl #16     ; b | a
    174     mul     r6, c51_205, r6         ; a * 51 + 205 * b
    175 
    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
    183 
    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
    190 
    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
    196 
    197     add     r9, r9, #0x8000
    198     subs    r2, r2, #1
    199     mov     r9, r9, lsr #24
    200     strb    r9, [lr], r1
    201 
    202     bne     vl45_loop
    203 
    204     ldmia   sp!, {r4 - r11, pc}
    205     ENDP    ;|vertical_band_4_5_scale_armv4|
    206 
    207 ;/****************************************************************************
    208 ; *
    209 ; *  ROUTINE       : horizontal_line_2_3_scale_armv4
    210 ; *
    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).
    215 ; *
    216 ; *  OUTPUTS       : None.
    217 ; *
    218 ; *  RETURNS       : void
    219 ; *
    220 ; *  FUNCTION      : Copies horizontal line of pixels from source to
    221 ; *                  destination scaling up by 2 to 3.
    222 ; *
    223 ; *  SPECIAL NOTES : None.
    224 ; *
    225 ; *
    226 ; ****************************************************************************/
    227 ;void horizontal_line_2_3_scale_armv4
    228 ;(
    229 ;   const unsigned char *source,
    230 ;   unsigned int source_width,
    231 ;   unsigned char *dest,
    232 ;   unsigned int dest_width
    233 ;)
    234 |horizontal_line_2_3_scale_armv4| PROC
    235     stmdb   sp!, {r4 - r11, lr}
    236     ldr     lr,  =85
    237     ldr     r12, =171
    238 
    239 hl23_loop
    240 
    241     ldrb    r3, [src], #1           ; a
    242     ldrb    r4, [src], #1           ; b
    243     ldrb    r5, [src]               ; c
    244 
    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
    249 
    250     add     r6, r6, #128
    251     mov     r6, r6, lsr #8
    252     strb    r6, [dest], #1
    253 
    254     add     r7, r7, #128
    255     mov     r7, r7, lsr #8
    256     strb    r7, [dest], #1
    257 
    258     subs    srcw, srcw, #2
    259     bne     hl23_loop
    260 
    261     ldrb    r4, [src, #1]           ; b
    262     strb    r5, [dest], #1
    263     strb    r4, [dest, #1]
    264 
    265     mul     r4, r12, r4             ; b * 171
    266     mla     r6, lr, r5, r4          ; a * 85 + b *171
    267 
    268     add     r6, r6, #128
    269     mov     r6, r6, lsr #8
    270     strb    r6, [dest]
    271 
    272     ldmia   sp!, {r4 - r11, pc}
    273     ENDP    ;|horizontal_line_2_3_scale_armv4|
    274 
    275 ;/****************************************************************************
    276 ; *
    277 ; *  ROUTINE       : vertical_band_2_3_scale_armv4
    278 ; *
    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.
    282 ; *
    283 ; *  OUTPUTS       : None.
    284 ; *
    285 ; *  RETURNS       : void
    286 ; *
    287 ; *  FUNCTION      : Scales vertical band of pixels by scale 2 to 3. The
    288 ; *                  height of the band scaled is 2-pixels.
    289 ; *
    290 ; *  SPECIAL NOTES : The routine uses the first line of the band below
    291 ; *                  the current band.
    292 ; *
    293 ; ****************************************************************************/
    294 ;void vertical_band_2_3_scale_armv4
    295 ;(
    296 ;   r0 = UINT8 *dest
    297 ;   r1 = UINT32 dest_pitch
    298 ;   r2 = UINT32 dest_width
    299 ;)
    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
    305 
    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
    311 
    312     mul     r5, r12, r5             ; b * 171
    313     mla     r6, lr, r4, r5          ; a * 85
    314     mla     r8, lr, r7, r5          ; c * 85
    315 
    316     add     r6, r6, #128
    317     mov     r6, r6, lsr #8
    318     strb    r6, [src, r1]
    319 
    320     add     r8, r8, #128
    321     mov     r8, r8, lsr #8
    322     strb    r8, [src, r1, lsl #1]
    323 
    324     add     src, src, #1
    325 
    326     bne     vl23_loop
    327 
    328     ldmia   sp!, {r4 - r8, pc}
    329     ENDP    ;|vertical_band_2_3_scale_armv4|
    330 
    331 ;/****************************************************************************
    332 ; *
    333 ; *  ROUTINE       : vp8cx_horizontal_line_3_5_scale_c
    334 ; *
    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).
    339 ; *
    340 ; *  OUTPUTS       : None.
    341 ; *
    342 ; *  RETURNS       : void
    343 ; *
    344 ; *  FUNCTION      : Copies horizontal line of pixels from source to
    345 ; *                  destination scaling up by 3 to 5.
    346 ; *
    347 ; *  SPECIAL NOTES : None.
    348 ; *
    349 ; *
    350 ; ****************************************************************************/
    351 ;void vp8cx_horizontal_line_3_5_scale_c
    352 ;(
    353 ;   const unsigned char *source,
    354 ;   unsigned int source_width,
    355 ;   unsigned char *dest,
    356 ;   unsigned int dest_width
    357 ;)
    358 |horizontal_line_3_5_scale_armv4| PROC
    359     stmdb   sp!, {r4 - r11, lr}
    360 
    361     ldr     c51_205, =0x3300cd
    362     ldr     c102_154, =0x66009a
    363 
    364     ldrb    r4, [src], #1           ; a = src[0]
    365 
    366 hl35_loop
    367 
    368     ldrb    r8, [src], #1           ; b = src[1]
    369     strb    r4, [dest], #1
    370 
    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
    374 
    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
    381 
    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
    387 
    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
    393 
    394     add     r9, r9, #0x8000
    395     subs    srcw, srcw, #3
    396     mov     r9, r9, lsr #24
    397     strb    r9, [dest], #1
    398 
    399     bpl     hl35_loop
    400 
    401     ldrb    r5, [src], #1           ; b = src[1]
    402     strb    r4, [dest], #1
    403 
    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
    407 
    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
    413 
    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
    419 
    420     add     r7, r7, #0x8000
    421     mov     r7, r7, lsr #24
    422     strb    r7, [dest], #1
    423     strb    r9, [dest], #1
    424 
    425     ldmia   sp!, {r4 - r11, pc}
    426     ENDP    ;|vp8cx_horizontal_line_3_5_scale_c|
    427 
    428 
    429 ;/****************************************************************************
    430 ; *
    431 ; *  ROUTINE       : vp8cx_vertical_band_3_5_scale_c
    432 ; *
    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.
    436 ; *
    437 ; *  OUTPUTS       : None.
    438 ; *
    439 ; *  RETURNS       : void
    440 ; *
    441 ; *  FUNCTION      : Scales vertical band of pixels by scale 3 to 5. The
    442 ; *                  height of the band scaled is 3-pixels.
    443 ; *
    444 ; *  SPECIAL NOTES : The routine uses the first line of the band below
    445 ; *                  the current band.
    446 ; *
    447 ; ****************************************************************************/
    448 ;void vertical_band_4_5_scale_armv4
    449 ;(
    450 ;   r0 = UINT8 *dest
    451 ;   r1 = UINT32 dest_pitch
    452 ;   r2 = UINT32 dest_width
    453 ;)
    454 |vertical_band_3_5_scale_armv4| PROC
    455     stmdb   sp!, {r4 - r11, lr}
    456 
    457     ldr     c51_205, =0x3300cd
    458     ldr     c102_154, =0x66009a
    459 
    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
    466 
    467     orr     r8, r4, r5, lsl #16     ; b | a
    468     mul     r6, c102_154, r8        ; a * 102 + 154 * b
    469 
    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
    477 
    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
    483 
    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
    489 
    490     add     r7, r7, #0x8000
    491     subs    r2, r2, #1
    492     mov     r7, r7, lsr #24
    493     strb    r7, [lr], r1
    494 
    495 
    496     bne     vl35_loop
    497 
    498     ldmia   sp!, {r4 - r11, pc}
    499     ENDP    ;|vertical_band_3_5_scale_armv4|
    500 
    501 ;/****************************************************************************
    502 ; *
    503 ; *  ROUTINE       : horizontal_line_3_4_scale_armv4
    504 ; *
    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).
    509 ; *
    510 ; *  OUTPUTS       : None.
    511 ; *
    512 ; *  RETURNS       : void
    513 ; *
    514 ; *  FUNCTION      : Copies horizontal line of pixels from source to
    515 ; *                  destination scaling up by 3 to 4.
    516 ; *
    517 ; *  SPECIAL NOTES : None.
    518 ; *
    519 ; *
    520 ; ****************************************************************************/
    521 ;void horizontal_line_3_4_scale_armv4
    522 ;(
    523 ;   const unsigned char *source,
    524 ;   unsigned int source_width,
    525 ;   unsigned char *dest,
    526 ;   unsigned int dest_width
    527 ;)
    528 |horizontal_line_3_4_scale_armv4| PROC
    529     stmdb   sp!, {r4 - r11, lr}
    530 
    531     ldr     r10, =64
    532     ldr     r11, =192
    533     mov     r9, #128
    534 
    535     ldrb    r4, [src], #1           ; a = src[0]
    536 
    537 hl34_loop
    538 
    539     ldrb    r8, [src], #1           ; b = src[1]
    540     ldrb    r7, [src], #1           ; c = src[2]
    541     strb    r4, [dest], #1
    542 
    543     mla     r4, r10, r4, r9         ; a*64 + 128
    544     mla     r4, r11, r8, r4         ; a*64 + b*192 + 1
    545 
    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
    549 
    550     mov     r4, r4, asr #8          ; (a*64 + b*192 + 1) >> 8
    551     strb    r4, [dest], #1
    552 
    553     strb    r8, [dest], #1
    554 
    555     ldrb    r4, [src], #1           ; [a+1]
    556 
    557     mla     r7, r11, r7, r9         ; c*192 + 128
    558     mla     r7, r4, r10, r7         ; a*64 + b*192 + 128
    559 
    560     subs    srcw, srcw, #3
    561 
    562     mov     r7, r7, asr #8          ; (a*64 + b*192 + 128) >> 8
    563     strb    r7, [dest], #1
    564 
    565     bpl     hl34_loop
    566 
    567     ldrb    r8, [src], #1           ; b = src[1]
    568     ldrb    r7, [src], #1           ; c = src[2]
    569     strb    r4, [dest], #1
    570 
    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
    575 
    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
    581 
    582     ldmia   sp!, {r4 - r11, pc}
    583     ENDP    ;|vp8cx_horizontal_line_3_4_scale_c|
    584 
    585 
    586 ;/****************************************************************************
    587 ; *
    588 ; *  ROUTINE       : vertical_band_3_4_scale_armv4
    589 ; *
    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.
    593 ; *
    594 ; *  OUTPUTS       : None.
    595 ; *
    596 ; *  RETURNS       : void
    597 ; *
    598 ; *  FUNCTION      : Scales vertical band of pixels by scale 3 to 4. The
    599 ; *                  height of the band scaled is 3-pixels.
    600 ; *
    601 ; *  SPECIAL NOTES : The routine uses the first line of the band below
    602 ; *                  the current band.
    603 ; *
    604 ; ****************************************************************************/
    605 ;void vertical_band_3_4_scale_armv4
    606 ;(
    607 ;   r0 = UINT8 *dest
    608 ;   r1 = UINT32 dest_pitch
    609 ;   r2 = UINT32 dest_width
    610 ;)
    611 |vertical_band_3_4_scale_armv4| PROC
    612     stmdb   sp!, {r4 - r11, lr}
    613 
    614     ldr     r10, =64
    615     ldr     r11, =192
    616     mov     r9, #128
    617 
    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
    625 
    626     mla     r4, r10, r4, r9         ; a*64 + 128
    627     mla     r4, r11, r5, r4         ; a*64 + b*192 + 1
    628 
    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
    632 
    633     mov     r4, r4, asr #8          ; (a*64 + b*192 + 1) >> 8
    634     strb    r4, [lr], r1
    635 
    636     ldrb    r4, [r3, r1]            ; a = des [dest_pitch*4]
    637 
    638     strb    r5, [lr], r1
    639 
    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
    643 
    644     add     src, src, #1
    645     subs    r2, r2, #1
    646 
    647     strb    r7, [lr]
    648 
    649     bne     vl34_loop
    650 
    651     ldmia   sp!, {r4 - r11, pc}
    652     ENDP    ;|vertical_band_3_4_scale_armv4|
    653 
    654 ;/****************************************************************************
    655 ; *
    656 ; *  ROUTINE       : vp8cx_horizontal_line_1_2_scale_c
    657 ; *
    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).
    662 ; *
    663 ; *  OUTPUTS       : None.
    664 ; *
    665 ; *  RETURNS       : void
    666 ; *
    667 ; *  FUNCTION      : Copies horizontal line of pixels from source to
    668 ; *                  destination scaling up by 1 to 2.
    669 ; *
    670 ; *  SPECIAL NOTES : None.
    671 ; *
    672 ; ****************************************************************************/
    673 ;void vp8cx_horizontal_line_1_2_scale_c
    674 ;(
    675 ;   const unsigned char *source,
    676 ;   unsigned int source_width,
    677 ;   unsigned char *dest,
    678 ;   unsigned int dest_width
    679 ;)
    680 |horizontal_line_1_2_scale_armv4| PROC
    681     stmdb   sp!, {r4 - r5, lr}
    682 
    683     sub     srcw, srcw, #1
    684 
    685     ldrb    r3, [src], #1
    686     ldrb    r4, [src], #1
    687 hl12_loop
    688     subs    srcw, srcw, #1
    689 
    690     add     r5, r3, r4
    691     add     r5, r5, #1
    692     mov     r5, r5, lsr #1
    693 
    694     orr     r5, r3, r5, lsl #8
    695     strh    r5, [dest], #2
    696 
    697     mov     r3, r4
    698 
    699     ldrneb  r4, [src], #1
    700     bne     hl12_loop
    701 
    702     orr     r5, r4, r4, lsl #8
    703     strh    r5, [dest]
    704 
    705     ldmia   sp!, {r4 - r5, pc}
    706     ENDP    ;|vertical_band_3_5_scale_armv4|
    707 
    708 ;/****************************************************************************
    709 ; *
    710 ; *  ROUTINE       : vp8cx_vertical_band_1_2_scale_c
    711 ; *
    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.
    715 ; *
    716 ; *  OUTPUTS       : None.
    717 ; *
    718 ; *  RETURNS       : void
    719 ; *
    720 ; *  FUNCTION      : Scales vertical band of pixels by scale 1 to 2. The
    721 ; *                  height of the band scaled is 1-pixel.
    722 ; *
    723 ; *  SPECIAL NOTES : The routine uses the first line of the band below
    724 ; *                  the current band.
    725 ; *
    726 ; ****************************************************************************/
    727 ;void vp8cx_vertical_band_1_2_scale_c
    728 ;(
    729 ;   r0 = UINT8 *dest
    730 ;   r1 = UINT32 dest_pitch
    731 ;   r2 = UINT32 dest_width
    732 ;)
    733 |vertical_band_1_2_scale_armv4| PROC
    734     stmdb   sp!, {r4 - r7, lr}
    735 
    736     ldr     mask, =0xff00ff             ; mask for selection
    737     ldr     lr, = 0x010001
    738 
    739 vl12_loop
    740     mov     r3, src
    741     ldr     r4, [r3], r1
    742     ldr     r5, [r3, r1]
    743 
    744     add     src, src, #4
    745     subs    r2, r2, #4
    746 
    747     and     r6, r4, mask
    748     and     r7, r5, mask
    749 
    750     add     r6, r7, r6
    751     add     r6, r6, lr
    752 
    753     and     r4, mask, r4, lsr #8
    754     and     r5, mask, r5, lsr #8
    755 
    756     mov     r6, r6, lsr #1
    757     and     r6, r6, mask
    758 
    759     add     r4, r5, r4
    760     add     r4, r4, lr
    761 
    762     mov     r4, r4, lsr #1
    763     and     r4, r4, mask
    764 
    765     orr     r5, r6, r4, lsl #8
    766 
    767     str     r5, [r3]
    768 
    769     bpl     vl12_loop
    770 
    771     ldmia   sp!, {r4 - r7, pc}
    772     ENDP    ;|vertical_band_3_5_scale_armv4|
    773 
    774     END
    775