summaryrefslogtreecommitdiff
path: root/packages/glibc/2.17/0050-glibc-ppc64le-28.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/glibc/2.17/0050-glibc-ppc64le-28.patch')
-rw-r--r--packages/glibc/2.17/0050-glibc-ppc64le-28.patch167
1 files changed, 167 insertions, 0 deletions
diff --git a/packages/glibc/2.17/0050-glibc-ppc64le-28.patch b/packages/glibc/2.17/0050-glibc-ppc64le-28.patch
new file mode 100644
index 0000000..05f63e9
--- /dev/null
+++ b/packages/glibc/2.17/0050-glibc-ppc64le-28.patch
@@ -0,0 +1,167 @@
+# commit 43b84013714c46e6dcae4a5564c5527777ad5e08
+# Author: Alan Modra <amodra@gmail.com>
+# Date: Sat Aug 17 18:45:31 2013 +0930
+#
+# PowerPC LE strcpy
+# http://sourceware.org/ml/libc-alpha/2013-08/msg00100.html
+#
+# The strcpy changes for little-endian are quite straight-forward, just
+# a matter of rotating the last word differently.
+#
+# I'll note that the powerpc64 version of stpcpy is just begging to be
+# converted to use 64-bit loads and stores..
+#
+# * sysdeps/powerpc/powerpc64/strcpy.S: Add little-endian support:
+# * sysdeps/powerpc/powerpc32/strcpy.S: Likewise.
+# * sysdeps/powerpc/powerpc64/stpcpy.S: Likewise.
+# * sysdeps/powerpc/powerpc32/stpcpy.S: Likewise.
+#
+diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S
+--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S 2014-05-28 13:40:01.000000000 -0500
++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S 2014-05-28 13:40:01.000000000 -0500
+@@ -74,7 +74,22 @@
+
+ mr rALT, rWORD
+ /* We've hit the end of the string. Do the rest byte-by-byte. */
+-L(g1): rlwinm. rTMP, rALT, 8, 24, 31
++L(g1):
++#ifdef __LITTLE_ENDIAN__
++ rlwinm. rTMP, rALT, 0, 24, 31
++ stbu rALT, 4(rDEST)
++ beqlr-
++ rlwinm. rTMP, rALT, 24, 24, 31
++ stbu rTMP, 1(rDEST)
++ beqlr-
++ rlwinm. rTMP, rALT, 16, 24, 31
++ stbu rTMP, 1(rDEST)
++ beqlr-
++ rlwinm rTMP, rALT, 8, 24, 31
++ stbu rTMP, 1(rDEST)
++ blr
++#else
++ rlwinm. rTMP, rALT, 8, 24, 31
+ stbu rTMP, 4(rDEST)
+ beqlr-
+ rlwinm. rTMP, rALT, 16, 24, 31
+@@ -87,6 +102,7 @@
+ CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
+ STORE_RETURN_VALUE (rDEST)
+ blr
++#endif
+
+ /* Oh well. In this case, we just do a byte-by-byte copy. */
+ .align 4
+diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S
+--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S 2014-05-28 13:40:01.000000000 -0500
++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S 2014-05-28 13:40:01.000000000 -0500
+@@ -78,7 +78,22 @@
+
+ mr rALT, rWORD
+ /* We've hit the end of the string. Do the rest byte-by-byte. */
+-L(g1): rlwinm. rTMP, rALT, 8, 24, 31
++L(g1):
++#ifdef __LITTLE_ENDIAN__
++ rlwinm. rTMP, rALT, 0, 24, 31
++ stb rALT, 4(rDEST)
++ beqlr-
++ rlwinm. rTMP, rALT, 24, 24, 31
++ stb rTMP, 5(rDEST)
++ beqlr-
++ rlwinm. rTMP, rALT, 16, 24, 31
++ stb rTMP, 6(rDEST)
++ beqlr-
++ rlwinm rTMP, rALT, 8, 24, 31
++ stb rTMP, 7(rDEST)
++ blr
++#else
++ rlwinm. rTMP, rALT, 8, 24, 31
+ stb rTMP, 4(rDEST)
+ beqlr-
+ rlwinm. rTMP, rALT, 16, 24, 31
+@@ -90,6 +105,7 @@
+ stb rALT, 7(rDEST)
+ /* GKM FIXME: check high bound. */
+ blr
++#endif
+
+ /* Oh well. In this case, we just do a byte-by-byte copy. */
+ .align 4
+diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S
+--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S 2014-05-28 13:40:01.000000000 -0500
++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S 2014-05-28 13:40:01.000000000 -0500
+@@ -75,7 +75,22 @@
+
+ mr rALT, rWORD
+ /* We've hit the end of the string. Do the rest byte-by-byte. */
+-L(g1): rlwinm. rTMP, rALT, 8, 24, 31
++L(g1):
++#ifdef __LITTLE_ENDIAN__
++ rlwinm. rTMP, rALT, 0, 24, 31
++ stbu rALT, 4(rDEST)
++ beqlr-
++ rlwinm. rTMP, rALT, 24, 24, 31
++ stbu rTMP, 1(rDEST)
++ beqlr-
++ rlwinm. rTMP, rALT, 16, 24, 31
++ stbu rTMP, 1(rDEST)
++ beqlr-
++ rlwinm rTMP, rALT, 8, 24, 31
++ stbu rTMP, 1(rDEST)
++ blr
++#else
++ rlwinm. rTMP, rALT, 8, 24, 31
+ stbu rTMP, 4(rDEST)
+ beqlr-
+ rlwinm. rTMP, rALT, 16, 24, 31
+@@ -88,6 +103,7 @@
+ CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
+ STORE_RETURN_VALUE (rDEST)
+ blr
++#endif
+
+ /* Oh well. In this case, we just do a byte-by-byte copy. */
+ .align 4
+diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S
+--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S 2014-05-28 13:40:01.000000000 -0500
++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S 2014-05-28 13:40:01.000000000 -0500
+@@ -90,6 +90,32 @@
+ mr rALT, rWORD
+ /* We've hit the end of the string. Do the rest byte-by-byte. */
+ L(g1):
++#ifdef __LITTLE_ENDIAN__
++ extrdi. rTMP, rALT, 8, 56
++ stb rALT, 8(rDEST)
++ beqlr-
++ extrdi. rTMP, rALT, 8, 48
++ stb rTMP, 9(rDEST)
++ beqlr-
++ extrdi. rTMP, rALT, 8, 40
++ stb rTMP, 10(rDEST)
++ beqlr-
++ extrdi. rTMP, rALT, 8, 32
++ stb rTMP, 11(rDEST)
++ beqlr-
++ extrdi. rTMP, rALT, 8, 24
++ stb rTMP, 12(rDEST)
++ beqlr-
++ extrdi. rTMP, rALT, 8, 16
++ stb rTMP, 13(rDEST)
++ beqlr-
++ extrdi. rTMP, rALT, 8, 8
++ stb rTMP, 14(rDEST)
++ beqlr-
++ extrdi rTMP, rALT, 8, 0
++ stb rTMP, 15(rDEST)
++ blr
++#else
+ extrdi. rTMP, rALT, 8, 0
+ stb rTMP, 8(rDEST)
+ beqlr-
+@@ -114,6 +140,7 @@
+ stb rALT, 15(rDEST)
+ /* GKM FIXME: check high bound. */
+ blr
++#endif
+
+ /* Oh well. In this case, we just do a byte-by-byte copy. */
+ .align 4