Revision | 592574ae535c35de500f6c3e8d8400d0bb0d985a (tree) |
---|---|
Zeit | 2022-04-13 21:17:48 |
Autor | Tom Bannink <tombannink@gmai...> |
Commiter | Waldemar Brodkorb |
Fix bug in ARM memset implementation
The ARM implementation of memset has a bug when the fill-value is negative or outside the
[0, 255] range. To reproduce:
This is supposed to fill the array with int8 values -5, -5, -5, ... . On ARM, this does
not work because the implementation assumes the high bytes of the fill-value argument are
already zero. However in this test case they are filled with 1-bits. The aarch64 and x86_64
implementations do not have this problem: they first convert the fill-value to an unsigned
byte following the specification of memset.
With GCC one can use memset(ptr, (-5 & 0xFF), size) as a workaround, but for clang
users that does not work: clang optimizes the & 0xFF away because it assumes that
memset will do it.
Signed-off-by: Tom Bannink <tombannink@gmail.com>
Acked-by: Peter Korsgaard <peter@korsgaard.com>
@@ -32,6 +32,7 @@ memset: | ||
32 | 32 | cmp r2, #8 @ at least 8 bytes to do? |
33 | 33 | bcc 2f |
34 | 34 | |
35 | + and r1, r1, #0xFF | |
35 | 36 | lsl r3, r1, #8 |
36 | 37 | orr r1, r3 |
37 | 38 | lsl r3, r1, #16 |
@@ -68,6 +69,7 @@ memset: | ||
68 | 69 | mov a4, a1 |
69 | 70 | cmp a3, $8 @ at least 8 bytes to do? |
70 | 71 | blo 2f |
72 | + and a2, a2, #0xFF | |
71 | 73 | orr a2, a2, a2, lsl $8 |
72 | 74 | orr a2, a2, a2, lsl $16 |
73 | 75 | 1: |