Loading...
--- Libc/Libc-498/ppc/string/memset.s
+++ Libc/Libc-391.2.3/ppc/string/memset.s
@@ -49,14 +49,23 @@
.align 5
_memset: // void * memset(void *b, int c, size_t len);
andi. r7,r4,0xFF // copy value to working register, test for 0
- mr r4,r5 // move length to working register
+ mr r4,r5 // move length to working register
cmplgi cr1,r5,kShort // long enough to bother with _COMM_PAGE_MEMSET_PATTERN?
beqa++ _COMM_PAGE_BZERO // if (c==0), map to bzero()
rlwimi r7,r7,8,16,23 // replicate nonzero value to low 2 bytes
- neg r5,r3 // start to compute #bytes to align
- mr r8,r3 // make working copy of operand ptr
+ neg r5,r3 // start to compute #bytes to align
+ mr r8,r3 // make working copy of operand ptr
rlwimi r7,r7,16,0,15 // value now in all 4 bytes
- blt cr1,Lmemset3 // too short to use commpage
+ blt cr1,Lmemset3 // too short to use commpage
+
+ // TEMPORARY HACK
+ // Operand is long enough to use _COMM_PAGE_MEMSET_PATTERN. During Tiger
+ // development, B&I uses Panther kernels on their builders but runs Tiger
+ // apps on it. So _COMM_PAGE_MEMSET_PATTERN may not be on this machine.
+ // Rather than patch build fleet kernels, we just test to see if it is there
+ // and use the short-operand case if not. We can remove the hack when Tiger ships.
+
+ lhz r10,_COMM_PAGE_VERSION(0) // REMOVE THIS LINE WHEN TIGER SHIPS
andi. r0,r5,0xF // r0 <- #bytes to align on quadword
// Align ptr and store enough so that we have an aligned 16-byte pattern.
@@ -65,6 +74,7 @@
stw r7,4(r8)
stw r7,8(r8)
stw r7,12(r8)
+ cmpwi cr1,r10,1 // REMOVE THIS LINE WHEN TIGER SHIPS
beq Lmemset1 // skip if (r0==0), ie if r8 is 16-byte aligned
add r8,r8,r0 // 16-byte align ptr
sub r4,r4,r0 // adjust length
@@ -86,7 +96,7 @@
mr r9,r8 // point to 16-byte-aligned 16-byte pattern
addi r8,r8,16 // point to first unstored byte
subi r4,r4,16 // account for the aligned bytes we have stored
- bla _COMM_PAGE_MEMSET_PATTERN
+ bnela++ cr1,_COMM_PAGE_MEMSET_PATTERN // CHANGE THIS LINE WHEN TIGER SHIPS
mtlr r12
// Here for short nonzero memset.
@@ -129,20 +139,20 @@
blr
-/* ***********************************
- * * M E M S E T _ P A T T E R N 1 6 *
- * ***********************************
+/* *************************************
+ * * _ M E M S E T _ P A T T E R N 1 6 *
+ * *************************************
*
* Used to store a 16-byte pattern in memory:
*
- * void memset_pattern16(void *b, const void *c16, size_t len);
+ * void _memset_pattern16(void *b, const void *c16, size_t len);
*
* Where c16 points to the 16-byte pattern. None of the parameters need be aligned.
*/
- .globl _memset_pattern16
- .align 5
-_memset_pattern16:
+ .globl __memset_pattern16
+ .align 5
+__memset_pattern16:
cmplgi cr1,r5,kShort // check length
lwz r7,0(r4) // load pattern into (these remain lwz in 64-bit mode)
lwz r9,4(r4)
@@ -152,20 +162,20 @@
b __memset_pattern_common
-/* *********************************
- * * M E M S E T _ P A T T E R N 8 *
- * *********************************
+/* ***********************************
+ * * _ M E M S E T _ P A T T E R N 8 *
+ * ***********************************
*
* Used to store an 8-byte pattern in memory:
*
- * void memset_pattern8(void *b, const void *c8, size_t len);
+ * void _memset_pattern8(void *b, const void *c8, size_t len);
*
* Where c8 points to the 8-byte pattern. None of the parameters need be aligned.
*/
- .globl _memset_pattern8
- .align 5
-_memset_pattern8:
+ .globl __memset_pattern8
+ .align 5
+__memset_pattern8:
lwz r7,0(r4) // load pattern (these remain lwz in 64-bit mode)
lwz r9,4(r4)
cmplgi cr1,r5,kShort // check length
@@ -175,20 +185,20 @@
b __memset_pattern_common
-/* *********************************
- * * M E M S E T _ P A T T E R N 4 *
- * *********************************
+/* ***********************************
+ * * _ M E M S E T _ P A T T E R N 4 *
+ * ***********************************
*
* Used to store a 4-byte pattern in memory:
*
- * void memset_pattern4(void *b, const void *c4, size_t len);
+ * void _memset_pattern4(void *b, const void *c4, size_t len);
*
* Where c4 points to the 4-byte pattern. None of the parameters need be aligned.
*/
- .globl _memset_pattern4
- .align 5
-_memset_pattern4:
+ .globl __memset_pattern4
+ .align 5
+__memset_pattern4:
lwz r7,0(r4) // load pattern
cmplgi cr1,r5,kShort // check length
neg r6,r3 // start to compute ptr alignment
@@ -202,7 +212,7 @@
* * _ M E M S E T _ P A T T E R N _ C O M M O N *
* ***********************************************
*
- * This is the common code used by _memset_pattern16, 8, and 4. They all get here via
+ * This is the common code used by _memset_patter16, 8, and 4. They all get here via
* long branch (ie, "b") in case the routines are re-ordered, with:
* r3 = ptr to memory to store pattern into (unaligned)
* r5 = length in bytes
@@ -212,7 +222,6 @@
*/
.globl __memset_pattern_common
- .private_extern __memset_pattern_common // avoid dyld stub, which trashes r11
.align 5
__memset_pattern_common:
andi. r0,r6,0xF // get #bytes to 16-byte align ptr