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/rotate_neon64.cc

    r5358 r5633  
    99 */ 
    1010 
     11#include "libyuv/rotate_row.h" 
    1112#include "libyuv/row.h" 
    12 #include "libyuv/rotate_row.h" 
    1313 
    1414#include "libyuv/basic_types.h" 
     
    2222#if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) 
    2323 
    24 static uvec8 kVTbl4x4Transpose = 
    25   { 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 }; 
    26  
    27 void TransposeWx8_NEON(const uint8* src, int src_stride, 
    28                        uint8* dst, int dst_stride, int width) { 
     24static uvec8 kVTbl4x4Transpose = {0, 4, 8,  12, 1, 5, 9,  13, 
     25                                  2, 6, 10, 14, 3, 7, 11, 15}; 
     26 
     27void TransposeWx8_NEON(const uint8* src, 
     28                       int src_stride, 
     29                       uint8* dst, 
     30                       int dst_stride, 
     31                       int width) { 
    2932  const uint8* src_temp; 
    30   int64 width64 = (int64) width;  // Work around clang 3.4 warning. 
    3133  asm volatile ( 
    3234    // loops are on blocks of 8. loop will stop when 
    3335    // counter gets to or below 0. starting the counter 
    3436    // at w-8 allow for this 
    35     "sub         %3, %3, #8                      \n" 
     37    "sub         %w3, %w3, #8                     \n" 
    3638 
    3739    // handle 8x8 blocks. this should be the majority of the plane 
     
    3941      "mov         %0, %1                        \n" 
    4042 
    41       MEMACCESS(0) 
    4243      "ld1        {v0.8b}, [%0], %5              \n" 
    43       MEMACCESS(0) 
    4444      "ld1        {v1.8b}, [%0], %5              \n" 
    45       MEMACCESS(0) 
    4645      "ld1        {v2.8b}, [%0], %5              \n" 
    47       MEMACCESS(0) 
    4846      "ld1        {v3.8b}, [%0], %5              \n" 
    49       MEMACCESS(0) 
    5047      "ld1        {v4.8b}, [%0], %5              \n" 
    51       MEMACCESS(0) 
    5248      "ld1        {v5.8b}, [%0], %5              \n" 
    53       MEMACCESS(0) 
    5449      "ld1        {v6.8b}, [%0], %5              \n" 
    55       MEMACCESS(0) 
    5650      "ld1        {v7.8b}, [%0]                  \n" 
    5751 
     
    8579      "mov         %0, %2                        \n" 
    8680 
    87     MEMACCESS(0) 
    8881      "st1      {v17.8b}, [%0], %6               \n" 
    89     MEMACCESS(0) 
    9082      "st1      {v16.8b}, [%0], %6               \n" 
    91     MEMACCESS(0) 
    9283      "st1      {v19.8b}, [%0], %6               \n" 
    93     MEMACCESS(0) 
    9484      "st1      {v18.8b}, [%0], %6               \n" 
    95     MEMACCESS(0) 
    9685      "st1      {v21.8b}, [%0], %6               \n" 
    97     MEMACCESS(0) 
    9886      "st1      {v20.8b}, [%0], %6               \n" 
    99     MEMACCESS(0) 
    10087      "st1      {v23.8b}, [%0], %6               \n" 
    101     MEMACCESS(0) 
    10288      "st1      {v22.8b}, [%0]                   \n" 
    10389 
    10490      "add         %1, %1, #8                    \n"  // src += 8 
    10591      "add         %2, %2, %6, lsl #3            \n"  // dst += 8 * dst_stride 
    106       "subs        %3, %3, #8                    \n"  // w   -= 8 
     92      "subs        %w3, %w3, #8                  \n"  // w   -= 8 
    10793      "b.ge        1b                            \n" 
    10894 
    10995    // add 8 back to counter. if the result is 0 there are 
    11096    // no residuals. 
    111     "adds        %3, %3, #8                      \n" 
     97    "adds        %w3, %w3, #8                    \n" 
    11298    "b.eq        4f                              \n" 
    11399 
    114100    // some residual, so between 1 and 7 lines left to transpose 
    115     "cmp         %3, #2                          \n" 
     101    "cmp         %w3, #2                          \n" 
    116102    "b.lt        3f                              \n" 
    117103 
    118     "cmp         %3, #4                          \n" 
     104    "cmp         %w3, #4                          \n" 
    119105    "b.lt        2f                              \n" 
    120106 
    121107    // 4x8 block 
    122108    "mov         %0, %1                          \n" 
    123     MEMACCESS(0) 
    124109    "ld1     {v0.s}[0], [%0], %5                 \n" 
    125     MEMACCESS(0) 
    126110    "ld1     {v0.s}[1], [%0], %5                 \n" 
    127     MEMACCESS(0) 
    128111    "ld1     {v0.s}[2], [%0], %5                 \n" 
    129     MEMACCESS(0) 
    130112    "ld1     {v0.s}[3], [%0], %5                 \n" 
    131     MEMACCESS(0) 
    132113    "ld1     {v1.s}[0], [%0], %5                 \n" 
    133     MEMACCESS(0) 
    134114    "ld1     {v1.s}[1], [%0], %5                 \n" 
    135     MEMACCESS(0) 
    136115    "ld1     {v1.s}[2], [%0], %5                 \n" 
    137     MEMACCESS(0) 
    138116    "ld1     {v1.s}[3], [%0]                     \n" 
    139117 
    140118    "mov         %0, %2                          \n" 
    141119 
    142     MEMACCESS(4) 
    143120    "ld1      {v2.16b}, [%4]                     \n" 
    144121 
     
    148125    // TODO(frkoenig): Rework shuffle above to 
    149126    // write out with 4 instead of 8 writes. 
    150     MEMACCESS(0) 
    151127    "st1 {v3.s}[0], [%0], %6                     \n" 
    152     MEMACCESS(0) 
    153128    "st1 {v3.s}[1], [%0], %6                     \n" 
    154     MEMACCESS(0) 
    155129    "st1 {v3.s}[2], [%0], %6                     \n" 
    156     MEMACCESS(0) 
    157130    "st1 {v3.s}[3], [%0]                         \n" 
    158131 
    159132    "add         %0, %2, #4                      \n" 
    160     MEMACCESS(0) 
    161133    "st1 {v0.s}[0], [%0], %6                     \n" 
    162     MEMACCESS(0) 
    163134    "st1 {v0.s}[1], [%0], %6                     \n" 
    164     MEMACCESS(0) 
    165135    "st1 {v0.s}[2], [%0], %6                     \n" 
    166     MEMACCESS(0) 
    167136    "st1 {v0.s}[3], [%0]                         \n" 
    168137 
    169138    "add         %1, %1, #4                      \n"  // src += 4 
    170139    "add         %2, %2, %6, lsl #2              \n"  // dst += 4 * dst_stride 
    171     "subs        %3, %3, #4                      \n"  // w   -= 4 
     140    "subs        %w3, %w3, #4                    \n"  // w   -= 4 
    172141    "b.eq        4f                              \n" 
    173142 
    174143    // some residual, check to see if it includes a 2x8 block, 
    175144    // or less 
    176     "cmp         %3, #2                          \n" 
     145    "cmp         %w3, #2                         \n" 
    177146    "b.lt        3f                              \n" 
    178147 
     
    180149    "2:                                          \n" 
    181150    "mov         %0, %1                          \n" 
    182     MEMACCESS(0) 
    183151    "ld1     {v0.h}[0], [%0], %5                 \n" 
    184     MEMACCESS(0) 
    185152    "ld1     {v1.h}[0], [%0], %5                 \n" 
    186     MEMACCESS(0) 
    187153    "ld1     {v0.h}[1], [%0], %5                 \n" 
    188     MEMACCESS(0) 
    189154    "ld1     {v1.h}[1], [%0], %5                 \n" 
    190     MEMACCESS(0) 
    191155    "ld1     {v0.h}[2], [%0], %5                 \n" 
    192     MEMACCESS(0) 
    193156    "ld1     {v1.h}[2], [%0], %5                 \n" 
    194     MEMACCESS(0) 
    195157    "ld1     {v0.h}[3], [%0], %5                 \n" 
    196     MEMACCESS(0) 
    197158    "ld1     {v1.h}[3], [%0]                     \n" 
    198159 
     
    202163    "mov         %0, %2                          \n" 
    203164 
    204     MEMACCESS(0) 
    205165    "st1     {v3.8b}, [%0], %6                   \n" 
    206     MEMACCESS(0) 
    207166    "st1     {v2.8b}, [%0]                       \n" 
    208167 
    209168    "add         %1, %1, #2                      \n"  // src += 2 
    210169    "add         %2, %2, %6, lsl #1              \n"  // dst += 2 * dst_stride 
    211     "subs        %3, %3,  #2                     \n"  // w   -= 2 
     170    "subs        %w3, %w3,  #2                   \n"  // w   -= 2 
    212171    "b.eq        4f                              \n" 
    213172 
    214173    // 1x8 block 
    215174    "3:                                          \n" 
    216     MEMACCESS(1) 
    217175    "ld1         {v0.b}[0], [%1], %5             \n" 
    218     MEMACCESS(1) 
    219176    "ld1         {v0.b}[1], [%1], %5             \n" 
    220     MEMACCESS(1) 
    221177    "ld1         {v0.b}[2], [%1], %5             \n" 
    222     MEMACCESS(1) 
    223178    "ld1         {v0.b}[3], [%1], %5             \n" 
    224     MEMACCESS(1) 
    225179    "ld1         {v0.b}[4], [%1], %5             \n" 
    226     MEMACCESS(1) 
    227180    "ld1         {v0.b}[5], [%1], %5             \n" 
    228     MEMACCESS(1) 
    229181    "ld1         {v0.b}[6], [%1], %5             \n" 
    230     MEMACCESS(1) 
    231182    "ld1         {v0.b}[7], [%1]                 \n" 
    232183 
    233     MEMACCESS(2) 
    234184    "st1         {v0.8b}, [%2]                   \n" 
    235185 
     
    239189      "+r"(src),                                  // %1 
    240190      "+r"(dst),                                  // %2 
    241       "+r"(width64)                               // %3 
     191      "+r"(width                               // %3 
    242192    : "r"(&kVTbl4x4Transpose),                    // %4 
    243193      "r"(static_cast<ptrdiff_t>(src_stride)),    // %5 
     
    248198} 
    249199 
    250 static uint8 kVTbl4x4TransposeDi[32] = 
    251   { 0,  16, 32, 48,  2, 18, 34, 50,  4, 20, 36, 52,  6, 22, 38, 54, 
    252     1,  17, 33, 49,  3, 19, 35, 51,  5, 21, 37, 53,  7, 23, 39, 55}; 
    253  
    254 void TransposeUVWx8_NEON(const uint8* src, int src_stride, 
    255                          uint8* dst_a, int dst_stride_a, 
    256                          uint8* dst_b, int dst_stride_b, 
     200static uint8 kVTbl4x4TransposeDi[32] = { 
     201    0, 16, 32, 48, 2, 18, 34, 50, 4, 20, 36, 52, 6, 22, 38, 54, 
     202    1, 17, 33, 49, 3, 19, 35, 51, 5, 21, 37, 53, 7, 23, 39, 55}; 
     203 
     204void TransposeUVWx8_NEON(const uint8* src, 
     205                         int src_stride, 
     206                         uint8* dst_a, 
     207                         int dst_stride_a, 
     208                         uint8* dst_b, 
     209                         int dst_stride_b, 
    257210                         int width) { 
    258211  const uint8* src_temp; 
    259   int64 width64 = (int64) width;  // Work around clang 3.4 warning. 
    260212  asm volatile ( 
    261213    // loops are on blocks of 8. loop will stop when 
    262214    // counter gets to or below 0. starting the counter 
    263215    // at w-8 allow for this 
    264     "sub       %4, %4, #8                      \n" 
     216    "sub       %w4, %w4, #8                    \n" 
    265217 
    266218    // handle 8x8 blocks. this should be the majority of the plane 
     
    268220    "mov       %0, %1                          \n" 
    269221 
    270     MEMACCESS(0) 
    271222    "ld1       {v0.16b}, [%0], %5              \n" 
    272     MEMACCESS(0) 
    273223    "ld1       {v1.16b}, [%0], %5              \n" 
    274     MEMACCESS(0) 
    275224    "ld1       {v2.16b}, [%0], %5              \n" 
    276     MEMACCESS(0) 
    277225    "ld1       {v3.16b}, [%0], %5              \n" 
    278     MEMACCESS(0) 
    279226    "ld1       {v4.16b}, [%0], %5              \n" 
    280     MEMACCESS(0) 
    281227    "ld1       {v5.16b}, [%0], %5              \n" 
    282     MEMACCESS(0) 
    283228    "ld1       {v6.16b}, [%0], %5              \n" 
    284     MEMACCESS(0) 
    285229    "ld1       {v7.16b}, [%0]                  \n" 
    286230 
     
    314258    "mov       %0, %2                          \n" 
    315259 
    316     MEMACCESS(0) 
    317260    "st1       {v16.d}[0], [%0], %6            \n" 
    318     MEMACCESS(0) 
    319261    "st1       {v18.d}[0], [%0], %6            \n" 
    320     MEMACCESS(0) 
    321262    "st1       {v17.d}[0], [%0], %6            \n" 
    322     MEMACCESS(0) 
    323263    "st1       {v19.d}[0], [%0], %6            \n" 
    324     MEMACCESS(0) 
    325264    "st1       {v16.d}[1], [%0], %6            \n" 
    326     MEMACCESS(0) 
    327265    "st1       {v18.d}[1], [%0], %6            \n" 
    328     MEMACCESS(0) 
    329266    "st1       {v17.d}[1], [%0], %6            \n" 
    330     MEMACCESS(0) 
    331267    "st1       {v19.d}[1], [%0]                \n" 
    332268 
    333269    "mov       %0, %3                          \n" 
    334270 
    335     MEMACCESS(0) 
    336271    "st1       {v20.d}[0], [%0], %7            \n" 
    337     MEMACCESS(0) 
    338272    "st1       {v22.d}[0], [%0], %7            \n" 
    339     MEMACCESS(0) 
    340273    "st1       {v21.d}[0], [%0], %7            \n" 
    341     MEMACCESS(0) 
    342274    "st1       {v23.d}[0], [%0], %7            \n" 
    343     MEMACCESS(0) 
    344275    "st1       {v20.d}[1], [%0], %7            \n" 
    345     MEMACCESS(0) 
    346276    "st1       {v22.d}[1], [%0], %7            \n" 
    347     MEMACCESS(0) 
    348277    "st1       {v21.d}[1], [%0], %7            \n" 
    349     MEMACCESS(0) 
    350278    "st1       {v23.d}[1], [%0]                \n" 
    351279 
     
    353281    "add       %2, %2, %6, lsl #3              \n"  // dst_a += 8 * dst_stride_a 
    354282    "add       %3, %3, %7, lsl #3              \n"  // dst_b += 8 * dst_stride_b 
    355     "subs      %4, %4,  #8                     \n"  // w     -= 8 
     283    "subs      %w4, %w4,  #8                   \n"  // w     -= 8 
    356284    "b.ge      1b                              \n" 
    357285 
    358286    // add 8 back to counter. if the result is 0 there are 
    359287    // no residuals. 
    360     "adds      %4, %4, #8                      \n" 
     288    "adds      %w4, %w4, #8                    \n" 
    361289    "b.eq      4f                              \n" 
    362290 
    363291    // some residual, so between 1 and 7 lines left to transpose 
    364     "cmp       %4, #2                          \n" 
     292    "cmp       %w4, #2                         \n" 
    365293    "b.lt      3f                              \n" 
    366294 
    367     "cmp       %4, #4                          \n" 
     295    "cmp       %w4, #4                         \n" 
    368296    "b.lt      2f                              \n" 
    369297 
     
    371299    // 4x8 block 
    372300    "mov       %0, %1                          \n" 
    373     MEMACCESS(0) 
    374301    "ld1       {v0.8b}, [%0], %5               \n" 
    375     MEMACCESS(0) 
    376302    "ld1       {v1.8b}, [%0], %5               \n" 
    377     MEMACCESS(0) 
    378303    "ld1       {v2.8b}, [%0], %5               \n" 
    379     MEMACCESS(0) 
    380304    "ld1       {v3.8b}, [%0], %5               \n" 
    381     MEMACCESS(0) 
    382305    "ld1       {v4.8b}, [%0], %5               \n" 
    383     MEMACCESS(0) 
    384306    "ld1       {v5.8b}, [%0], %5               \n" 
    385     MEMACCESS(0) 
    386307    "ld1       {v6.8b}, [%0], %5               \n" 
    387     MEMACCESS(0) 
    388308    "ld1       {v7.8b}, [%0]                   \n" 
    389309 
    390     MEMACCESS(8) 
    391310    "ld1       {v30.16b}, [%8], #16            \n" 
    392311    "ld1       {v31.16b}, [%8]                 \n" 
     
    399318    "mov       %0, %2                          \n" 
    400319 
    401     MEMACCESS(0) 
    402320    "st1       {v16.s}[0],  [%0], %6           \n" 
    403     MEMACCESS(0) 
    404321    "st1       {v16.s}[1],  [%0], %6           \n" 
    405     MEMACCESS(0) 
    406322    "st1       {v16.s}[2],  [%0], %6           \n" 
    407     MEMACCESS(0) 
    408323    "st1       {v16.s}[3],  [%0], %6           \n" 
    409324 
    410325    "add       %0, %2, #4                      \n" 
    411     MEMACCESS(0) 
    412326    "st1       {v18.s}[0], [%0], %6            \n" 
    413     MEMACCESS(0) 
    414327    "st1       {v18.s}[1], [%0], %6            \n" 
    415     MEMACCESS(0) 
    416328    "st1       {v18.s}[2], [%0], %6            \n" 
    417     MEMACCESS(0) 
    418329    "st1       {v18.s}[3], [%0]                \n" 
    419330 
    420331    "mov       %0, %3                          \n" 
    421332 
    422     MEMACCESS(0) 
    423333    "st1       {v17.s}[0], [%0], %7            \n" 
    424     MEMACCESS(0) 
    425334    "st1       {v17.s}[1], [%0], %7            \n" 
    426     MEMACCESS(0) 
    427335    "st1       {v17.s}[2], [%0], %7            \n" 
    428     MEMACCESS(0) 
    429336    "st1       {v17.s}[3], [%0], %7            \n" 
    430337 
    431338    "add       %0, %3, #4                      \n" 
    432     MEMACCESS(0) 
    433339    "st1       {v19.s}[0],  [%0], %7           \n" 
    434     MEMACCESS(0) 
    435340    "st1       {v19.s}[1],  [%0], %7           \n" 
    436     MEMACCESS(0) 
    437341    "st1       {v19.s}[2],  [%0], %7           \n" 
    438     MEMACCESS(0) 
    439342    "st1       {v19.s}[3],  [%0]               \n" 
    440343 
     
    442345    "add       %2, %2, %6, lsl #2              \n"  // dst_a += 4 * dst_stride_a 
    443346    "add       %3, %3, %7, lsl #2              \n"  // dst_b += 4 * dst_stride_b 
    444     "subs      %4,  %4,  #4                    \n"  // w     -= 4 
     347    "subs      %w4,  %w4,  #4                  \n"  // w     -= 4 
    445348    "b.eq      4f                              \n" 
    446349 
    447350    // some residual, check to see if it includes a 2x8 block, 
    448351    // or less 
    449     "cmp       %4, #2                          \n" 
     352    "cmp       %w4, #2                         \n" 
    450353    "b.lt      3f                              \n" 
    451354 
     
    453356    "2:                                        \n" 
    454357    "mov       %0, %1                          \n" 
    455     MEMACCESS(0) 
    456358    "ld2       {v0.h, v1.h}[0], [%0], %5       \n" 
    457     MEMACCESS(0) 
    458359    "ld2       {v2.h, v3.h}[0], [%0], %5       \n" 
    459     MEMACCESS(0) 
    460360    "ld2       {v0.h, v1.h}[1], [%0], %5       \n" 
    461     MEMACCESS(0) 
    462361    "ld2       {v2.h, v3.h}[1], [%0], %5       \n" 
    463     MEMACCESS(0) 
    464362    "ld2       {v0.h, v1.h}[2], [%0], %5       \n" 
    465     MEMACCESS(0) 
    466363    "ld2       {v2.h, v3.h}[2], [%0], %5       \n" 
    467     MEMACCESS(0) 
    468364    "ld2       {v0.h, v1.h}[3], [%0], %5       \n" 
    469     MEMACCESS(0) 
    470365    "ld2       {v2.h, v3.h}[3], [%0]           \n" 
    471366 
     
    477372    "mov       %0, %2                          \n" 
    478373 
    479     MEMACCESS(0) 
    480374    "st1       {v4.d}[0], [%0], %6             \n" 
    481     MEMACCESS(0) 
    482375    "st1       {v6.d}[0], [%0]                 \n" 
    483376 
    484377    "mov       %0, %3                          \n" 
    485378 
    486     MEMACCESS(0) 
    487379    "st1       {v5.d}[0], [%0], %7             \n" 
    488     MEMACCESS(0) 
    489380    "st1       {v7.d}[0], [%0]                 \n" 
    490381 
     
    492383    "add       %2, %2, %6, lsl #1              \n"  // dst_a += 2 * dst_stride_a 
    493384    "add       %3, %3, %7, lsl #1              \n"  // dst_b += 2 * dst_stride_b 
    494     "subs      %4,  %4,  #2                    \n"  // w     -= 2 
     385    "subs      %w4,  %w4,  #2                  \n"  // w     -= 2 
    495386    "b.eq      4f                              \n" 
    496387 
    497388    // 1x8 block 
    498389    "3:                                        \n" 
    499     MEMACCESS(1) 
    500390    "ld2       {v0.b, v1.b}[0], [%1], %5       \n" 
    501     MEMACCESS(1) 
    502391    "ld2       {v0.b, v1.b}[1], [%1], %5       \n" 
    503     MEMACCESS(1) 
    504392    "ld2       {v0.b, v1.b}[2], [%1], %5       \n" 
    505     MEMACCESS(1) 
    506393    "ld2       {v0.b, v1.b}[3], [%1], %5       \n" 
    507     MEMACCESS(1) 
    508394    "ld2       {v0.b, v1.b}[4], [%1], %5       \n" 
    509     MEMACCESS(1) 
    510395    "ld2       {v0.b, v1.b}[5], [%1], %5       \n" 
    511     MEMACCESS(1) 
    512396    "ld2       {v0.b, v1.b}[6], [%1], %5       \n" 
    513     MEMACCESS(1) 
    514397    "ld2       {v0.b, v1.b}[7], [%1]           \n" 
    515398 
    516     MEMACCESS(2) 
    517399    "st1       {v0.d}[0], [%2]                 \n" 
    518     MEMACCESS(3) 
    519400    "st1       {v1.d}[0], [%3]                 \n" 
    520401 
     
    525406      "+r"(dst_a),                                // %2 
    526407      "+r"(dst_b),                                // %3 
    527       "+r"(width64)                               // %4 
     408      "+r"(width                               // %4 
    528409    : "r"(static_cast<ptrdiff_t>(src_stride)),    // %5 
    529410      "r"(static_cast<ptrdiff_t>(dst_stride_a)),  // %6 
Note: See TracChangeset for help on using the changeset viewer.