* [PATCH] arm: memset: zero out upper bytes in r1
@ 2014-05-05 7:11 Andrey Ryabinin
2014-05-07 23:42 ` Afzal Mohammed
[not found] ` <loom.20140508T095105-952@post.gmane.org>
0 siblings, 2 replies; 5+ messages in thread
From: Andrey Ryabinin @ 2014-05-05 7:11 UTC (permalink / raw)
To: linux-arm-kernel
memset doesn't work right for following example:
signed char c = 0xF0;
memset(addr, c, size);
Variable c is signed, so after typcasting to int the value will be 0xFFFFFFF0.
This value will be passed through r1 regitster to memset function.
memset doesn't zero out upper bytes in r1, so memory will be filled
with 0xFFFFFFF0 instead of expected 0xF0F0F0F0.
Signed-off-by: Andrey Ryabinin <a.ryabinin@samsung.com>
---
arch/arm/lib/memset.S | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
index 94b0650..a010f76 100644
--- a/arch/arm/lib/memset.S
+++ b/arch/arm/lib/memset.S
@@ -22,7 +22,8 @@ ENTRY(memset)
/*
* we know that the pointer in ip is aligned to a word boundary.
*/
-1: orr r1, r1, r1, lsl #8
+1: and r1, r1, #0xff
+ orr r1, r1, r1, lsl #8
orr r1, r1, r1, lsl #16
mov r3, r1
cmp r2, #16
--
1.8.3.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH] arm: memset: zero out upper bytes in r1
2014-05-05 7:11 [PATCH] arm: memset: zero out upper bytes in r1 Andrey Ryabinin
@ 2014-05-07 23:42 ` Afzal Mohammed
2014-05-08 7:59 ` Andrey Ryabinin
[not found] ` <loom.20140508T095105-952@post.gmane.org>
1 sibling, 1 reply; 5+ messages in thread
From: Afzal Mohammed @ 2014-05-07 23:42 UTC (permalink / raw)
To: linux-arm-kernel
Hi Andrey,
On Mon, May 05, 2014 at 11:11:13AM +0400, Andrey Ryabinin wrote:
> memset doesn't work right for following example:
>
> signed char c = 0xF0;
> memset(addr, c, size);
>
> Variable c is signed, so after typcasting to int the value will be 0xFFFFFFF0.
> This value will be passed through r1 regitster to memset function.
> memset doesn't zero out upper bytes in r1, so memory will be filled
> with 0xFFFFFFF0 instead of expected 0xF0F0F0F0.
> --- a/arch/arm/lib/memset.S
> +++ b/arch/arm/lib/memset.S
> @@ -22,7 +22,8 @@ ENTRY(memset)
> /*
> * we know that the pointer in ip is aligned to a word boundary.
> */
> -1: orr r1, r1, r1, lsl #8
> +1: and r1, r1, #0xff
> + orr r1, r1, r1, lsl #8
int is to be converted to unsigned char in memset, would having above
change immediately upon entry to memset rather than at a place where it
won't always execute make intention clearer ? (although it doesn't make
difference)
ubfx r1, r1, #0, #8 would have given the needed typecasting, but seems
it is available only on ARMv6T2 & above.
Regards
Afzal
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH] arm: memset: zero out upper bytes in r1
2014-05-07 23:42 ` Afzal Mohammed
@ 2014-05-08 7:59 ` Andrey Ryabinin
2014-05-08 14:40 ` Andrey Ryabinin
0 siblings, 1 reply; 5+ messages in thread
From: Andrey Ryabinin @ 2014-05-08 7:59 UTC (permalink / raw)
To: linux-arm-kernel
On 05/08/14 03:42, Afzal Mohammed wrote:
>
> int is to be converted to unsigned char in memset, would having above
> change immediately upon entry to memset rather than at a place where it
> won't always execute make intention clearer ? (although it doesn't make
> difference)
>
I think it's better to keep it near other manipulations with r1.
Plus this will save us from executing extra instruction on 'memset -> 6 -> 5 -> return'
path (memset for size <= 3).
> ubfx r1, r1, #0, #8 would have given the needed typecasting, but seems
> it is available only on ARMv6T2 & above.
>
Indeed. It might be wrapped it with #if #else, but it will be a bit ugly,
probably not worth to do.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] arm: memset: zero out upper bytes in r1
2014-05-08 7:59 ` Andrey Ryabinin
@ 2014-05-08 14:40 ` Andrey Ryabinin
0 siblings, 0 replies; 5+ messages in thread
From: Andrey Ryabinin @ 2014-05-08 14:40 UTC (permalink / raw)
To: linux-arm-kernel
On 05/08/14 11:59, Andrey Ryabinin wrote:
> On 05/08/14 03:42, Afzal Mohammed wrote:
>>
>> int is to be converted to unsigned char in memset, would having above
>> change immediately upon entry to memset rather than at a place where it
>> won't always execute make intention clearer ? (although it doesn't make
>> difference)
>>
>
> I think it's better to keep it near other manipulations with r1.
> Plus this will save us from executing extra instruction on 'memset -> 6 -> 5 -> return'
> path (memset for size <= 3).
>
>
>> ubfx r1, r1, #0, #8 would have given the needed typecasting, but seems
>> it is available only on ARMv6T2 & above.
>>
>
> Indeed. It might be wrapped it with #if #else, but it will be a bit ugly,
> probably not worth to do.
>
>
Err, there is no reason to use ubfx, it just the same as and r1,r1, #0xff.
On ARMv6T2 & above one instruction could be saved by using BFI instead of ORR, like this:
diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
index 94b0650..9a7f714 100644
--- a/arch/arm/lib/memset.S
+++ b/arch/arm/lib/memset.S
@@ -22,8 +22,8 @@ ENTRY(memset)
/*
* we know that the pointer in ip is aligned to a word boundary.
*/
-1: orr r1, r1, r1, lsl #8
- orr r1, r1, r1, lsl #16
+1: bfi r1, r1, #8, #8
+ bfi r1, r1, #16, #16
mov r3, r1
cmp r2, #16
blt 4f
^ permalink raw reply related [flat|nested] 5+ messages in thread
[parent not found: <loom.20140508T095105-952@post.gmane.org>]
end of thread, other threads:[~2014-05-12 6:58 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-05 7:11 [PATCH] arm: memset: zero out upper bytes in r1 Andrey Ryabinin
2014-05-07 23:42 ` Afzal Mohammed
2014-05-08 7:59 ` Andrey Ryabinin
2014-05-08 14:40 ` Andrey Ryabinin
[not found] ` <loom.20140508T095105-952@post.gmane.org>
[not found] ` <loom.20140508T103032-725@post.gmane.org>
2014-05-12 6:58 ` Andrey Ryabinin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).