aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeelkamal Semwal <neelkamal.semwal@ittiam.com>2021-09-30 18:45:42 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-09-30 18:45:42 +0000
commitcebdfe545a07d542d2d8aeb7f128db71a7f4a119 (patch)
tree00451145e6200d31a516d1fc672d0892fc9dff52
parent862fc2aa24c5fa7d4dcf0f86847635c0722c444c (diff)
parenta6a69736bad24c7a142bc40916d7bfa576be7fc1 (diff)
downloadlibopus-android12L-dev.tar.gz
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/libopus/+/15935007 Change-Id: I8a0616639417a8c8ccfd2fdb47cd949c6616c3dd
-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)