diff options
author | Xin Li <delphij@google.com> | 2021-11-10 08:05:29 +0000 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2021-11-10 08:05:29 +0000 |
commit | b70940fbddd52bdb469de95f954b1f4d2273de08 (patch) | |
tree | 600db2cceed1c6fffd057f37bba63a75f313e843 | |
parent | fd1465e039a0778b3035f6824fcccc6b4a5a61b8 (diff) | |
parent | 650210f37c13bf41c66896a4071a9556261bf6ed (diff) | |
download | libopus-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.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) |