Ignore:
Timestamp:
Jul 28, 2017 2:51:44 AM (7 years ago)
Author:
nanang
Message:

Re #2004: Update libyuv version from libyuv git master repo dated 27 July 2017, the compile errors on old gcc versions issue persists though.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/third_party/yuv/source/scale_neon64.cc

    r5358 r5633  
    99 */ 
    1010 
     11#include "libyuv/row.h" 
    1112#include "libyuv/scale.h" 
    12 #include "libyuv/row.h" 
    1313#include "libyuv/scale_row.h" 
    1414 
     
    2222 
    2323// Read 32x1 throw away even pixels, and write 16x1. 
    24 void ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    25                         uint8* dst, int dst_width) { 
     24void ScaleRowDown2_NEON(const uint8* src_ptr, 
     25                        ptrdiff_t src_stride, 
     26                        uint8* dst, 
     27                        int dst_width) { 
     28  (void)src_stride; 
    2629  asm volatile ( 
    2730  "1:                                          \n" 
    2831    // load even pixels into v0, odd into v1 
    29     MEMACCESS(0) 
    3032    "ld2        {v0.16b,v1.16b}, [%0], #32     \n" 
    3133    "subs       %w2, %w2, #16                  \n"  // 16 processed per loop 
    32     MEMACCESS(1) 
    3334    "st1        {v1.16b}, [%1], #16            \n"  // store odd pixels 
    3435    "b.gt       1b                             \n" 
     
    4243 
    4344// Read 32x1 average down and write 16x1. 
    44 void ScaleRowDown2Linear_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    45                            uint8* dst, int dst_width) { 
    46   asm volatile ( 
    47   "1:                                          \n" 
    48     MEMACCESS(0) 
     45void ScaleRowDown2Linear_NEON(const uint8* src_ptr, 
     46                              ptrdiff_t src_stride, 
     47                              uint8* dst, 
     48                              int dst_width) { 
     49  (void)src_stride; 
     50  asm volatile ( 
     51  "1:                                          \n" 
    4952    "ld1        {v0.16b,v1.16b}, [%0], #32     \n"  // load pixels and post inc 
    5053    "subs       %w2, %w2, #16                  \n"  // 16 processed per loop 
     
    5356    "rshrn      v0.8b, v0.8h, #1               \n"  // downshift, round and pack 
    5457    "rshrn2     v0.16b, v1.8h, #1              \n" 
    55     MEMACCESS(1) 
    5658    "st1        {v0.16b}, [%1], #16            \n" 
    5759    "b.gt       1b                             \n" 
     
    6567 
    6668// Read 32x2 average down and write 16x1. 
    67 void ScaleRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    68                            uint8* dst, int dst_width) { 
     69void ScaleRowDown2Box_NEON(const uint8* src_ptr, 
     70                           ptrdiff_t src_stride, 
     71                           uint8* dst, 
     72                           int dst_width) { 
    6973  asm volatile ( 
    7074    // change the stride to row 2 pointer 
    7175    "add        %1, %1, %0                     \n" 
    7276  "1:                                          \n" 
    73     MEMACCESS(0) 
    74     "ld1        {v0.16b,v1.16b}, [%0], #32    \n"  // load row 1 and post inc 
    75     MEMACCESS(1) 
     77    "ld1        {v0.16b, v1.16b}, [%0], #32    \n"  // load row 1 and post inc 
    7678    "ld1        {v2.16b, v3.16b}, [%1], #32    \n"  // load row 2 and post inc 
    7779    "subs       %w3, %w3, #16                  \n"  // 16 processed per loop 
     
    8284    "rshrn      v0.8b, v0.8h, #2               \n"  // downshift, round and pack 
    8385    "rshrn2     v0.16b, v1.8h, #2              \n" 
    84     MEMACCESS(2) 
    8586    "st1        {v0.16b}, [%2], #16            \n" 
    8687    "b.gt       1b                             \n" 
     
    9495} 
    9596 
    96 void ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    97                         uint8* dst_ptr, int dst_width) { 
    98   asm volatile ( 
    99   "1:                                          \n" 
    100     MEMACCESS(0) 
     97void ScaleRowDown4_NEON(const uint8* src_ptr, 
     98                        ptrdiff_t src_stride, 
     99                        uint8* dst_ptr, 
     100                        int dst_width) { 
     101  (void)src_stride; 
     102  asm volatile ( 
     103  "1:                                          \n" 
    101104    "ld4     {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32          \n"  // src line 0 
    102105    "subs       %w2, %w2, #8                   \n"  // 8 processed per loop 
    103     MEMACCESS(1) 
    104106    "st1     {v2.8b}, [%1], #8                 \n" 
    105107    "b.gt       1b                             \n" 
     
    112114} 
    113115 
    114 void ScaleRowDown4Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    115                            uint8* dst_ptr, int dst_width) { 
     116void ScaleRowDown4Box_NEON(const uint8* src_ptr, 
     117                           ptrdiff_t src_stride, 
     118                           uint8* dst_ptr, 
     119                           int dst_width) { 
    116120  const uint8* src_ptr1 = src_ptr + src_stride; 
    117121  const uint8* src_ptr2 = src_ptr + src_stride * 2; 
    118122  const uint8* src_ptr3 = src_ptr + src_stride * 3; 
    119 asm volatile ( 
    120   "1:                                          \n" 
    121     MEMACCESS(0) 
     123  asm volatile ( 
     124  "1:                                          \n" 
    122125    "ld1     {v0.16b}, [%0], #16               \n"   // load up 16x4 
    123     MEMACCESS(3) 
    124126    "ld1     {v1.16b}, [%2], #16               \n" 
    125     MEMACCESS(4) 
    126127    "ld1     {v2.16b}, [%3], #16               \n" 
    127     MEMACCESS(5) 
    128128    "ld1     {v3.16b}, [%4], #16               \n" 
    129129    "subs    %w5, %w5, #4                      \n" 
     
    134134    "addp    v0.8h, v0.8h, v0.8h               \n" 
    135135    "rshrn   v0.8b, v0.8h, #4                  \n"   // divide by 16 w/rounding 
    136     MEMACCESS(1) 
    137136    "st1    {v0.s}[0], [%1], #4                \n" 
    138137    "b.gt       1b                             \n" 
     
    153152void ScaleRowDown34_NEON(const uint8* src_ptr, 
    154153                         ptrdiff_t src_stride, 
    155                          uint8* dst_ptr, int dst_width) { 
     154                         uint8* dst_ptr, 
     155                         int dst_width) { 
     156  (void)src_stride; 
    156157  asm volatile ( 
    157158  "1:                                                  \n" 
    158     MEMACCESS(0) 
    159     "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32                \n"  // src line 0 
     159    "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32    \n"  // src line 0 
    160160    "subs      %w2, %w2, #24                           \n" 
    161161    "orr       v2.16b, v3.16b, v3.16b                  \n"  // order v0, v1, v2 
    162     MEMACCESS(1) 
    163     "st3       {v0.8b,v1.8b,v2.8b}, [%1], #24                \n" 
     162    "st3       {v0.8b,v1.8b,v2.8b}, [%1], #24          \n" 
    164163    "b.gt      1b                                      \n" 
    165164  : "+r"(src_ptr),          // %0 
     
    173172void ScaleRowDown34_0_Box_NEON(const uint8* src_ptr, 
    174173                               ptrdiff_t src_stride, 
    175                                uint8* dst_ptr, int dst_width) { 
     174                               uint8* dst_ptr, 
     175                               int dst_width) { 
    176176  asm volatile ( 
    177177    "movi      v20.8b, #3                              \n" 
    178178    "add       %3, %3, %0                              \n" 
    179179  "1:                                                  \n" 
    180     MEMACCESS(0) 
    181     "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32                \n"  // src line 0 
    182     MEMACCESS(3) 
    183     "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%3], #32                \n"  // src line 1 
     180    "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32    \n"  // src line 0 
     181    "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%3], #32    \n"  // src line 1 
    184182    "subs         %w2, %w2, #24                        \n" 
    185183 
     
    217215    "uqrshrn   v2.8b, v16.8h, #2                       \n" 
    218216 
    219     MEMACCESS(1) 
    220     "st3       {v0.8b,v1.8b,v2.8b}, [%1], #24                \n" 
     217    "st3       {v0.8b,v1.8b,v2.8b}, [%1], #24          \n" 
    221218 
    222219    "b.gt      1b                                      \n" 
     
    233230void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr, 
    234231                               ptrdiff_t src_stride, 
    235                                uint8* dst_ptr, int dst_width) { 
     232                               uint8* dst_ptr, 
     233                               int dst_width) { 
    236234  asm volatile ( 
    237235    "movi      v20.8b, #3                              \n" 
    238236    "add       %3, %3, %0                              \n" 
    239237  "1:                                                  \n" 
    240     MEMACCESS(0) 
    241     "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32                \n"  // src line 0 
    242     MEMACCESS(3) 
    243     "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%3], #32                \n"  // src line 1 
     238    "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32    \n"  // src line 0 
     239    "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%3], #32    \n"  // src line 1 
    244240    "subs         %w2, %w2, #24                        \n" 
    245241    // average src line 0 with src line 1 
     
    262258    "uqrshrn   v2.8b, v4.8h, #2                        \n" 
    263259 
    264     MEMACCESS(1) 
    265     "st3       {v0.8b,v1.8b,v2.8b}, [%1], #24                \n" 
     260    "st3       {v0.8b,v1.8b,v2.8b}, [%1], #24          \n" 
    266261    "b.gt      1b                                      \n" 
    267262  : "+r"(src_ptr),          // %0 
     
    274269} 
    275270 
    276 static uvec8 kShuf38 = 
    277   { 0, 3, 6, 8, 11, 14, 16, 19, 22, 24, 27, 30, 0, 0, 0, 0 }; 
    278 static uvec8 kShuf38_2 = 
    279   { 0, 16, 32, 2, 18, 33, 4, 20, 34, 6, 22, 35, 0, 0, 0, 0 }; 
    280 static vec16 kMult38_Div6 = 
    281   { 65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12, 
    282     65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12 }; 
    283 static vec16 kMult38_Div9 = 
    284   { 65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18, 
    285     65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18 }; 
     271static uvec8 kShuf38 = {0, 3, 6, 8, 11, 14, 16, 19, 22, 24, 27, 30, 0, 0, 0, 0}; 
     272static uvec8 kShuf38_2 = {0,  16, 32, 2,  18, 33, 4, 20, 
     273                          34, 6,  22, 35, 0,  0,  0, 0}; 
     274static vec16 kMult38_Div6 = {65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12, 
     275                             65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12}; 
     276static vec16 kMult38_Div9 = {65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18, 
     277                             65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18}; 
    286278 
    287279// 32 -> 12 
    288280void ScaleRowDown38_NEON(const uint8* src_ptr, 
    289281                         ptrdiff_t src_stride, 
    290                          uint8* dst_ptr, int dst_width) { 
    291   asm volatile ( 
    292     MEMACCESS(3) 
     282                         uint8* dst_ptr, 
     283                         int dst_width) { 
     284  (void)src_stride; 
     285  asm volatile ( 
    293286    "ld1       {v3.16b}, [%3]                          \n" 
    294287  "1:                                                  \n" 
    295     MEMACCESS(0) 
    296     "ld1       {v0.16b,v1.16b}, [%0], #32             \n" 
     288    "ld1       {v0.16b,v1.16b}, [%0], #32              \n" 
    297289    "subs      %w2, %w2, #12                           \n" 
    298     "tbl       v2.16b, {v0.16b,v1.16b}, v3.16b        \n" 
    299     MEMACCESS(1) 
     290    "tbl       v2.16b, {v0.16b,v1.16b}, v3.16b         \n" 
    300291    "st1       {v2.8b}, [%1], #8                       \n" 
    301     MEMACCESS(1) 
    302292    "st1       {v2.s}[2], [%1], #4                     \n" 
    303293    "b.gt      1b                                      \n" 
     
    313303void OMITFP ScaleRowDown38_3_Box_NEON(const uint8* src_ptr, 
    314304                                      ptrdiff_t src_stride, 
    315                                       uint8* dst_ptr, int dst_width) { 
     305                                      uint8* dst_ptr, 
     306                                      int dst_width) { 
    316307  const uint8* src_ptr1 = src_ptr + src_stride * 2; 
    317308  ptrdiff_t tmp_src_stride = src_stride; 
    318309 
    319310  asm volatile ( 
    320     MEMACCESS(5) 
    321311    "ld1       {v29.8h}, [%5]                          \n" 
    322     MEMACCESS(6) 
    323312    "ld1       {v30.16b}, [%6]                         \n" 
    324     MEMACCESS(7) 
    325313    "ld1       {v31.8h}, [%7]                          \n" 
    326314    "add       %2, %2, %0                              \n" 
     
    331319    // 20 60 21 61 22 62 23 63 
    332320    // 30 70 31 71 32 72 33 73 
    333     MEMACCESS(0) 
    334     "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32                \n" 
    335     MEMACCESS(3) 
    336     "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%2], #32                \n" 
    337     MEMACCESS(4) 
    338     "ld4       {v16.8b,v17.8b,v18.8b,v19.8b}, [%3], #32              \n" 
     321    "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32      \n" 
     322    "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%2], #32      \n" 
     323    "ld4       {v16.8b,v17.8b,v18.8b,v19.8b}, [%3], #32  \n" 
    339324    "subs      %w4, %w4, #12                           \n" 
    340325 
     
    420405    "tbl       v3.16b, {v0.16b, v1.16b, v2.16b}, v30.16b \n" 
    421406 
    422     MEMACCESS(1) 
    423407    "st1       {v3.8b}, [%1], #8                       \n" 
    424     MEMACCESS(1) 
    425408    "st1       {v3.s}[2], [%1], #4                     \n" 
    426409    "b.gt      1b                                      \n" 
     
    442425void ScaleRowDown38_2_Box_NEON(const uint8* src_ptr, 
    443426                               ptrdiff_t src_stride, 
    444                                uint8* dst_ptr, int dst_width) { 
     427                               uint8* dst_ptr, 
     428                               int dst_width) { 
    445429  // TODO(fbarchard): use src_stride directly for clang 3.5+. 
    446430  ptrdiff_t tmp_src_stride = src_stride; 
    447431  asm volatile ( 
    448     MEMACCESS(4) 
    449432    "ld1       {v30.8h}, [%4]                          \n" 
    450     MEMACCESS(5) 
    451433    "ld1       {v31.16b}, [%5]                         \n" 
    452434    "add       %2, %2, %0                              \n" 
     
    457439    // 20 60 21 61 22 62 23 63 
    458440    // 30 70 31 71 32 72 33 73 
    459     MEMACCESS(0) 
    460     "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32                \n" 
    461     MEMACCESS(3) 
    462     "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%2], #32                \n" 
     441    "ld4       {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32    \n" 
     442    "ld4       {v4.8b,v5.8b,v6.8b,v7.8b}, [%2], #32    \n" 
    463443    "subs      %w3, %w3, #12                           \n" 
    464444 
     
    530510    "tbl       v3.16b, {v0.16b, v1.16b, v2.16b}, v31.16b \n" 
    531511 
    532     MEMACCESS(1) 
    533512    "st1       {v3.8b}, [%1], #8                       \n" 
    534     MEMACCESS(1) 
    535513    "st1       {v3.s}[2], [%1], #4                     \n" 
    536514    "b.gt      1b                                      \n" 
     
    546524} 
    547525 
    548 void ScaleAddRows_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    549                     uint16* dst_ptr, int src_width, int src_height) { 
     526void ScaleAddRows_NEON(const uint8* src_ptr, 
     527                       ptrdiff_t src_stride, 
     528                       uint16* dst_ptr, 
     529                       int src_width, 
     530                       int src_height) { 
    550531  const uint8* src_tmp; 
    551532  asm volatile ( 
     
    557538  "2:                                          \n" 
    558539    // load 16 pixels into q0 
    559     MEMACCESS(0) 
    560540    "ld1       {v0.16b}, [%0], %3              \n" 
    561541    "uaddw2    v3.8h, v3.8h, v0.16b            \n" 
     
    563543    "subs      w12, w12, #1                    \n" 
    564544    "b.gt      2b                              \n" 
    565     MEMACCESS(2) 
    566545    "st1      {v2.8h, v3.8h}, [%2], #32        \n"  // store pixels 
    567546    "add      %1, %1, #16                      \n" 
     
    579558} 
    580559 
     560// clang-format off 
    581561// TODO(Yang Zhang): Investigate less load instructions for 
    582562// the x/dx stepping 
    583 #define LOAD2_DATA8_LANE(n)                                    \ 
    584     "lsr        %5, %3, #16                    \n"             \ 
    585     "add        %6, %1, %5                    \n"              \ 
    586     "add        %3, %3, %4                     \n"             \ 
    587     MEMACCESS(6)                                               \ 
    588     "ld2        {v4.b, v5.b}["#n"], [%6]      \n" 
    589  
    590 void ScaleFilterCols_NEON(uint8* dst_ptr, const uint8* src_ptr, 
    591                           int dst_width, int x, int dx) { 
     563#define LOAD2_DATA8_LANE(n)                                 \ 
     564  "lsr        %5, %3, #16                    \n"            \ 
     565  "add        %6, %1, %5                     \n"            \ 
     566  "add        %3, %3, %4                     \n"            \ 
     567  "ld2        {v4.b, v5.b}[" #n "], [%6]     \n" 
     568// clang-format on 
     569 
     570// The NEON version mimics this formula (from row_common.cc): 
     571// #define BLENDER(a, b, f) (uint8)((int)(a) + 
     572//    ((((int)((f)) * ((int)(b) - (int)(a))) + 0x8000) >> 16)) 
     573 
     574void ScaleFilterCols_NEON(uint8* dst_ptr, 
     575                          const uint8* src_ptr, 
     576                          int dst_width, 
     577                          int x, 
     578                          int dx) { 
    592579  int dx_offset[4] = {0, 1, 2, 3}; 
    593580  int* tmp = dx_offset; 
    594581  const uint8* src_tmp = src_ptr; 
    595   int64 dst_width64 = (int64) dst_width;  // Work around ios 64 bit warning. 
    596   int64 x64 = (int64) x; 
    597   int64 dx64 = (int64) dx; 
     582  int64 x64 = (int64)x; 
     583  int64 dx64 = (int64)dx; 
    598584  asm volatile ( 
    599585    "dup        v0.4s, %w3                     \n"  // x 
     
    627613    "mul       v16.4s, v16.4s, v7.4s           \n" 
    628614    "mul       v17.4s, v17.4s, v6.4s           \n" 
    629     "shrn      v6.4h, v16.4s, #16              \n" 
    630     "shrn2     v6.8h, v17.4s, #16              \n" 
     615    "rshrn     v6.4h, v16.4s, #16              \n" 
     616    "rshrn2    v6.8h, v17.4s, #16              \n" 
    631617    "add       v4.8h, v4.8h, v6.8h             \n" 
    632618    "xtn       v4.8b, v4.8h                    \n" 
    633619 
    634     MEMACCESS(0) 
    635620    "st1       {v4.8b}, [%0], #8               \n"  // store pixels 
    636621    "add       v1.4s, v1.4s, v0.4s             \n" 
     
    640625  : "+r"(dst_ptr),          // %0 
    641626    "+r"(src_ptr),          // %1 
    642     "+r"(dst_width64),      // %2 
     627    "+r"(dst_width),        // %2 
    643628    "+r"(x64),              // %3 
    644629    "+r"(dx64),             // %4 
     
    655640// 16x2 -> 16x1 
    656641void ScaleFilterRows_NEON(uint8* dst_ptr, 
    657                           const uint8* src_ptr, ptrdiff_t src_stride, 
    658                           int dst_width, int source_y_fraction) { 
    659     int y_fraction = 256 - source_y_fraction; 
     642                          const uint8* src_ptr, 
     643                          ptrdiff_t src_stride, 
     644                          int dst_width, 
     645                          int source_y_fraction) { 
     646  int y_fraction = 256 - source_y_fraction; 
    660647  asm volatile ( 
    661648    "cmp          %w4, #0                      \n" 
     
    673660    // General purpose row blend. 
    674661  "1:                                          \n" 
    675     MEMACCESS(1) 
    676662    "ld1          {v0.16b}, [%1], #16          \n" 
    677     MEMACCESS(2) 
    678663    "ld1          {v1.16b}, [%2], #16          \n" 
    679664    "subs         %w3, %w3, #16                \n" 
     
    684669    "rshrn        v0.8b, v6.8h, #8             \n" 
    685670    "rshrn2       v0.16b, v7.8h, #8            \n" 
    686     MEMACCESS(0) 
    687671    "st1          {v0.16b}, [%0], #16          \n" 
    688672    "b.gt         1b                           \n" 
     
    691675    // Blend 25 / 75. 
    692676  "25:                                         \n" 
    693     MEMACCESS(1) 
    694677    "ld1          {v0.16b}, [%1], #16          \n" 
    695     MEMACCESS(2) 
    696678    "ld1          {v1.16b}, [%2], #16          \n" 
    697679    "subs         %w3, %w3, #16                \n" 
    698680    "urhadd       v0.16b, v0.16b, v1.16b       \n" 
    699681    "urhadd       v0.16b, v0.16b, v1.16b       \n" 
    700     MEMACCESS(0) 
    701682    "st1          {v0.16b}, [%0], #16          \n" 
    702683    "b.gt         25b                          \n" 
     
    705686    // Blend 50 / 50. 
    706687  "50:                                         \n" 
    707     MEMACCESS(1) 
    708688    "ld1          {v0.16b}, [%1], #16          \n" 
    709     MEMACCESS(2) 
    710689    "ld1          {v1.16b}, [%2], #16          \n" 
    711690    "subs         %w3, %w3, #16                \n" 
    712691    "urhadd       v0.16b, v0.16b, v1.16b       \n" 
    713     MEMACCESS(0) 
    714692    "st1          {v0.16b}, [%0], #16          \n" 
    715693    "b.gt         50b                          \n" 
     
    718696    // Blend 75 / 25. 
    719697  "75:                                         \n" 
    720     MEMACCESS(1) 
    721698    "ld1          {v1.16b}, [%1], #16          \n" 
    722     MEMACCESS(2) 
    723699    "ld1          {v0.16b}, [%2], #16          \n" 
    724700    "subs         %w3, %w3, #16                \n" 
    725701    "urhadd       v0.16b, v0.16b, v1.16b       \n" 
    726702    "urhadd       v0.16b, v0.16b, v1.16b       \n" 
    727     MEMACCESS(0) 
    728703    "st1          {v0.16b}, [%0], #16          \n" 
    729704    "b.gt         75b                          \n" 
     
    732707    // Blend 100 / 0 - Copy row unchanged. 
    733708  "100:                                        \n" 
    734     MEMACCESS(1) 
    735709    "ld1          {v0.16b}, [%1], #16          \n" 
    736710    "subs         %w3, %w3, #16                \n" 
    737     MEMACCESS(0) 
    738711    "st1          {v0.16b}, [%0], #16          \n" 
    739712    "b.gt         100b                         \n" 
    740713 
    741714  "99:                                         \n" 
    742     MEMACCESS(0) 
    743715    "st1          {v0.b}[15], [%0]             \n" 
    744716  : "+r"(dst_ptr),          // %0 
     
    753725} 
    754726 
    755 void ScaleARGBRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    756                             uint8* dst, int dst_width) { 
     727void ScaleARGBRowDown2_NEON(const uint8* src_ptr, 
     728                            ptrdiff_t src_stride, 
     729                            uint8* dst, 
     730                            int dst_width) { 
     731  (void)src_stride; 
    757732  asm volatile ( 
    758733  "1:                                          \n" 
    759734    // load even pixels into q0, odd into q1 
    760     MEMACCESS (0) 
    761735    "ld2        {v0.4s, v1.4s}, [%0], #32      \n" 
    762     MEMACCESS (0) 
    763736    "ld2        {v2.4s, v3.4s}, [%0], #32      \n" 
    764737    "subs       %w2, %w2, #8                   \n"  // 8 processed per loop 
    765     MEMACCESS (1) 
    766738    "st1        {v1.16b}, [%1], #16            \n"  // store odd pixels 
    767     MEMACCESS (1) 
    768739    "st1        {v3.16b}, [%1], #16            \n" 
    769740    "b.gt       1b                             \n" 
     
    776747} 
    777748 
    778 void ScaleARGBRowDown2Linear_NEON(const uint8* src_argb, ptrdiff_t src_stride, 
    779                                   uint8* dst_argb, int dst_width) { 
    780   asm volatile ( 
    781   "1:                                          \n" 
    782     MEMACCESS (0) 
     749void ScaleARGBRowDown2Linear_NEON(const uint8* src_argb, 
     750                                  ptrdiff_t src_stride, 
     751                                  uint8* dst_argb, 
     752                                  int dst_width) { 
     753  (void)src_stride; 
     754  asm volatile ( 
     755  "1:                                          \n" 
    783756    // load 8 ARGB pixels. 
    784757    "ld4        {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64   \n" 
     
    792765    "rshrn      v2.8b, v2.8h, #1               \n" 
    793766    "rshrn      v3.8b, v3.8h, #1               \n" 
    794     MEMACCESS (1) 
    795767    "st4        {v0.8b,v1.8b,v2.8b,v3.8b}, [%1], #32     \n" 
    796768    "b.gt       1b                             \n" 
     
    803775} 
    804776 
    805 void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 
    806                                uint8* dst, int dst_width) { 
     777void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, 
     778                               ptrdiff_t src_stride, 
     779                               uint8* dst, 
     780                               int dst_width) { 
    807781  asm volatile ( 
    808782    // change the stride to row 2 pointer 
    809783    "add        %1, %1, %0                     \n" 
    810784  "1:                                          \n" 
    811     MEMACCESS (0) 
    812785    "ld4        {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64   \n"  // load 8 ARGB pixels. 
    813786    "subs       %w3, %w3, #8                   \n"  // 8 processed per loop. 
     
    816789    "uaddlp     v2.8h, v2.16b                  \n"  // R 16 bytes -> 8 shorts. 
    817790    "uaddlp     v3.8h, v3.16b                  \n"  // A 16 bytes -> 8 shorts. 
    818     MEMACCESS (1) 
    819791    "ld4        {v16.16b,v17.16b,v18.16b,v19.16b}, [%1], #64 \n"  // load 8 more ARGB pixels. 
    820792    "uadalp     v0.8h, v16.16b                 \n"  // B 16 bytes -> 8 shorts. 
     
    826798    "rshrn      v2.8b, v2.8h, #2               \n" 
    827799    "rshrn      v3.8b, v3.8h, #2               \n" 
    828     MEMACCESS (2) 
    829800    "st4        {v0.8b,v1.8b,v2.8b,v3.8b}, [%2], #32     \n" 
    830801    "b.gt       1b                             \n" 
     
    840811// Reads 4 pixels at a time. 
    841812// Alignment requirement: src_argb 4 byte aligned. 
    842 void ScaleARGBRowDownEven_NEON(const uint8* src_argb,  ptrdiff_t src_stride, 
    843                                int src_stepx, uint8* dst_argb, int dst_width) { 
    844   asm volatile ( 
    845   "1:                                          \n" 
    846     MEMACCESS(0) 
     813void ScaleARGBRowDownEven_NEON(const uint8* src_argb, 
     814                               ptrdiff_t src_stride, 
     815                               int src_stepx, 
     816                               uint8* dst_argb, 
     817                               int dst_width) { 
     818  (void)src_stride; 
     819  asm volatile ( 
     820  "1:                                          \n" 
    847821    "ld1        {v0.s}[0], [%0], %3            \n" 
    848     MEMACCESS(0) 
    849822    "ld1        {v0.s}[1], [%0], %3            \n" 
    850     MEMACCESS(0) 
    851823    "ld1        {v0.s}[2], [%0], %3            \n" 
    852     MEMACCESS(0) 
    853824    "ld1        {v0.s}[3], [%0], %3            \n" 
    854825    "subs       %w2, %w2, #4                   \n"  // 4 pixels per loop. 
    855     MEMACCESS(1) 
    856826    "st1        {v0.16b}, [%1], #16            \n" 
    857827    "b.gt       1b                             \n" 
     
    868838// TODO(Yang Zhang): Might be worth another optimization pass in future. 
    869839// It could be upgraded to 8 pixels at a time to start with. 
    870 void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, ptrdiff_t src_stride, 
     840void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, 
     841                                  ptrdiff_t src_stride, 
    871842                                  int src_stepx, 
    872                                   uint8* dst_argb, int dst_width) { 
     843                                  uint8* dst_argb, 
     844                                  int dst_width) { 
    873845  asm volatile ( 
    874846    "add        %1, %1, %0                     \n" 
    875847  "1:                                          \n" 
    876     MEMACCESS(0) 
    877848    "ld1        {v0.8b}, [%0], %4              \n"  // Read 4 2x2 blocks -> 2x1 
    878     MEMACCESS(1) 
    879849    "ld1        {v1.8b}, [%1], %4              \n" 
    880     MEMACCESS(0) 
    881850    "ld1        {v2.8b}, [%0], %4              \n" 
    882     MEMACCESS(1) 
    883851    "ld1        {v3.8b}, [%1], %4              \n" 
    884     MEMACCESS(0) 
    885852    "ld1        {v4.8b}, [%0], %4              \n" 
    886     MEMACCESS(1) 
    887853    "ld1        {v5.8b}, [%1], %4              \n" 
    888     MEMACCESS(0) 
    889854    "ld1        {v6.8b}, [%0], %4              \n" 
    890     MEMACCESS(1) 
    891855    "ld1        {v7.8b}, [%1], %4              \n" 
    892856    "uaddl      v0.8h, v0.8b, v1.8b            \n" 
     
    905869    "rshrn2     v0.16b, v4.8h, #2              \n"  // next 2 pixels. 
    906870    "subs       %w3, %w3, #4                   \n"  // 4 pixels per loop. 
    907     MEMACCESS(2) 
    908871    "st1     {v0.16b}, [%2], #16               \n" 
    909872    "b.gt       1b                             \n" 
     
    917880} 
    918881 
     882// clang-format off 
    919883// TODO(Yang Zhang): Investigate less load instructions for 
    920884// the x/dx stepping 
    921 #define LOAD1_DATA32_LANE(vn, n)                               \ 
    922     "lsr        %5, %3, #16                    \n"             \ 
    923     "add        %6, %1, %5, lsl #2             \n"             \ 
    924     "add        %3, %3, %4                     \n"             \ 
    925     MEMACCESS(6)                                               \ 
    926     "ld1        {"#vn".s}["#n"], [%6]          \n" 
    927  
    928 void ScaleARGBCols_NEON(uint8* dst_argb, const uint8* src_argb, 
    929                         int dst_width, int x, int dx) { 
     885#define LOAD1_DATA32_LANE(vn, n)                            \ 
     886  "lsr        %5, %3, #16                    \n"            \ 
     887  "add        %6, %1, %5, lsl #2             \n"            \ 
     888  "add        %3, %3, %4                     \n"            \ 
     889  "ld1        {" #vn ".s}[" #n "], [%6]      \n" 
     890// clang-format on 
     891 
     892void ScaleARGBCols_NEON(uint8* dst_argb, 
     893                        const uint8* src_argb, 
     894                        int dst_width, 
     895                        int x, 
     896                        int dx) { 
    930897  const uint8* src_tmp = src_argb; 
    931   int64 dst_width64 = (int64) dst_width;  // Work around ios 64 bit warning. 
    932   int64 x64 = (int64) x; 
    933   int64 dx64 = (int64) dx; 
     898  int64 x64 = (int64)x; 
     899  int64 dx64 = (int64)dx; 
    934900  int64 tmp64; 
    935901  asm volatile ( 
     
    944910    LOAD1_DATA32_LANE(v1, 3) 
    945911 
    946     MEMACCESS(0) 
    947912    "st1        {v0.4s, v1.4s}, [%0], #32      \n"  // store pixels 
    948913    "subs       %w2, %w2, #8                   \n"  // 8 processed per loop 
    949     "b.gt        1b                            \n" 
     914    "b.gt       1b                             \n" 
    950915  : "+r"(dst_argb),     // %0 
    951916    "+r"(src_argb),     // %1 
    952     "+r"(dst_width64),  // %2 
     917    "+r"(dst_width),    // %2 
    953918    "+r"(x64),          // %3 
    954919    "+r"(dx64),         // %4 
     
    962927#undef LOAD1_DATA32_LANE 
    963928 
     929// clang-format off 
    964930// TODO(Yang Zhang): Investigate less load instructions for 
    965931// the x/dx stepping 
    966 #define LOAD2_DATA32_LANE(vn1, vn2, n)                         \ 
    967     "lsr        %5, %3, #16                           \n"      \ 
    968     "add        %6, %1, %5, lsl #2                    \n"      \ 
    969     "add        %3, %3, %4                            \n"      \ 
    970     MEMACCESS(6)                                               \ 
    971     "ld2        {"#vn1".s, "#vn2".s}["#n"], [%6]      \n" 
    972  
    973 void ScaleARGBFilterCols_NEON(uint8* dst_argb, const uint8* src_argb, 
    974                               int dst_width, int x, int dx) { 
     932#define LOAD2_DATA32_LANE(vn1, vn2, n)                             \ 
     933  "lsr        %5, %3, #16                           \n"            \ 
     934  "add        %6, %1, %5, lsl #2                    \n"            \ 
     935  "add        %3, %3, %4                            \n"            \ 
     936  "ld2        {" #vn1 ".s, " #vn2 ".s}[" #n "], [%6]  \n" 
     937// clang-format on 
     938 
     939void ScaleARGBFilterCols_NEON(uint8* dst_argb, 
     940                              const uint8* src_argb, 
     941                              int dst_width, 
     942                              int x, 
     943                              int dx) { 
    975944  int dx_offset[4] = {0, 1, 2, 3}; 
    976945  int* tmp = dx_offset; 
    977946  const uint8* src_tmp = src_argb; 
    978   int64 dst_width64 = (int64) dst_width;  // Work around ios 64 bit warning. 
    979   int64 x64 = (int64) x; 
    980   int64 dx64 = (int64) dx; 
     947  int64 x64 = (int64)x; 
     948  int64 dx64 = (int64)dx; 
    981949  asm volatile ( 
    982950    "dup        v0.4s, %w3                     \n"  // x 
     
    1015983    "shrn2      v0.16b, v17.8h, #7             \n" 
    1016984 
    1017     MEMACCESS(0) 
    1018985    "st1     {v0.4s}, [%0], #16                \n"  // store pixels 
    1019986    "add     v5.4s, v5.4s, v6.4s               \n" 
     
    1022989  : "+r"(dst_argb),         // %0 
    1023990    "+r"(src_argb),         // %1 
    1024     "+r"(dst_width64),      // %2 
     991    "+r"(dst_width),        // %2 
    1025992    "+r"(x64),              // %3 
    1026993    "+r"(dx64),             // %4 
Note: See TracChangeset for help on using the changeset viewer.