diff options
author | Android Chromium Automerger <chromium-automerger@android> | 2014-04-22 01:37:59 +0000 |
---|---|---|
committer | Android Chromium Automerger <chromium-automerger@android> | 2014-04-22 01:37:59 +0000 |
commit | 570d24043d234855229608571cbe445b3ac16b51 (patch) | |
tree | a7c88aa146b55940a5d548e9139f5926c8218088 | |
parent | b68f3551ec914148504e56752b9c8637bb92053a (diff) | |
parent | 05c4c715090dd1ffdd3b9bbc52cc078e6398ac3a (diff) | |
download | libyuv-570d24043d234855229608571cbe445b3ac16b51.tar.gz |
Merge third_party/libyuv from https://chromium.googlesource.com/external/libyuv.git at 05c4c715090dd1ffdd3b9bbc52cc078e6398ac3a
This commit was generated by merge_from_chromium.py.
Change-Id: I80d2926194f03a56293a8ba0df723183046b0393
-rw-r--r-- | DEPS | 32 | ||||
-rw-r--r-- | README.chromium | 2 | ||||
-rw-r--r-- | download_vs_toolchain.py | 29 | ||||
-rwxr-xr-x | gyp_libyuv | 11 | ||||
-rw-r--r-- | include/libyuv/version.h | 2 | ||||
-rw-r--r-- | source/rotate_neon.cc | 396 |
6 files changed, 258 insertions, 214 deletions
@@ -14,7 +14,7 @@ vars = { "chromium_trunk" : "http://src.chromium.org/svn/trunk", # chrome://version/ for revision of canary Chrome. # http://chromium-status.appspot.com/lkgr is a last known good revision. - "chromium_revision": "255773", + "chromium_revision": "262938", } # NOTE: Prefer revision numbers to tags for svn deps. Use http rather than @@ -58,6 +58,9 @@ deps = { "tools/win/supalink": Var("chromium_trunk") + "/src/tools/win/supalink@" + Var("chromium_revision"), + "third_party/binutils": + Var("chromium_trunk") + "/src/third_party/binutils@" + Var("chromium_revision"), + "third_party/libjpeg_turbo": From("chromium_deps", "src/third_party/libjpeg_turbo"), @@ -84,10 +87,6 @@ deps_os = { "tools/find_depot_tools": File(Var("chromium_trunk") + "/src/tools/find_depot_tools.py@" + Var("chromium_revision")), }, - "unix": { - "third_party/gold": - From("chromium_deps", "src/third_party/gold"), - }, "android": { "third_party/android_tools": From("chromium_deps", "src/third_party/android_tools"), @@ -125,7 +124,7 @@ hooks = [ # Pull GN binaries. This needs to be before running GYP below. { "name": "gn_win", - "pattern": "tools/gn/bin/win/gn.exe.sha1", + "pattern": ".", "action": [ "download_from_google_storage", "--no_resume", "--platform=win32", @@ -136,7 +135,7 @@ hooks = [ }, { "name": "gn_mac", - "pattern": "tools/gn/bin/mac/gn.sha1", + "pattern": ".", "action": [ "download_from_google_storage", "--no_resume", "--platform=darwin", @@ -147,7 +146,7 @@ hooks = [ }, { "name": "gn_linux", - "pattern": "tools/gn/bin/linux/gn.sha1", + "pattern": ".", "action": [ "download_from_google_storage", "--no_resume", "--platform=linux*", @@ -158,7 +157,7 @@ hooks = [ }, { "name": "gn_linux32", - "pattern": "tools/gn/bin/linux/gn32.sha1", + "pattern": ".", "action": [ "download_from_google_storage", "--no_resume", "--platform=linux*", @@ -172,7 +171,20 @@ hooks = [ # zero seconds to run. If something changed, it downloads a prebuilt clang. "pattern": ".", "action": ["python", Var("root_dir") + "/tools/clang/scripts/update.py", - "--mac-only"], + "--if-needed"], + }, + { + # Update the Windows toolchain if necessary. + "name": "win_toolchain", + "pattern": ".", + "action": ["python", Var("root_dir") + "/download_vs_toolchain.py", + "update"], + }, + { + # Pull binutils for gold. + "name": "binutils", + "pattern": ".", + "action": ["python", Var("root_dir") + "/third_party/binutils/download.py"], }, { # A change to a .gyp, .gypi, or to GYP itself should run the generator. diff --git a/README.chromium b/README.chromium index 4af41b4..d0363f5 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 994 +Version: 1000 License: BSD License File: LICENSE diff --git a/download_vs_toolchain.py b/download_vs_toolchain.py new file mode 100644 index 0000000..4b34578 --- /dev/null +++ b/download_vs_toolchain.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# +# Copyright 2014 The LibYuv Project Authors. All rights reserved. +# +# Use of this source code is governed by a BSD-style license +# that can be found in the LICENSE file in the root of the source +# tree. An additional intellectual property rights grant can be found +# in the file PATENTS. All contributing project authors may +# be found in the AUTHORS file in the root of the source tree. + +# This script is used to run the vs_toolchain.py script to download the +# Visual Studio toolchain. It's just a temporary measure while waiting for the +# Chrome team to move find_depot_tools into src/build to get rid of these +# workarounds (similar one in gyp_libyuv). + +import os +import sys + + +checkout_root = os.path.dirname(os.path.realpath(__file__)) +sys.path.insert(0, os.path.join(checkout_root, 'build')) +sys.path.insert(0, os.path.join(checkout_root, 'tools', 'find_depot_tools')) + + +import vs_toolchain + + +if __name__ == '__main__': + sys.exit(vs_toolchain.main()) @@ -22,6 +22,7 @@ sys.path.insert(0, os.path.join(checkout_root, 'build')) sys.path.insert(0, os.path.join(checkout_root, 'tools', 'find_depot_tools')) import gyp_chromium import gyp_helper +import vs_toolchain sys.path.insert(0, os.path.join(checkout_root, 'tools', 'gyp', 'pylib')) import gyp @@ -49,22 +50,20 @@ if __name__ == '__main__': if not os.environ.get('GYP_GENERATORS'): os.environ['GYP_GENERATORS'] = 'ninja' - vs2013_runtime_dll_dirs = gyp_chromium.DownloadVsToolChain() + vs2013_runtime_dll_dirs = vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs() # Enforce gyp syntax checking. This adds about 20% execution time. args.append('--check') supplemental_includes = gyp_chromium.GetSupplementalFiles() - gn_vars_dict = gyp_chromium.GetGypVarsForGN(supplemental_includes) + gyp_vars_dict = gyp_chromium.GetGypVars(supplemental_includes) # Automatically turn on crosscompile support for platforms that need it. if all(('ninja' in os.environ.get('GYP_GENERATORS', ''), - gn_vars_dict.get('OS') in ['android', 'ios'], + gyp_vars_dict.get('OS') in ['android', 'ios'], 'GYP_CROSSCOMPILE' not in os.environ)): os.environ['GYP_CROSSCOMPILE'] = '1' - if not gyp_chromium.RunGN(gn_vars_dict): - sys.exit(1) args.extend(['-I' + i for i in gyp_chromium.additional_include_files(supplemental_includes, args)]) @@ -80,7 +79,7 @@ if __name__ == '__main__': if vs2013_runtime_dll_dirs: x64_runtime, x86_runtime = vs2013_runtime_dll_dirs - gyp_chromium.CopyVsRuntimeDlls( + vs_toolchain.CopyVsRuntimeDlls( os.path.join(checkout_root, gyp_chromium.GetOutputDirectory()), (x86_runtime, x64_runtime)) diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 52f2999..a61c45f 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 994 +#define LIBYUV_VERSION 1000 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/source/rotate_neon.cc b/source/rotate_neon.cc index a59c4d5..15ca335 100644 --- a/source/rotate_neon.cc +++ b/source/rotate_neon.cc @@ -24,25 +24,26 @@ static uvec8 kVTbl4x4Transpose = void TransposeWx8_NEON(const uint8* src, int src_stride, uint8* dst, int dst_stride, int width) { + const uint8* src_temp = NULL; asm volatile ( // loops are on blocks of 8. loop will stop when // counter gets to or below 0. starting the counter // at w-8 allow for this - "sub %4, #8 \n" + "sub %5, #8 \n" // handle 8x8 blocks. this should be the majority of the plane ".p2align 2 \n" "1: \n" - "mov r9, %0 \n" + "mov %0, %1 \n" - "vld1.8 {d0}, [r9], %1 \n" - "vld1.8 {d1}, [r9], %1 \n" - "vld1.8 {d2}, [r9], %1 \n" - "vld1.8 {d3}, [r9], %1 \n" - "vld1.8 {d4}, [r9], %1 \n" - "vld1.8 {d5}, [r9], %1 \n" - "vld1.8 {d6}, [r9], %1 \n" - "vld1.8 {d7}, [r9] \n" + "vld1.8 {d0}, [%0], %2 \n" + "vld1.8 {d1}, [%0], %2 \n" + "vld1.8 {d2}, [%0], %2 \n" + "vld1.8 {d3}, [%0], %2 \n" + "vld1.8 {d4}, [%0], %2 \n" + "vld1.8 {d5}, [%0], %2 \n" + "vld1.8 {d6}, [%0], %2 \n" + "vld1.8 {d7}, [%0] \n" "vtrn.8 d1, d0 \n" "vtrn.8 d3, d2 \n" @@ -64,48 +65,48 @@ void TransposeWx8_NEON(const uint8* src, int src_stride, "vrev16.8 q2, q2 \n" "vrev16.8 q3, q3 \n" - "mov r9, %2 \n" + "mov %0, %3 \n" - "vst1.8 {d1}, [r9], %3 \n" - "vst1.8 {d0}, [r9], %3 \n" - "vst1.8 {d3}, [r9], %3 \n" - "vst1.8 {d2}, [r9], %3 \n" - "vst1.8 {d5}, [r9], %3 \n" - "vst1.8 {d4}, [r9], %3 \n" - "vst1.8 {d7}, [r9], %3 \n" - "vst1.8 {d6}, [r9] \n" + "vst1.8 {d1}, [%0], %4 \n" + "vst1.8 {d0}, [%0], %4 \n" + "vst1.8 {d3}, [%0], %4 \n" + "vst1.8 {d2}, [%0], %4 \n" + "vst1.8 {d5}, [%0], %4 \n" + "vst1.8 {d4}, [%0], %4 \n" + "vst1.8 {d7}, [%0], %4 \n" + "vst1.8 {d6}, [%0] \n" - "add %0, #8 \n" // src += 8 - "add %2, %2, %3, lsl #3 \n" // dst += 8 * dst_stride - "subs %4, #8 \n" // w -= 8 + "add %1, #8 \n" // src += 8 + "add %3, %3, %4, lsl #3 \n" // dst += 8 * dst_stride + "subs %5, #8 \n" // w -= 8 "bge 1b \n" // add 8 back to counter. if the result is 0 there are // no residuals. - "adds %4, #8 \n" + "adds %5, #8 \n" "beq 4f \n" // some residual, so between 1 and 7 lines left to transpose - "cmp %4, #2 \n" + "cmp %5, #2 \n" "blt 3f \n" - "cmp %4, #4 \n" + "cmp %5, #4 \n" "blt 2f \n" // 4x8 block - "mov r9, %0 \n" - "vld1.32 {d0[0]}, [r9], %1 \n" - "vld1.32 {d0[1]}, [r9], %1 \n" - "vld1.32 {d1[0]}, [r9], %1 \n" - "vld1.32 {d1[1]}, [r9], %1 \n" - "vld1.32 {d2[0]}, [r9], %1 \n" - "vld1.32 {d2[1]}, [r9], %1 \n" - "vld1.32 {d3[0]}, [r9], %1 \n" - "vld1.32 {d3[1]}, [r9] \n" + "mov %0, %1 \n" + "vld1.32 {d0[0]}, [%0], %2 \n" + "vld1.32 {d0[1]}, [%0], %2 \n" + "vld1.32 {d1[0]}, [%0], %2 \n" + "vld1.32 {d1[1]}, [%0], %2 \n" + "vld1.32 {d2[0]}, [%0], %2 \n" + "vld1.32 {d2[1]}, [%0], %2 \n" + "vld1.32 {d3[0]}, [%0], %2 \n" + "vld1.32 {d3[1]}, [%0] \n" - "mov r9, %2 \n" + "mov %0, %3 \n" - "vld1.8 {q3}, [%5] \n" + "vld1.8 {q3}, [%6] \n" "vtbl.8 d4, {d0, d1}, d6 \n" "vtbl.8 d5, {d0, d1}, d7 \n" @@ -114,73 +115,74 @@ void TransposeWx8_NEON(const uint8* src, int src_stride, // TODO(frkoenig): Rework shuffle above to // write out with 4 instead of 8 writes. - "vst1.32 {d4[0]}, [r9], %3 \n" - "vst1.32 {d4[1]}, [r9], %3 \n" - "vst1.32 {d5[0]}, [r9], %3 \n" - "vst1.32 {d5[1]}, [r9] \n" - - "add r9, %2, #4 \n" - "vst1.32 {d0[0]}, [r9], %3 \n" - "vst1.32 {d0[1]}, [r9], %3 \n" - "vst1.32 {d1[0]}, [r9], %3 \n" - "vst1.32 {d1[1]}, [r9] \n" - - "add %0, #4 \n" // src += 4 - "add %2, %2, %3, lsl #2 \n" // dst += 4 * dst_stride - "subs %4, #4 \n" // w -= 4 + "vst1.32 {d4[0]}, [%0], %4 \n" + "vst1.32 {d4[1]}, [%0], %4 \n" + "vst1.32 {d5[0]}, [%0], %4 \n" + "vst1.32 {d5[1]}, [%0] \n" + + "add %0, %3, #4 \n" + "vst1.32 {d0[0]}, [%0], %4 \n" + "vst1.32 {d0[1]}, [%0], %4 \n" + "vst1.32 {d1[0]}, [%0], %4 \n" + "vst1.32 {d1[1]}, [%0] \n" + + "add %1, #4 \n" // src += 4 + "add %3, %3, %4, lsl #2 \n" // dst += 4 * dst_stride + "subs %5, #4 \n" // w -= 4 "beq 4f \n" // some residual, check to see if it includes a 2x8 block, // or less - "cmp %4, #2 \n" + "cmp %5, #2 \n" "blt 3f \n" // 2x8 block "2: \n" - "mov r9, %0 \n" - "vld1.16 {d0[0]}, [r9], %1 \n" - "vld1.16 {d1[0]}, [r9], %1 \n" - "vld1.16 {d0[1]}, [r9], %1 \n" - "vld1.16 {d1[1]}, [r9], %1 \n" - "vld1.16 {d0[2]}, [r9], %1 \n" - "vld1.16 {d1[2]}, [r9], %1 \n" - "vld1.16 {d0[3]}, [r9], %1 \n" - "vld1.16 {d1[3]}, [r9] \n" + "mov %0, %1 \n" + "vld1.16 {d0[0]}, [%0], %2 \n" + "vld1.16 {d1[0]}, [%0], %2 \n" + "vld1.16 {d0[1]}, [%0], %2 \n" + "vld1.16 {d1[1]}, [%0], %2 \n" + "vld1.16 {d0[2]}, [%0], %2 \n" + "vld1.16 {d1[2]}, [%0], %2 \n" + "vld1.16 {d0[3]}, [%0], %2 \n" + "vld1.16 {d1[3]}, [%0] \n" "vtrn.8 d0, d1 \n" - "mov r9, %2 \n" + "mov %0, %3 \n" - "vst1.64 {d0}, [r9], %3 \n" - "vst1.64 {d1}, [r9] \n" + "vst1.64 {d0}, [%0], %4 \n" + "vst1.64 {d1}, [%0] \n" - "add %0, #2 \n" // src += 2 - "add %2, %2, %3, lsl #1 \n" // dst += 2 * dst_stride - "subs %4, #2 \n" // w -= 2 + "add %1, #2 \n" // src += 2 + "add %3, %3, %4, lsl #1 \n" // dst += 2 * dst_stride + "subs %5, #2 \n" // w -= 2 "beq 4f \n" // 1x8 block "3: \n" - "vld1.8 {d0[0]}, [%0], %1 \n" - "vld1.8 {d0[1]}, [%0], %1 \n" - "vld1.8 {d0[2]}, [%0], %1 \n" - "vld1.8 {d0[3]}, [%0], %1 \n" - "vld1.8 {d0[4]}, [%0], %1 \n" - "vld1.8 {d0[5]}, [%0], %1 \n" - "vld1.8 {d0[6]}, [%0], %1 \n" - "vld1.8 {d0[7]}, [%0] \n" + "vld1.8 {d0[0]}, [%1], %2 \n" + "vld1.8 {d0[1]}, [%1], %2 \n" + "vld1.8 {d0[2]}, [%1], %2 \n" + "vld1.8 {d0[3]}, [%1], %2 \n" + "vld1.8 {d0[4]}, [%1], %2 \n" + "vld1.8 {d0[5]}, [%1], %2 \n" + "vld1.8 {d0[6]}, [%1], %2 \n" + "vld1.8 {d0[7]}, [%1] \n" - "vst1.64 {d0}, [%2] \n" + "vst1.64 {d0}, [%3] \n" "4: \n" - : "+r"(src), // %0 - "+r"(src_stride), // %1 - "+r"(dst), // %2 - "+r"(dst_stride), // %3 - "+r"(width) // %4 - : "r"(&kVTbl4x4Transpose) // %5 - : "memory", "cc", "r9", "q0", "q1", "q2", "q3" + : "+r"(src_temp), // %0 + "+r"(src), // %1 + "+r"(src_stride), // %2 + "+r"(dst), // %3 + "+r"(dst_stride), // %4 + "+r"(width) // %5 + : "r"(&kVTbl4x4Transpose) // %6 + : "memory", "cc", "q0", "q1", "q2", "q3" ); } @@ -191,25 +193,26 @@ void TransposeUVWx8_NEON(const uint8* src, int src_stride, uint8* dst_a, int dst_stride_a, uint8* dst_b, int dst_stride_b, int width) { + const uint8* src_temp = NULL; asm volatile ( // loops are on blocks of 8. loop will stop when // counter gets to or below 0. starting the counter // at w-8 allow for this - "sub %6, #8 \n" + "sub %7, #8 \n" // handle 8x8 blocks. this should be the majority of the plane ".p2align 2 \n" "1: \n" - "mov r9, %0 \n" + "mov %0, %1 \n" - "vld2.8 {d0, d1}, [r9], %1 \n" - "vld2.8 {d2, d3}, [r9], %1 \n" - "vld2.8 {d4, d5}, [r9], %1 \n" - "vld2.8 {d6, d7}, [r9], %1 \n" - "vld2.8 {d16, d17}, [r9], %1 \n" - "vld2.8 {d18, d19}, [r9], %1 \n" - "vld2.8 {d20, d21}, [r9], %1 \n" - "vld2.8 {d22, d23}, [r9] \n" + "vld2.8 {d0, d1}, [%0], %2 \n" + "vld2.8 {d2, d3}, [%0], %2 \n" + "vld2.8 {d4, d5}, [%0], %2 \n" + "vld2.8 {d6, d7}, [%0], %2 \n" + "vld2.8 {d16, d17}, [%0], %2 \n" + "vld2.8 {d18, d19}, [%0], %2 \n" + "vld2.8 {d20, d21}, [%0], %2 \n" + "vld2.8 {d22, d23}, [%0] \n" "vtrn.8 q1, q0 \n" "vtrn.8 q3, q2 \n" @@ -235,59 +238,59 @@ void TransposeUVWx8_NEON(const uint8* src, int src_stride, "vrev16.8 q10, q10 \n" "vrev16.8 q11, q11 \n" - "mov r9, %2 \n" - - "vst1.8 {d2}, [r9], %3 \n" - "vst1.8 {d0}, [r9], %3 \n" - "vst1.8 {d6}, [r9], %3 \n" - "vst1.8 {d4}, [r9], %3 \n" - "vst1.8 {d18}, [r9], %3 \n" - "vst1.8 {d16}, [r9], %3 \n" - "vst1.8 {d22}, [r9], %3 \n" - "vst1.8 {d20}, [r9] \n" - - "mov r9, %4 \n" - - "vst1.8 {d3}, [r9], %5 \n" - "vst1.8 {d1}, [r9], %5 \n" - "vst1.8 {d7}, [r9], %5 \n" - "vst1.8 {d5}, [r9], %5 \n" - "vst1.8 {d19}, [r9], %5 \n" - "vst1.8 {d17}, [r9], %5 \n" - "vst1.8 {d23}, [r9], %5 \n" - "vst1.8 {d21}, [r9] \n" - - "add %0, #8*2 \n" // src += 8*2 - "add %2, %2, %3, lsl #3 \n" // dst_a += 8 * dst_stride_a - "add %4, %4, %5, lsl #3 \n" // dst_b += 8 * dst_stride_b - "subs %6, #8 \n" // w -= 8 + "mov %0, %3 \n" + + "vst1.8 {d2}, [%0], %4 \n" + "vst1.8 {d0}, [%0], %4 \n" + "vst1.8 {d6}, [%0], %4 \n" + "vst1.8 {d4}, [%0], %4 \n" + "vst1.8 {d18}, [%0], %4 \n" + "vst1.8 {d16}, [%0], %4 \n" + "vst1.8 {d22}, [%0], %4 \n" + "vst1.8 {d20}, [%0] \n" + + "mov %0, %5 \n" + + "vst1.8 {d3}, [%0], %6 \n" + "vst1.8 {d1}, [%0], %6 \n" + "vst1.8 {d7}, [%0], %6 \n" + "vst1.8 {d5}, [%0], %6 \n" + "vst1.8 {d19}, [%0], %6 \n" + "vst1.8 {d17}, [%0], %6 \n" + "vst1.8 {d23}, [%0], %6 \n" + "vst1.8 {d21}, [%0] \n" + + "add %1, #8*2 \n" // src += 8*2 + "add %3, %3, %4, lsl #3 \n" // dst_a += 8 * dst_stride_a + "add %5, %5, %6, lsl #3 \n" // dst_b += 8 * dst_stride_b + "subs %7, #8 \n" // w -= 8 "bge 1b \n" // add 8 back to counter. if the result is 0 there are // no residuals. - "adds %6, #8 \n" + "adds %7, #8 \n" "beq 4f \n" // some residual, so between 1 and 7 lines left to transpose - "cmp %6, #2 \n" + "cmp %7, #2 \n" "blt 3f \n" - "cmp %6, #4 \n" + "cmp %7, #4 \n" "blt 2f \n" //TODO(frkoenig): Clean this up // 4x8 block - "mov r9, %0 \n" - "vld1.64 {d0}, [r9], %1 \n" - "vld1.64 {d1}, [r9], %1 \n" - "vld1.64 {d2}, [r9], %1 \n" - "vld1.64 {d3}, [r9], %1 \n" - "vld1.64 {d4}, [r9], %1 \n" - "vld1.64 {d5}, [r9], %1 \n" - "vld1.64 {d6}, [r9], %1 \n" - "vld1.64 {d7}, [r9] \n" - - "vld1.8 {q15}, [%7] \n" + "mov %0, %1 \n" + "vld1.64 {d0}, [%0], %2 \n" + "vld1.64 {d1}, [%0], %2 \n" + "vld1.64 {d2}, [%0], %2 \n" + "vld1.64 {d3}, [%0], %2 \n" + "vld1.64 {d4}, [%0], %2 \n" + "vld1.64 {d5}, [%0], %2 \n" + "vld1.64 {d6}, [%0], %2 \n" + "vld1.64 {d7}, [%0] \n" + + "vld1.8 {q15}, [%8] \n" "vtrn.8 q0, q1 \n" "vtrn.8 q2, q3 \n" @@ -301,99 +304,100 @@ void TransposeUVWx8_NEON(const uint8* src, int src_stride, "vtbl.8 d22, {d6, d7}, d30 \n" "vtbl.8 d23, {d6, d7}, d31 \n" - "mov r9, %2 \n" + "mov %0, %3 \n" - "vst1.32 {d16[0]}, [r9], %3 \n" - "vst1.32 {d16[1]}, [r9], %3 \n" - "vst1.32 {d17[0]}, [r9], %3 \n" - "vst1.32 {d17[1]}, [r9], %3 \n" + "vst1.32 {d16[0]}, [%0], %4 \n" + "vst1.32 {d16[1]}, [%0], %4 \n" + "vst1.32 {d17[0]}, [%0], %4 \n" + "vst1.32 {d17[1]}, [%0], %4 \n" - "add r9, %2, #4 \n" - "vst1.32 {d20[0]}, [r9], %3 \n" - "vst1.32 {d20[1]}, [r9], %3 \n" - "vst1.32 {d21[0]}, [r9], %3 \n" - "vst1.32 {d21[1]}, [r9] \n" + "add %0, %3, #4 \n" + "vst1.32 {d20[0]}, [%0], %4 \n" + "vst1.32 {d20[1]}, [%0], %4 \n" + "vst1.32 {d21[0]}, [%0], %4 \n" + "vst1.32 {d21[1]}, [%0] \n" - "mov r9, %4 \n" + "mov %0, %5 \n" - "vst1.32 {d18[0]}, [r9], %5 \n" - "vst1.32 {d18[1]}, [r9], %5 \n" - "vst1.32 {d19[0]}, [r9], %5 \n" - "vst1.32 {d19[1]}, [r9], %5 \n" + "vst1.32 {d18[0]}, [%0], %6 \n" + "vst1.32 {d18[1]}, [%0], %6 \n" + "vst1.32 {d19[0]}, [%0], %6 \n" + "vst1.32 {d19[1]}, [%0], %6 \n" - "add r9, %4, #4 \n" - "vst1.32 {d22[0]}, [r9], %5 \n" - "vst1.32 {d22[1]}, [r9], %5 \n" - "vst1.32 {d23[0]}, [r9], %5 \n" - "vst1.32 {d23[1]}, [r9] \n" + "add %0, %5, #4 \n" + "vst1.32 {d22[0]}, [%0], %6 \n" + "vst1.32 {d22[1]}, [%0], %6 \n" + "vst1.32 {d23[0]}, [%0], %6 \n" + "vst1.32 {d23[1]}, [%0] \n" - "add %0, #4*2 \n" // src += 4 * 2 - "add %2, %2, %3, lsl #2 \n" // dst_a += 4 * dst_stride_a - "add %4, %4, %5, lsl #2 \n" // dst_b += 4 * dst_stride_b - "subs %6, #4 \n" // w -= 4 + "add %1, #4*2 \n" // src += 4 * 2 + "add %3, %3, %4, lsl #2 \n" // dst_a += 4 * dst_stride_a + "add %5, %5, %6, lsl #2 \n" // dst_b += 4 * dst_stride_b + "subs %7, #4 \n" // w -= 4 "beq 4f \n" // some residual, check to see if it includes a 2x8 block, // or less - "cmp %6, #2 \n" + "cmp %7, #2 \n" "blt 3f \n" // 2x8 block "2: \n" - "mov r9, %0 \n" - "vld2.16 {d0[0], d2[0]}, [r9], %1 \n" - "vld2.16 {d1[0], d3[0]}, [r9], %1 \n" - "vld2.16 {d0[1], d2[1]}, [r9], %1 \n" - "vld2.16 {d1[1], d3[1]}, [r9], %1 \n" - "vld2.16 {d0[2], d2[2]}, [r9], %1 \n" - "vld2.16 {d1[2], d3[2]}, [r9], %1 \n" - "vld2.16 {d0[3], d2[3]}, [r9], %1 \n" - "vld2.16 {d1[3], d3[3]}, [r9] \n" + "mov %0, %1 \n" + "vld2.16 {d0[0], d2[0]}, [%0], %2 \n" + "vld2.16 {d1[0], d3[0]}, [%0], %2 \n" + "vld2.16 {d0[1], d2[1]}, [%0], %2 \n" + "vld2.16 {d1[1], d3[1]}, [%0], %2 \n" + "vld2.16 {d0[2], d2[2]}, [%0], %2 \n" + "vld2.16 {d1[2], d3[2]}, [%0], %2 \n" + "vld2.16 {d0[3], d2[3]}, [%0], %2 \n" + "vld2.16 {d1[3], d3[3]}, [%0] \n" "vtrn.8 d0, d1 \n" "vtrn.8 d2, d3 \n" - "mov r9, %2 \n" + "mov %0, %3 \n" - "vst1.64 {d0}, [r9], %3 \n" - "vst1.64 {d2}, [r9] \n" + "vst1.64 {d0}, [%0], %4 \n" + "vst1.64 {d2}, [%0] \n" - "mov r9, %4 \n" + "mov %0, %5 \n" - "vst1.64 {d1}, [r9], %5 \n" - "vst1.64 {d3}, [r9] \n" + "vst1.64 {d1}, [%0], %6 \n" + "vst1.64 {d3}, [%0] \n" - "add %0, #2*2 \n" // src += 2 * 2 - "add %2, %2, %3, lsl #1 \n" // dst_a += 2 * dst_stride_a - "add %4, %4, %5, lsl #1 \n" // dst_b += 2 * dst_stride_b - "subs %6, #2 \n" // w -= 2 + "add %1, #2*2 \n" // src += 2 * 2 + "add %3, %3, %4, lsl #1 \n" // dst_a += 2 * dst_stride_a + "add %5, %5, %6, lsl #1 \n" // dst_b += 2 * dst_stride_b + "subs %7, #2 \n" // w -= 2 "beq 4f \n" // 1x8 block "3: \n" - "vld2.8 {d0[0], d1[0]}, [%0], %1 \n" - "vld2.8 {d0[1], d1[1]}, [%0], %1 \n" - "vld2.8 {d0[2], d1[2]}, [%0], %1 \n" - "vld2.8 {d0[3], d1[3]}, [%0], %1 \n" - "vld2.8 {d0[4], d1[4]}, [%0], %1 \n" - "vld2.8 {d0[5], d1[5]}, [%0], %1 \n" - "vld2.8 {d0[6], d1[6]}, [%0], %1 \n" - "vld2.8 {d0[7], d1[7]}, [%0] \n" - - "vst1.64 {d0}, [%2] \n" - "vst1.64 {d1}, [%4] \n" + "vld2.8 {d0[0], d1[0]}, [%1], %2 \n" + "vld2.8 {d0[1], d1[1]}, [%1], %2 \n" + "vld2.8 {d0[2], d1[2]}, [%1], %2 \n" + "vld2.8 {d0[3], d1[3]}, [%1], %2 \n" + "vld2.8 {d0[4], d1[4]}, [%1], %2 \n" + "vld2.8 {d0[5], d1[5]}, [%1], %2 \n" + "vld2.8 {d0[6], d1[6]}, [%1], %2 \n" + "vld2.8 {d0[7], d1[7]}, [%1] \n" + + "vst1.64 {d0}, [%3] \n" + "vst1.64 {d1}, [%5] \n" "4: \n" - : "+r"(src), // %0 - "+r"(src_stride), // %1 - "+r"(dst_a), // %2 - "+r"(dst_stride_a), // %3 - "+r"(dst_b), // %4 - "+r"(dst_stride_b), // %5 - "+r"(width) // %6 - : "r"(&kVTbl4x4TransposeDi) // %7 - : "memory", "cc", "r9", + : "+r"(src_temp), // %0 + "+r"(src), // %1 + "+r"(src_stride), // %2 + "+r"(dst_a), // %3 + "+r"(dst_stride_a), // %4 + "+r"(dst_b), // %5 + "+r"(dst_stride_b), // %6 + "+r"(width) // %7 + : "r"(&kVTbl4x4TransposeDi) // %8 + : "memory", "cc", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11" ); } |