Home | History | Annotate | Download | only in symbian
      1 @ This file was created from a .asm file
      2 @  using the ads2gas.pl script.
      3 
      4     .equ WIDE_REFERENCE, 0
      5     .ifndef ARCHITECTURE
      6     .equ ARCHITECTURE, 5
      7     .endif
      8     .global horizontal_line_4_5_scale_armv4
      9     .ifndef NO_TYPE_PSEUDO_OP
     10     .type horizontal_line_4_5_scale_armv4, function
     11     .endif
     12     .global vertical_band_4_5_scale_armv4
     13     .ifndef NO_TYPE_PSEUDO_OP
     14     .type vertical_band_4_5_scale_armv4, function
     15     .endif
     16     .global horizontal_line_2_3_scale_armv4
     17     .ifndef NO_TYPE_PSEUDO_OP
     18     .type horizontal_line_2_3_scale_armv4, function
     19     .endif
     20     .global vertical_band_2_3_scale_armv4
     21     .ifndef NO_TYPE_PSEUDO_OP
     22     .type vertical_band_2_3_scale_armv4, function
     23     .endif
     24     .global horizontal_line_3_5_scale_armv4
     25     .ifndef NO_TYPE_PSEUDO_OP
     26     .type horizontal_line_3_5_scale_armv4, function
     27     .endif
     28     .global vertical_band_3_5_scale_armv4
     29     .ifndef NO_TYPE_PSEUDO_OP
     30     .type vertical_band_3_5_scale_armv4, function
     31     .endif
     32     .global horizontal_line_3_4_scale_armv4
     33     .ifndef NO_TYPE_PSEUDO_OP
     34     .type horizontal_line_3_4_scale_armv4, function
     35     .endif
     36     .global vertical_band_3_4_scale_armv4
     37     .ifndef NO_TYPE_PSEUDO_OP
     38     .type vertical_band_3_4_scale_armv4, function
     39     .endif
     40     .global horizontal_line_1_2_scale_armv4
     41     .ifndef NO_TYPE_PSEUDO_OP
     42     .type horizontal_line_1_2_scale_armv4, function
     43     .endif
     44     .global vertical_band_1_2_scale_armv4
     45     .ifndef NO_TYPE_PSEUDO_OP
     46     .type vertical_band_1_2_scale_armv4, function
     47     .endif
     48 
     49 .text
     50 
     51 src         .req    r0
     52 srcw        .req    r1
     53 dest        .req    r2
     54 mask        .req    r12
     55 c51_205     .req    r10
     56 c102_154    .req    r11
     57 @/****************************************************************************
     58 @ *
     59 @ *  ROUTINE       : horizontal_line_4_5_scale_armv4
     60 @ *
     61 @ *  INPUTS        : const unsigned char *source : Pointer to source data.
     62 @ *                  unsigned int source_width    : Stride of source.
     63 @ *                  unsigned char *dest         : Pointer to destination data.
     64 @ *                  unsigned int dest_width      : Stride of destination (NOT USED).
     65 @ *
     66 @ *  OUTPUTS       : None.
     67 @ *
     68 @ *  RETU.req_s       : void
     69 @ *
     70 @ *  FUNCTION      : Copies horizontal line of pixels from source to
     71 @ *                  destination scaling up by 4 to 5.
     72 @ *
     73 @ *  SPECIAL NOTES : None.
     74 @ *
     75 @ ****************************************************************************/
     76 @void horizontal_line_4_5_scale_armv4
     77 @(
     78 @   r0 = UINT8 *source
     79 @   r1 = UINT32 source_width
     80 @   r2 = UINT8 *dest
     81 @   r3 = UINT32 dest_width
     82 @)
     83 _HorizontalLine_4_5_Scale_ARMv4:
     84     horizontal_line_4_5_scale_armv4: @
     85     stmdb   sp!, {r4 - r11, lr}
     86 
     87     mov     mask, #255              @ mask for selection
     88     ldr     c51_205, =0x3300cd
     89     ldr     c102_154, =0x66009a
     90 
     91     ldr     r3, [src], #4
     92 
     93 hl45_loop:
     94 
     95     and     r4, r3, mask            @ a = src[0]
     96     and     r5, mask, r3, lsr #8    @ b = src[1]
     97     strb    r4, [dest], #1
     98 
     99     orr     r6, r4, r5, lsl #16     @ b | a
    100     and     r7, mask, r3, lsr #16   @ c = src[2]
    101     mul     r6, c51_205, r6         @ a * 51 + 205 * b
    102 
    103     orr     r5, r5, r7, lsl #16     @ c | b
    104     mul     r5, c102_154, r5        @ b * 102 + 154 * c
    105     add     r6, r6, #0x8000
    106     and     r8, mask, r3, lsr #24   @ d = src[3]
    107     mov     r6, r6, lsr #24
    108     strb    r6, [dest], #1
    109 
    110     orr     r7, r8, r7, lsl #16     @ c | d
    111     mul     r7, c102_154, r7        @ c * 154 + 102 * d
    112     add     r5, r5, #0x8000
    113     ldr     r3, [src], #4
    114     mov     r5, r5, lsr #24
    115     strb    r5, [dest], #1
    116 
    117     add     r7, r7, #0x8000
    118     and     r9, mask, r3            @ e = src[4]
    119     orr     r9, r9, r8, lsl #16     @ d | e
    120     mul     r9, c51_205, r9         @ d * 205 + 51 * e
    121     mov     r7, r7, lsr #24
    122     strb    r7, [dest], #1
    123 
    124     add     r9, r9, #0x8000
    125     subs    srcw, srcw, #4
    126     mov     r9, r9, lsr #24
    127     strb    r9, [dest], #1
    128 
    129     bne     hl45_loop
    130 
    131     and     r4, r3, mask
    132     and     r5, mask, r3, lsl #8
    133     strb    r4, [dest], #1
    134 
    135     orr     r6, r4, r5, lsl #16     @ b | a
    136     mul     r6, c51_205, r6
    137 
    138     and     r7, mask, r3, lsl #16
    139     orr     r5, r5, r7, lsl #16     @ c | b
    140     mul     r5, c102_154, r5
    141     add     r6, r6, #0x8000
    142     and     r8, mask, r3, lsl #24
    143     mov     r6, r6, lsr #24
    144     strb    r6, [dest], #1
    145 
    146     orr     r7, r8, r7, lsl #16     @ c | d
    147     mul     r7, c102_154, r7
    148     add     r5, r5, #0x8000
    149     mov     r5, r5, lsr #24
    150     strb    r5, [dest], #1
    151 
    152     add     r7, r7, #0x8000
    153     mov     r7, r7, lsr #24
    154     strb    r7, [dest], #1
    155 
    156     ldrb    r3, [src]
    157     strb    r3, [dest], #1
    158 
    159     ldmia   sp!, {r4 - r11, pc}
    160     @   @|vp8cx_horizontal_line_4_5_scale_c|
    161 
    162 @/****************************************************************************
    163 @ *
    164 @ *  ROUTINE       : vertical_band_4_5_scale_armv4
    165 @ *
    166 @ *  INPUTS        : unsigned char *dest    : Pointer to destination data.
    167 @ *                  unsigned int dest_pitch : Stride of destination data.
    168 @ *                  unsigned int dest_width : Width of destination data.
    169 @ *
    170 @ *  OUTPUTS       : None.
    171 @ *
    172 @ *  RETU.req_s       : void
    173 @ *
    174 @ *  FUNCTION      : Scales vertical band of pixels by scale 4 to 5. The
    175 @ *                  height of the band scaled is 4-pixels.
    176 @ *
    177 @ *  SPECIAL NOTES : The routine uses the first line of the band below
    178 @ *                  the current band.
    179 @ *
    180 @ ****************************************************************************/
    181 @void vertical_band_4_5_scale_armv4
    182 @(
    183 @   r0 = UINT8 *dest
    184 @   r1 = UINT32 dest_pitch
    185 @   r2 = UINT32 dest_width
    186 @)
    187 _VerticalBand_4_5_Scale_ARMv4:
    188     vertical_band_4_5_scale_armv4: @
    189     stmdb   sp!, {r4 - r11, lr}
    190 
    191     ldr     c51_205, =0x3300cd
    192     ldr     c102_154, =0x66009a
    193 
    194 vl45_loop:
    195     mov     r3, src
    196     ldrb    r4, [r3], r1            @ a = des [0]
    197     ldrb    r5, [r3], r1            @ b = des [dest_pitch]
    198     ldrb    r7, [r3], r1            @ c = des[dest_pitch*2]
    199     add     lr, src, r1
    200 
    201     orr     r6, r4, r5, lsl #16     @ b | a
    202     mul     r6, c51_205, r6         @ a * 51 + 205 * b
    203 
    204     ldrb    r8, [r3], r1            @ d = des[dest_pitch*3]
    205     orr     r5, r5, r7, lsl #16     @ c | b
    206     mul     r5, c102_154, r5        @ b * 102 + 154 * c
    207     add     r6, r6, #0x8000
    208     orr     r7, r8, r7, lsl #16     @ c | d
    209     mov     r6, r6, lsr #24
    210     strb    r6, [lr], r1
    211 
    212     ldrb    r9, [r3, r1]            @ e = des [dest_pitch * 5]
    213     mul     r7, c102_154, r7        @ c * 154 + 102 * d
    214     add     r5, r5, #0x8000
    215     orr     r9, r9, r8, lsl #16     @ d | e
    216     mov     r5, r5, lsr #24
    217     strb    r5, [lr], r1
    218 
    219     mul     r9, c51_205, r9         @ d * 205 + 51 * e
    220     add     r7, r7, #0x8000
    221     add     src, src, #1
    222     mov     r7, r7, lsr #24
    223     strb    r7, [lr], r1
    224 
    225     add     r9, r9, #0x8000
    226     subs    r2, r2, #1
    227     mov     r9, r9, lsr #24
    228     strb    r9, [lr], r1
    229 
    230     bne     vl45_loop
    231 
    232     ldmia   sp!, {r4 - r11, pc}
    233     @   @|vertical_band_4_5_scale_armv4|
    234 
    235 @/****************************************************************************
    236 @ *
    237 @ *  ROUTINE       : horizontal_line_2_3_scale_armv4
    238 @ *
    239 @ *  INPUTS        : const unsigned char *source : Pointer to source data.
    240 @ *                  unsigned int source_width    : Stride of source.
    241 @ *                  unsigned char *dest         : Pointer to destination data.
    242 @ *                  unsigned int dest_width      : Stride of destination (NOT USED).
    243 @ *
    244 @ *  OUTPUTS       : None.
    245 @ *
    246 @ *  RETU.req_s       : void
    247 @ *
    248 @ *  FUNCTION      : Copies horizontal line of pixels from source to
    249 @ *                  destination scaling up by 2 to 3.
    250 @ *
    251 @ *  SPECIAL NOTES : None.
    252 @ *
    253 @ *
    254 @ ****************************************************************************/
    255 @void horizontal_line_2_3_scale_armv4
    256 @(
    257 @   const unsigned char *source,
    258 @   unsigned int source_width,
    259 @   unsigned char *dest,
    260 @   unsigned int dest_width
    261 @)
    262 _HorizontalLine_2_3_Scale_ARMv4:
    263     horizontal_line_2_3_scale_armv4: @
    264     stmdb   sp!, {r4 - r11, lr}
    265     ldr     lr,  =85
    266     ldr     r12, =171
    267 
    268 hl23_loop:
    269 
    270     ldrb    r3, [src], #1           @ a
    271     ldrb    r4, [src], #1           @ b
    272     ldrb    r5, [src]               @ c
    273 
    274     strb    r3, [dest], #1
    275     mul     r4, r12, r4             @ b * 171
    276     mla     r6, lr, r3, r4          @ a * 85
    277     mla     r7, lr, r5, r4          @ c * 85
    278 
    279     add     r6, r6, #128
    280     mov     r6, r6, lsr #8
    281     strb    r6, [dest], #1
    282 
    283     add     r7, r7, #128
    284     mov     r7, r7, lsr #8
    285     strb    r7, [dest], #1
    286 
    287     subs    srcw, srcw, #2
    288     bne     hl23_loop
    289 
    290     ldrb    r4, [src, #1]           @ b
    291     strb    r5, [dest], #1
    292     strb    r4, [dest, #1]
    293 
    294     mul     r4, r12, r4             @ b * 171
    295     mla     r6, lr, r5, r4          @ a * 85 + b *171
    296 
    297     add     r6, r6, #128
    298     mov     r6, r6, lsr #8
    299     strb    r6, [dest]
    300 
    301     ldmia   sp!, {r4 - r11, pc}
    302     @   @|horizontal_line_2_3_scale_armv4|
    303 
    304 @/****************************************************************************
    305 @ *
    306 @ *  ROUTINE       : vertical_band_2_3_scale_armv4
    307 @ *
    308 @ *  INPUTS        : unsigned char *dest    : Pointer to destination data.
    309 @ *                  unsigned int dest_pitch : Stride of destination data.
    310 @ *                  unsigned int dest_width : Width of destination data.
    311 @ *
    312 @ *  OUTPUTS       : None.
    313 @ *
    314 @ *  RETU.req_s       : void
    315 @ *
    316 @ *  FUNCTION      : Scales vertical band of pixels by scale 2 to 3. The
    317 @ *                  height of the band scaled is 2-pixels.
    318 @ *
    319 @ *  SPECIAL NOTES : The routine uses the first line of the band below
    320 @ *                  the current band.
    321 @ *
    322 @ ****************************************************************************/
    323 @void vertical_band_2_3_scale_armv4
    324 @(
    325 @   r0 = UINT8 *dest
    326 @   r1 = UINT32 dest_pitch
    327 @   r2 = UINT32 dest_width
    328 @)
    329 _VerticalBand_2_3_Scale_ARMv4:
    330     vertical_band_2_3_scale_armv4: @
    331     stmdb   sp!, {r4 - r8, lr}
    332     ldr     lr,  =85
    333     ldr     r12, =171
    334     add     r3, r1, r1, lsl #1      @ 3 * dest_pitch
    335 
    336 vl23_loop:
    337     ldrb    r4, [src]               @ a = des [0]
    338     ldrb    r5, [src, r1]           @ b = des [dest_pitch]
    339     ldrb    r7, [src, r3]           @ c = des [dest_pitch*3]
    340     subs    r2, r2, #1
    341 
    342     mul     r5, r12, r5             @ b * 171
    343     mla     r6, lr, r4, r5          @ a * 85
    344     mla     r8, lr, r7, r5          @ c * 85
    345 
    346     add     r6, r6, #128
    347     mov     r6, r6, lsr #8
    348     strb    r6, [src, r1]
    349 
    350     add     r8, r8, #128
    351     mov     r8, r8, lsr #8
    352     strb    r8, [src, r1, lsl #1]
    353 
    354     add     src, src, #1
    355 
    356     bne     vl23_loop
    357 
    358     ldmia   sp!, {r4 - r8, pc}
    359     @   @|vertical_band_2_3_scale_armv4|
    360 
    361 @/****************************************************************************
    362 @ *
    363 @ *  ROUTINE       : vp8cx_horizontal_line_3_5_scale_c
    364 @ *
    365 @ *  INPUTS        : const unsigned char *source : Pointer to source data.
    366 @ *                  unsigned int source_width    : Stride of source.
    367 @ *                  unsigned char *dest         : Pointer to destination data.
    368 @ *                  unsigned int dest_width      : Stride of destination (NOT USED).
    369 @ *
    370 @ *  OUTPUTS       : None.
    371 @ *
    372 @ *  RETU.req_s       : void
    373 @ *
    374 @ *  FUNCTION      : Copies horizontal line of pixels from source to
    375 @ *                  destination scaling up by 3 to 5.
    376 @ *
    377 @ *  SPECIAL NOTES : None.
    378 @ *
    379 @ *
    380 @ ****************************************************************************/
    381 @void vp8cx_horizontal_line_3_5_scale_c
    382 @(
    383 @   const unsigned char *source,
    384 @   unsigned int source_width,
    385 @   unsigned char *dest,
    386 @   unsigned int dest_width
    387 @)
    388 _HorizontalLine_3_5_Scale_ARMv4:
    389     horizontal_line_3_5_scale_armv4: @
    390     stmdb   sp!, {r4 - r11, lr}
    391 
    392     ldr     c51_205, =0x3300cd
    393     ldr     c102_154, =0x66009a
    394 
    395     ldrb    r4, [src], #1           @ a = src[0]
    396 
    397 hl35_loop:
    398 
    399     ldrb    r8, [src], #1           @ b = src[1]
    400     strb    r4, [dest], #1
    401 
    402     orr     r6, r4, r8, lsl #16     @ b | a
    403     ldrb    r9, [src], #1           @ c = src[2]
    404     mul     r6, c102_154, r6        @ a * 102 + 154 * b
    405 
    406     orr     r5, r9, r8, lsl #16     @ b | c
    407     mul     r5, c51_205, r5         @ b * 205 + 51 * c
    408     add     r6, r6, #0x8000
    409     ldrb    r4, [src], #1           @ d = src[3]
    410     mov     r6, r6, lsr #24
    411     strb    r6, [dest], #1
    412 
    413     orr     r7, r8, r9, lsl #16     @ c | b
    414     mul     r7, c51_205, r7         @ c * 205 + 154 * b
    415     add     r5, r5, #0x8000
    416     mov     r5, r5, lsr #24
    417     strb    r5, [dest], #1
    418 
    419     orr     r9, r4, r9, lsl #16     @ c | d
    420     mul     r9, c102_154, r9        @ c * 154 + 102 * d
    421     add     r7, r7, #0x8000
    422     mov     r7, r7, lsr #24
    423     strb    r7, [dest], #1
    424 
    425     add     r9, r9, #0x8000
    426     subs    srcw, srcw, #3
    427     mov     r9, r9, lsr #24
    428     strb    r9, [dest], #1
    429 
    430     bpl     hl35_loop
    431 
    432     ldrb    r5, [src], #1           @ b = src[1]
    433     strb    r4, [dest], #1
    434 
    435     orr     r6, r4, r8, lsl #16     @ b | a
    436     ldrb    r9, [src], #1           @ c = src[2]
    437     mul     r6, c102_154, r6        @ a * 102 + 154 * b
    438 
    439     orr     r5, r9, r8, lsl #16     @ b | c
    440     mul     r5, c51_205, r5         @ b * 205 + 51 * c
    441     add     r6, r6, #0x8000
    442     mov     r6, r6, lsr #24
    443     strb    r6, [dest], #1
    444 
    445     orr     r7, r8, r9, lsl #16     @ c | b
    446     mul     r7, c51_205, r7         @ c * 205 + 154 * b
    447     add     r5, r5, #0x8000
    448     mov     r5, r5, lsr #24
    449     strb    r5, [dest], #1
    450 
    451     add     r7, r7, #0x8000
    452     mov     r7, r7, lsr #24
    453     strb    r7, [dest], #1
    454     strb    r9, [dest], #1
    455 
    456     ldmia   sp!, {r4 - r11, pc}
    457     @   @|vp8cx_horizontal_line_3_5_scale_c|
    458 
    459 
    460 @/****************************************************************************
    461 @ *
    462 @ *  ROUTINE       : vp8cx_vertical_band_3_5_scale_c
    463 @ *
    464 @ *  INPUTS        : unsigned char *dest    : Pointer to destination data.
    465 @ *                  unsigned int dest_pitch : Stride of destination data.
    466 @ *                  unsigned int dest_width : Width of destination data.
    467 @ *
    468 @ *  OUTPUTS       : None.
    469 @ *
    470 @ *  RETU.req_s       : void
    471 @ *
    472 @ *  FUNCTION      : Scales vertical band of pixels by scale 3 to 5. The
    473 @ *                  height of the band scaled is 3-pixels.
    474 @ *
    475 @ *  SPECIAL NOTES : The routine uses the first line of the band below
    476 @ *                  the current band.
    477 @ *
    478 @ ****************************************************************************/
    479 @void vertical_band_4_5_scale_armv4
    480 @(
    481 @   r0 = UINT8 *dest
    482 @   r1 = UINT32 dest_pitch
    483 @   r2 = UINT32 dest_width
    484 @)
    485 _VerticalBand_3_5_Scale_ARMv4:
    486     vertical_band_3_5_scale_armv4: @
    487     stmdb   sp!, {r4 - r11, lr}
    488 
    489     ldr     c51_205, =0x3300cd
    490     ldr     c102_154, =0x66009a
    491 
    492 vl35_loop:
    493     mov     r3, src
    494     ldrb    r4, [r3], r1            @ a = des [0]
    495     ldrb    r5, [r3], r1            @ b = des [dest_pitch]
    496     ldrb    r7, [r3], r1            @ c = des[dest_pitch*2]
    497     add     lr, src, r1
    498 
    499     orr     r8, r4, r5, lsl #16     @ b | a
    500     mul     r6, c102_154, r8        @ a * 102 + 154 * b
    501 
    502     ldrb    r8, [r3, r1, lsl #1]    @ d = des[dest_pitch*5]
    503     orr     r3, r7, r5, lsl #16     @ b | c
    504     mul     r9, c51_205, r3         @ b * 205 + 51 * c
    505     add     r6, r6, #0x8000
    506     orr     r3, r5, r7, lsl #16     @ c | b
    507     mov     r6, r6, lsr #24
    508     strb    r6, [lr], r1
    509 
    510     mul     r5, c51_205, r3         @ c * 205 + 154 * b
    511     add     r9, r9, #0x8000
    512     orr     r3, r8, r7, lsl #16     @ c | d
    513     mov     r9, r9, lsr #24
    514     strb    r9, [lr], r1
    515 
    516     mul     r7, c102_154, r3        @ c * 154 + 102 * d
    517     add     r5, r5, #0x8000
    518     add     src, src, #1
    519     mov     r5, r5, lsr #24
    520     strb    r5, [lr], r1
    521 
    522     add     r7, r7, #0x8000
    523     subs    r2, r2, #1
    524     mov     r7, r7, lsr #24
    525     strb    r7, [lr], r1
    526 
    527 
    528     bne     vl35_loop
    529 
    530     ldmia   sp!, {r4 - r11, pc}
    531     @   @|vertical_band_3_5_scale_armv4|
    532 
    533 @/****************************************************************************
    534 @ *
    535 @ *  ROUTINE       : horizontal_line_3_4_scale_armv4
    536 @ *
    537 @ *  INPUTS        : const unsigned char *source : Pointer to source data.
    538 @ *                  unsigned int source_width    : Stride of source.
    539 @ *                  unsigned char *dest         : Pointer to destination data.
    540 @ *                  unsigned int dest_width      : Stride of destination (NOT USED).
    541 @ *
    542 @ *  OUTPUTS       : None.
    543 @ *
    544 @ *  RETU.req_s       : void
    545 @ *
    546 @ *  FUNCTION      : Copies horizontal line of pixels from source to
    547 @ *                  destination scaling up by 3 to 4.
    548 @ *
    549 @ *  SPECIAL NOTES : None.
    550 @ *
    551 @ *
    552 @ ****************************************************************************/
    553 @void horizontal_line_3_4_scale_armv4
    554 @(
    555 @   const unsigned char *source,
    556 @   unsigned int source_width,
    557 @   unsigned char *dest,
    558 @   unsigned int dest_width
    559 @)
    560 _HorizontalLine_3_4_Scale_ARMv4:
    561     horizontal_line_3_4_scale_armv4: @
    562     stmdb   sp!, {r4 - r11, lr}
    563 
    564     ldr     r10, =64
    565     ldr     r11, =192
    566     mov     r9, #128
    567 
    568     ldrb    r4, [src], #1           @ a = src[0]
    569 
    570 hl34_loop:
    571 
    572     ldrb    r8, [src], #1           @ b = src[1]
    573     ldrb    r7, [src], #1           @ c = src[2]
    574     strb    r4, [dest], #1
    575 
    576     mla     r4, r10, r4, r9         @ a*64 + 128
    577     mla     r4, r11, r8, r4         @ a*64 + b*192 + 1
    578 
    579     add     r8, r8, #1              @ b + 1
    580     add     r8, r8, r7              @ b + c + 1
    581     mov     r8, r8, asr #1          @ (b + c + 1) >> 1
    582 
    583     mov     r4, r4, asr #8          @ (a*64 + b*192 + 1) >> 8
    584     strb    r4, [dest], #1
    585 
    586     strb    r8, [dest], #1
    587 
    588     ldrb    r4, [src], #1           @ [a+1]
    589 
    590     mla     r7, r11, r7, r9         @ c*192 + 128
    591     mla     r7, r4, r10, r7         @ a*64 + b*192 + 128
    592 
    593     subs    srcw, srcw, #3
    594 
    595     mov     r7, r7, asr #8          @ (a*64 + b*192 + 128) >> 8
    596     strb    r7, [dest], #1
    597 
    598     bpl     hl34_loop
    599 
    600     ldrb    r8, [src], #1           @ b = src[1]
    601     ldrb    r7, [src], #1           @ c = src[2]
    602     strb    r4, [dest], #1
    603 
    604     mla     r4, r10, r4, r9         @ a*64 + 128
    605     mla     r4, r11, r8, r4         @ a*64 + b*192 + 1
    606     mov     r4, r4, asr #8          @ (a*64 + b*192 + 1) >> 8
    607     strb    r4, [dest], #1
    608 
    609     add     r8, r8, #1              @ b + 1
    610     add     r8, r8, r7              @ b + c + 1
    611     mov     r8, r8, asr #1          @ (b + c + 1) >> 1
    612     strb    r8, [dest], #1
    613     strb    r7, [dest], #1
    614 
    615     ldmia   sp!, {r4 - r11, pc}
    616     @   @|vp8cx_horizontal_line_3_4_scale_c|
    617 
    618 
    619 @/****************************************************************************
    620 @ *
    621 @ *  ROUTINE       : vertical_band_3_4_scale_armv4
    622 @ *
    623 @ *  INPUTS        : unsigned char *dest    : Pointer to destination data.
    624 @ *                  unsigned int dest_pitch : Stride of destination data.
    625 @ *                  unsigned int dest_width : Width of destination data.
    626 @ *
    627 @ *  OUTPUTS       : None.
    628 @ *
    629 @ *  RETU.req_s       : void
    630 @ *
    631 @ *  FUNCTION      : Scales vertical band of pixels by scale 3 to 4. The
    632 @ *                  height of the band scaled is 3-pixels.
    633 @ *
    634 @ *  SPECIAL NOTES : The routine uses the first line of the band below
    635 @ *                  the current band.
    636 @ *
    637 @ ****************************************************************************/
    638 @void vertical_band_3_4_scale_armv4
    639 @(
    640 @   r0 = UINT8 *dest
    641 @   r1 = UINT32 dest_pitch
    642 @   r2 = UINT32 dest_width
    643 @)
    644 _VerticalBand_3_4_Scale_ARMv4:
    645     vertical_band_3_4_scale_armv4: @
    646     stmdb   sp!, {r4 - r11, lr}
    647 
    648     ldr     r10, =64
    649     ldr     r11, =192
    650     mov     r9, #128
    651 
    652 @   ldr     r1,[r1]
    653 vl34_loop:
    654     mov     r3, src
    655     ldrb    r4, [r3], r1            @ a = des [0]
    656     ldrb    r5, [r3], r1            @ b = des [dest_pitch]
    657     ldrb    r7, [r3], r1            @ c = des [dest_pitch*2]
    658     add     lr, src, r1
    659 
    660     mla     r4, r10, r4, r9         @ a*64 + 128
    661     mla     r4, r11, r5, r4         @ a*64 + b*192 + 1
    662 
    663     add     r5, r5, #1              @ b + 1
    664     add     r5, r5, r7              @ b + c + 1
    665     mov     r5, r5, asr #1          @ (b + c + 1) >> 1
    666 
    667     mov     r4, r4, asr #8          @ (a*64 + b*192 + 1) >> 8
    668     strb    r4, [lr], r1
    669 
    670     ldrb    r4, [r3, r1]            @ a = des [dest_pitch*4]
    671 
    672     strb    r5, [lr], r1
    673 
    674     mla     r7, r11, r7, r9         @ c*192 + 128
    675     mla     r7, r4, r10, r7         @ a*64 + b*192 + 128
    676     mov     r7, r7, asr #8          @ (a*64 + b*192 + 128) >> 8
    677 
    678     add     src, src, #1
    679     subs    r2, r2, #1
    680 
    681     strb    r7, [lr]
    682 
    683     bne     vl34_loop
    684 
    685     ldmia   sp!, {r4 - r11, pc}
    686     @   @|vertical_band_3_4_scale_armv4|
    687 
    688 @/****************************************************************************
    689 @ *
    690 @ *  ROUTINE       : vp8cx_horizontal_line_1_2_scale_c
    691 @ *
    692 @ *  INPUTS        : const unsigned char *source : Pointer to source data.
    693 @ *                  unsigned int source_width    : Stride of source.
    694 @ *                  unsigned char *dest         : Pointer to destination data.
    695 @ *                  unsigned int dest_width      : Stride of destination (NOT USED).
    696 @ *
    697 @ *  OUTPUTS       : None.
    698 @ *
    699 @ *  RETU.req_s       : void
    700 @ *
    701 @ *  FUNCTION      : Copies horizontal line of pixels from source to
    702 @ *                  destination scaling up by 1 to 2.
    703 @ *
    704 @ *  SPECIAL NOTES : None.
    705 @ *
    706 @ ****************************************************************************/
    707 @void vp8cx_horizontal_line_1_2_scale_c
    708 @(
    709 @   const unsigned char *source,
    710 @   unsigned int source_width,
    711 @   unsigned char *dest,
    712 @   unsigned int dest_width
    713 @)
    714 _HorizontalLine_1_2_Scale_ARMv4:
    715     horizontal_line_1_2_scale_armv4: @
    716     stmdb   sp!, {r4 - r5, lr}
    717 
    718     sub     srcw, srcw, #1
    719 
    720     ldrb    r3, [src], #1
    721     ldrb    r4, [src], #1
    722 hl12_loop:
    723     subs    srcw, srcw, #1
    724 
    725     add     r5, r3, r4
    726     add     r5, r5, #1
    727     mov     r5, r5, lsr #1
    728 
    729     orr     r5, r3, r5, lsl #8
    730     strh    r5, [dest], #2
    731 
    732     mov     r3, r4
    733 
    734     ldrneb  r4, [src], #1
    735     bne     hl12_loop
    736 
    737     orr     r5, r4, r4, lsl #8
    738     strh    r5, [dest]
    739 
    740     ldmia   sp!, {r4 - r5, pc}
    741     @   @|vertical_band_3_5_scale_armv4|
    742 
    743 @/****************************************************************************
    744 @ *
    745 @ *  ROUTINE       : vp8cx_vertical_band_1_2_scale_c
    746 @ *
    747 @ *  INPUTS        : unsigned char *dest    : Pointer to destination data.
    748 @ *                  unsigned int dest_pitch : Stride of destination data.
    749 @ *                  unsigned int dest_width : Width of destination data.
    750 @ *
    751 @ *  OUTPUTS       : None.
    752 @ *
    753 @ *  RETU.req_s       : void
    754 @ *
    755 @ *  FUNCTION      : Scales vertical band of pixels by scale 1 to 2. The
    756 @ *                  height of the band scaled is 1-pixel.
    757 @ *
    758 @ *  SPECIAL NOTES : The routine uses the first line of the band below
    759 @ *                  the current band.
    760 @ *
    761 @ ****************************************************************************/
    762 @void vp8cx_vertical_band_1_2_scale_c
    763 @(
    764 @   r0 = UINT8 *dest
    765 @   r1 = UINT32 dest_pitch
    766 @   r2 = UINT32 dest_width
    767 @)
    768 _VerticalBand_1_2_Scale_ARMv4:
    769     vertical_band_1_2_scale_armv4: @
    770     stmdb   sp!, {r4 - r7, lr}
    771 
    772     ldr     mask, =0xff00ff             @ mask for selection
    773     ldr     lr, = 0x010001
    774 
    775 vl12_loop:
    776     mov     r3, src
    777     ldr     r4, [r3], r1
    778     ldr     r5, [r3, r1]
    779 
    780     add     src, src, #4
    781     subs    r2, r2, #4
    782 
    783     and     r6, r4, mask
    784     and     r7, r5, mask
    785 
    786     add     r6, r7, r6
    787     add     r6, r6, lr
    788 
    789     and     r4, mask, r4, lsr #8
    790     and     r5, mask, r5, lsr #8
    791 
    792     mov     r6, r6, lsr #1
    793     and     r6, r6, mask
    794 
    795     add     r4, r5, r4
    796     add     r4, r4, lr
    797 
    798     mov     r4, r4, lsr #1
    799     and     r4, r4, mask
    800 
    801     orr     r5, r6, r4, lsl #8
    802 
    803     str     r5, [r3]
    804 
    805     bpl     vl12_loop
    806 
    807     ldmia   sp!, {r4 - r7, pc}
    808     @   @|vertical_band_3_5_scale_armv4|
    809