aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/powerpc32/power7
diff options
context:
space:
mode:
authorTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2016-12-28 11:38:56 -0200
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2016-12-28 11:44:31 -0200
commit5e628dd118807981bdd880731e6fdf019f64a245 (patch)
treeab1efb6529f5b0c7ee03ab5e2f412e8d212f4717 /sysdeps/powerpc/powerpc32/power7
parent9314d3545e6641063b490918e2e8716556ba20db (diff)
downloadglibc-5e628dd118807981bdd880731e6fdf019f64a245.tar
glibc-5e628dd118807981bdd880731e6fdf019f64a245.tar.gz
glibc-5e628dd118807981bdd880731e6fdf019f64a245.tar.bz2
glibc-5e628dd118807981bdd880731e6fdf019f64a245.zip
powerpc: Fix powerpc32/power7 memchr for large input sizes
The same error fixed in commit b224637928e9fc04e3cef3e10d02ccf042d01584 happens in the 32-bit implementation of memchr for power7. This patch adopts the same solution, with a minimal change: it implements a saturated addition where overflows sets the maximum pointer size to UINTPTR_MAX.
Diffstat (limited to 'sysdeps/powerpc/powerpc32/power7')
-rw-r--r--sysdeps/powerpc/powerpc32/power7/memchr.S11
1 files changed, 10 insertions, 1 deletions
diff --git a/sysdeps/powerpc/powerpc32/power7/memchr.S b/sysdeps/powerpc/powerpc32/power7/memchr.S
index 318168b4cf..5ce2bb0bad 100644
--- a/sysdeps/powerpc/powerpc32/power7/memchr.S
+++ b/sysdeps/powerpc/powerpc32/power7/memchr.S
@@ -26,7 +26,16 @@ ENTRY (__memchr)
dcbt 0,r3
clrrwi r8,r3,2
insrwi r4,r4,8,16 /* Replicate byte to word. */
- add r7,r3,r5 /* Calculate the last acceptable address. */
+
+ /* Calculate the last acceptable address and check for possible
+ addition overflow by using satured math:
+ r7 = r3 + r5
+ r7 |= -(r7 < x) */
+ add r7,r3,r5
+ subfc r6,r3,r7
+ subfe r9,r9,r9
+ or r7,r7,r9
+
insrwi r4,r4,16,0
cmplwi r5,16
li r9, -1