diff options
author | Xin Li <delphij@google.com> | 2021-12-13 21:41:30 -0800 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2021-12-14 08:39:04 -0800 |
commit | 701b236fc3f1a0b496ba4783e33256580da17aa0 (patch) | |
tree | 600db2cceed1c6fffd057f37bba63a75f313e843 | |
parent | fd1465e039a0778b3035f6824fcccc6b4a5a61b8 (diff) | |
parent | b70940fbddd52bdb469de95f954b1f4d2273de08 (diff) | |
download | libopus-701b236fc3f1a0b496ba4783e33256580da17aa0.tar.gz |
Merge Android 12 QPR1
Bug: 210511427
Merged-In: I248f642dde56c0dce04496bdc04877566850086a
Change-Id: Ib8161aaeb0dea8cb22ba97127ca6776d7b72cbdd
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | celt/stack_alloc.h | 25 |
2 files changed, 23 insertions, 3 deletions
@@ -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) |