summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2014-04-24 10:50:43 +0100
committerBen Murdoch <benm@google.com>2014-04-24 10:50:43 +0100
commitee1b06fb6ce66e57fd100dae397c1062c906d607 (patch)
treeb39f2e94e85f1e0cb889185a87dd66f1774fe3a9
parent7d6324402a59b47e3420ac7cc2c085354613675c (diff)
parent362a380ee9ab59783add528f8c0954fb886f96f3 (diff)
downloadlibyuv-ee1b06fb6ce66e57fd100dae397c1062c906d607.tar.gz
Merge from Chromium at DEPS revision 265802
This commit was generated by merge_to_master.py. Change-Id: I4d50f13a7152bd508c6c3771bfd1c945c9a6f92a
-rw-r--r--DEPS32
-rw-r--r--README.chromium2
-rw-r--r--download_vs_toolchain.py29
-rwxr-xr-xgyp_libyuv11
-rw-r--r--include/libyuv/version.h2
-rw-r--r--libyuv.target.darwin-arm.mk1
-rw-r--r--libyuv.target.darwin-mips.mk1
-rw-r--r--libyuv.target.darwin-x86.mk1
-rw-r--r--libyuv.target.darwin-x86_64.mk1
-rw-r--r--libyuv.target.linux-arm.mk1
-rw-r--r--libyuv.target.linux-mips.mk1
-rw-r--r--libyuv.target.linux-x86.mk1
-rw-r--r--libyuv.target.linux-x86_64.mk1
-rw-r--r--libyuv_neon.target.darwin-arm.mk1
-rw-r--r--libyuv_neon.target.linux-arm.mk1
-rw-r--r--source/rotate_neon.cc396
16 files changed, 258 insertions, 224 deletions
diff --git a/DEPS b/DEPS
index 40b69b8..e4da873 100644
--- a/DEPS
+++ b/DEPS
@@ -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())
diff --git a/gyp_libyuv b/gyp_libyuv
index be7cb7a..64d426e 100755
--- a/gyp_libyuv
+++ b/gyp_libyuv
@@ -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/libyuv.target.darwin-arm.mk b/libyuv.target.darwin-arm.mk
index ae76744..0a6d53c 100644
--- a/libyuv.target.darwin-arm.mk
+++ b/libyuv.target.darwin-arm.mk
@@ -261,7 +261,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.darwin-mips.mk b/libyuv.target.darwin-mips.mk
index 091ab4d..6781631 100644
--- a/libyuv.target.darwin-mips.mk
+++ b/libyuv.target.darwin-mips.mk
@@ -257,7 +257,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.darwin-x86.mk b/libyuv.target.darwin-x86.mk
index 58d4bd5..b246570 100644
--- a/libyuv.target.darwin-x86.mk
+++ b/libyuv.target.darwin-x86.mk
@@ -257,7 +257,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.darwin-x86_64.mk b/libyuv.target.darwin-x86_64.mk
index a455c5c..b473242 100644
--- a/libyuv.target.darwin-x86_64.mk
+++ b/libyuv.target.darwin-x86_64.mk
@@ -257,7 +257,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.linux-arm.mk b/libyuv.target.linux-arm.mk
index ae76744..0a6d53c 100644
--- a/libyuv.target.linux-arm.mk
+++ b/libyuv.target.linux-arm.mk
@@ -261,7 +261,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.linux-mips.mk b/libyuv.target.linux-mips.mk
index 091ab4d..6781631 100644
--- a/libyuv.target.linux-mips.mk
+++ b/libyuv.target.linux-mips.mk
@@ -257,7 +257,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.linux-x86.mk b/libyuv.target.linux-x86.mk
index 58d4bd5..b246570 100644
--- a/libyuv.target.linux-x86.mk
+++ b/libyuv.target.linux-x86.mk
@@ -257,7 +257,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv.target.linux-x86_64.mk b/libyuv.target.linux-x86_64.mk
index a455c5c..b473242 100644
--- a/libyuv.target.linux-x86_64.mk
+++ b/libyuv.target.linux-x86_64.mk
@@ -257,7 +257,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv_neon.target.darwin-arm.mk b/libyuv_neon.target.darwin-arm.mk
index d388f37..687c4b5 100644
--- a/libyuv_neon.target.darwin-arm.mk
+++ b/libyuv_neon.target.darwin-arm.mk
@@ -227,7 +227,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/libyuv_neon.target.linux-arm.mk b/libyuv_neon.target.linux-arm.mk
index d388f37..687c4b5 100644
--- a/libyuv_neon.target.linux-arm.mk
+++ b/libyuv_neon.target.linux-arm.mk
@@ -227,7 +227,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
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"
);
}