aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2021-11-10 08:05:29 +0000
committerXin Li <delphij@google.com>2021-11-10 08:05:29 +0000
commitb70940fbddd52bdb469de95f954b1f4d2273de08 (patch)
tree600db2cceed1c6fffd057f37bba63a75f313e843
parentfd1465e039a0778b3035f6824fcccc6b4a5a61b8 (diff)
parent650210f37c13bf41c66896a4071a9556261bf6ed (diff)
downloadlibopus-b70940fbddd52bdb469de95f954b1f4d2273de08.tar.gz
Merge sc-qpr1-dev-plus-aosp-without-vendor@7810918temp_sam_210511427temp-sc-sam
Bug: 205056467 Merged-In: Icace1828cffaecd45db52671b844fc04e597bc48 Change-Id: I248f642dde56c0dce04496bdc04877566850086a
-rw-r--r--Android.bp1
-rw-r--r--celt/stack_alloc.h25
2 files changed, 23 insertions, 3 deletions
diff --git a/Android.bp b/Android.bp
index 702ddcc4..270d3271 100644
--- a/Android.bp
+++ b/Android.bp
@@ -208,6 +208,7 @@ cc_library {
"-DOPUS_BUILD",
"-DFIXED_POINT",
"-DUSE_ALLOCA",
+ "-DSIMD_EXTRA_ALLOC_BYTES=16",
"-DHAVE_LRINT",
"-DHAVE_LRINTF",
"-DENABLE_HARDENING",
diff --git a/celt/stack_alloc.h b/celt/stack_alloc.h
index ae40e2a1..b289facd 100644
--- a/celt/stack_alloc.h
+++ b/celt/stack_alloc.h
@@ -88,10 +88,22 @@
* @param type Type of element
*/
+#ifndef SIMD_EXTRA_ALLOC_BYTES
+#error define SIMD_EXTRA_ALLOC_BYTES appropriately in your makefile
+/*
+ * Useful values:
+ * 0 for an all-scalar processor, which should never over-read the arrays
+ * 16 for an implementation using ARM Neon or X86 SSE4 instructions, which work
+ * with blocks of 16 bytes (128 bits)
+ */
+#endif
+
#if defined(VAR_ARRAYS)
#define VARDECL(type, var)
-#define ALLOC(var, size, type) type var[size]
+// include a full SIMD width afterwards;
+#define ALLOC(var, size, type) type var[(size) + ((SIMD_EXTRA_ALLOC_BYTES)/sizeof(type))]
+
#define SAVE_STACK
#define RESTORE_STACK
#define ALLOC_STACK
@@ -103,9 +115,11 @@
#define VARDECL(type, var) type *var
# ifdef _WIN32
-# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size)))
+# define ALLOC(var, size, type) var = \
+ ((type*)_alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES))
# else
-# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size)))
+# define ALLOC(var, size, type) var = \
+ ((type*)alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES))
# endif
#define SAVE_STACK
@@ -151,6 +165,11 @@ extern char *global_stack_top;
#endif /* ENABLE_VALGRIND */
+// this path has NOT been modified to be safe in the face of SIMD over-reads
+#if SIMD_EXTRA_ALLOC_BYTES != 0
+#error "ALLOC() is not updated in this configuration to provide for SIMD over-reads"
+#endif
+
#include "os_support.h"
#define VARDECL(type, var) type *var
#define ALLOC(var, size, type) var = PUSH(global_stack, size, type)