summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/arch/alpha/lib
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/arch/alpha/lib')
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/Makefile58
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/callback_srm.S103
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/checksum.c184
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/clear_page.S39
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/clear_user.S113
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/copy_page.S49
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/copy_user.S145
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/csum_ipv6_magic.S115
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/csum_partial_copy.c378
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/dbg_current.S29
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/dbg_stackcheck.S27
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/dbg_stackkill.S35
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/dec_and_lock.c41
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/divide.S195
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-clear_page.S54
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-clear_user.S225
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-copy_page.S203
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-copy_user.S259
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-csum_ipv6_magic.S150
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-divide.S259
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-memchr.S191
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-memcpy.S248
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-memset.S597
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-strncpy_from_user.S424
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-stxcpy.S321
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev6-stxncpy.S397
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev67-strcat.S54
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev67-strchr.S88
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev67-strlen.S49
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev67-strlen_user.S107
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev67-strncat.S94
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/ev67-strrchr.S109
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/fls.c38
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/fpreg.c193
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/memchr.S164
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/memcpy.c163
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/memmove.S181
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/memset.S124
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/srm_printk.c41
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/srm_puts.c23
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/stacktrace.c102
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strcat.S52
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strchr.S70
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strcpy.S23
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strlen.S57
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strlen_user.S91
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strncat.S84
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strncpy.S81
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strncpy_from_user.S339
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/strrchr.S87
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/stxcpy.S289
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/stxncpy.S345
-rw-r--r--ANDROID_3.4.5/arch/alpha/lib/udelay.c54
53 files changed, 0 insertions, 7941 deletions
diff --git a/ANDROID_3.4.5/arch/alpha/lib/Makefile b/ANDROID_3.4.5/arch/alpha/lib/Makefile
deleted file mode 100644
index c0a83ab6..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# Makefile for alpha-specific library files..
-#
-
-asflags-y := $(KBUILD_CFLAGS)
-ccflags-y := -Werror
-
-# Many of these routines have implementations tuned for ev6.
-# Choose them iff we're targeting ev6 specifically.
-ev6-$(CONFIG_ALPHA_EV6) := ev6-
-
-# Several make use of the cttz instruction introduced in ev67.
-ev67-$(CONFIG_ALPHA_EV67) := ev67-
-
-lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \
- udelay.o \
- $(ev6-y)memset.o \
- $(ev6-y)memcpy.o \
- memmove.o \
- checksum.o \
- csum_partial_copy.o \
- $(ev67-y)strlen.o \
- $(ev67-y)strcat.o \
- strcpy.o \
- $(ev67-y)strncat.o \
- strncpy.o \
- $(ev6-y)stxcpy.o \
- $(ev6-y)stxncpy.o \
- $(ev67-y)strchr.o \
- $(ev67-y)strrchr.o \
- $(ev6-y)memchr.o \
- $(ev6-y)copy_user.o \
- $(ev6-y)clear_user.o \
- $(ev6-y)strncpy_from_user.o \
- $(ev67-y)strlen_user.o \
- $(ev6-y)csum_ipv6_magic.o \
- $(ev6-y)clear_page.o \
- $(ev6-y)copy_page.o \
- fpreg.o \
- callback_srm.o srm_puts.o srm_printk.o \
- fls.o
-
-lib-$(CONFIG_SMP) += dec_and_lock.o
-
-# The division routines are built from single source, with different defines.
-AFLAGS___divqu.o = -DDIV
-AFLAGS___remqu.o = -DREM
-AFLAGS___divlu.o = -DDIV -DINTSIZE
-AFLAGS___remlu.o = -DREM -DINTSIZE
-
-$(obj)/__divqu.o: $(obj)/$(ev6-y)divide.S
- $(cmd_as_o_S)
-$(obj)/__remqu.o: $(obj)/$(ev6-y)divide.S
- $(cmd_as_o_S)
-$(obj)/__divlu.o: $(obj)/$(ev6-y)divide.S
- $(cmd_as_o_S)
-$(obj)/__remlu.o: $(obj)/$(ev6-y)divide.S
- $(cmd_as_o_S)
diff --git a/ANDROID_3.4.5/arch/alpha/lib/callback_srm.S b/ANDROID_3.4.5/arch/alpha/lib/callback_srm.S
deleted file mode 100644
index 8804bec2..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/callback_srm.S
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * arch/alpha/lib/callback_srm.S
- */
-
-#include <asm/console.h>
-
-.text
-#define HWRPB_CRB_OFFSET 0xc0
-
-#if defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC)
-.align 4
-srm_dispatch:
-#if defined(CONFIG_ALPHA_GENERIC)
- ldl $4,alpha_using_srm
- beq $4,nosrm
-#endif
- ldq $0,hwrpb # gp is set up by CALLBACK macro.
- ldl $25,0($25) # Pick up the wrapper data.
- mov $20,$21 # Shift arguments right.
- mov $19,$20
- ldq $1,HWRPB_CRB_OFFSET($0)
- mov $18,$19
- mov $17,$18
- mov $16,$17
- addq $0,$1,$2 # CRB address
- ldq $27,0($2) # DISPATCH procedure descriptor (VMS call std)
- extwl $25,0,$16 # SRM callback function code
- ldq $3,8($27) # call address
- extwl $25,2,$25 # argument information (VMS calling std)
- jmp ($3) # Return directly to caller of wrapper.
-
-.align 4
-.globl srm_fixup
-.ent srm_fixup
-srm_fixup:
- ldgp $29,0($27)
-#if defined(CONFIG_ALPHA_GENERIC)
- ldl $4,alpha_using_srm
- beq $4,nosrm
-#endif
- ldq $0,hwrpb
- ldq $1,HWRPB_CRB_OFFSET($0)
- addq $0,$1,$2 # CRB address
- ldq $27,16($2) # VA of FIXUP procedure descriptor
- ldq $3,8($27) # call address
- lda $25,2($31) # two integer arguments
- jmp ($3) # Return directly to caller of srm_fixup.
-.end srm_fixup
-
-#if defined(CONFIG_ALPHA_GENERIC)
-.align 3
-nosrm:
- lda $0,-1($31)
- ret
-#endif
-
-#define CALLBACK(NAME, CODE, ARG_CNT) \
-.align 4; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \
-ldgp $29,0($27); br $25,srm_dispatch; .word CODE, ARG_CNT; .end callback_##NAME
-
-#else /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */
-
-#define CALLBACK(NAME, CODE, ARG_CNT) \
-.align 3; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \
-lda $0,-1($31); ret; .end callback_##NAME
-
-.align 3
-.globl srm_fixup
-.ent srm_fixup
-srm_fixup:
- lda $0,-1($31)
- ret
-.end srm_fixup
-#endif /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */
-
-CALLBACK(puts, CCB_PUTS, 4)
-CALLBACK(open, CCB_OPEN, 3)
-CALLBACK(close, CCB_CLOSE, 2)
-CALLBACK(read, CCB_READ, 5)
-CALLBACK(open_console, CCB_OPEN_CONSOLE, 1)
-CALLBACK(close_console, CCB_CLOSE_CONSOLE, 1)
-CALLBACK(getenv, CCB_GET_ENV, 4)
-CALLBACK(setenv, CCB_SET_ENV, 4)
-CALLBACK(getc, CCB_GETC, 2)
-CALLBACK(reset_term, CCB_RESET_TERM, 2)
-CALLBACK(term_int, CCB_SET_TERM_INT, 3)
-CALLBACK(term_ctl, CCB_SET_TERM_CTL, 3)
-CALLBACK(process_keycode, CCB_PROCESS_KEYCODE, 3)
-CALLBACK(ioctl, CCB_IOCTL, 6)
-CALLBACK(write, CCB_WRITE, 5)
-CALLBACK(reset_env, CCB_RESET_ENV, 4)
-CALLBACK(save_env, CCB_SAVE_ENV, 1)
-CALLBACK(pswitch, CCB_PSWITCH, 3)
-CALLBACK(bios_emul, CCB_BIOS_EMUL, 5)
-
-.data
-__alpha_using_srm: # For use by bootpheader
- .long 7 # value is not 1 for link debugging
- .weak alpha_using_srm; alpha_using_srm = __alpha_using_srm
-__callback_init_done: # For use by bootpheader
- .long 7 # value is not 1 for link debugging
- .weak callback_init_done; callback_init_done = __callback_init_done
-
diff --git a/ANDROID_3.4.5/arch/alpha/lib/checksum.c b/ANDROID_3.4.5/arch/alpha/lib/checksum.c
deleted file mode 100644
index 199f6efa..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/checksum.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * arch/alpha/lib/checksum.c
- *
- * This file contains network checksum routines that are better done
- * in an architecture-specific manner due to speed..
- * Comments in other versions indicate that the algorithms are from RFC1071
- *
- * accelerated versions (and 21264 assembly versions ) contributed by
- * Rick Gorton <rick.gorton@alpha-processor.com>
- */
-
-#include <linux/module.h>
-#include <linux/string.h>
-
-#include <asm/byteorder.h>
-
-static inline unsigned short from64to16(unsigned long x)
-{
- /* Using extract instructions is a bit more efficient
- than the original shift/bitmask version. */
-
- union {
- unsigned long ul;
- unsigned int ui[2];
- unsigned short us[4];
- } in_v, tmp_v, out_v;
-
- in_v.ul = x;
- tmp_v.ul = (unsigned long) in_v.ui[0] + (unsigned long) in_v.ui[1];
-
- /* Since the bits of tmp_v.sh[3] are going to always be zero,
- we don't have to bother to add that in. */
- out_v.ul = (unsigned long) tmp_v.us[0] + (unsigned long) tmp_v.us[1]
- + (unsigned long) tmp_v.us[2];
-
- /* Similarly, out_v.us[2] is always zero for the final add. */
- return out_v.us[0] + out_v.us[1];
-}
-
-/*
- * computes the checksum of the TCP/UDP pseudo-header
- * returns a 16-bit checksum, already complemented.
- */
-__sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
- unsigned short len,
- unsigned short proto,
- __wsum sum)
-{
- return (__force __sum16)~from64to16(
- (__force u64)saddr + (__force u64)daddr +
- (__force u64)sum + ((len + proto) << 8));
-}
-
-__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
- unsigned short len,
- unsigned short proto,
- __wsum sum)
-{
- unsigned long result;
-
- result = (__force u64)saddr + (__force u64)daddr +
- (__force u64)sum + ((len + proto) << 8);
-
- /* Fold down to 32-bits so we don't lose in the typedef-less
- network stack. */
- /* 64 to 33 */
- result = (result & 0xffffffff) + (result >> 32);
- /* 33 to 32 */
- result = (result & 0xffffffff) + (result >> 32);
- return (__force __wsum)result;
-}
-EXPORT_SYMBOL(csum_tcpudp_nofold);
-
-/*
- * Do a 64-bit checksum on an arbitrary memory area..
- *
- * This isn't a great routine, but it's not _horrible_ either. The
- * inner loop could be unrolled a bit further, and there are better
- * ways to do the carry, but this is reasonable.
- */
-static inline unsigned long do_csum(const unsigned char * buff, int len)
-{
- int odd, count;
- unsigned long result = 0;
-
- if (len <= 0)
- goto out;
- odd = 1 & (unsigned long) buff;
- if (odd) {
- result = *buff << 8;
- len--;
- buff++;
- }
- count = len >> 1; /* nr of 16-bit words.. */
- if (count) {
- if (2 & (unsigned long) buff) {
- result += *(unsigned short *) buff;
- count--;
- len -= 2;
- buff += 2;
- }
- count >>= 1; /* nr of 32-bit words.. */
- if (count) {
- if (4 & (unsigned long) buff) {
- result += *(unsigned int *) buff;
- count--;
- len -= 4;
- buff += 4;
- }
- count >>= 1; /* nr of 64-bit words.. */
- if (count) {
- unsigned long carry = 0;
- do {
- unsigned long w = *(unsigned long *) buff;
- count--;
- buff += 8;
- result += carry;
- result += w;
- carry = (w > result);
- } while (count);
- result += carry;
- result = (result & 0xffffffff) + (result >> 32);
- }
- if (len & 4) {
- result += *(unsigned int *) buff;
- buff += 4;
- }
- }
- if (len & 2) {
- result += *(unsigned short *) buff;
- buff += 2;
- }
- }
- if (len & 1)
- result += *buff;
- result = from64to16(result);
- if (odd)
- result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
-out:
- return result;
-}
-
-/*
- * This is a version of ip_compute_csum() optimized for IP headers,
- * which always checksum on 4 octet boundaries.
- */
-__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
-{
- return (__force __sum16)~do_csum(iph,ihl*4);
-}
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
-__wsum csum_partial(const void *buff, int len, __wsum sum)
-{
- unsigned long result = do_csum(buff, len);
-
- /* add in old sum, and carry.. */
- result += (__force u32)sum;
- /* 32+c bits -> 32 bits */
- result = (result & 0xffffffff) + (result >> 32);
- return (__force __wsum)result;
-}
-
-EXPORT_SYMBOL(csum_partial);
-
-/*
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
-__sum16 ip_compute_csum(const void *buff, int len)
-{
- return (__force __sum16)~from64to16(do_csum(buff,len));
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/clear_page.S b/ANDROID_3.4.5/arch/alpha/lib/clear_page.S
deleted file mode 100644
index a221ae26..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/clear_page.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * arch/alpha/lib/clear_page.S
- *
- * Zero an entire page.
- */
-
- .text
- .align 4
- .global clear_page
- .ent clear_page
-clear_page:
- .prologue 0
-
- lda $0,128
- nop
- unop
- nop
-
-1: stq $31,0($16)
- stq $31,8($16)
- stq $31,16($16)
- stq $31,24($16)
-
- stq $31,32($16)
- stq $31,40($16)
- stq $31,48($16)
- subq $0,1,$0
-
- stq $31,56($16)
- addq $16,64,$16
- unop
- bne $0,1b
-
- ret
- nop
- unop
- nop
-
- .end clear_page
diff --git a/ANDROID_3.4.5/arch/alpha/lib/clear_user.S b/ANDROID_3.4.5/arch/alpha/lib/clear_user.S
deleted file mode 100644
index 8860316c..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/clear_user.S
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * arch/alpha/lib/clear_user.S
- * Contributed by Richard Henderson <rth@tamu.edu>
- *
- * Zero user space, handling exceptions as we go.
- *
- * We have to make sure that $0 is always up-to-date and contains the
- * right "bytes left to zero" value (and that it is updated only _after_
- * a successful copy). There is also some rather minor exception setup
- * stuff.
- *
- * NOTE! This is not directly C-callable, because the calling semantics
- * are different:
- *
- * Inputs:
- * length in $0
- * destination address in $6
- * exception pointer in $7
- * return address in $28 (exceptions expect it there)
- *
- * Outputs:
- * bytes left to copy in $0
- *
- * Clobbers:
- * $1,$2,$3,$4,$5,$6
- */
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EX(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exception-99b($31); \
- .previous
-
- .set noat
- .set noreorder
- .align 4
-
- .globl __do_clear_user
- .ent __do_clear_user
- .frame $30, 0, $28
- .prologue 0
-
-$loop:
- and $1, 3, $4 # e0 :
- beq $4, 1f # .. e1 :
-
-0: EX( stq_u $31, 0($6) ) # e0 : zero one word
- subq $0, 8, $0 # .. e1 :
- subq $4, 1, $4 # e0 :
- addq $6, 8, $6 # .. e1 :
- bne $4, 0b # e1 :
- unop # :
-
-1: bic $1, 3, $1 # e0 :
- beq $1, $tail # .. e1 :
-
-2: EX( stq_u $31, 0($6) ) # e0 : zero four words
- subq $0, 8, $0 # .. e1 :
- EX( stq_u $31, 8($6) ) # e0 :
- subq $0, 8, $0 # .. e1 :
- EX( stq_u $31, 16($6) ) # e0 :
- subq $0, 8, $0 # .. e1 :
- EX( stq_u $31, 24($6) ) # e0 :
- subq $0, 8, $0 # .. e1 :
- subq $1, 4, $1 # e0 :
- addq $6, 32, $6 # .. e1 :
- bne $1, 2b # e1 :
-
-$tail:
- bne $2, 1f # e1 : is there a tail to do?
- ret $31, ($28), 1 # .. e1 :
-
-1: EX( ldq_u $5, 0($6) ) # e0 :
- clr $0 # .. e1 :
- nop # e1 :
- mskqh $5, $0, $5 # e0 :
- EX( stq_u $5, 0($6) ) # e0 :
- ret $31, ($28), 1 # .. e1 :
-
-__do_clear_user:
- and $6, 7, $4 # e0 : find dest misalignment
- beq $0, $zerolength # .. e1 :
- addq $0, $4, $1 # e0 : bias counter
- and $1, 7, $2 # e1 : number of bytes in tail
- srl $1, 3, $1 # e0 :
- beq $4, $loop # .. e1 :
-
- EX( ldq_u $5, 0($6) ) # e0 : load dst word to mask back in
- beq $1, $oneword # .. e1 : sub-word store?
-
- mskql $5, $6, $5 # e0 : take care of misaligned head
- addq $6, 8, $6 # .. e1 :
- EX( stq_u $5, -8($6) ) # e0 :
- addq $0, $4, $0 # .. e1 : bytes left -= 8 - misalignment
- subq $1, 1, $1 # e0 :
- subq $0, 8, $0 # .. e1 :
- br $loop # e1 :
- unop # :
-
-$oneword:
- mskql $5, $6, $4 # e0 :
- mskqh $5, $2, $5 # e0 :
- or $5, $4, $5 # e1 :
- EX( stq_u $5, 0($6) ) # e0 :
- clr $0 # .. e1 :
-
-$zerolength:
-$exception:
- ret $31, ($28), 1 # .. e1 :
-
- .end __do_clear_user
diff --git a/ANDROID_3.4.5/arch/alpha/lib/copy_page.S b/ANDROID_3.4.5/arch/alpha/lib/copy_page.S
deleted file mode 100644
index 9f3b9745..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/copy_page.S
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * arch/alpha/lib/copy_page.S
- *
- * Copy an entire page.
- */
-
- .text
- .align 4
- .global copy_page
- .ent copy_page
-copy_page:
- .prologue 0
-
- lda $18,128
- nop
- unop
- nop
-
-1: ldq $0,0($17)
- ldq $1,8($17)
- ldq $2,16($17)
- ldq $3,24($17)
-
- ldq $4,32($17)
- ldq $5,40($17)
- ldq $6,48($17)
- ldq $7,56($17)
-
- stq $0,0($16)
- subq $18,1,$18
- stq $1,8($16)
- addq $17,64,$17
-
- stq $2,16($16)
- stq $3,24($16)
- stq $4,32($16)
- stq $5,40($16)
-
- stq $6,48($16)
- stq $7,56($16)
- addq $16,64,$16
- bne $18, 1b
-
- ret
- nop
- unop
- nop
-
- .end copy_page
diff --git a/ANDROID_3.4.5/arch/alpha/lib/copy_user.S b/ANDROID_3.4.5/arch/alpha/lib/copy_user.S
deleted file mode 100644
index 6f3fab9e..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/copy_user.S
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * arch/alpha/lib/copy_user.S
- *
- * Copy to/from user space, handling exceptions as we go.. This
- * isn't exactly pretty.
- *
- * This is essentially the same as "memcpy()", but with a few twists.
- * Notably, we have to make sure that $0 is always up-to-date and
- * contains the right "bytes left to copy" value (and that it is updated
- * only _after_ a successful copy). There is also some rather minor
- * exception setup stuff..
- *
- * NOTE! This is not directly C-callable, because the calling semantics are
- * different:
- *
- * Inputs:
- * length in $0
- * destination address in $6
- * source address in $7
- * return address in $28
- *
- * Outputs:
- * bytes left to copy in $0
- *
- * Clobbers:
- * $1,$2,$3,$4,$5,$6,$7
- */
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EXI(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exitin-99b($31); \
- .previous
-
-#define EXO(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exitout-99b($31); \
- .previous
-
- .set noat
- .align 4
- .globl __copy_user
- .ent __copy_user
-__copy_user:
- .prologue 0
- and $6,7,$3
- beq $0,$35
- beq $3,$36
- subq $3,8,$3
- .align 4
-$37:
- EXI( ldq_u $1,0($7) )
- EXO( ldq_u $2,0($6) )
- extbl $1,$7,$1
- mskbl $2,$6,$2
- insbl $1,$6,$1
- addq $3,1,$3
- bis $1,$2,$1
- EXO( stq_u $1,0($6) )
- subq $0,1,$0
- addq $6,1,$6
- addq $7,1,$7
- beq $0,$41
- bne $3,$37
-$36:
- and $7,7,$1
- bic $0,7,$4
- beq $1,$43
- beq $4,$48
- EXI( ldq_u $3,0($7) )
- .align 4
-$50:
- EXI( ldq_u $2,8($7) )
- subq $4,8,$4
- extql $3,$7,$3
- extqh $2,$7,$1
- bis $3,$1,$1
- EXO( stq $1,0($6) )
- addq $7,8,$7
- subq $0,8,$0
- addq $6,8,$6
- bis $2,$2,$3
- bne $4,$50
-$48:
- beq $0,$41
- .align 4
-$57:
- EXI( ldq_u $1,0($7) )
- EXO( ldq_u $2,0($6) )
- extbl $1,$7,$1
- mskbl $2,$6,$2
- insbl $1,$6,$1
- bis $1,$2,$1
- EXO( stq_u $1,0($6) )
- subq $0,1,$0
- addq $6,1,$6
- addq $7,1,$7
- bne $0,$57
- br $31,$41
- .align 4
-$43:
- beq $4,$65
- .align 4
-$66:
- EXI( ldq $1,0($7) )
- subq $4,8,$4
- EXO( stq $1,0($6) )
- addq $7,8,$7
- subq $0,8,$0
- addq $6,8,$6
- bne $4,$66
-$65:
- beq $0,$41
- EXI( ldq $2,0($7) )
- EXO( ldq $1,0($6) )
- mskql $2,$0,$2
- mskqh $1,$0,$1
- bis $2,$1,$2
- EXO( stq $2,0($6) )
- bis $31,$31,$0
-$41:
-$35:
-$exitout:
- ret $31,($28),1
-
-$exitin:
- /* A stupid byte-by-byte zeroing of the rest of the output
- buffer. This cures security holes by never leaving
- random kernel data around to be copied elsewhere. */
-
- mov $0,$1
-$101:
- EXO ( ldq_u $2,0($6) )
- subq $1,1,$1
- mskbl $2,$6,$2
- EXO ( stq_u $2,0($6) )
- addq $6,1,$6
- bgt $1,$101
- ret $31,($28),1
-
- .end __copy_user
diff --git a/ANDROID_3.4.5/arch/alpha/lib/csum_ipv6_magic.S b/ANDROID_3.4.5/arch/alpha/lib/csum_ipv6_magic.S
deleted file mode 100644
index 2c2acb96..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/csum_ipv6_magic.S
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * arch/alpha/lib/csum_ipv6_magic.S
- * Contributed by Richard Henderson <rth@tamu.edu>
- *
- * unsigned short csum_ipv6_magic(struct in6_addr *saddr,
- * struct in6_addr *daddr,
- * __u32 len,
- * unsigned short proto,
- * unsigned int csum);
- *
- * Misalignment handling (which costs 16 instructions / 8 cycles)
- * added by Ivan Kokshaysky <ink@jurassic.park.msu.ru>
- */
-
- .globl csum_ipv6_magic
- .align 4
- .ent csum_ipv6_magic
- .frame $30,0,$26,0
-csum_ipv6_magic:
- .prologue 0
-
- ldq_u $0,0($16) # e0 : load src & dst addr words
- zapnot $20,15,$20 # .. e1 : zero extend incoming csum
- extqh $18,1,$4 # e0 : byte swap len & proto while we wait
- ldq_u $21,7($16) # .. e1 : handle misalignment
-
- extbl $18,1,$5 # e0 :
- ldq_u $1,8($16) # .. e1 :
- extbl $18,2,$6 # e0 :
- ldq_u $22,15($16) # .. e1 :
-
- extbl $18,3,$18 # e0 :
- ldq_u $2,0($17) # .. e1 :
- sra $4,32,$4 # e0 :
- ldq_u $23,7($17) # .. e1 :
-
- extql $0,$16,$0 # e0 :
- ldq_u $3,8($17) # .. e1 :
- extqh $21,$16,$21 # e0 :
- ldq_u $24,15($17) # .. e1 :
-
- sll $5,16,$5 # e0 :
- or $0,$21,$0 # .. e1 : 1st src word complete
- extql $1,$16,$1 # e0 :
- addq $20,$0,$20 # .. e1 : begin summing the words
-
- extqh $22,$16,$22 # e0 :
- cmpult $20,$0,$0 # .. e1 :
- sll $6,8,$6 # e0 :
- or $1,$22,$1 # .. e1 : 2nd src word complete
-
- extql $2,$17,$2 # e0 :
- or $4,$18,$18 # .. e1 :
- extqh $23,$17,$23 # e0 :
- or $5,$6,$5 # .. e1 :
-
- extql $3,$17,$3 # e0 :
- or $2,$23,$2 # .. e1 : 1st dst word complete
- extqh $24,$17,$24 # e0 :
- or $18,$5,$18 # .. e1 : len complete
-
- extwh $19,7,$7 # e0 :
- or $3,$24,$3 # .. e1 : 2nd dst word complete
- extbl $19,1,$19 # e0 :
- addq $20,$1,$20 # .. e1 :
-
- or $19,$7,$19 # e0 :
- cmpult $20,$1,$1 # .. e1 :
- sll $19,48,$19 # e0 :
- nop # .. e0 :
-
- sra $19,32,$19 # e0 : proto complete
- addq $20,$2,$20 # .. e1 :
- cmpult $20,$2,$2 # e0 :
- addq $20,$3,$20 # .. e1 :
-
- cmpult $20,$3,$3 # e0 :
- addq $20,$18,$20 # .. e1 :
- cmpult $20,$18,$18 # e0 :
- addq $20,$19,$20 # .. e1 :
-
- cmpult $20,$19,$19 # e0 :
- addq $0,$1,$0 # .. e1 : merge the carries back into the csum
- addq $2,$3,$2 # e0 :
- addq $18,$19,$18 # .. e1 :
-
- addq $0,$2,$0 # e0 :
- addq $20,$18,$20 # .. e1 :
- addq $0,$20,$0 # e0 :
- unop # :
-
- extwl $0,2,$2 # e0 : begin folding the 64-bit value
- zapnot $0,3,$3 # .. e1 :
- extwl $0,4,$1 # e0 :
- addq $2,$3,$3 # .. e1 :
-
- extwl $0,6,$0 # e0 :
- addq $3,$1,$3 # .. e1 :
- addq $0,$3,$0 # e0 :
- unop # :
-
- extwl $0,2,$1 # e0 : fold 18-bit value
- zapnot $0,3,$0 # .. e1 :
- addq $0,$1,$0 # e0 :
- unop # :
-
- extwl $0,2,$1 # e0 : fold 17-bit value
- zapnot $0,3,$0 # .. e1 :
- addq $0,$1,$0 # e0 :
- not $0,$0 # .. e1 : and complement.
-
- zapnot $0,3,$0 # e0 :
- ret # .. e1 :
-
- .end csum_ipv6_magic
diff --git a/ANDROID_3.4.5/arch/alpha/lib/csum_partial_copy.c b/ANDROID_3.4.5/arch/alpha/lib/csum_partial_copy.c
deleted file mode 100644
index 40736da9..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/csum_partial_copy.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * csum_partial_copy - do IP checksumming and copy
- *
- * (C) Copyright 1996 Linus Torvalds
- * accelerated versions (and 21264 assembly versions ) contributed by
- * Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Don't look at this too closely - you'll go mad. The things
- * we do for performance..
- */
-
-#include <linux/types.h>
-#include <linux/string.h>
-#include <asm/uaccess.h>
-
-
-#define ldq_u(x,y) \
-__asm__ __volatile__("ldq_u %0,%1":"=r" (x):"m" (*(const unsigned long *)(y)))
-
-#define stq_u(x,y) \
-__asm__ __volatile__("stq_u %1,%0":"=m" (*(unsigned long *)(y)):"r" (x))
-
-#define extql(x,y,z) \
-__asm__ __volatile__("extql %1,%2,%0":"=r" (z):"r" (x),"r" (y))
-
-#define extqh(x,y,z) \
-__asm__ __volatile__("extqh %1,%2,%0":"=r" (z):"r" (x),"r" (y))
-
-#define mskql(x,y,z) \
-__asm__ __volatile__("mskql %1,%2,%0":"=r" (z):"r" (x),"r" (y))
-
-#define mskqh(x,y,z) \
-__asm__ __volatile__("mskqh %1,%2,%0":"=r" (z):"r" (x),"r" (y))
-
-#define insql(x,y,z) \
-__asm__ __volatile__("insql %1,%2,%0":"=r" (z):"r" (x),"r" (y))
-
-#define insqh(x,y,z) \
-__asm__ __volatile__("insqh %1,%2,%0":"=r" (z):"r" (x),"r" (y))
-
-
-#define __get_user_u(x,ptr) \
-({ \
- long __guu_err; \
- __asm__ __volatile__( \
- "1: ldq_u %0,%2\n" \
- "2:\n" \
- ".section __ex_table,\"a\"\n" \
- " .long 1b - .\n" \
- " lda %0,2b-1b(%1)\n" \
- ".previous" \
- : "=r"(x), "=r"(__guu_err) \
- : "m"(__m(ptr)), "1"(0)); \
- __guu_err; \
-})
-
-#define __put_user_u(x,ptr) \
-({ \
- long __puu_err; \
- __asm__ __volatile__( \
- "1: stq_u %2,%1\n" \
- "2:\n" \
- ".section __ex_table,\"a\"\n" \
- " .long 1b - ." \
- " lda $31,2b-1b(%0)\n" \
- ".previous" \
- : "=r"(__puu_err) \
- : "m"(__m(addr)), "rJ"(x), "0"(0)); \
- __puu_err; \
-})
-
-
-static inline unsigned short from64to16(unsigned long x)
-{
- /* Using extract instructions is a bit more efficient
- than the original shift/bitmask version. */
-
- union {
- unsigned long ul;
- unsigned int ui[2];
- unsigned short us[4];
- } in_v, tmp_v, out_v;
-
- in_v.ul = x;
- tmp_v.ul = (unsigned long) in_v.ui[0] + (unsigned long) in_v.ui[1];
-
- /* Since the bits of tmp_v.sh[3] are going to always be zero,
- we don't have to bother to add that in. */
- out_v.ul = (unsigned long) tmp_v.us[0] + (unsigned long) tmp_v.us[1]
- + (unsigned long) tmp_v.us[2];
-
- /* Similarly, out_v.us[2] is always zero for the final add. */
- return out_v.us[0] + out_v.us[1];
-}
-
-
-
-/*
- * Ok. This isn't fun, but this is the EASY case.
- */
-static inline unsigned long
-csum_partial_cfu_aligned(const unsigned long __user *src, unsigned long *dst,
- long len, unsigned long checksum,
- int *errp)
-{
- unsigned long carry = 0;
- int err = 0;
-
- while (len >= 0) {
- unsigned long word;
- err |= __get_user(word, src);
- checksum += carry;
- src++;
- checksum += word;
- len -= 8;
- carry = checksum < word;
- *dst = word;
- dst++;
- }
- len += 8;
- checksum += carry;
- if (len) {
- unsigned long word, tmp;
- err |= __get_user(word, src);
- tmp = *dst;
- mskql(word, len, word);
- checksum += word;
- mskqh(tmp, len, tmp);
- carry = checksum < word;
- *dst = word | tmp;
- checksum += carry;
- }
- if (err) *errp = err;
- return checksum;
-}
-
-/*
- * This is even less fun, but this is still reasonably
- * easy.
- */
-static inline unsigned long
-csum_partial_cfu_dest_aligned(const unsigned long __user *src,
- unsigned long *dst,
- unsigned long soff,
- long len, unsigned long checksum,
- int *errp)
-{
- unsigned long first;
- unsigned long word, carry;
- unsigned long lastsrc = 7+len+(unsigned long)src;
- int err = 0;
-
- err |= __get_user_u(first,src);
- carry = 0;
- while (len >= 0) {
- unsigned long second;
-
- err |= __get_user_u(second, src+1);
- extql(first, soff, word);
- len -= 8;
- src++;
- extqh(second, soff, first);
- checksum += carry;
- word |= first;
- first = second;
- checksum += word;
- *dst = word;
- dst++;
- carry = checksum < word;
- }
- len += 8;
- checksum += carry;
- if (len) {
- unsigned long tmp;
- unsigned long second;
- err |= __get_user_u(second, lastsrc);
- tmp = *dst;
- extql(first, soff, word);
- extqh(second, soff, first);
- word |= first;
- mskql(word, len, word);
- checksum += word;
- mskqh(tmp, len, tmp);
- carry = checksum < word;
- *dst = word | tmp;
- checksum += carry;
- }
- if (err) *errp = err;
- return checksum;
-}
-
-/*
- * This is slightly less fun than the above..
- */
-static inline unsigned long
-csum_partial_cfu_src_aligned(const unsigned long __user *src,
- unsigned long *dst,
- unsigned long doff,
- long len, unsigned long checksum,
- unsigned long partial_dest,
- int *errp)
-{
- unsigned long carry = 0;
- unsigned long word;
- unsigned long second_dest;
- int err = 0;
-
- mskql(partial_dest, doff, partial_dest);
- while (len >= 0) {
- err |= __get_user(word, src);
- len -= 8;
- insql(word, doff, second_dest);
- checksum += carry;
- stq_u(partial_dest | second_dest, dst);
- src++;
- checksum += word;
- insqh(word, doff, partial_dest);
- carry = checksum < word;
- dst++;
- }
- len += 8;
- if (len) {
- checksum += carry;
- err |= __get_user(word, src);
- mskql(word, len, word);
- len -= 8;
- checksum += word;
- insql(word, doff, second_dest);
- len += doff;
- carry = checksum < word;
- partial_dest |= second_dest;
- if (len >= 0) {
- stq_u(partial_dest, dst);
- if (!len) goto out;
- dst++;
- insqh(word, doff, partial_dest);
- }
- doff = len;
- }
- ldq_u(second_dest, dst);
- mskqh(second_dest, doff, second_dest);
- stq_u(partial_dest | second_dest, dst);
-out:
- checksum += carry;
- if (err) *errp = err;
- return checksum;
-}
-
-/*
- * This is so totally un-fun that it's frightening. Don't
- * look at this too closely, you'll go blind.
- */
-static inline unsigned long
-csum_partial_cfu_unaligned(const unsigned long __user * src,
- unsigned long * dst,
- unsigned long soff, unsigned long doff,
- long len, unsigned long checksum,
- unsigned long partial_dest,
- int *errp)
-{
- unsigned long carry = 0;
- unsigned long first;
- unsigned long lastsrc;
- int err = 0;
-
- err |= __get_user_u(first, src);
- lastsrc = 7+len+(unsigned long)src;
- mskql(partial_dest, doff, partial_dest);
- while (len >= 0) {
- unsigned long second, word;
- unsigned long second_dest;
-
- err |= __get_user_u(second, src+1);
- extql(first, soff, word);
- checksum += carry;
- len -= 8;
- extqh(second, soff, first);
- src++;
- word |= first;
- first = second;
- insql(word, doff, second_dest);
- checksum += word;
- stq_u(partial_dest | second_dest, dst);
- carry = checksum < word;
- insqh(word, doff, partial_dest);
- dst++;
- }
- len += doff;
- checksum += carry;
- if (len >= 0) {
- unsigned long second, word;
- unsigned long second_dest;
-
- err |= __get_user_u(second, lastsrc);
- extql(first, soff, word);
- extqh(second, soff, first);
- word |= first;
- first = second;
- mskql(word, len-doff, word);
- checksum += word;
- insql(word, doff, second_dest);
- carry = checksum < word;
- stq_u(partial_dest | second_dest, dst);
- if (len) {
- ldq_u(second_dest, dst+1);
- insqh(word, doff, partial_dest);
- mskqh(second_dest, len, second_dest);
- stq_u(partial_dest | second_dest, dst+1);
- }
- checksum += carry;
- } else {
- unsigned long second, word;
- unsigned long second_dest;
-
- err |= __get_user_u(second, lastsrc);
- extql(first, soff, word);
- extqh(second, soff, first);
- word |= first;
- ldq_u(second_dest, dst);
- mskql(word, len-doff, word);
- checksum += word;
- mskqh(second_dest, len, second_dest);
- carry = checksum < word;
- insql(word, doff, word);
- stq_u(partial_dest | word | second_dest, dst);
- checksum += carry;
- }
- if (err) *errp = err;
- return checksum;
-}
-
-__wsum
-csum_partial_copy_from_user(const void __user *src, void *dst, int len,
- __wsum sum, int *errp)
-{
- unsigned long checksum = (__force u32) sum;
- unsigned long soff = 7 & (unsigned long) src;
- unsigned long doff = 7 & (unsigned long) dst;
-
- if (len) {
- if (!doff) {
- if (!soff)
- checksum = csum_partial_cfu_aligned(
- (const unsigned long __user *) src,
- (unsigned long *) dst,
- len-8, checksum, errp);
- else
- checksum = csum_partial_cfu_dest_aligned(
- (const unsigned long __user *) src,
- (unsigned long *) dst,
- soff, len-8, checksum, errp);
- } else {
- unsigned long partial_dest;
- ldq_u(partial_dest, dst);
- if (!soff)
- checksum = csum_partial_cfu_src_aligned(
- (const unsigned long __user *) src,
- (unsigned long *) dst,
- doff, len-8, checksum,
- partial_dest, errp);
- else
- checksum = csum_partial_cfu_unaligned(
- (const unsigned long __user *) src,
- (unsigned long *) dst,
- soff, doff, len-8, checksum,
- partial_dest, errp);
- }
- checksum = from64to16 (checksum);
- }
- return (__force __wsum)checksum;
-}
-
-__wsum
-csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
-{
- return csum_partial_copy_from_user((__force const void __user *)src,
- dst, len, sum, NULL);
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/dbg_current.S b/ANDROID_3.4.5/arch/alpha/lib/dbg_current.S
deleted file mode 100644
index e6d07101..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/dbg_current.S
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * arch/alpha/lib/dbg_current.S
- * Contributed by Richard Henderson (rth@cygnus.com)
- *
- * Trap if we find current not correct.
- */
-
-#include <asm/pal.h>
-
- .text
- .set noat
-
- .globl _mcount
- .ent _mcount
-_mcount:
- .frame $30, 0, $28, 0
- .prologue 0
-
- lda $0, -0x4000($30)
- cmpult $8, $30, $1
- cmpule $0, $30, $2
- and $1, $2, $3
- bne $3, 1f
-
- call_pal PAL_bugchk
-
-1: ret $31, ($28), 1
-
- .end _mcount
diff --git a/ANDROID_3.4.5/arch/alpha/lib/dbg_stackcheck.S b/ANDROID_3.4.5/arch/alpha/lib/dbg_stackcheck.S
deleted file mode 100644
index 78f6b924..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/dbg_stackcheck.S
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * arch/alpha/lib/dbg_stackcheck.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Verify that we have not overflowed the stack. Oops if we have.
- */
-
-#include <asm/asm-offsets.h>
-
- .text
- .set noat
-
- .align 3
- .globl _mcount
- .ent _mcount
-_mcount:
- .frame $30, 0, $28, 0
- .prologue 0
-
- lda $0, TASK_SIZE($8)
- cmpult $30, $0, $0
- bne $0, 1f
- ret ($28)
-1: stq $31, -8($31) # oops me, damn it.
- br 1b
-
- .end _mcount
diff --git a/ANDROID_3.4.5/arch/alpha/lib/dbg_stackkill.S b/ANDROID_3.4.5/arch/alpha/lib/dbg_stackkill.S
deleted file mode 100644
index c1e40a1a..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/dbg_stackkill.S
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * arch/alpha/lib/dbg_stackkill.S
- * Contributed by Richard Henderson (rth@cygnus.com)
- *
- * Clobber the balance of the kernel stack, hoping to catch
- * uninitialized local variables in the act.
- */
-
-#include <asm/asm-offsets.h>
-
- .text
- .set noat
-
- .align 5
- .globl _mcount
- .ent _mcount
-_mcount:
- .frame $30, 0, $28, 0
- .prologue 0
-
- ldi $0, 0xdeadbeef
- lda $2, -STACK_SIZE
- sll $0, 32, $1
- and $30, $2, $2
- or $0, $1, $0
- lda $2, TASK_SIZE($2)
- cmpult $2, $30, $1
- beq $1, 2f
-1: stq $0, 0($2)
- addq $2, 8, $2
- cmpult $2, $30, $1
- bne $1, 1b
-2: ret ($28)
-
- .end _mcount
diff --git a/ANDROID_3.4.5/arch/alpha/lib/dec_and_lock.c b/ANDROID_3.4.5/arch/alpha/lib/dec_and_lock.c
deleted file mode 100644
index f9f5fe83..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/dec_and_lock.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * arch/alpha/lib/dec_and_lock.c
- *
- * ll/sc version of atomic_dec_and_lock()
- *
- */
-
-#include <linux/spinlock.h>
-#include <linux/atomic.h>
-
- asm (".text \n\
- .global _atomic_dec_and_lock \n\
- .ent _atomic_dec_and_lock \n\
- .align 4 \n\
-_atomic_dec_and_lock: \n\
- .prologue 0 \n\
-1: ldl_l $1, 0($16) \n\
- subl $1, 1, $1 \n\
- beq $1, 2f \n\
- stl_c $1, 0($16) \n\
- beq $1, 4f \n\
- mb \n\
- clr $0 \n\
- ret \n\
-2: br $29, 3f \n\
-3: ldgp $29, 0($29) \n\
- br $atomic_dec_and_lock_1..ng \n\
- .subsection 2 \n\
-4: br 1b \n\
- .previous \n\
- .end _atomic_dec_and_lock");
-
-static int __used atomic_dec_and_lock_1(atomic_t *atomic, spinlock_t *lock)
-{
- /* Slow path */
- spin_lock(lock);
- if (atomic_dec_and_test(atomic))
- return 1;
- spin_unlock(lock);
- return 0;
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/divide.S b/ANDROID_3.4.5/arch/alpha/lib/divide.S
deleted file mode 100644
index 2d1a0484..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/divide.S
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * arch/alpha/lib/divide.S
- *
- * (C) 1995 Linus Torvalds
- *
- * Alpha division..
- */
-
-/*
- * The alpha chip doesn't provide hardware division, so we have to do it
- * by hand. The compiler expects the functions
- *
- * __divqu: 64-bit unsigned long divide
- * __remqu: 64-bit unsigned long remainder
- * __divqs/__remqs: signed 64-bit
- * __divlu/__remlu: unsigned 32-bit
- * __divls/__remls: signed 32-bit
- *
- * These are not normal C functions: instead of the normal
- * calling sequence, these expect their arguments in registers
- * $24 and $25, and return the result in $27. Register $28 may
- * be clobbered (assembly temporary), anything else must be saved.
- *
- * In short: painful.
- *
- * This is a rather simple bit-at-a-time algorithm: it's very good
- * at dividing random 64-bit numbers, but the more usual case where
- * the divisor is small is handled better by the DEC algorithm
- * using lookup tables. This uses much less memory, though, and is
- * nicer on the cache.. Besides, I don't know the copyright status
- * of the DEC code.
- */
-
-/*
- * My temporaries:
- * $0 - current bit
- * $1 - shifted divisor
- * $2 - modulus/quotient
- *
- * $23 - return address
- * $24 - dividend
- * $25 - divisor
- *
- * $27 - quotient/modulus
- * $28 - compare status
- */
-
-#define halt .long 0
-
-/*
- * Select function type and registers
- */
-#define mask $0
-#define divisor $1
-#define compare $28
-#define tmp1 $3
-#define tmp2 $4
-
-#ifdef DIV
-#define DIV_ONLY(x,y...) x,##y
-#define MOD_ONLY(x,y...)
-#define func(x) __div##x
-#define modulus $2
-#define quotient $27
-#define GETSIGN(x) xor $24,$25,x
-#define STACK 48
-#else
-#define DIV_ONLY(x,y...)
-#define MOD_ONLY(x,y...) x,##y
-#define func(x) __rem##x
-#define modulus $27
-#define quotient $2
-#define GETSIGN(x) bis $24,$24,x
-#define STACK 32
-#endif
-
-/*
- * For 32-bit operations, we need to extend to 64-bit
- */
-#ifdef INTSIZE
-#define ufunction func(lu)
-#define sfunction func(l)
-#define LONGIFY(x) zapnot x,15,x
-#define SLONGIFY(x) addl x,0,x
-#else
-#define ufunction func(qu)
-#define sfunction func(q)
-#define LONGIFY(x)
-#define SLONGIFY(x)
-#endif
-
-.set noat
-.align 3
-.globl ufunction
-.ent ufunction
-ufunction:
- subq $30,STACK,$30
- .frame $30,STACK,$23
- .prologue 0
-
-7: stq $1, 0($30)
- bis $25,$25,divisor
- stq $2, 8($30)
- bis $24,$24,modulus
- stq $0,16($30)
- bis $31,$31,quotient
- LONGIFY(divisor)
- stq tmp1,24($30)
- LONGIFY(modulus)
- bis $31,1,mask
- DIV_ONLY(stq tmp2,32($30))
- beq divisor, 9f /* div by zero */
-
-#ifdef INTSIZE
- /*
- * shift divisor left, using 3-bit shifts for
- * 32-bit divides as we can't overflow. Three-bit
- * shifts will result in looping three times less
- * here, but can result in two loops more later.
- * Thus using a large shift isn't worth it (and
- * s8add pairs better than a sll..)
- */
-1: cmpult divisor,modulus,compare
- s8addq divisor,$31,divisor
- s8addq mask,$31,mask
- bne compare,1b
-#else
-1: cmpult divisor,modulus,compare
- blt divisor, 2f
- addq divisor,divisor,divisor
- addq mask,mask,mask
- bne compare,1b
- unop
-#endif
-
- /* ok, start to go right again.. */
-2: DIV_ONLY(addq quotient,mask,tmp2)
- srl mask,1,mask
- cmpule divisor,modulus,compare
- subq modulus,divisor,tmp1
- DIV_ONLY(cmovne compare,tmp2,quotient)
- srl divisor,1,divisor
- cmovne compare,tmp1,modulus
- bne mask,2b
-
-9: ldq $1, 0($30)
- ldq $2, 8($30)
- ldq $0,16($30)
- ldq tmp1,24($30)
- DIV_ONLY(ldq tmp2,32($30))
- addq $30,STACK,$30
- ret $31,($23),1
- .end ufunction
-
-/*
- * Uhh.. Ugly signed division. I'd rather not have it at all, but
- * it's needed in some circumstances. There are different ways to
- * handle this, really. This does:
- * -a / b = a / -b = -(a / b)
- * -a % b = -(a % b)
- * a % -b = a % b
- * which is probably not the best solution, but at least should
- * have the property that (x/y)*y + (x%y) = x.
- */
-.align 3
-.globl sfunction
-.ent sfunction
-sfunction:
- subq $30,STACK,$30
- .frame $30,STACK,$23
- .prologue 0
- bis $24,$25,$28
- SLONGIFY($28)
- bge $28,7b
- stq $24,0($30)
- subq $31,$24,$28
- stq $25,8($30)
- cmovlt $24,$28,$24 /* abs($24) */
- stq $23,16($30)
- subq $31,$25,$28
- stq tmp1,24($30)
- cmovlt $25,$28,$25 /* abs($25) */
- unop
- bsr $23,ufunction
- ldq $24,0($30)
- ldq $25,8($30)
- GETSIGN($28)
- subq $31,$27,tmp1
- SLONGIFY($28)
- ldq $23,16($30)
- cmovlt $28,tmp1,$27
- ldq tmp1,24($30)
- addq $30,STACK,$30
- ret $31,($23),1
- .end sfunction
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-clear_page.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-clear_page.S
deleted file mode 100644
index adf4f7be..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-clear_page.S
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * arch/alpha/lib/ev6-clear_page.S
- *
- * Zero an entire page.
- */
-
- .text
- .align 4
- .global clear_page
- .ent clear_page
-clear_page:
- .prologue 0
-
- lda $0,128
- lda $1,125
- addq $16,64,$2
- addq $16,128,$3
-
- addq $16,192,$17
- wh64 ($16)
- wh64 ($2)
- wh64 ($3)
-
-1: wh64 ($17)
- stq $31,0($16)
- subq $0,1,$0
- subq $1,1,$1
-
- stq $31,8($16)
- stq $31,16($16)
- addq $17,64,$2
- nop
-
- stq $31,24($16)
- stq $31,32($16)
- cmovgt $1,$2,$17
- nop
-
- stq $31,40($16)
- stq $31,48($16)
- nop
- nop
-
- stq $31,56($16)
- addq $16,64,$16
- nop
- bne $0,1b
-
- ret
- nop
- nop
- nop
-
- .end clear_page
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-clear_user.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-clear_user.S
deleted file mode 100644
index 4f42a16b..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-clear_user.S
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * arch/alpha/lib/ev6-clear_user.S
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Zero user space, handling exceptions as we go.
- *
- * We have to make sure that $0 is always up-to-date and contains the
- * right "bytes left to zero" value (and that it is updated only _after_
- * a successful copy). There is also some rather minor exception setup
- * stuff.
- *
- * NOTE! This is not directly C-callable, because the calling semantics
- * are different:
- *
- * Inputs:
- * length in $0
- * destination address in $6
- * exception pointer in $7
- * return address in $28 (exceptions expect it there)
- *
- * Outputs:
- * bytes left to copy in $0
- *
- * Clobbers:
- * $1,$2,$3,$4,$5,$6
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- * Determining actual stalls (other than slotting) doesn't appear to be easy to do.
- * From perusing the source code context where this routine is called, it is
- * a fair assumption that significant fractions of entire pages are zeroed, so
- * it's going to be worth the effort to hand-unroll a big loop, and use wh64.
- * ASSUMPTION:
- * The believed purpose of only updating $0 after a store is that a signal
- * may come along during the execution of this chunk of code, and we don't
- * want to leave a hole (and we also want to avoid repeating lots of work)
- */
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EX(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exception-99b($31); \
- .previous
-
- .set noat
- .set noreorder
- .align 4
-
- .globl __do_clear_user
- .ent __do_clear_user
- .frame $30, 0, $28
- .prologue 0
-
- # Pipeline info : Slotting & Comments
-__do_clear_user:
- and $6, 7, $4 # .. E .. .. : find dest head misalignment
- beq $0, $zerolength # U .. .. .. : U L U L
-
- addq $0, $4, $1 # .. .. .. E : bias counter
- and $1, 7, $2 # .. .. E .. : number of misaligned bytes in tail
-# Note - we never actually use $2, so this is a moot computation
-# and we can rewrite this later...
- srl $1, 3, $1 # .. E .. .. : number of quadwords to clear
- beq $4, $headalign # U .. .. .. : U L U L
-
-/*
- * Head is not aligned. Write (8 - $4) bytes to head of destination
- * This means $6 is known to be misaligned
- */
- EX( ldq_u $5, 0($6) ) # .. .. .. L : load dst word to mask back in
- beq $1, $onebyte # .. .. U .. : sub-word store?
- mskql $5, $6, $5 # .. U .. .. : take care of misaligned head
- addq $6, 8, $6 # E .. .. .. : L U U L
-
- EX( stq_u $5, -8($6) ) # .. .. .. L :
- subq $1, 1, $1 # .. .. E .. :
- addq $0, $4, $0 # .. E .. .. : bytes left -= 8 - misalignment
- subq $0, 8, $0 # E .. .. .. : U L U L
-
- .align 4
-/*
- * (The .align directive ought to be a moot point)
- * values upon initial entry to the loop
- * $1 is number of quadwords to clear (zero is a valid value)
- * $2 is number of trailing bytes (0..7) ($2 never used...)
- * $6 is known to be aligned 0mod8
- */
-$headalign:
- subq $1, 16, $4 # .. .. .. E : If < 16, we can not use the huge loop
- and $6, 0x3f, $2 # .. .. E .. : Forward work for huge loop
- subq $2, 0x40, $3 # .. E .. .. : bias counter (huge loop)
- blt $4, $trailquad # U .. .. .. : U L U L
-
-/*
- * We know that we're going to do at least 16 quads, which means we are
- * going to be able to use the large block clear loop at least once.
- * Figure out how many quads we need to clear before we are 0mod64 aligned
- * so we can use the wh64 instruction.
- */
-
- nop # .. .. .. E
- nop # .. .. E ..
- nop # .. E .. ..
- beq $3, $bigalign # U .. .. .. : U L U L : Aligned 0mod64
-
-$alignmod64:
- EX( stq_u $31, 0($6) ) # .. .. .. L
- addq $3, 8, $3 # .. .. E ..
- subq $0, 8, $0 # .. E .. ..
- nop # E .. .. .. : U L U L
-
- nop # .. .. .. E
- subq $1, 1, $1 # .. .. E ..
- addq $6, 8, $6 # .. E .. ..
- blt $3, $alignmod64 # U .. .. .. : U L U L
-
-$bigalign:
-/*
- * $0 is the number of bytes left
- * $1 is the number of quads left
- * $6 is aligned 0mod64
- * we know that we'll be taking a minimum of one trip through
- * CWG Section 3.7.6: do not expect a sustained store rate of > 1/cycle
- * We are _not_ going to update $0 after every single store. That
- * would be silly, because there will be cross-cluster dependencies
- * no matter how the code is scheduled. By doing it in slightly
- * staggered fashion, we can still do this loop in 5 fetches
- * The worse case will be doing two extra quads in some future execution,
- * in the event of an interrupted clear.
- * Assumes the wh64 needs to be for 2 trips through the loop in the future
- * The wh64 is issued on for the starting destination address for trip +2
- * through the loop, and if there are less than two trips left, the target
- * address will be for the current trip.
- */
- nop # E :
- nop # E :
- nop # E :
- bis $6,$6,$3 # E : U L U L : Initial wh64 address is dest
- /* This might actually help for the current trip... */
-
-$do_wh64:
- wh64 ($3) # .. .. .. L1 : memory subsystem hint
- subq $1, 16, $4 # .. .. E .. : Forward calculation - repeat the loop?
- EX( stq_u $31, 0($6) ) # .. L .. ..
- subq $0, 8, $0 # E .. .. .. : U L U L
-
- addq $6, 128, $3 # E : Target address of wh64
- EX( stq_u $31, 8($6) ) # L :
- EX( stq_u $31, 16($6) ) # L :
- subq $0, 16, $0 # E : U L L U
-
- nop # E :
- EX( stq_u $31, 24($6) ) # L :
- EX( stq_u $31, 32($6) ) # L :
- subq $0, 168, $5 # E : U L L U : two trips through the loop left?
- /* 168 = 192 - 24, since we've already completed some stores */
-
- subq $0, 16, $0 # E :
- EX( stq_u $31, 40($6) ) # L :
- EX( stq_u $31, 48($6) ) # L :
- cmovlt $5, $6, $3 # E : U L L U : Latency 2, extra mapping cycle
-
- subq $1, 8, $1 # E :
- subq $0, 16, $0 # E :
- EX( stq_u $31, 56($6) ) # L :
- nop # E : U L U L
-
- nop # E :
- subq $0, 8, $0 # E :
- addq $6, 64, $6 # E :
- bge $4, $do_wh64 # U : U L U L
-
-$trailquad:
- # zero to 16 quadwords left to store, plus any trailing bytes
- # $1 is the number of quadwords left to go.
- #
- nop # .. .. .. E
- nop # .. .. E ..
- nop # .. E .. ..
- beq $1, $trailbytes # U .. .. .. : U L U L : Only 0..7 bytes to go
-
-$onequad:
- EX( stq_u $31, 0($6) ) # .. .. .. L
- subq $1, 1, $1 # .. .. E ..
- subq $0, 8, $0 # .. E .. ..
- nop # E .. .. .. : U L U L
-
- nop # .. .. .. E
- nop # .. .. E ..
- addq $6, 8, $6 # .. E .. ..
- bgt $1, $onequad # U .. .. .. : U L U L
-
- # We have an unknown number of bytes left to go.
-$trailbytes:
- nop # .. .. .. E
- nop # .. .. E ..
- nop # .. E .. ..
- beq $0, $zerolength # U .. .. .. : U L U L
-
- # $0 contains the number of bytes left to copy (0..31)
- # so we will use $0 as the loop counter
- # We know for a fact that $0 > 0 zero due to previous context
-$onebyte:
- EX( stb $31, 0($6) ) # .. .. .. L
- subq $0, 1, $0 # .. .. E .. :
- addq $6, 1, $6 # .. E .. .. :
- bgt $0, $onebyte # U .. .. .. : U L U L
-
-$zerolength:
-$exception: # Destination for exception recovery(?)
- nop # .. .. .. E :
- nop # .. .. E .. :
- nop # .. E .. .. :
- ret $31, ($28), 1 # L0 .. .. .. : L U L U
- .end __do_clear_user
-
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-copy_page.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-copy_page.S
deleted file mode 100644
index b789db19..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-copy_page.S
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * arch/alpha/lib/ev6-copy_page.S
- *
- * Copy an entire page.
- */
-
-/* The following comparison of this routine vs the normal copy_page.S
- was written by an unnamed ev6 hardware designer and forwarded to me
- via Steven Hobbs <hobbs@steven.zko.dec.com>.
-
- First Problem: STQ overflows.
- -----------------------------
-
- It would be nice if EV6 handled every resource overflow efficiently,
- but for some it doesn't. Including store queue overflows. It causes
- a trap and a restart of the pipe.
-
- To get around this we sometimes use (to borrow a term from a VSSAD
- researcher) "aeration". The idea is to slow the rate at which the
- processor receives valid instructions by inserting nops in the fetch
- path. In doing so, you can prevent the overflow and actually make
- the code run faster. You can, of course, take advantage of the fact
- that the processor can fetch at most 4 aligned instructions per cycle.
-
- I inserted enough nops to force it to take 10 cycles to fetch the
- loop code. In theory, EV6 should be able to execute this loop in
- 9 cycles but I was not able to get it to run that fast -- the initial
- conditions were such that I could not reach this optimum rate on
- (chaotic) EV6. I wrote the code such that everything would issue
- in order.
-
- Second Problem: Dcache index matches.
- -------------------------------------
-
- If you are going to use this routine on random aligned pages, there
- is a 25% chance that the pages will be at the same dcache indices.
- This results in many nasty memory traps without care.
-
- The solution is to schedule the prefetches to avoid the memory
- conflicts. I schedule the wh64 prefetches farther ahead of the
- read prefetches to avoid this problem.
-
- Third Problem: Needs more prefetching.
- --------------------------------------
-
- In order to improve the code I added deeper prefetching to take the
- most advantage of EV6's bandwidth.
-
- I also prefetched the read stream. Note that adding the read prefetch
- forced me to add another cycle to the inner-most kernel - up to 11
- from the original 8 cycles per iteration. We could improve performance
- further by unrolling the loop and doing multiple prefetches per cycle.
-
- I think that the code below will be very robust and fast code for the
- purposes of copying aligned pages. It is slower when both source and
- destination pages are in the dcache, but it is my guess that this is
- less important than the dcache miss case. */
-
-
- .text
- .align 4
- .global copy_page
- .ent copy_page
-copy_page:
- .prologue 0
-
- /* Prefetch 5 read cachelines; write-hint 10 cache lines. */
- wh64 ($16)
- ldl $31,0($17)
- ldl $31,64($17)
- lda $1,1*64($16)
-
- wh64 ($1)
- ldl $31,128($17)
- ldl $31,192($17)
- lda $1,2*64($16)
-
- wh64 ($1)
- ldl $31,256($17)
- lda $18,118
- lda $1,3*64($16)
-
- wh64 ($1)
- nop
- lda $1,4*64($16)
- lda $2,5*64($16)
-
- wh64 ($1)
- wh64 ($2)
- lda $1,6*64($16)
- lda $2,7*64($16)
-
- wh64 ($1)
- wh64 ($2)
- lda $1,8*64($16)
- lda $2,9*64($16)
-
- wh64 ($1)
- wh64 ($2)
- lda $19,10*64($16)
- nop
-
- /* Main prefetching/write-hinting loop. */
-1: ldq $0,0($17)
- ldq $1,8($17)
- unop
- unop
-
- unop
- unop
- ldq $2,16($17)
- ldq $3,24($17)
-
- ldq $4,32($17)
- ldq $5,40($17)
- unop
- unop
-
- unop
- unop
- ldq $6,48($17)
- ldq $7,56($17)
-
- ldl $31,320($17)
- unop
- unop
- unop
-
- /* This gives the extra cycle of aeration above the minimum. */
- unop
- unop
- unop
- unop
-
- wh64 ($19)
- unop
- unop
- unop
-
- stq $0,0($16)
- subq $18,1,$18
- stq $1,8($16)
- unop
-
- unop
- stq $2,16($16)
- addq $17,64,$17
- stq $3,24($16)
-
- stq $4,32($16)
- stq $5,40($16)
- addq $19,64,$19
- unop
-
- stq $6,48($16)
- stq $7,56($16)
- addq $16,64,$16
- bne $18, 1b
-
- /* Prefetch the final 5 cache lines of the read stream. */
- lda $18,10
- ldl $31,320($17)
- ldl $31,384($17)
- ldl $31,448($17)
-
- ldl $31,512($17)
- ldl $31,576($17)
- nop
- nop
-
- /* Non-prefetching, non-write-hinting cleanup loop for the
- final 10 cache lines. */
-2: ldq $0,0($17)
- ldq $1,8($17)
- ldq $2,16($17)
- ldq $3,24($17)
-
- ldq $4,32($17)
- ldq $5,40($17)
- ldq $6,48($17)
- ldq $7,56($17)
-
- stq $0,0($16)
- subq $18,1,$18
- stq $1,8($16)
- addq $17,64,$17
-
- stq $2,16($16)
- stq $3,24($16)
- stq $4,32($16)
- stq $5,40($16)
-
- stq $6,48($16)
- stq $7,56($16)
- addq $16,64,$16
- bne $18, 2b
-
- ret
- nop
- unop
- nop
-
- .end copy_page
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-copy_user.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-copy_user.S
deleted file mode 100644
index db42ffe9..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-copy_user.S
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * arch/alpha/lib/ev6-copy_user.S
- *
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Copy to/from user space, handling exceptions as we go.. This
- * isn't exactly pretty.
- *
- * This is essentially the same as "memcpy()", but with a few twists.
- * Notably, we have to make sure that $0 is always up-to-date and
- * contains the right "bytes left to copy" value (and that it is updated
- * only _after_ a successful copy). There is also some rather minor
- * exception setup stuff..
- *
- * NOTE! This is not directly C-callable, because the calling semantics are
- * different:
- *
- * Inputs:
- * length in $0
- * destination address in $6
- * source address in $7
- * return address in $28
- *
- * Outputs:
- * bytes left to copy in $0
- *
- * Clobbers:
- * $1,$2,$3,$4,$5,$6,$7
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- */
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EXI(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exitin-99b($31); \
- .previous
-
-#define EXO(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exitout-99b($31); \
- .previous
-
- .set noat
- .align 4
- .globl __copy_user
- .ent __copy_user
- # Pipeline info: Slotting & Comments
-__copy_user:
- .prologue 0
- subq $0, 32, $1 # .. E .. .. : Is this going to be a small copy?
- beq $0, $zerolength # U .. .. .. : U L U L
-
- and $6,7,$3 # .. .. .. E : is leading dest misalignment
- ble $1, $onebyteloop # .. .. U .. : 1st branch : small amount of data
- beq $3, $destaligned # .. U .. .. : 2nd (one cycle fetcher stall)
- subq $3, 8, $3 # E .. .. .. : L U U L : trip counter
-/*
- * The fetcher stall also hides the 1 cycle cross-cluster stall for $3 (L --> U)
- * This loop aligns the destination a byte at a time
- * We know we have at least one trip through this loop
- */
-$aligndest:
- EXI( ldbu $1,0($7) ) # .. .. .. L : Keep loads separate from stores
- addq $6,1,$6 # .. .. E .. : Section 3.8 in the CWG
- addq $3,1,$3 # .. E .. .. :
- nop # E .. .. .. : U L U L
-
-/*
- * the -1 is to compensate for the inc($6) done in a previous quadpack
- * which allows us zero dependencies within either quadpack in the loop
- */
- EXO( stb $1,-1($6) ) # .. .. .. L :
- addq $7,1,$7 # .. .. E .. : Section 3.8 in the CWG
- subq $0,1,$0 # .. E .. .. :
- bne $3, $aligndest # U .. .. .. : U L U L
-
-/*
- * If we fell through into here, we have a minimum of 33 - 7 bytes
- * If we arrived via branch, we have a minimum of 32 bytes
- */
-$destaligned:
- and $7,7,$1 # .. .. .. E : Check _current_ source alignment
- bic $0,7,$4 # .. .. E .. : number bytes as a quadword loop
- EXI( ldq_u $3,0($7) ) # .. L .. .. : Forward fetch for fallthrough code
- beq $1,$quadaligned # U .. .. .. : U L U L
-
-/*
- * In the worst case, we've just executed an ldq_u here from 0($7)
- * and we'll repeat it once if we take the branch
- */
-
-/* Misaligned quadword loop - not unrolled. Leave it that way. */
-$misquad:
- EXI( ldq_u $2,8($7) ) # .. .. .. L :
- subq $4,8,$4 # .. .. E .. :
- extql $3,$7,$3 # .. U .. .. :
- extqh $2,$7,$1 # U .. .. .. : U U L L
-
- bis $3,$1,$1 # .. .. .. E :
- EXO( stq $1,0($6) ) # .. .. L .. :
- addq $7,8,$7 # .. E .. .. :
- subq $0,8,$0 # E .. .. .. : U L L U
-
- addq $6,8,$6 # .. .. .. E :
- bis $2,$2,$3 # .. .. E .. :
- nop # .. E .. .. :
- bne $4,$misquad # U .. .. .. : U L U L
-
- nop # .. .. .. E
- nop # .. .. E ..
- nop # .. E .. ..
- beq $0,$zerolength # U .. .. .. : U L U L
-
-/* We know we have at least one trip through the byte loop */
- EXI ( ldbu $2,0($7) ) # .. .. .. L : No loads in the same quad
- addq $6,1,$6 # .. .. E .. : as the store (Section 3.8 in CWG)
- nop # .. E .. .. :
- br $31, $dirtyentry # L0 .. .. .. : L U U L
-/* Do the trailing byte loop load, then hop into the store part of the loop */
-
-/*
- * A minimum of (33 - 7) bytes to do a quad at a time.
- * Based upon the usage context, it's worth the effort to unroll this loop
- * $0 - number of bytes to be moved
- * $4 - number of bytes to move as quadwords
- * $6 is current destination address
- * $7 is current source address
- */
-$quadaligned:
- subq $4, 32, $2 # .. .. .. E : do not unroll for small stuff
- nop # .. .. E ..
- nop # .. E .. ..
- blt $2, $onequad # U .. .. .. : U L U L
-
-/*
- * There is a significant assumption here that the source and destination
- * addresses differ by more than 32 bytes. In this particular case, a
- * sparsity of registers further bounds this to be a minimum of 8 bytes.
- * But if this isn't met, then the output result will be incorrect.
- * Furthermore, due to a lack of available registers, we really can't
- * unroll this to be an 8x loop (which would enable us to use the wh64
- * instruction memory hint instruction).
- */
-$unroll4:
- EXI( ldq $1,0($7) ) # .. .. .. L
- EXI( ldq $2,8($7) ) # .. .. L ..
- subq $4,32,$4 # .. E .. ..
- nop # E .. .. .. : U U L L
-
- addq $7,16,$7 # .. .. .. E
- EXO( stq $1,0($6) ) # .. .. L ..
- EXO( stq $2,8($6) ) # .. L .. ..
- subq $0,16,$0 # E .. .. .. : U L L U
-
- addq $6,16,$6 # .. .. .. E
- EXI( ldq $1,0($7) ) # .. .. L ..
- EXI( ldq $2,8($7) ) # .. L .. ..
- subq $4, 32, $3 # E .. .. .. : U U L L : is there enough for another trip?
-
- EXO( stq $1,0($6) ) # .. .. .. L
- EXO( stq $2,8($6) ) # .. .. L ..
- subq $0,16,$0 # .. E .. ..
- addq $7,16,$7 # E .. .. .. : U L L U
-
- nop # .. .. .. E
- nop # .. .. E ..
- addq $6,16,$6 # .. E .. ..
- bgt $3,$unroll4 # U .. .. .. : U L U L
-
- nop
- nop
- nop
- beq $4, $noquads
-
-$onequad:
- EXI( ldq $1,0($7) )
- subq $4,8,$4
- addq $7,8,$7
- nop
-
- EXO( stq $1,0($6) )
- subq $0,8,$0
- addq $6,8,$6
- bne $4,$onequad
-
-$noquads:
- nop
- nop
- nop
- beq $0,$zerolength
-
-/*
- * For small copies (or the tail of a larger copy), do a very simple byte loop.
- * There's no point in doing a lot of complex alignment calculations to try to
- * to quadword stuff for a small amount of data.
- * $0 - remaining number of bytes left to copy
- * $6 - current dest addr
- * $7 - current source addr
- */
-
-$onebyteloop:
- EXI ( ldbu $2,0($7) ) # .. .. .. L : No loads in the same quad
- addq $6,1,$6 # .. .. E .. : as the store (Section 3.8 in CWG)
- nop # .. E .. .. :
- nop # E .. .. .. : U L U L
-
-$dirtyentry:
-/*
- * the -1 is to compensate for the inc($6) done in a previous quadpack
- * which allows us zero dependencies within either quadpack in the loop
- */
- EXO ( stb $2,-1($6) ) # .. .. .. L :
- addq $7,1,$7 # .. .. E .. : quadpack as the load
- subq $0,1,$0 # .. E .. .. : change count _after_ copy
- bgt $0,$onebyteloop # U .. .. .. : U L U L
-
-$zerolength:
-$exitout: # Destination for exception recovery(?)
- nop # .. .. .. E
- nop # .. .. E ..
- nop # .. E .. ..
- ret $31,($28),1 # L0 .. .. .. : L U L U
-
-$exitin:
-
- /* A stupid byte-by-byte zeroing of the rest of the output
- buffer. This cures security holes by never leaving
- random kernel data around to be copied elsewhere. */
-
- nop
- nop
- nop
- mov $0,$1
-
-$101:
- EXO ( stb $31,0($6) ) # L
- subq $1,1,$1 # E
- addq $6,1,$6 # E
- bgt $1,$101 # U
-
- nop
- nop
- nop
- ret $31,($28),1 # L0
-
- .end __copy_user
-
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-csum_ipv6_magic.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-csum_ipv6_magic.S
deleted file mode 100644
index fc0bc399..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-csum_ipv6_magic.S
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * arch/alpha/lib/ev6-csum_ipv6_magic.S
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * unsigned short csum_ipv6_magic(struct in6_addr *saddr,
- * struct in6_addr *daddr,
- * __u32 len,
- * unsigned short proto,
- * unsigned int csum);
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- * Determining actual stalls (other than slotting) doesn't appear to be easy to do.
- *
- * unsigned short csum_ipv6_magic(struct in6_addr *saddr,
- * struct in6_addr *daddr,
- * __u32 len,
- * unsigned short proto,
- * unsigned int csum);
- *
- * Swap <proto> (takes form 0xaabb)
- * Then shift it left by 48, so result is:
- * 0xbbaa0000 00000000
- * Then turn it back into a sign extended 32-bit item
- * 0xbbaa0000
- *
- * Swap <len> (an unsigned int) using Mike Burrows' 7-instruction sequence
- * (we can't hide the 3-cycle latency of the unpkbw in the 6-instruction sequence)
- * Assume input takes form 0xAABBCCDD
- *
- * Finally, original 'folding' approach is to split the long into 4 unsigned shorts
- * add 4 ushorts, resulting in ushort/carry
- * add carry bits + ushort --> ushort
- * add carry bits + ushort --> ushort (in case the carry results in an overflow)
- * Truncate to a ushort. (took 13 instructions)
- * From doing some testing, using the approach in checksum.c:from64to16()
- * results in the same outcome:
- * split into 2 uints, add those, generating a ulong
- * add the 3 low ushorts together, generating a uint
- * a final add of the 2 lower ushorts
- * truncating the result.
- *
- * Misalignment handling added by Ivan Kokshaysky <ink@jurassic.park.msu.ru>
- * The cost is 16 instructions (~8 cycles), including two extra loads which
- * may cause additional delay in rare cases (load-load replay traps).
- */
-
- .globl csum_ipv6_magic
- .align 4
- .ent csum_ipv6_magic
- .frame $30,0,$26,0
-csum_ipv6_magic:
- .prologue 0
-
- ldq_u $0,0($16) # L : Latency: 3
- inslh $18,7,$4 # U : 0000000000AABBCC
- ldq_u $1,8($16) # L : Latency: 3
- sll $19,8,$7 # U : U L U L : 0x00000000 00aabb00
-
- and $16,7,$6 # E : src misalignment
- ldq_u $5,15($16) # L : Latency: 3
- zapnot $20,15,$20 # U : zero extend incoming csum
- ldq_u $2,0($17) # L : U L U L : Latency: 3
-
- extql $0,$6,$0 # U :
- extqh $1,$6,$22 # U :
- ldq_u $3,8($17) # L : Latency: 3
- sll $19,24,$19 # U : U U L U : 0x000000aa bb000000
-
- cmoveq $6,$31,$22 # E : src aligned?
- ldq_u $23,15($17) # L : Latency: 3
- inswl $18,3,$18 # U : 000000CCDD000000
- addl $19,$7,$19 # E : U L U L : <sign bits>bbaabb00
-
- or $0,$22,$0 # E : 1st src word complete
- extql $1,$6,$1 # U :
- or $18,$4,$18 # E : 000000CCDDAABBCC
- extqh $5,$6,$5 # U : L U L U
-
- and $17,7,$6 # E : dst misalignment
- extql $2,$6,$2 # U :
- or $1,$5,$1 # E : 2nd src word complete
- extqh $3,$6,$22 # U : L U L U :
-
- cmoveq $6,$31,$22 # E : dst aligned?
- extql $3,$6,$3 # U :
- addq $20,$0,$20 # E : begin summing the words
- extqh $23,$6,$23 # U : L U L U :
-
- srl $18,16,$4 # U : 0000000000CCDDAA
- or $2,$22,$2 # E : 1st dst word complete
- zap $19,0x3,$19 # U : <sign bits>bbaa0000
- or $3,$23,$3 # E : U L U L : 2nd dst word complete
-
- cmpult $20,$0,$0 # E :
- addq $20,$1,$20 # E :
- zapnot $18,0xa,$18 # U : 00000000DD00BB00
- zap $4,0xa,$4 # U : U U L L : 0000000000CC00AA
-
- or $18,$4,$18 # E : 00000000DDCCBBAA
- nop # E :
- cmpult $20,$1,$1 # E :
- addq $20,$2,$20 # E : U L U L
-
- cmpult $20,$2,$2 # E :
- addq $20,$3,$20 # E :
- cmpult $20,$3,$3 # E : (1 cycle stall on $20)
- addq $20,$18,$20 # E : U L U L (1 cycle stall on $20)
-
- cmpult $20,$18,$18 # E :
- addq $20,$19,$20 # E : (1 cycle stall on $20)
- addq $0,$1,$0 # E : merge the carries back into the csum
- addq $2,$3,$2 # E :
-
- cmpult $20,$19,$19 # E :
- addq $18,$19,$18 # E : (1 cycle stall on $19)
- addq $0,$2,$0 # E :
- addq $20,$18,$20 # E : U L U L :
- /* (1 cycle stall on $18, 2 cycles on $20) */
-
- addq $0,$20,$0 # E :
- zapnot $0,15,$1 # U : Start folding output (1 cycle stall on $0)
- nop # E :
- srl $0,32,$0 # U : U L U L : (1 cycle stall on $0)
-
- addq $1,$0,$1 # E : Finished generating ulong
- extwl $1,2,$2 # U : ushort[1] (1 cycle stall on $1)
- zapnot $1,3,$0 # U : ushort[0] (1 cycle stall on $1)
- extwl $1,4,$1 # U : ushort[2] (1 cycle stall on $1)
-
- addq $0,$2,$0 # E
- addq $0,$1,$3 # E : Finished generating uint
- /* (1 cycle stall on $0) */
- extwl $3,2,$1 # U : ushort[1] (1 cycle stall on $3)
- nop # E : L U L U
-
- addq $1,$3,$0 # E : Final carry
- not $0,$4 # E : complement (1 cycle stall on $0)
- zapnot $4,3,$0 # U : clear upper garbage bits
- /* (1 cycle stall on $4) */
- ret # L0 : L U L U
-
- .end csum_ipv6_magic
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-divide.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-divide.S
deleted file mode 100644
index 2a82b9be..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-divide.S
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * arch/alpha/lib/ev6-divide.S
- *
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Alpha division..
- */
-
-/*
- * The alpha chip doesn't provide hardware division, so we have to do it
- * by hand. The compiler expects the functions
- *
- * __divqu: 64-bit unsigned long divide
- * __remqu: 64-bit unsigned long remainder
- * __divqs/__remqs: signed 64-bit
- * __divlu/__remlu: unsigned 32-bit
- * __divls/__remls: signed 32-bit
- *
- * These are not normal C functions: instead of the normal
- * calling sequence, these expect their arguments in registers
- * $24 and $25, and return the result in $27. Register $28 may
- * be clobbered (assembly temporary), anything else must be saved.
- *
- * In short: painful.
- *
- * This is a rather simple bit-at-a-time algorithm: it's very good
- * at dividing random 64-bit numbers, but the more usual case where
- * the divisor is small is handled better by the DEC algorithm
- * using lookup tables. This uses much less memory, though, and is
- * nicer on the cache.. Besides, I don't know the copyright status
- * of the DEC code.
- */
-
-/*
- * My temporaries:
- * $0 - current bit
- * $1 - shifted divisor
- * $2 - modulus/quotient
- *
- * $23 - return address
- * $24 - dividend
- * $25 - divisor
- *
- * $27 - quotient/modulus
- * $28 - compare status
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
-#define halt .long 0
-
-/*
- * Select function type and registers
- */
-#define mask $0
-#define divisor $1
-#define compare $28
-#define tmp1 $3
-#define tmp2 $4
-
-#ifdef DIV
-#define DIV_ONLY(x,y...) x,##y
-#define MOD_ONLY(x,y...)
-#define func(x) __div##x
-#define modulus $2
-#define quotient $27
-#define GETSIGN(x) xor $24,$25,x
-#define STACK 48
-#else
-#define DIV_ONLY(x,y...)
-#define MOD_ONLY(x,y...) x,##y
-#define func(x) __rem##x
-#define modulus $27
-#define quotient $2
-#define GETSIGN(x) bis $24,$24,x
-#define STACK 32
-#endif
-
-/*
- * For 32-bit operations, we need to extend to 64-bit
- */
-#ifdef INTSIZE
-#define ufunction func(lu)
-#define sfunction func(l)
-#define LONGIFY(x) zapnot x,15,x
-#define SLONGIFY(x) addl x,0,x
-#else
-#define ufunction func(qu)
-#define sfunction func(q)
-#define LONGIFY(x)
-#define SLONGIFY(x)
-#endif
-
-.set noat
-.align 4
-.globl ufunction
-.ent ufunction
-ufunction:
- subq $30,STACK,$30 # E :
- .frame $30,STACK,$23
- .prologue 0
-
-7: stq $1, 0($30) # L :
- bis $25,$25,divisor # E :
- stq $2, 8($30) # L : L U L U
-
- bis $24,$24,modulus # E :
- stq $0,16($30) # L :
- bis $31,$31,quotient # E :
- LONGIFY(divisor) # E : U L L U
-
- stq tmp1,24($30) # L :
- LONGIFY(modulus) # E :
- bis $31,1,mask # E :
- DIV_ONLY(stq tmp2,32($30)) # L : L U U L
-
- beq divisor, 9f /* div by zero */
- /*
- * In spite of the DIV_ONLY being either a non-instruction
- * or an actual stq, the addition of the .align directive
- * below ensures that label 1 is going to be nicely aligned
- */
-
- .align 4
-#ifdef INTSIZE
- /*
- * shift divisor left, using 3-bit shifts for
- * 32-bit divides as we can't overflow. Three-bit
- * shifts will result in looping three times less
- * here, but can result in two loops more later.
- * Thus using a large shift isn't worth it (and
- * s8add pairs better than a sll..)
- */
-1: cmpult divisor,modulus,compare # E :
- s8addq divisor,$31,divisor # E :
- s8addq mask,$31,mask # E :
- bne compare,1b # U : U L U L
-#else
-1: cmpult divisor,modulus,compare # E :
- nop # E :
- nop # E :
- blt divisor, 2f # U : U L U L
-
- addq divisor,divisor,divisor # E :
- addq mask,mask,mask # E :
- unop # E :
- bne compare,1b # U : U L U L
-#endif
-
- /* ok, start to go right again.. */
-2:
- /*
- * Keep things nicely bundled... use a nop instead of not
- * having an instruction for DIV_ONLY
- */
-#ifdef DIV
- DIV_ONLY(addq quotient,mask,tmp2) # E :
-#else
- nop # E :
-#endif
- srl mask,1,mask # U :
- cmpule divisor,modulus,compare # E :
- subq modulus,divisor,tmp1 # E :
-
-#ifdef DIV
- DIV_ONLY(cmovne compare,tmp2,quotient) # E : Latency 2, extra map slot
- nop # E : as part of the cmovne
- srl divisor,1,divisor # U :
- nop # E : L U L U
-
- nop # E :
- cmovne compare,tmp1,modulus # E : Latency 2, extra map slot
- nop # E : as part of the cmovne
- bne mask,2b # U : U L U L
-#else
- srl divisor,1,divisor # U :
- cmovne compare,tmp1,modulus # E : Latency 2, extra map slot
- nop # E : as part of the cmovne
- bne mask,2b # U : U L L U
-#endif
-
-9: ldq $1, 0($30) # L :
- ldq $2, 8($30) # L :
- nop # E :
- nop # E : U U L L
-
- ldq $0,16($30) # L :
- ldq tmp1,24($30) # L :
- nop # E :
- nop # E :
-
-#ifdef DIV
- DIV_ONLY(ldq tmp2,32($30)) # L :
-#else
- nop # E :
-#endif
- addq $30,STACK,$30 # E :
- ret $31,($23),1 # L0 : L U U L
- .end ufunction
-
-/*
- * Uhh.. Ugly signed division. I'd rather not have it at all, but
- * it's needed in some circumstances. There are different ways to
- * handle this, really. This does:
- * -a / b = a / -b = -(a / b)
- * -a % b = -(a % b)
- * a % -b = a % b
- * which is probably not the best solution, but at least should
- * have the property that (x/y)*y + (x%y) = x.
- */
-.align 4
-.globl sfunction
-.ent sfunction
-sfunction:
- subq $30,STACK,$30 # E :
- .frame $30,STACK,$23
- .prologue 0
- bis $24,$25,$28 # E :
- SLONGIFY($28) # E :
- bge $28,7b # U :
-
- stq $24,0($30) # L :
- subq $31,$24,$28 # E :
- stq $25,8($30) # L :
- nop # E : U L U L
-
- cmovlt $24,$28,$24 /* abs($24) */ # E : Latency 2, extra map slot
- nop # E : as part of the cmov
- stq $23,16($30) # L :
- subq $31,$25,$28 # E : U L U L
-
- stq tmp1,24($30) # L :
- cmovlt $25,$28,$25 /* abs($25) */ # E : Latency 2, extra map slot
- nop # E :
- bsr $23,ufunction # L0: L U L U
-
- ldq $24,0($30) # L :
- ldq $25,8($30) # L :
- GETSIGN($28) # E :
- subq $31,$27,tmp1 # E : U U L L
-
- SLONGIFY($28) # E :
- ldq $23,16($30) # L :
- cmovlt $28,tmp1,$27 # E : Latency 2, extra map slot
- nop # E : U L L U : as part of the cmov
-
- ldq tmp1,24($30) # L :
- nop # E : as part of the cmov
- addq $30,STACK,$30 # E :
- ret $31,($23),1 # L0 : L U U L
- .end sfunction
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-memchr.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-memchr.S
deleted file mode 100644
index 1a5f71b9..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-memchr.S
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * arch/alpha/lib/ev6-memchr.S
- *
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Finds characters in a memory area. Optimized for the Alpha:
- *
- * - memory accessed as aligned quadwords only
- * - uses cmpbge to compare 8 bytes in parallel
- * - does binary search to find 0 byte in last
- * quadword (HAKMEM needed 12 instructions to
- * do this instead of the 9 instructions that
- * binary search needs).
- *
- * For correctness consider that:
- *
- * - only minimum number of quadwords may be accessed
- * - the third argument is an unsigned long
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
- .set noreorder
- .set noat
-
- .align 4
- .globl memchr
- .ent memchr
-memchr:
- .frame $30,0,$26,0
- .prologue 0
-
- # Hack -- if someone passes in (size_t)-1, hoping to just
- # search til the end of the address space, we will overflow
- # below when we find the address of the last byte. Given
- # that we will never have a 56-bit address space, cropping
- # the length is the easiest way to avoid trouble.
- zap $18, 0x80, $5 # U : Bound length
- beq $18, $not_found # U :
- ldq_u $1, 0($16) # L : load first quadword Latency=3
- and $17, 0xff, $17 # E : L L U U : 00000000000000ch
-
- insbl $17, 1, $2 # U : 000000000000ch00
- cmpult $18, 9, $4 # E : small (< 1 quad) string?
- or $2, $17, $17 # E : 000000000000chch
- lda $3, -1($31) # E : U L L U
-
- sll $17, 16, $2 # U : 00000000chch0000
- addq $16, $5, $5 # E : Max search address
- or $2, $17, $17 # E : 00000000chchchch
- sll $17, 32, $2 # U : U L L U : chchchch00000000
-
- or $2, $17, $17 # E : chchchchchchchch
- extql $1, $16, $7 # U : $7 is upper bits
- beq $4, $first_quad # U :
- ldq_u $6, -1($5) # L : L U U L : eight or less bytes to search Latency=3
-
- extqh $6, $16, $6 # U : 2 cycle stall for $6
- mov $16, $0 # E :
- nop # E :
- or $7, $6, $1 # E : L U L U $1 = quadword starting at $16
-
- # Deal with the case where at most 8 bytes remain to be searched
- # in $1. E.g.:
- # $18 = 6
- # $1 = ????c6c5c4c3c2c1
-$last_quad:
- negq $18, $6 # E :
- xor $17, $1, $1 # E :
- srl $3, $6, $6 # U : $6 = mask of $18 bits set
- cmpbge $31, $1, $2 # E : L U L U
-
- nop
- nop
- and $2, $6, $2 # E :
- beq $2, $not_found # U : U L U L
-
-$found_it:
-#ifdef CONFIG_ALPHA_EV67
- /*
- * Since we are guaranteed to have set one of the bits, we don't
- * have to worry about coming back with a 0x40 out of cttz...
- */
- cttz $2, $3 # U0 :
- addq $0, $3, $0 # E : All done
- nop # E :
- ret # L0 : L U L U
-#else
- /*
- * Slow and clunky. It can probably be improved.
- * An exercise left for others.
- */
- negq $2, $3 # E :
- and $2, $3, $2 # E :
- and $2, 0x0f, $1 # E :
- addq $0, 4, $3 # E :
-
- cmoveq $1, $3, $0 # E : Latency 2, extra map cycle
- nop # E : keep with cmov
- and $2, 0x33, $1 # E :
- addq $0, 2, $3 # E : U L U L : 2 cycle stall on $0
-
- cmoveq $1, $3, $0 # E : Latency 2, extra map cycle
- nop # E : keep with cmov
- and $2, 0x55, $1 # E :
- addq $0, 1, $3 # E : U L U L : 2 cycle stall on $0
-
- cmoveq $1, $3, $0 # E : Latency 2, extra map cycle
- nop
- nop
- ret # L0 : L U L U
-#endif
-
- # Deal with the case where $18 > 8 bytes remain to be
- # searched. $16 may not be aligned.
- .align 4
-$first_quad:
- andnot $16, 0x7, $0 # E :
- insqh $3, $16, $2 # U : $2 = 0000ffffffffffff ($16<0:2> ff)
- xor $1, $17, $1 # E :
- or $1, $2, $1 # E : U L U L $1 = ====ffffffffffff
-
- cmpbge $31, $1, $2 # E :
- bne $2, $found_it # U :
- # At least one byte left to process.
- ldq $1, 8($0) # L :
- subq $5, 1, $18 # E : U L U L
-
- addq $0, 8, $0 # E :
- # Make $18 point to last quad to be accessed (the
- # last quad may or may not be partial).
- andnot $18, 0x7, $18 # E :
- cmpult $0, $18, $2 # E :
- beq $2, $final # U : U L U L
-
- # At least two quads remain to be accessed.
-
- subq $18, $0, $4 # E : $4 <- nr quads to be processed
- and $4, 8, $4 # E : odd number of quads?
- bne $4, $odd_quad_count # U :
- # At least three quads remain to be accessed
- mov $1, $4 # E : L U L U : move prefetched value to correct reg
-
- .align 4
-$unrolled_loop:
- ldq $1, 8($0) # L : prefetch $1
- xor $17, $4, $2 # E :
- cmpbge $31, $2, $2 # E :
- bne $2, $found_it # U : U L U L
-
- addq $0, 8, $0 # E :
- nop # E :
- nop # E :
- nop # E :
-
-$odd_quad_count:
- xor $17, $1, $2 # E :
- ldq $4, 8($0) # L : prefetch $4
- cmpbge $31, $2, $2 # E :
- addq $0, 8, $6 # E :
-
- bne $2, $found_it # U :
- cmpult $6, $18, $6 # E :
- addq $0, 8, $0 # E :
- nop # E :
-
- bne $6, $unrolled_loop # U :
- mov $4, $1 # E : move prefetched value into $1
- nop # E :
- nop # E :
-
-$final: subq $5, $0, $18 # E : $18 <- number of bytes left to do
- nop # E :
- nop # E :
- bne $18, $last_quad # U :
-
-$not_found:
- mov $31, $0 # E :
- nop # E :
- nop # E :
- ret # L0 :
-
- .end memchr
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-memcpy.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-memcpy.S
deleted file mode 100644
index 52b37b0f..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-memcpy.S
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * arch/alpha/lib/ev6-memcpy.S
- * 21264 version by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Reasonably optimized memcpy() routine for the Alpha 21264
- *
- * - memory accessed as aligned quadwords only
- * - uses bcmpge to compare 8 bytes in parallel
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- *
- * Temp usage notes:
- * $1,$2, - scratch
- */
-
- .set noreorder
- .set noat
-
- .align 4
- .globl memcpy
- .ent memcpy
-memcpy:
- .frame $30,0,$26,0
- .prologue 0
-
- mov $16, $0 # E : copy dest to return
- ble $18, $nomoredata # U : done with the copy?
- xor $16, $17, $1 # E : are source and dest alignments the same?
- and $1, 7, $1 # E : are they the same mod 8?
-
- bne $1, $misaligned # U : Nope - gotta do this the slow way
- /* source and dest are same mod 8 address */
- and $16, 7, $1 # E : Are both 0mod8?
- beq $1, $both_0mod8 # U : Yes
- nop # E :
-
- /*
- * source and dest are same misalignment. move a byte at a time
- * until a 0mod8 alignment for both is reached.
- * At least one byte more to move
- */
-
-$head_align:
- ldbu $1, 0($17) # L : grab a byte
- subq $18, 1, $18 # E : count--
- addq $17, 1, $17 # E : src++
- stb $1, 0($16) # L :
- addq $16, 1, $16 # E : dest++
- and $16, 7, $1 # E : Are we at 0mod8 yet?
- ble $18, $nomoredata # U : done with the copy?
- bne $1, $head_align # U :
-
-$both_0mod8:
- cmple $18, 127, $1 # E : Can we unroll the loop?
- bne $1, $no_unroll # U :
- and $16, 63, $1 # E : get mod64 alignment
- beq $1, $do_unroll # U : no single quads to fiddle
-
-$single_head_quad:
- ldq $1, 0($17) # L : get 8 bytes
- subq $18, 8, $18 # E : count -= 8
- addq $17, 8, $17 # E : src += 8
- nop # E :
-
- stq $1, 0($16) # L : store
- addq $16, 8, $16 # E : dest += 8
- and $16, 63, $1 # E : get mod64 alignment
- bne $1, $single_head_quad # U : still not fully aligned
-
-$do_unroll:
- addq $16, 64, $7 # E : Initial (+1 trip) wh64 address
- cmple $18, 127, $1 # E : Can we go through the unrolled loop?
- bne $1, $tail_quads # U : Nope
- nop # E :
-
-$unroll_body:
- wh64 ($7) # L1 : memory subsystem hint: 64 bytes at
- # ($7) are about to be over-written
- ldq $6, 0($17) # L0 : bytes 0..7
- nop # E :
- nop # E :
-
- ldq $4, 8($17) # L : bytes 8..15
- ldq $5, 16($17) # L : bytes 16..23
- addq $7, 64, $7 # E : Update next wh64 address
- nop # E :
-
- ldq $3, 24($17) # L : bytes 24..31
- addq $16, 64, $1 # E : fallback value for wh64
- nop # E :
- nop # E :
-
- addq $17, 32, $17 # E : src += 32 bytes
- stq $6, 0($16) # L : bytes 0..7
- nop # E :
- nop # E :
-
- stq $4, 8($16) # L : bytes 8..15
- stq $5, 16($16) # L : bytes 16..23
- subq $18, 192, $2 # E : At least two more trips to go?
- nop # E :
-
- stq $3, 24($16) # L : bytes 24..31
- addq $16, 32, $16 # E : dest += 32 bytes
- nop # E :
- nop # E :
-
- ldq $6, 0($17) # L : bytes 0..7
- ldq $4, 8($17) # L : bytes 8..15
- cmovlt $2, $1, $7 # E : Latency 2, extra map slot - Use
- # fallback wh64 address if < 2 more trips
- nop # E :
-
- ldq $5, 16($17) # L : bytes 16..23
- ldq $3, 24($17) # L : bytes 24..31
- addq $16, 32, $16 # E : dest += 32
- subq $18, 64, $18 # E : count -= 64
-
- addq $17, 32, $17 # E : src += 32
- stq $6, -32($16) # L : bytes 0..7
- stq $4, -24($16) # L : bytes 8..15
- cmple $18, 63, $1 # E : At least one more trip?
-
- stq $5, -16($16) # L : bytes 16..23
- stq $3, -8($16) # L : bytes 24..31
- nop # E :
- beq $1, $unroll_body
-
-$tail_quads:
-$no_unroll:
- .align 4
- subq $18, 8, $18 # E : At least a quad left?
- blt $18, $less_than_8 # U : Nope
- nop # E :
- nop # E :
-
-$move_a_quad:
- ldq $1, 0($17) # L : fetch 8
- subq $18, 8, $18 # E : count -= 8
- addq $17, 8, $17 # E : src += 8
- nop # E :
-
- stq $1, 0($16) # L : store 8
- addq $16, 8, $16 # E : dest += 8
- bge $18, $move_a_quad # U :
- nop # E :
-
-$less_than_8:
- .align 4
- addq $18, 8, $18 # E : add back for trailing bytes
- ble $18, $nomoredata # U : All-done
- nop # E :
- nop # E :
-
- /* Trailing bytes */
-$tail_bytes:
- subq $18, 1, $18 # E : count--
- ldbu $1, 0($17) # L : fetch a byte
- addq $17, 1, $17 # E : src++
- nop # E :
-
- stb $1, 0($16) # L : store a byte
- addq $16, 1, $16 # E : dest++
- bgt $18, $tail_bytes # U : more to be done?
- nop # E :
-
- /* branching to exit takes 3 extra cycles, so replicate exit here */
- ret $31, ($26), 1 # L0 :
- nop # E :
- nop # E :
- nop # E :
-
-$misaligned:
- mov $0, $4 # E : dest temp
- and $0, 7, $1 # E : dest alignment mod8
- beq $1, $dest_0mod8 # U : life doesnt totally suck
- nop
-
-$aligndest:
- ble $18, $nomoredata # U :
- ldbu $1, 0($17) # L : fetch a byte
- subq $18, 1, $18 # E : count--
- addq $17, 1, $17 # E : src++
-
- stb $1, 0($4) # L : store it
- addq $4, 1, $4 # E : dest++
- and $4, 7, $1 # E : dest 0mod8 yet?
- bne $1, $aligndest # U : go until we are aligned.
-
- /* Source has unknown alignment, but dest is known to be 0mod8 */
-$dest_0mod8:
- subq $18, 8, $18 # E : At least a quad left?
- blt $18, $misalign_tail # U : Nope
- ldq_u $3, 0($17) # L : seed (rotating load) of 8 bytes
- nop # E :
-
-$mis_quad:
- ldq_u $16, 8($17) # L : Fetch next 8
- extql $3, $17, $3 # U : masking
- extqh $16, $17, $1 # U : masking
- bis $3, $1, $1 # E : merged bytes to store
-
- subq $18, 8, $18 # E : count -= 8
- addq $17, 8, $17 # E : src += 8
- stq $1, 0($4) # L : store 8 (aligned)
- mov $16, $3 # E : "rotate" source data
-
- addq $4, 8, $4 # E : dest += 8
- bge $18, $mis_quad # U : More quads to move
- nop
- nop
-
-$misalign_tail:
- addq $18, 8, $18 # E : account for tail stuff
- ble $18, $nomoredata # U :
- nop
- nop
-
-$misalign_byte:
- ldbu $1, 0($17) # L : fetch 1
- subq $18, 1, $18 # E : count--
- addq $17, 1, $17 # E : src++
- nop # E :
-
- stb $1, 0($4) # L : store
- addq $4, 1, $4 # E : dest++
- bgt $18, $misalign_byte # U : more to go?
- nop
-
-
-$nomoredata:
- ret $31, ($26), 1 # L0 :
- nop # E :
- nop # E :
- nop # E :
-
- .end memcpy
-
-/* For backwards module compatibility. */
-__memcpy = memcpy
-.globl __memcpy
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-memset.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-memset.S
deleted file mode 100644
index d8b94e1c..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-memset.S
+++ /dev/null
@@ -1,597 +0,0 @@
-/*
- * arch/alpha/lib/ev6-memset.S
- *
- * This is an efficient (and relatively small) implementation of the C library
- * "memset()" function for the 21264 implementation of Alpha.
- *
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * The algorithm for the leading and trailing quadwords remains the same,
- * however the loop has been unrolled to enable better memory throughput,
- * and the code has been replicated for each of the entry points: __memset
- * and __memsetw to permit better scheduling to eliminate the stalling
- * encountered during the mask replication.
- * A future enhancement might be to put in a byte store loop for really
- * small (say < 32 bytes) memset()s. Whether or not that change would be
- * a win in the kernel would depend upon the contextual usage.
- * WARNING: Maintaining this is going to be more work than the above version,
- * as fixes will need to be made in multiple places. The performance gain
- * is worth it.
- */
-
- .set noat
- .set noreorder
-.text
- .globl __memset
- .globl __memsetw
- .globl __constant_c_memset
- .globl memset
-
- .ent __memset
-.align 5
-__memset:
- .frame $30,0,$26,0
- .prologue 0
-
- /*
- * Serious stalling happens. The only way to mitigate this is to
- * undertake a major re-write to interleave the constant materialization
- * with other parts of the fall-through code. This is important, even
- * though it makes maintenance tougher.
- * Do this later.
- */
- and $17,255,$1 # E : 00000000000000ch
- insbl $17,1,$2 # U : 000000000000ch00
- bis $16,$16,$0 # E : return value
- ble $18,end_b # U : zero length requested?
-
- addq $18,$16,$6 # E : max address to write to
- bis $1,$2,$17 # E : 000000000000chch
- insbl $1,2,$3 # U : 0000000000ch0000
- insbl $1,3,$4 # U : 00000000ch000000
-
- or $3,$4,$3 # E : 00000000chch0000
- inswl $17,4,$5 # U : 0000chch00000000
- xor $16,$6,$1 # E : will complete write be within one quadword?
- inswl $17,6,$2 # U : chch000000000000
-
- or $17,$3,$17 # E : 00000000chchchch
- or $2,$5,$2 # E : chchchch00000000
- bic $1,7,$1 # E : fit within a single quadword?
- and $16,7,$3 # E : Target addr misalignment
-
- or $17,$2,$17 # E : chchchchchchchch
- beq $1,within_quad_b # U :
- nop # E :
- beq $3,aligned_b # U : target is 0mod8
-
- /*
- * Target address is misaligned, and won't fit within a quadword
- */
- ldq_u $4,0($16) # L : Fetch first partial
- bis $16,$16,$5 # E : Save the address
- insql $17,$16,$2 # U : Insert new bytes
- subq $3,8,$3 # E : Invert (for addressing uses)
-
- addq $18,$3,$18 # E : $18 is new count ($3 is negative)
- mskql $4,$16,$4 # U : clear relevant parts of the quad
- subq $16,$3,$16 # E : $16 is new aligned destination
- bis $2,$4,$1 # E : Final bytes
-
- nop
- stq_u $1,0($5) # L : Store result
- nop
- nop
-
-.align 4
-aligned_b:
- /*
- * We are now guaranteed to be quad aligned, with at least
- * one partial quad to write.
- */
-
- sra $18,3,$3 # U : Number of remaining quads to write
- and $18,7,$18 # E : Number of trailing bytes to write
- bis $16,$16,$5 # E : Save dest address
- beq $3,no_quad_b # U : tail stuff only
-
- /*
- * it's worth the effort to unroll this and use wh64 if possible
- * Lifted a bunch of code from clear_user.S
- * At this point, entry values are:
- * $16 Current destination address
- * $5 A copy of $16
- * $6 The max quadword address to write to
- * $18 Number trailer bytes
- * $3 Number quads to write
- */
-
- and $16, 0x3f, $2 # E : Forward work (only useful for unrolled loop)
- subq $3, 16, $4 # E : Only try to unroll if > 128 bytes
- subq $2, 0x40, $1 # E : bias counter (aligning stuff 0mod64)
- blt $4, loop_b # U :
-
- /*
- * We know we've got at least 16 quads, minimum of one trip
- * through unrolled loop. Do a quad at a time to get us 0mod64
- * aligned.
- */
-
- nop # E :
- nop # E :
- nop # E :
- beq $1, $bigalign_b # U :
-
-$alignmod64_b:
- stq $17, 0($5) # L :
- subq $3, 1, $3 # E : For consistency later
- addq $1, 8, $1 # E : Increment towards zero for alignment
- addq $5, 8, $4 # E : Initial wh64 address (filler instruction)
-
- nop
- nop
- addq $5, 8, $5 # E : Inc address
- blt $1, $alignmod64_b # U :
-
-$bigalign_b:
- /*
- * $3 - number quads left to go
- * $5 - target address (aligned 0mod64)
- * $17 - mask of stuff to store
- * Scratch registers available: $7, $2, $4, $1
- * we know that we'll be taking a minimum of one trip through
- * CWG Section 3.7.6: do not expect a sustained store rate of > 1/cycle
- * Assumes the wh64 needs to be for 2 trips through the loop in the future
- * The wh64 is issued on for the starting destination address for trip +2
- * through the loop, and if there are less than two trips left, the target
- * address will be for the current trip.
- */
-
-$do_wh64_b:
- wh64 ($4) # L1 : memory subsystem write hint
- subq $3, 24, $2 # E : For determining future wh64 addresses
- stq $17, 0($5) # L :
- nop # E :
-
- addq $5, 128, $4 # E : speculative target of next wh64
- stq $17, 8($5) # L :
- stq $17, 16($5) # L :
- addq $5, 64, $7 # E : Fallback address for wh64 (== next trip addr)
-
- stq $17, 24($5) # L :
- stq $17, 32($5) # L :
- cmovlt $2, $7, $4 # E : Latency 2, extra mapping cycle
- nop
-
- stq $17, 40($5) # L :
- stq $17, 48($5) # L :
- subq $3, 16, $2 # E : Repeat the loop at least once more?
- nop
-
- stq $17, 56($5) # L :
- addq $5, 64, $5 # E :
- subq $3, 8, $3 # E :
- bge $2, $do_wh64_b # U :
-
- nop
- nop
- nop
- beq $3, no_quad_b # U : Might have finished already
-
-.align 4
- /*
- * Simple loop for trailing quadwords, or for small amounts
- * of data (where we can't use an unrolled loop and wh64)
- */
-loop_b:
- stq $17,0($5) # L :
- subq $3,1,$3 # E : Decrement number quads left
- addq $5,8,$5 # E : Inc address
- bne $3,loop_b # U : more?
-
-no_quad_b:
- /*
- * Write 0..7 trailing bytes.
- */
- nop # E :
- beq $18,end_b # U : All done?
- ldq $7,0($5) # L :
- mskqh $7,$6,$2 # U : Mask final quad
-
- insqh $17,$6,$4 # U : New bits
- bis $2,$4,$1 # E : Put it all together
- stq $1,0($5) # L : And back to memory
- ret $31,($26),1 # L0 :
-
-within_quad_b:
- ldq_u $1,0($16) # L :
- insql $17,$16,$2 # U : New bits
- mskql $1,$16,$4 # U : Clear old
- bis $2,$4,$2 # E : New result
-
- mskql $2,$6,$4 # U :
- mskqh $1,$6,$2 # U :
- bis $2,$4,$1 # E :
- stq_u $1,0($16) # L :
-
-end_b:
- nop
- nop
- nop
- ret $31,($26),1 # L0 :
- .end __memset
-
- /*
- * This is the original body of code, prior to replication and
- * rescheduling. Leave it here, as there may be calls to this
- * entry point.
- */
-.align 4
- .ent __constant_c_memset
-__constant_c_memset:
- .frame $30,0,$26,0
- .prologue 0
-
- addq $18,$16,$6 # E : max address to write to
- bis $16,$16,$0 # E : return value
- xor $16,$6,$1 # E : will complete write be within one quadword?
- ble $18,end # U : zero length requested?
-
- bic $1,7,$1 # E : fit within a single quadword
- beq $1,within_one_quad # U :
- and $16,7,$3 # E : Target addr misalignment
- beq $3,aligned # U : target is 0mod8
-
- /*
- * Target address is misaligned, and won't fit within a quadword
- */
- ldq_u $4,0($16) # L : Fetch first partial
- bis $16,$16,$5 # E : Save the address
- insql $17,$16,$2 # U : Insert new bytes
- subq $3,8,$3 # E : Invert (for addressing uses)
-
- addq $18,$3,$18 # E : $18 is new count ($3 is negative)
- mskql $4,$16,$4 # U : clear relevant parts of the quad
- subq $16,$3,$16 # E : $16 is new aligned destination
- bis $2,$4,$1 # E : Final bytes
-
- nop
- stq_u $1,0($5) # L : Store result
- nop
- nop
-
-.align 4
-aligned:
- /*
- * We are now guaranteed to be quad aligned, with at least
- * one partial quad to write.
- */
-
- sra $18,3,$3 # U : Number of remaining quads to write
- and $18,7,$18 # E : Number of trailing bytes to write
- bis $16,$16,$5 # E : Save dest address
- beq $3,no_quad # U : tail stuff only
-
- /*
- * it's worth the effort to unroll this and use wh64 if possible
- * Lifted a bunch of code from clear_user.S
- * At this point, entry values are:
- * $16 Current destination address
- * $5 A copy of $16
- * $6 The max quadword address to write to
- * $18 Number trailer bytes
- * $3 Number quads to write
- */
-
- and $16, 0x3f, $2 # E : Forward work (only useful for unrolled loop)
- subq $3, 16, $4 # E : Only try to unroll if > 128 bytes
- subq $2, 0x40, $1 # E : bias counter (aligning stuff 0mod64)
- blt $4, loop # U :
-
- /*
- * We know we've got at least 16 quads, minimum of one trip
- * through unrolled loop. Do a quad at a time to get us 0mod64
- * aligned.
- */
-
- nop # E :
- nop # E :
- nop # E :
- beq $1, $bigalign # U :
-
-$alignmod64:
- stq $17, 0($5) # L :
- subq $3, 1, $3 # E : For consistency later
- addq $1, 8, $1 # E : Increment towards zero for alignment
- addq $5, 8, $4 # E : Initial wh64 address (filler instruction)
-
- nop
- nop
- addq $5, 8, $5 # E : Inc address
- blt $1, $alignmod64 # U :
-
-$bigalign:
- /*
- * $3 - number quads left to go
- * $5 - target address (aligned 0mod64)
- * $17 - mask of stuff to store
- * Scratch registers available: $7, $2, $4, $1
- * we know that we'll be taking a minimum of one trip through
- * CWG Section 3.7.6: do not expect a sustained store rate of > 1/cycle
- * Assumes the wh64 needs to be for 2 trips through the loop in the future
- * The wh64 is issued on for the starting destination address for trip +2
- * through the loop, and if there are less than two trips left, the target
- * address will be for the current trip.
- */
-
-$do_wh64:
- wh64 ($4) # L1 : memory subsystem write hint
- subq $3, 24, $2 # E : For determining future wh64 addresses
- stq $17, 0($5) # L :
- nop # E :
-
- addq $5, 128, $4 # E : speculative target of next wh64
- stq $17, 8($5) # L :
- stq $17, 16($5) # L :
- addq $5, 64, $7 # E : Fallback address for wh64 (== next trip addr)
-
- stq $17, 24($5) # L :
- stq $17, 32($5) # L :
- cmovlt $2, $7, $4 # E : Latency 2, extra mapping cycle
- nop
-
- stq $17, 40($5) # L :
- stq $17, 48($5) # L :
- subq $3, 16, $2 # E : Repeat the loop at least once more?
- nop
-
- stq $17, 56($5) # L :
- addq $5, 64, $5 # E :
- subq $3, 8, $3 # E :
- bge $2, $do_wh64 # U :
-
- nop
- nop
- nop
- beq $3, no_quad # U : Might have finished already
-
-.align 4
- /*
- * Simple loop for trailing quadwords, or for small amounts
- * of data (where we can't use an unrolled loop and wh64)
- */
-loop:
- stq $17,0($5) # L :
- subq $3,1,$3 # E : Decrement number quads left
- addq $5,8,$5 # E : Inc address
- bne $3,loop # U : more?
-
-no_quad:
- /*
- * Write 0..7 trailing bytes.
- */
- nop # E :
- beq $18,end # U : All done?
- ldq $7,0($5) # L :
- mskqh $7,$6,$2 # U : Mask final quad
-
- insqh $17,$6,$4 # U : New bits
- bis $2,$4,$1 # E : Put it all together
- stq $1,0($5) # L : And back to memory
- ret $31,($26),1 # L0 :
-
-within_one_quad:
- ldq_u $1,0($16) # L :
- insql $17,$16,$2 # U : New bits
- mskql $1,$16,$4 # U : Clear old
- bis $2,$4,$2 # E : New result
-
- mskql $2,$6,$4 # U :
- mskqh $1,$6,$2 # U :
- bis $2,$4,$1 # E :
- stq_u $1,0($16) # L :
-
-end:
- nop
- nop
- nop
- ret $31,($26),1 # L0 :
- .end __constant_c_memset
-
- /*
- * This is a replicant of the __constant_c_memset code, rescheduled
- * to mask stalls. Note that entry point names also had to change
- */
- .align 5
- .ent __memsetw
-
-__memsetw:
- .frame $30,0,$26,0
- .prologue 0
-
- inswl $17,0,$5 # U : 000000000000c1c2
- inswl $17,2,$2 # U : 00000000c1c20000
- bis $16,$16,$0 # E : return value
- addq $18,$16,$6 # E : max address to write to
-
- ble $18, end_w # U : zero length requested?
- inswl $17,4,$3 # U : 0000c1c200000000
- inswl $17,6,$4 # U : c1c2000000000000
- xor $16,$6,$1 # E : will complete write be within one quadword?
-
- or $2,$5,$2 # E : 00000000c1c2c1c2
- or $3,$4,$17 # E : c1c2c1c200000000
- bic $1,7,$1 # E : fit within a single quadword
- and $16,7,$3 # E : Target addr misalignment
-
- or $17,$2,$17 # E : c1c2c1c2c1c2c1c2
- beq $1,within_quad_w # U :
- nop
- beq $3,aligned_w # U : target is 0mod8
-
- /*
- * Target address is misaligned, and won't fit within a quadword
- */
- ldq_u $4,0($16) # L : Fetch first partial
- bis $16,$16,$5 # E : Save the address
- insql $17,$16,$2 # U : Insert new bytes
- subq $3,8,$3 # E : Invert (for addressing uses)
-
- addq $18,$3,$18 # E : $18 is new count ($3 is negative)
- mskql $4,$16,$4 # U : clear relevant parts of the quad
- subq $16,$3,$16 # E : $16 is new aligned destination
- bis $2,$4,$1 # E : Final bytes
-
- nop
- stq_u $1,0($5) # L : Store result
- nop
- nop
-
-.align 4
-aligned_w:
- /*
- * We are now guaranteed to be quad aligned, with at least
- * one partial quad to write.
- */
-
- sra $18,3,$3 # U : Number of remaining quads to write
- and $18,7,$18 # E : Number of trailing bytes to write
- bis $16,$16,$5 # E : Save dest address
- beq $3,no_quad_w # U : tail stuff only
-
- /*
- * it's worth the effort to unroll this and use wh64 if possible
- * Lifted a bunch of code from clear_user.S
- * At this point, entry values are:
- * $16 Current destination address
- * $5 A copy of $16
- * $6 The max quadword address to write to
- * $18 Number trailer bytes
- * $3 Number quads to write
- */
-
- and $16, 0x3f, $2 # E : Forward work (only useful for unrolled loop)
- subq $3, 16, $4 # E : Only try to unroll if > 128 bytes
- subq $2, 0x40, $1 # E : bias counter (aligning stuff 0mod64)
- blt $4, loop_w # U :
-
- /*
- * We know we've got at least 16 quads, minimum of one trip
- * through unrolled loop. Do a quad at a time to get us 0mod64
- * aligned.
- */
-
- nop # E :
- nop # E :
- nop # E :
- beq $1, $bigalign_w # U :
-
-$alignmod64_w:
- stq $17, 0($5) # L :
- subq $3, 1, $3 # E : For consistency later
- addq $1, 8, $1 # E : Increment towards zero for alignment
- addq $5, 8, $4 # E : Initial wh64 address (filler instruction)
-
- nop
- nop
- addq $5, 8, $5 # E : Inc address
- blt $1, $alignmod64_w # U :
-
-$bigalign_w:
- /*
- * $3 - number quads left to go
- * $5 - target address (aligned 0mod64)
- * $17 - mask of stuff to store
- * Scratch registers available: $7, $2, $4, $1
- * we know that we'll be taking a minimum of one trip through
- * CWG Section 3.7.6: do not expect a sustained store rate of > 1/cycle
- * Assumes the wh64 needs to be for 2 trips through the loop in the future
- * The wh64 is issued on for the starting destination address for trip +2
- * through the loop, and if there are less than two trips left, the target
- * address will be for the current trip.
- */
-
-$do_wh64_w:
- wh64 ($4) # L1 : memory subsystem write hint
- subq $3, 24, $2 # E : For determining future wh64 addresses
- stq $17, 0($5) # L :
- nop # E :
-
- addq $5, 128, $4 # E : speculative target of next wh64
- stq $17, 8($5) # L :
- stq $17, 16($5) # L :
- addq $5, 64, $7 # E : Fallback address for wh64 (== next trip addr)
-
- stq $17, 24($5) # L :
- stq $17, 32($5) # L :
- cmovlt $2, $7, $4 # E : Latency 2, extra mapping cycle
- nop
-
- stq $17, 40($5) # L :
- stq $17, 48($5) # L :
- subq $3, 16, $2 # E : Repeat the loop at least once more?
- nop
-
- stq $17, 56($5) # L :
- addq $5, 64, $5 # E :
- subq $3, 8, $3 # E :
- bge $2, $do_wh64_w # U :
-
- nop
- nop
- nop
- beq $3, no_quad_w # U : Might have finished already
-
-.align 4
- /*
- * Simple loop for trailing quadwords, or for small amounts
- * of data (where we can't use an unrolled loop and wh64)
- */
-loop_w:
- stq $17,0($5) # L :
- subq $3,1,$3 # E : Decrement number quads left
- addq $5,8,$5 # E : Inc address
- bne $3,loop_w # U : more?
-
-no_quad_w:
- /*
- * Write 0..7 trailing bytes.
- */
- nop # E :
- beq $18,end_w # U : All done?
- ldq $7,0($5) # L :
- mskqh $7,$6,$2 # U : Mask final quad
-
- insqh $17,$6,$4 # U : New bits
- bis $2,$4,$1 # E : Put it all together
- stq $1,0($5) # L : And back to memory
- ret $31,($26),1 # L0 :
-
-within_quad_w:
- ldq_u $1,0($16) # L :
- insql $17,$16,$2 # U : New bits
- mskql $1,$16,$4 # U : Clear old
- bis $2,$4,$2 # E : New result
-
- mskql $2,$6,$4 # U :
- mskqh $1,$6,$2 # U :
- bis $2,$4,$1 # E :
- stq_u $1,0($16) # L :
-
-end_w:
- nop
- nop
- nop
- ret $31,($26),1 # L0 :
-
- .end __memsetw
-
-memset = __memset
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-strncpy_from_user.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-strncpy_from_user.S
deleted file mode 100644
index d2e28178..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-strncpy_from_user.S
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * arch/alpha/lib/ev6-strncpy_from_user.S
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Just like strncpy except in the return value:
- *
- * -EFAULT if an exception occurs before the terminator is copied.
- * N if the buffer filled.
- *
- * Otherwise the length of the string is returned.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * A bunch of instructions got moved and temp registers were changed
- * to aid in scheduling. Control flow was also re-arranged to eliminate
- * branches, and to provide longer code sequences to enable better scheduling.
- * A total rewrite (using byte load/stores for start & tail sequences)
- * is desirable, but very difficult to do without a from-scratch rewrite.
- * Save that for the future.
- */
-
-
-#include <asm/errno.h>
-#include <asm/regdef.h>
-
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EX(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exception-99b($0); \
- .previous
-
-
- .set noat
- .set noreorder
- .text
-
- .globl __strncpy_from_user
- .ent __strncpy_from_user
- .frame $30, 0, $26
- .prologue 0
-
- .align 4
-__strncpy_from_user:
- and a0, 7, t3 # E : find dest misalignment
- beq a2, $zerolength # U :
-
- /* Are source and destination co-aligned? */
- mov a0, v0 # E : save the string start
- xor a0, a1, t4 # E :
- EX( ldq_u t1, 0(a1) ) # L : Latency=3 load first quadword
- ldq_u t0, 0(a0) # L : load first (partial) aligned dest quadword
-
- addq a2, t3, a2 # E : bias count by dest misalignment
- subq a2, 1, a3 # E :
- addq zero, 1, t10 # E :
- and t4, 7, t4 # E : misalignment between the two
-
- and a3, 7, t6 # E : number of tail bytes
- sll t10, t6, t10 # E : t10 = bitmask of last count byte
- bne t4, $unaligned # U :
- lda t2, -1 # E : build a mask against false zero
-
- /*
- * We are co-aligned; take care of a partial first word.
- * On entry to this basic block:
- * t0 == the first destination word for masking back in
- * t1 == the first source word.
- */
-
- srl a3, 3, a2 # E : a2 = loop counter = (count - 1)/8
- addq a1, 8, a1 # E :
- mskqh t2, a1, t2 # U : detection in the src word
- nop
-
- /* Create the 1st output word and detect 0's in the 1st input word. */
- mskqh t1, a1, t3 # U :
- mskql t0, a1, t0 # U : assemble the first output word
- ornot t1, t2, t2 # E :
- nop
-
- cmpbge zero, t2, t8 # E : bits set iff null found
- or t0, t3, t0 # E :
- beq a2, $a_eoc # U :
- bne t8, $a_eos # U : 2nd branch in a quad. Bad.
-
- /* On entry to this basic block:
- * t0 == a source quad not containing a null.
- * a0 - current aligned destination address
- * a1 - current aligned source address
- * a2 - count of quadwords to move.
- * NOTE: Loop improvement - unrolling this is going to be
- * a huge win, since we're going to stall otherwise.
- * Fix this later. For _really_ large copies, look
- * at using wh64 on a look-ahead basis. See the code
- * in clear_user.S and copy_user.S.
- * Presumably, since (a0) and (a1) do not overlap (by C definition)
- * Lots of nops here:
- * - Separate loads from stores
- * - Keep it to 1 branch/quadpack so the branch predictor
- * can train.
- */
-$a_loop:
- stq_u t0, 0(a0) # L :
- addq a0, 8, a0 # E :
- nop
- subq a2, 1, a2 # E :
-
- EX( ldq_u t0, 0(a1) ) # L :
- addq a1, 8, a1 # E :
- cmpbge zero, t0, t8 # E : Stall 2 cycles on t0
- beq a2, $a_eoc # U :
-
- beq t8, $a_loop # U :
- nop
- nop
- nop
-
- /* Take care of the final (partial) word store. At this point
- * the end-of-count bit is set in t8 iff it applies.
- *
- * On entry to this basic block we have:
- * t0 == the source word containing the null
- * t8 == the cmpbge mask that found it.
- */
-$a_eos:
- negq t8, t12 # E : find low bit set
- and t8, t12, t12 # E :
-
- /* We're doing a partial word store and so need to combine
- our source and original destination words. */
- ldq_u t1, 0(a0) # L :
- subq t12, 1, t6 # E :
-
- or t12, t6, t8 # E :
- zapnot t0, t8, t0 # U : clear src bytes > null
- zap t1, t8, t1 # U : clear dst bytes <= null
- or t0, t1, t0 # E :
-
- stq_u t0, 0(a0) # L :
- br $finish_up # L0 :
- nop
- nop
-
- /* Add the end-of-count bit to the eos detection bitmask. */
- .align 4
-$a_eoc:
- or t10, t8, t8
- br $a_eos
- nop
- nop
-
-
-/* The source and destination are not co-aligned. Align the destination
- and cope. We have to be very careful about not reading too much and
- causing a SEGV. */
-
- .align 4
-$u_head:
- /* We know just enough now to be able to assemble the first
- full source word. We can still find a zero at the end of it
- that prevents us from outputting the whole thing.
-
- On entry to this basic block:
- t0 == the first dest word, unmasked
- t1 == the shifted low bits of the first source word
- t6 == bytemask that is -1 in dest word bytes */
-
- EX( ldq_u t2, 8(a1) ) # L : load second src word
- addq a1, 8, a1 # E :
- mskql t0, a0, t0 # U : mask trailing garbage in dst
- extqh t2, a1, t4 # U :
-
- or t1, t4, t1 # E : first aligned src word complete
- mskqh t1, a0, t1 # U : mask leading garbage in src
- or t0, t1, t0 # E : first output word complete
- or t0, t6, t6 # E : mask original data for zero test
-
- cmpbge zero, t6, t8 # E :
- beq a2, $u_eocfin # U :
- bne t8, $u_final # U : bad news - 2nd branch in a quad
- lda t6, -1 # E : mask out the bits we have
-
- mskql t6, a1, t6 # U : already seen
- stq_u t0, 0(a0) # L : store first output word
- or t6, t2, t2 # E :
- cmpbge zero, t2, t8 # E : find nulls in second partial
-
- addq a0, 8, a0 # E :
- subq a2, 1, a2 # E :
- bne t8, $u_late_head_exit # U :
- nop
-
- /* Finally, we've got all the stupid leading edge cases taken care
- of and we can set up to enter the main loop. */
-
- extql t2, a1, t1 # U : position hi-bits of lo word
- EX( ldq_u t2, 8(a1) ) # L : read next high-order source word
- addq a1, 8, a1 # E :
- cmpbge zero, t2, t8 # E :
-
- beq a2, $u_eoc # U :
- bne t8, $u_eos # U :
- nop
- nop
-
- /* Unaligned copy main loop. In order to avoid reading too much,
- the loop is structured to detect zeros in aligned source words.
- This has, unfortunately, effectively pulled half of a loop
- iteration out into the head and half into the tail, but it does
- prevent nastiness from accumulating in the very thing we want
- to run as fast as possible.
-
- On entry to this basic block:
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word
-
- We further know that t2 does not contain a null terminator. */
-
- /*
- * Extra nops here:
- * separate load quads from store quads
- * only one branch/quad to permit predictor training
- */
-
- .align 4
-$u_loop:
- extqh t2, a1, t0 # U : extract high bits for current word
- addq a1, 8, a1 # E :
- extql t2, a1, t3 # U : extract low bits for next time
- addq a0, 8, a0 # E :
-
- or t0, t1, t0 # E : current dst word now complete
- EX( ldq_u t2, 0(a1) ) # L : load high word for next time
- subq a2, 1, a2 # E :
- nop
-
- stq_u t0, -8(a0) # L : save the current word
- mov t3, t1 # E :
- cmpbge zero, t2, t8 # E : test new word for eos
- beq a2, $u_eoc # U :
-
- beq t8, $u_loop # U :
- nop
- nop
- nop
-
- /* We've found a zero somewhere in the source word we just read.
- If it resides in the lower half, we have one (probably partial)
- word to write out, and if it resides in the upper half, we
- have one full and one partial word left to write out.
-
- On entry to this basic block:
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word. */
- .align 4
-$u_eos:
- extqh t2, a1, t0 # U :
- or t0, t1, t0 # E : first (partial) source word complete
- cmpbge zero, t0, t8 # E : is the null in this first bit?
- nop
-
- bne t8, $u_final # U :
- stq_u t0, 0(a0) # L : the null was in the high-order bits
- addq a0, 8, a0 # E :
- subq a2, 1, a2 # E :
-
- .align 4
-$u_late_head_exit:
- extql t2, a1, t0 # U :
- cmpbge zero, t0, t8 # E :
- or t8, t10, t6 # E :
- cmoveq a2, t6, t8 # E :
-
- /* Take care of a final (probably partial) result word.
- On entry to this basic block:
- t0 == assembled source word
- t8 == cmpbge mask that found the null. */
- .align 4
-$u_final:
- negq t8, t6 # E : isolate low bit set
- and t6, t8, t12 # E :
- ldq_u t1, 0(a0) # L :
- subq t12, 1, t6 # E :
-
- or t6, t12, t8 # E :
- zapnot t0, t8, t0 # U : kill source bytes > null
- zap t1, t8, t1 # U : kill dest bytes <= null
- or t0, t1, t0 # E :
-
- stq_u t0, 0(a0) # E :
- br $finish_up # U :
- nop
- nop
-
- .align 4
-$u_eoc: # end-of-count
- extqh t2, a1, t0 # U :
- or t0, t1, t0 # E :
- cmpbge zero, t0, t8 # E :
- nop
-
- .align 4
-$u_eocfin: # end-of-count, final word
- or t10, t8, t8 # E :
- br $u_final # U :
- nop
- nop
-
- /* Unaligned copy entry point. */
- .align 4
-$unaligned:
-
- srl a3, 3, a2 # U : a2 = loop counter = (count - 1)/8
- and a0, 7, t4 # E : find dest misalignment
- and a1, 7, t5 # E : find src misalignment
- mov zero, t0 # E :
-
- /* Conditionally load the first destination word and a bytemask
- with 0xff indicating that the destination byte is sacrosanct. */
-
- mov zero, t6 # E :
- beq t4, 1f # U :
- ldq_u t0, 0(a0) # L :
- lda t6, -1 # E :
-
- mskql t6, a0, t6 # E :
- nop
- nop
- nop
-
- .align 4
-1:
- subq a1, t4, a1 # E : sub dest misalignment from src addr
- /* If source misalignment is larger than dest misalignment, we need
- extra startup checks to avoid SEGV. */
- cmplt t4, t5, t12 # E :
- extql t1, a1, t1 # U : shift src into place
- lda t2, -1 # E : for creating masks later
-
- beq t12, $u_head # U :
- mskqh t2, t5, t2 # U : begin src byte validity mask
- cmpbge zero, t1, t8 # E : is there a zero?
- nop
-
- extql t2, a1, t2 # U :
- or t8, t10, t5 # E : test for end-of-count too
- cmpbge zero, t2, t3 # E :
- cmoveq a2, t5, t8 # E : Latency=2, extra map slot
-
- nop # E : goes with cmov
- andnot t8, t3, t8 # E :
- beq t8, $u_head # U :
- nop
-
- /* At this point we've found a zero in the first partial word of
- the source. We need to isolate the valid source data and mask
- it into the original destination data. (Incidentally, we know
- that we'll need at least one byte of that original dest word.) */
-
- ldq_u t0, 0(a0) # L :
- negq t8, t6 # E : build bitmask of bytes <= zero
- mskqh t1, t4, t1 # U :
- and t6, t8, t12 # E :
-
- subq t12, 1, t6 # E :
- or t6, t12, t8 # E :
- zapnot t2, t8, t2 # U : prepare source word; mirror changes
- zapnot t1, t8, t1 # U : to source validity mask
-
- andnot t0, t2, t0 # E : zero place for source to reside
- or t0, t1, t0 # E : and put it there
- stq_u t0, 0(a0) # L :
- nop
-
- .align 4
-$finish_up:
- zapnot t0, t12, t4 # U : was last byte written null?
- and t12, 0xf0, t3 # E : binary search for the address of the
- cmovne t4, 1, t4 # E : Latency=2, extra map slot
- nop # E : with cmovne
-
- and t12, 0xcc, t2 # E : last byte written
- and t12, 0xaa, t1 # E :
- cmovne t3, 4, t3 # E : Latency=2, extra map slot
- nop # E : with cmovne
-
- bic a0, 7, t0
- cmovne t2, 2, t2 # E : Latency=2, extra map slot
- nop # E : with cmovne
- nop
-
- cmovne t1, 1, t1 # E : Latency=2, extra map slot
- nop # E : with cmovne
- addq t0, t3, t0 # E :
- addq t1, t2, t1 # E :
-
- addq t0, t1, t0 # E :
- addq t0, t4, t0 # add one if we filled the buffer
- subq t0, v0, v0 # find string length
- ret # L0 :
-
- .align 4
-$zerolength:
- nop
- nop
- nop
- clr v0
-
-$exception:
- nop
- nop
- nop
- ret
-
- .end __strncpy_from_user
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-stxcpy.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-stxcpy.S
deleted file mode 100644
index 4643ff2f..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-stxcpy.S
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * arch/alpha/lib/ev6-stxcpy.S
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Copy a null-terminated string from SRC to DST.
- *
- * This is an internal routine used by strcpy, stpcpy, and strcat.
- * As such, it uses special linkage conventions to make implementation
- * of these public functions more efficient.
- *
- * On input:
- * t9 = return address
- * a0 = DST
- * a1 = SRC
- *
- * On output:
- * t12 = bitmask (with one bit set) indicating the last byte written
- * a0 = unaligned address of the last *word* written
- *
- * Furthermore, v0, a3-a5, t11, and t12 are untouched.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
-#include <asm/regdef.h>
-
- .set noat
- .set noreorder
-
- .text
-
-/* There is a problem with either gdb (as of 4.16) or gas (as of 2.7) that
- doesn't like putting the entry point for a procedure somewhere in the
- middle of the procedure descriptor. Work around this by putting the
- aligned copy in its own procedure descriptor */
-
-
- .ent stxcpy_aligned
- .align 4
-stxcpy_aligned:
- .frame sp, 0, t9
- .prologue 0
-
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == the first source word. */
-
- /* Create the 1st output word and detect 0's in the 1st input word. */
- lda t2, -1 # E : build a mask against false zero
- mskqh t2, a1, t2 # U : detection in the src word (stall)
- mskqh t1, a1, t3 # U :
- ornot t1, t2, t2 # E : (stall)
-
- mskql t0, a1, t0 # U : assemble the first output word
- cmpbge zero, t2, t8 # E : bits set iff null found
- or t0, t3, t1 # E : (stall)
- bne t8, $a_eos # U : (stall)
-
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == a source word not containing a null. */
- /* Nops here to separate store quads from load quads */
-
-$a_loop:
- stq_u t1, 0(a0) # L :
- addq a0, 8, a0 # E :
- nop
- nop
-
- ldq_u t1, 0(a1) # L : Latency=3
- addq a1, 8, a1 # E :
- cmpbge zero, t1, t8 # E : (3 cycle stall)
- beq t8, $a_loop # U : (stall for t8)
-
- /* Take care of the final (partial) word store.
- On entry to this basic block we have:
- t1 == the source word containing the null
- t8 == the cmpbge mask that found it. */
-$a_eos:
- negq t8, t6 # E : find low bit set
- and t8, t6, t12 # E : (stall)
- /* For the sake of the cache, don't read a destination word
- if we're not going to need it. */
- and t12, 0x80, t6 # E : (stall)
- bne t6, 1f # U : (stall)
-
- /* We're doing a partial word store and so need to combine
- our source and original destination words. */
- ldq_u t0, 0(a0) # L : Latency=3
- subq t12, 1, t6 # E :
- zapnot t1, t6, t1 # U : clear src bytes >= null (stall)
- or t12, t6, t8 # E : (stall)
-
- zap t0, t8, t0 # E : clear dst bytes <= null
- or t0, t1, t1 # E : (stall)
- nop
- nop
-
-1: stq_u t1, 0(a0) # L :
- ret (t9) # L0 : Latency=3
- nop
- nop
-
- .end stxcpy_aligned
-
- .align 4
- .ent __stxcpy
- .globl __stxcpy
-__stxcpy:
- .frame sp, 0, t9
- .prologue 0
-
- /* Are source and destination co-aligned? */
- xor a0, a1, t0 # E :
- unop # E :
- and t0, 7, t0 # E : (stall)
- bne t0, $unaligned # U : (stall)
-
- /* We are co-aligned; take care of a partial first word. */
- ldq_u t1, 0(a1) # L : load first src word
- and a0, 7, t0 # E : take care not to load a word ...
- addq a1, 8, a1 # E :
- beq t0, stxcpy_aligned # U : ... if we wont need it (stall)
-
- ldq_u t0, 0(a0) # L :
- br stxcpy_aligned # L0 : Latency=3
- nop
- nop
-
-
-/* The source and destination are not co-aligned. Align the destination
- and cope. We have to be very careful about not reading too much and
- causing a SEGV. */
-
- .align 4
-$u_head:
- /* We know just enough now to be able to assemble the first
- full source word. We can still find a zero at the end of it
- that prevents us from outputting the whole thing.
-
- On entry to this basic block:
- t0 == the first dest word, for masking back in, if needed else 0
- t1 == the low bits of the first source word
- t6 == bytemask that is -1 in dest word bytes */
-
- ldq_u t2, 8(a1) # L :
- addq a1, 8, a1 # E :
- extql t1, a1, t1 # U : (stall on a1)
- extqh t2, a1, t4 # U : (stall on a1)
-
- mskql t0, a0, t0 # U :
- or t1, t4, t1 # E :
- mskqh t1, a0, t1 # U : (stall on t1)
- or t0, t1, t1 # E : (stall on t1)
-
- or t1, t6, t6 # E :
- cmpbge zero, t6, t8 # E : (stall)
- lda t6, -1 # E : for masking just below
- bne t8, $u_final # U : (stall)
-
- mskql t6, a1, t6 # U : mask out the bits we have
- or t6, t2, t2 # E : already extracted before (stall)
- cmpbge zero, t2, t8 # E : testing eos (stall)
- bne t8, $u_late_head_exit # U : (stall)
-
- /* Finally, we've got all the stupid leading edge cases taken care
- of and we can set up to enter the main loop. */
-
- stq_u t1, 0(a0) # L : store first output word
- addq a0, 8, a0 # E :
- extql t2, a1, t0 # U : position ho-bits of lo word
- ldq_u t2, 8(a1) # U : read next high-order source word
-
- addq a1, 8, a1 # E :
- cmpbge zero, t2, t8 # E : (stall for t2)
- nop # E :
- bne t8, $u_eos # U : (stall)
-
- /* Unaligned copy main loop. In order to avoid reading too much,
- the loop is structured to detect zeros in aligned source words.
- This has, unfortunately, effectively pulled half of a loop
- iteration out into the head and half into the tail, but it does
- prevent nastiness from accumulating in the very thing we want
- to run as fast as possible.
-
- On entry to this basic block:
- t0 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word
-
- We further know that t2 does not contain a null terminator. */
-
- .align 3
-$u_loop:
- extqh t2, a1, t1 # U : extract high bits for current word
- addq a1, 8, a1 # E : (stall)
- extql t2, a1, t3 # U : extract low bits for next time (stall)
- addq a0, 8, a0 # E :
-
- or t0, t1, t1 # E : current dst word now complete
- ldq_u t2, 0(a1) # L : Latency=3 load high word for next time
- stq_u t1, -8(a0) # L : save the current word (stall)
- mov t3, t0 # E :
-
- cmpbge zero, t2, t8 # E : test new word for eos
- beq t8, $u_loop # U : (stall)
- nop
- nop
-
- /* We've found a zero somewhere in the source word we just read.
- If it resides in the lower half, we have one (probably partial)
- word to write out, and if it resides in the upper half, we
- have one full and one partial word left to write out.
-
- On entry to this basic block:
- t0 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word. */
-$u_eos:
- extqh t2, a1, t1 # U :
- or t0, t1, t1 # E : first (partial) source word complete (stall)
- cmpbge zero, t1, t8 # E : is the null in this first bit? (stall)
- bne t8, $u_final # U : (stall)
-
-$u_late_head_exit:
- stq_u t1, 0(a0) # L : the null was in the high-order bits
- addq a0, 8, a0 # E :
- extql t2, a1, t1 # U :
- cmpbge zero, t1, t8 # E : (stall)
-
- /* Take care of a final (probably partial) result word.
- On entry to this basic block:
- t1 == assembled source word
- t8 == cmpbge mask that found the null. */
-$u_final:
- negq t8, t6 # E : isolate low bit set
- and t6, t8, t12 # E : (stall)
- and t12, 0x80, t6 # E : avoid dest word load if we can (stall)
- bne t6, 1f # U : (stall)
-
- ldq_u t0, 0(a0) # E :
- subq t12, 1, t6 # E :
- or t6, t12, t8 # E : (stall)
- zapnot t1, t6, t1 # U : kill source bytes >= null (stall)
-
- zap t0, t8, t0 # U : kill dest bytes <= null (2 cycle data stall)
- or t0, t1, t1 # E : (stall)
- nop
- nop
-
-1: stq_u t1, 0(a0) # L :
- ret (t9) # L0 : Latency=3
- nop
- nop
-
- /* Unaligned copy entry point. */
- .align 4
-$unaligned:
-
- ldq_u t1, 0(a1) # L : load first source word
- and a0, 7, t4 # E : find dest misalignment
- and a1, 7, t5 # E : find src misalignment
- /* Conditionally load the first destination word and a bytemask
- with 0xff indicating that the destination byte is sacrosanct. */
- mov zero, t0 # E :
-
- mov zero, t6 # E :
- beq t4, 1f # U :
- ldq_u t0, 0(a0) # L :
- lda t6, -1 # E :
-
- mskql t6, a0, t6 # U :
- nop
- nop
- nop
-1:
- subq a1, t4, a1 # E : sub dest misalignment from src addr
- /* If source misalignment is larger than dest misalignment, we need
- extra startup checks to avoid SEGV. */
- cmplt t4, t5, t12 # E :
- beq t12, $u_head # U :
- lda t2, -1 # E : mask out leading garbage in source
-
- mskqh t2, t5, t2 # U :
- ornot t1, t2, t3 # E : (stall)
- cmpbge zero, t3, t8 # E : is there a zero? (stall)
- beq t8, $u_head # U : (stall)
-
- /* At this point we've found a zero in the first partial word of
- the source. We need to isolate the valid source data and mask
- it into the original destination data. (Incidentally, we know
- that we'll need at least one byte of that original dest word.) */
-
- ldq_u t0, 0(a0) # L :
- negq t8, t6 # E : build bitmask of bytes <= zero
- and t6, t8, t12 # E : (stall)
- and a1, 7, t5 # E :
-
- subq t12, 1, t6 # E :
- or t6, t12, t8 # E : (stall)
- srl t12, t5, t12 # U : adjust final null return value
- zapnot t2, t8, t2 # U : prepare source word; mirror changes (stall)
-
- and t1, t2, t1 # E : to source validity mask
- extql t2, a1, t2 # U :
- extql t1, a1, t1 # U : (stall)
- andnot t0, t2, t0 # .. e1 : zero place for source to reside (stall)
-
- or t0, t1, t1 # e1 : and put it there
- stq_u t1, 0(a0) # .. e0 : (stall)
- ret (t9) # e1 :
- nop
-
- .end __stxcpy
-
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev6-stxncpy.S b/ANDROID_3.4.5/arch/alpha/lib/ev6-stxncpy.S
deleted file mode 100644
index 1aa6e97e..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev6-stxncpy.S
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * arch/alpha/lib/ev6-stxncpy.S
- * 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com>
- *
- * Copy no more than COUNT bytes of the null-terminated string from
- * SRC to DST.
- *
- * This is an internal routine used by strncpy, stpncpy, and strncat.
- * As such, it uses special linkage conventions to make implementation
- * of these public functions more efficient.
- *
- * On input:
- * t9 = return address
- * a0 = DST
- * a1 = SRC
- * a2 = COUNT
- *
- * Furthermore, COUNT may not be zero.
- *
- * On output:
- * t0 = last word written
- * t10 = bitmask (with one bit set) indicating the byte position of
- * the end of the range specified by COUNT
- * t12 = bitmask (with one bit set) indicating the last byte written
- * a0 = unaligned address of the last *word* written
- * a2 = the number of full words left in COUNT
- *
- * Furthermore, v0, a3-a5, t11, and $at are untouched.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
-#include <asm/regdef.h>
-
- .set noat
- .set noreorder
-
- .text
-
-/* There is a problem with either gdb (as of 4.16) or gas (as of 2.7) that
- doesn't like putting the entry point for a procedure somewhere in the
- middle of the procedure descriptor. Work around this by putting the
- aligned copy in its own procedure descriptor */
-
-
- .ent stxncpy_aligned
- .align 4
-stxncpy_aligned:
- .frame sp, 0, t9, 0
- .prologue 0
-
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == the first source word. */
-
- /* Create the 1st output word and detect 0's in the 1st input word. */
- lda t2, -1 # E : build a mask against false zero
- mskqh t2, a1, t2 # U : detection in the src word (stall)
- mskqh t1, a1, t3 # U :
- ornot t1, t2, t2 # E : (stall)
-
- mskql t0, a1, t0 # U : assemble the first output word
- cmpbge zero, t2, t8 # E : bits set iff null found
- or t0, t3, t0 # E : (stall)
- beq a2, $a_eoc # U :
-
- bne t8, $a_eos # U :
- nop
- nop
- nop
-
- /* On entry to this basic block:
- t0 == a source word not containing a null. */
-
- /*
- * nops here to:
- * separate store quads from load quads
- * limit of 1 bcond/quad to permit training
- */
-$a_loop:
- stq_u t0, 0(a0) # L :
- addq a0, 8, a0 # E :
- subq a2, 1, a2 # E :
- nop
-
- ldq_u t0, 0(a1) # L :
- addq a1, 8, a1 # E :
- cmpbge zero, t0, t8 # E :
- beq a2, $a_eoc # U :
-
- beq t8, $a_loop # U :
- nop
- nop
- nop
-
- /* Take care of the final (partial) word store. At this point
- the end-of-count bit is set in t8 iff it applies.
-
- On entry to this basic block we have:
- t0 == the source word containing the null
- t8 == the cmpbge mask that found it. */
-
-$a_eos:
- negq t8, t12 # E : find low bit set
- and t8, t12, t12 # E : (stall)
- /* For the sake of the cache, don't read a destination word
- if we're not going to need it. */
- and t12, 0x80, t6 # E : (stall)
- bne t6, 1f # U : (stall)
-
- /* We're doing a partial word store and so need to combine
- our source and original destination words. */
- ldq_u t1, 0(a0) # L :
- subq t12, 1, t6 # E :
- or t12, t6, t8 # E : (stall)
- zapnot t0, t8, t0 # U : clear src bytes > null (stall)
-
- zap t1, t8, t1 # .. e1 : clear dst bytes <= null
- or t0, t1, t0 # e1 : (stall)
- nop
- nop
-
-1: stq_u t0, 0(a0) # L :
- ret (t9) # L0 : Latency=3
- nop
- nop
-
- /* Add the end-of-count bit to the eos detection bitmask. */
-$a_eoc:
- or t10, t8, t8 # E :
- br $a_eos # L0 : Latency=3
- nop
- nop
-
- .end stxncpy_aligned
-
- .align 4
- .ent __stxncpy
- .globl __stxncpy
-__stxncpy:
- .frame sp, 0, t9, 0
- .prologue 0
-
- /* Are source and destination co-aligned? */
- xor a0, a1, t1 # E :
- and a0, 7, t0 # E : find dest misalignment
- and t1, 7, t1 # E : (stall)
- addq a2, t0, a2 # E : bias count by dest misalignment (stall)
-
- subq a2, 1, a2 # E :
- and a2, 7, t2 # E : (stall)
- srl a2, 3, a2 # U : a2 = loop counter = (count - 1)/8 (stall)
- addq zero, 1, t10 # E :
-
- sll t10, t2, t10 # U : t10 = bitmask of last count byte
- bne t1, $unaligned # U :
- /* We are co-aligned; take care of a partial first word. */
- ldq_u t1, 0(a1) # L : load first src word
- addq a1, 8, a1 # E :
-
- beq t0, stxncpy_aligned # U : avoid loading dest word if not needed
- ldq_u t0, 0(a0) # L :
- nop
- nop
-
- br stxncpy_aligned # .. e1 :
- nop
- nop
- nop
-
-
-
-/* The source and destination are not co-aligned. Align the destination
- and cope. We have to be very careful about not reading too much and
- causing a SEGV. */
-
- .align 4
-$u_head:
- /* We know just enough now to be able to assemble the first
- full source word. We can still find a zero at the end of it
- that prevents us from outputting the whole thing.
-
- On entry to this basic block:
- t0 == the first dest word, unmasked
- t1 == the shifted low bits of the first source word
- t6 == bytemask that is -1 in dest word bytes */
-
- ldq_u t2, 8(a1) # L : Latency=3 load second src word
- addq a1, 8, a1 # E :
- mskql t0, a0, t0 # U : mask trailing garbage in dst
- extqh t2, a1, t4 # U : (3 cycle stall on t2)
-
- or t1, t4, t1 # E : first aligned src word complete (stall)
- mskqh t1, a0, t1 # U : mask leading garbage in src (stall)
- or t0, t1, t0 # E : first output word complete (stall)
- or t0, t6, t6 # E : mask original data for zero test (stall)
-
- cmpbge zero, t6, t8 # E :
- beq a2, $u_eocfin # U :
- lda t6, -1 # E :
- nop
-
- bne t8, $u_final # U :
- mskql t6, a1, t6 # U : mask out bits already seen
- stq_u t0, 0(a0) # L : store first output word
- or t6, t2, t2 # E : (stall)
-
- cmpbge zero, t2, t8 # E : find nulls in second partial
- addq a0, 8, a0 # E :
- subq a2, 1, a2 # E :
- bne t8, $u_late_head_exit # U :
-
- /* Finally, we've got all the stupid leading edge cases taken care
- of and we can set up to enter the main loop. */
- extql t2, a1, t1 # U : position hi-bits of lo word
- beq a2, $u_eoc # U :
- ldq_u t2, 8(a1) # L : read next high-order source word
- addq a1, 8, a1 # E :
-
- extqh t2, a1, t0 # U : position lo-bits of hi word (stall)
- cmpbge zero, t2, t8 # E :
- nop
- bne t8, $u_eos # U :
-
- /* Unaligned copy main loop. In order to avoid reading too much,
- the loop is structured to detect zeros in aligned source words.
- This has, unfortunately, effectively pulled half of a loop
- iteration out into the head and half into the tail, but it does
- prevent nastiness from accumulating in the very thing we want
- to run as fast as possible.
-
- On entry to this basic block:
- t0 == the shifted low-order bits from the current source word
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word
-
- We further know that t2 does not contain a null terminator. */
-
- .align 4
-$u_loop:
- or t0, t1, t0 # E : current dst word now complete
- subq a2, 1, a2 # E : decrement word count
- extql t2, a1, t1 # U : extract low bits for next time
- addq a0, 8, a0 # E :
-
- stq_u t0, -8(a0) # U : save the current word
- beq a2, $u_eoc # U :
- ldq_u t2, 8(a1) # U : Latency=3 load high word for next time
- addq a1, 8, a1 # E :
-
- extqh t2, a1, t0 # U : extract low bits (2 cycle stall)
- cmpbge zero, t2, t8 # E : test new word for eos
- nop
- beq t8, $u_loop # U :
-
- /* We've found a zero somewhere in the source word we just read.
- If it resides in the lower half, we have one (probably partial)
- word to write out, and if it resides in the upper half, we
- have one full and one partial word left to write out.
-
- On entry to this basic block:
- t0 == the shifted low-order bits from the current source word
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word. */
-$u_eos:
- or t0, t1, t0 # E : first (partial) source word complete
- nop
- cmpbge zero, t0, t8 # E : is the null in this first bit? (stall)
- bne t8, $u_final # U : (stall)
-
- stq_u t0, 0(a0) # L : the null was in the high-order bits
- addq a0, 8, a0 # E :
- subq a2, 1, a2 # E :
- nop
-
-$u_late_head_exit:
- extql t2, a1, t0 # U :
- cmpbge zero, t0, t8 # E :
- or t8, t10, t6 # E : (stall)
- cmoveq a2, t6, t8 # E : Latency=2, extra map slot (stall)
-
- /* Take care of a final (probably partial) result word.
- On entry to this basic block:
- t0 == assembled source word
- t8 == cmpbge mask that found the null. */
-$u_final:
- negq t8, t6 # E : isolate low bit set
- and t6, t8, t12 # E : (stall)
- and t12, 0x80, t6 # E : avoid dest word load if we can (stall)
- bne t6, 1f # U : (stall)
-
- ldq_u t1, 0(a0) # L :
- subq t12, 1, t6 # E :
- or t6, t12, t8 # E : (stall)
- zapnot t0, t8, t0 # U : kill source bytes > null
-
- zap t1, t8, t1 # U : kill dest bytes <= null
- or t0, t1, t0 # E : (stall)
- nop
- nop
-
-1: stq_u t0, 0(a0) # L :
- ret (t9) # L0 : Latency=3
-
- /* Got to end-of-count before end of string.
- On entry to this basic block:
- t1 == the shifted high-order bits from the previous source word */
-$u_eoc:
- and a1, 7, t6 # E : avoid final load if possible
- sll t10, t6, t6 # U : (stall)
- and t6, 0xff, t6 # E : (stall)
- bne t6, 1f # U : (stall)
-
- ldq_u t2, 8(a1) # L : load final src word
- nop
- extqh t2, a1, t0 # U : extract low bits for last word (stall)
- or t1, t0, t1 # E : (stall)
-
-1: cmpbge zero, t1, t8 # E :
- mov t1, t0 # E :
-
-$u_eocfin: # end-of-count, final word
- or t10, t8, t8 # E :
- br $u_final # L0 : Latency=3
-
- /* Unaligned copy entry point. */
- .align 4
-$unaligned:
-
- ldq_u t1, 0(a1) # L : load first source word
- and a0, 7, t4 # E : find dest misalignment
- and a1, 7, t5 # E : find src misalignment
- /* Conditionally load the first destination word and a bytemask
- with 0xff indicating that the destination byte is sacrosanct. */
- mov zero, t0 # E :
-
- mov zero, t6 # E :
- beq t4, 1f # U :
- ldq_u t0, 0(a0) # L :
- lda t6, -1 # E :
-
- mskql t6, a0, t6 # U :
- nop
- nop
- subq a1, t4, a1 # E : sub dest misalignment from src addr
-
- /* If source misalignment is larger than dest misalignment, we need
- extra startup checks to avoid SEGV. */
-
-1: cmplt t4, t5, t12 # E :
- extql t1, a1, t1 # U : shift src into place
- lda t2, -1 # E : for creating masks later
- beq t12, $u_head # U : (stall)
-
- extql t2, a1, t2 # U :
- cmpbge zero, t1, t8 # E : is there a zero?
- andnot t2, t6, t2 # E : dest mask for a single word copy
- or t8, t10, t5 # E : test for end-of-count too
-
- cmpbge zero, t2, t3 # E :
- cmoveq a2, t5, t8 # E : Latency=2, extra map slot
- nop # E : keep with cmoveq
- andnot t8, t3, t8 # E : (stall)
-
- beq t8, $u_head # U :
- /* At this point we've found a zero in the first partial word of
- the source. We need to isolate the valid source data and mask
- it into the original destination data. (Incidentally, we know
- that we'll need at least one byte of that original dest word.) */
- ldq_u t0, 0(a0) # L :
- negq t8, t6 # E : build bitmask of bytes <= zero
- mskqh t1, t4, t1 # U :
-
- and t6, t8, t12 # E :
- subq t12, 1, t6 # E : (stall)
- or t6, t12, t8 # E : (stall)
- zapnot t2, t8, t2 # U : prepare source word; mirror changes (stall)
-
- zapnot t1, t8, t1 # U : to source validity mask
- andnot t0, t2, t0 # E : zero place for source to reside
- or t0, t1, t0 # E : and put it there (stall both t0, t1)
- stq_u t0, 0(a0) # L : (stall)
-
- ret (t9) # L0 : Latency=3
- nop
- nop
- nop
-
- .end __stxncpy
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev67-strcat.S b/ANDROID_3.4.5/arch/alpha/lib/ev67-strcat.S
deleted file mode 100644
index c426fe3e..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev67-strcat.S
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * arch/alpha/lib/ev67-strcat.S
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Append a null-terminated string from SRC to DST.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- * Commentary: It seems bogus to walk the input string twice - once
- * to determine the length, and then again while doing the copy.
- * A significant (future) enhancement would be to only read the input
- * string once.
- */
-
-
- .text
-
- .align 4
- .globl strcat
- .ent strcat
-strcat:
- .frame $30, 0, $26
- .prologue 0
-
- mov $16, $0 # E : set up return value
- /* Find the end of the string. */
- ldq_u $1, 0($16) # L : load first quadword (a0 may be misaligned)
- lda $2, -1 # E :
- insqh $2, $16, $2 # U :
-
- andnot $16, 7, $16 # E :
- or $2, $1, $1 # E :
- cmpbge $31, $1, $2 # E : bits set iff byte == 0
- bne $2, $found # U :
-
-$loop: ldq $1, 8($16) # L :
- addq $16, 8, $16 # E :
- cmpbge $31, $1, $2 # E :
- beq $2, $loop # U :
-
-$found: cttz $2, $3 # U0 :
- addq $16, $3, $16 # E :
- /* Now do the append. */
- mov $26, $23 # E :
- br __stxcpy # L0 :
-
- .end strcat
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev67-strchr.S b/ANDROID_3.4.5/arch/alpha/lib/ev67-strchr.S
deleted file mode 100644
index fbb7b4ff..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev67-strchr.S
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * arch/alpha/lib/ev67-strchr.S
- * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Return the address of a given character within a null-terminated
- * string, or null if it is not found.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
-#include <asm/regdef.h>
-
- .set noreorder
- .set noat
-
- .align 4
- .globl strchr
- .ent strchr
-strchr:
- .frame sp, 0, ra
- .prologue 0
-
- ldq_u t0, 0(a0) # L : load first quadword Latency=3
- and a1, 0xff, t3 # E : 00000000000000ch
- insbl a1, 1, t5 # U : 000000000000ch00
- insbl a1, 7, a2 # U : ch00000000000000
-
- insbl t3, 6, a3 # U : 00ch000000000000
- or t5, t3, a1 # E : 000000000000chch
- andnot a0, 7, v0 # E : align our loop pointer
- lda t4, -1 # E : build garbage mask
-
- mskqh t4, a0, t4 # U : only want relevant part of first quad
- or a2, a3, a2 # E : chch000000000000
- inswl a1, 2, t5 # E : 00000000chch0000
- inswl a1, 4, a3 # E : 0000chch00000000
-
- or a1, a2, a1 # E : chch00000000chch
- or a3, t5, t5 # E : 0000chchchch0000
- cmpbge zero, t0, t2 # E : bits set iff byte == zero
- cmpbge zero, t4, t4 # E : bits set iff byte is garbage
-
- /* This quad is _very_ serialized. Lots of stalling happens */
- or t5, a1, a1 # E : chchchchchchchch
- xor t0, a1, t1 # E : make bytes == c zero
- cmpbge zero, t1, t3 # E : bits set iff byte == c
- or t2, t3, t0 # E : bits set iff char match or zero match
-
- andnot t0, t4, t0 # E : clear garbage bits
- cttz t0, a2 # U0 : speculative (in case we get a match)
- nop # E :
- bne t0, $found # U :
-
- /*
- * Yuk. This loop is going to stall like crazy waiting for the
- * data to be loaded. Not much can be done about it unless it's
- * unrolled multiple times - is that safe to do in kernel space?
- * Or would exception handling recovery code do the trick here?
- */
-$loop: ldq t0, 8(v0) # L : Latency=3
- addq v0, 8, v0 # E :
- xor t0, a1, t1 # E :
- cmpbge zero, t0, t2 # E : bits set iff byte == 0
-
- cmpbge zero, t1, t3 # E : bits set iff byte == c
- or t2, t3, t0 # E :
- cttz t3, a2 # U0 : speculative (in case we get a match)
- beq t0, $loop # U :
-
-$found: negq t0, t1 # E : clear all but least set bit
- and t0, t1, t0 # E :
- and t0, t3, t1 # E : bit set iff byte was the char
- addq v0, a2, v0 # E : Add in the bit number from above
-
- cmoveq t1, $31, v0 # E : Two mapping slots, latency = 2
- nop
- nop
- ret # L0 :
-
- .end strchr
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev67-strlen.S b/ANDROID_3.4.5/arch/alpha/lib/ev67-strlen.S
deleted file mode 100644
index 50392807..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev67-strlen.S
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * arch/alpha/lib/ev67-strlen.S
- * 21264 version by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Finds length of a 0-terminated string. Optimized for the
- * Alpha architecture:
- *
- * - memory accessed as aligned quadwords only
- * - uses bcmpge to compare 8 bytes in parallel
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- */
-
- .set noreorder
- .set noat
-
- .globl strlen
- .ent strlen
- .align 4
-strlen:
- ldq_u $1, 0($16) # L : load first quadword ($16 may be misaligned)
- lda $2, -1($31) # E :
- insqh $2, $16, $2 # U :
- andnot $16, 7, $0 # E :
-
- or $2, $1, $1 # E :
- cmpbge $31, $1, $2 # E : $2 <- bitmask: bit i == 1 <==> i-th byte == 0
- nop # E :
- bne $2, $found # U :
-
-$loop: ldq $1, 8($0) # L :
- addq $0, 8, $0 # E : addr += 8
- cmpbge $31, $1, $2 # E :
- beq $2, $loop # U :
-
-$found:
- cttz $2, $3 # U0 :
- addq $0, $3, $0 # E :
- subq $0, $16, $0 # E :
- ret $31, ($26) # L0 :
-
- .end strlen
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev67-strlen_user.S b/ANDROID_3.4.5/arch/alpha/lib/ev67-strlen_user.S
deleted file mode 100644
index 57e0d77b..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev67-strlen_user.S
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * arch/alpha/lib/ev67-strlen_user.S
- * 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com>
- *
- * Return the length of the string including the NULL terminator
- * (strlen+1) or zero if an error occurred.
- *
- * In places where it is critical to limit the processing time,
- * and the data is not trusted, strnlen_user() should be used.
- * It will return a value greater than its second argument if
- * that limit would be exceeded. This implementation is allowed
- * to access memory beyond the limit, but will not cross a page
- * boundary when doing so.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
-#include <asm/regdef.h>
-
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EX(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda v0, $exception-99b(zero); \
- .previous
-
-
- .set noreorder
- .set noat
- .text
-
- .globl __strlen_user
- .ent __strlen_user
- .frame sp, 0, ra
-
- .align 4
-__strlen_user:
- ldah a1, 32767(zero) # do not use plain strlen_user() for strings
- # that might be almost 2 GB long; you should
- # be using strnlen_user() instead
- nop
- nop
- nop
-
- .globl __strnlen_user
-
- .align 4
-__strnlen_user:
- .prologue 0
- EX( ldq_u t0, 0(a0) ) # L : load first quadword (a0 may be misaligned)
- lda t1, -1(zero) # E :
-
- insqh t1, a0, t1 # U :
- andnot a0, 7, v0 # E :
- or t1, t0, t0 # E :
- subq a0, 1, a0 # E : get our +1 for the return
-
- cmpbge zero, t0, t1 # E : t1 <- bitmask: bit i == 1 <==> i-th byte == 0
- subq a1, 7, t2 # E :
- subq a0, v0, t0 # E :
- bne t1, $found # U :
-
- addq t2, t0, t2 # E :
- addq a1, 1, a1 # E :
- nop # E :
- nop # E :
-
- .align 4
-$loop: ble t2, $limit # U :
- EX( ldq t0, 8(v0) ) # L :
- nop # E :
- nop # E :
-
- cmpbge zero, t0, t1 # E :
- subq t2, 8, t2 # E :
- addq v0, 8, v0 # E : addr += 8
- beq t1, $loop # U :
-
-$found: cttz t1, t2 # U0 :
- addq v0, t2, v0 # E :
- subq v0, a0, v0 # E :
- ret # L0 :
-
-$exception:
- nop
- nop
- nop
- ret
-
- .align 4 # currently redundant
-$limit:
- nop
- nop
- subq a1, t2, v0
- ret
-
- .end __strlen_user
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev67-strncat.S b/ANDROID_3.4.5/arch/alpha/lib/ev67-strncat.S
deleted file mode 100644
index 4ae716cd..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev67-strncat.S
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * arch/alpha/lib/ev67-strncat.S
- * 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com>
- *
- * Append no more than COUNT characters from the null-terminated string SRC
- * to the null-terminated string DST. Always null-terminate the new DST.
- *
- * This differs slightly from the semantics in libc in that we never write
- * past count, whereas libc may write to count+1. This follows the generic
- * implementation in lib/string.c and is, IMHO, more sensible.
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- * Try not to change the actual algorithm if possible for consistency.
- */
-
-
- .text
-
- .align 4
- .globl strncat
- .ent strncat
-strncat:
- .frame $30, 0, $26
- .prologue 0
-
- mov $16, $0 # set up return value
- beq $18, $zerocount # U :
- /* Find the end of the string. */
- ldq_u $1, 0($16) # L : load first quadword ($16 may be misaligned)
- lda $2, -1($31) # E :
-
- insqh $2, $0, $2 # U :
- andnot $16, 7, $16 # E :
- nop # E :
- or $2, $1, $1 # E :
-
- nop # E :
- nop # E :
- cmpbge $31, $1, $2 # E : bits set iff byte == 0
- bne $2, $found # U :
-
-$loop: ldq $1, 8($16) # L :
- addq $16, 8, $16 # E :
- cmpbge $31, $1, $2 # E :
- beq $2, $loop # U :
-
-$found: cttz $2, $3 # U0 :
- addq $16, $3, $16 # E :
- nop # E :
- bsr $23, __stxncpy # L0 :/* Now do the append. */
-
- /* Worry about the null termination. */
-
- zapnot $1, $27, $2 # U : was last byte a null?
- cmplt $27, $24, $5 # E : did we fill the buffer completely?
- bne $2, 0f # U :
- ret # L0 :
-
-0: or $5, $18, $2 # E :
- nop
- bne $2, 2f # U :
- and $24, 0x80, $3 # E : no zero next byte
-
- nop # E :
- bne $3, 1f # U :
- /* Here there are bytes left in the current word. Clear one. */
- addq $24, $24, $24 # E : end-of-count bit <<= 1
- nop # E :
-
-2: zap $1, $24, $1 # U :
- nop # E :
- stq_u $1, 0($16) # L :
- ret # L0 :
-
-1: /* Here we must clear the first byte of the next DST word */
- stb $31, 8($16) # L :
- nop # E :
- nop # E :
- ret # L0 :
-
-$zerocount:
- nop # E :
- nop # E :
- nop # E :
- ret # L0 :
-
- .end strncat
diff --git a/ANDROID_3.4.5/arch/alpha/lib/ev67-strrchr.S b/ANDROID_3.4.5/arch/alpha/lib/ev67-strrchr.S
deleted file mode 100644
index dd0d8c6b..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/ev67-strrchr.S
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * arch/alpha/lib/ev67-strrchr.S
- * 21264 version by Rick Gorton <rick.gorton@alpha-processor.com>
- *
- * Finds length of a 0-terminated string. Optimized for the
- * Alpha architecture:
- *
- * - memory accessed as aligned quadwords only
- * - uses bcmpge to compare 8 bytes in parallel
- *
- * Much of the information about 21264 scheduling/coding comes from:
- * Compiler Writer's Guide for the Alpha 21264
- * abbreviated as 'CWG' in other comments here
- * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
- * Scheduling notation:
- * E - either cluster
- * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
- * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
- */
-
-
-#include <asm/regdef.h>
-
- .set noreorder
- .set noat
-
- .align 4
- .ent strrchr
- .globl strrchr
-strrchr:
- .frame sp, 0, ra
- .prologue 0
-
- and a1, 0xff, t2 # E : 00000000000000ch
- insbl a1, 1, t4 # U : 000000000000ch00
- insbl a1, 2, t5 # U : 0000000000ch0000
- ldq_u t0, 0(a0) # L : load first quadword Latency=3
-
- mov zero, t6 # E : t6 is last match aligned addr
- or t2, t4, a1 # E : 000000000000chch
- sll t5, 8, t3 # U : 00000000ch000000
- mov zero, t8 # E : t8 is last match byte compare mask
-
- andnot a0, 7, v0 # E : align source addr
- or t5, t3, t3 # E : 00000000chch0000
- sll a1, 32, t2 # U : 0000chch00000000
- sll a1, 48, t4 # U : chch000000000000
-
- or t4, a1, a1 # E : chch00000000chch
- or t2, t3, t2 # E : 0000chchchch0000
- or a1, t2, a1 # E : chchchchchchchch
- lda t5, -1 # E : build garbage mask
-
- cmpbge zero, t0, t1 # E : bits set iff byte == zero
- mskqh t5, a0, t4 # E : Complete garbage mask
- xor t0, a1, t2 # E : make bytes == c zero
- cmpbge zero, t4, t4 # E : bits set iff byte is garbage
-
- cmpbge zero, t2, t3 # E : bits set iff byte == c
- andnot t1, t4, t1 # E : clear garbage from null test
- andnot t3, t4, t3 # E : clear garbage from char test
- bne t1, $eos # U : did we already hit the terminator?
-
- /* Character search main loop */
-$loop:
- ldq t0, 8(v0) # L : load next quadword
- cmovne t3, v0, t6 # E : save previous comparisons match
- nop # : Latency=2, extra map slot (keep nop with cmov)
- nop
-
- cmovne t3, t3, t8 # E : Latency=2, extra map slot
- nop # : keep with cmovne
- addq v0, 8, v0 # E :
- xor t0, a1, t2 # E :
-
- cmpbge zero, t0, t1 # E : bits set iff byte == zero
- cmpbge zero, t2, t3 # E : bits set iff byte == c
- beq t1, $loop # U : if we havnt seen a null, loop
- nop
-
- /* Mask out character matches after terminator */
-$eos:
- negq t1, t4 # E : isolate first null byte match
- and t1, t4, t4 # E :
- subq t4, 1, t5 # E : build a mask of the bytes up to...
- or t4, t5, t4 # E : ... and including the null
-
- and t3, t4, t3 # E : mask out char matches after null
- cmovne t3, t3, t8 # E : save it, if match found Latency=2, extra map slot
- nop # : Keep with cmovne
- nop
-
- cmovne t3, v0, t6 # E :
- nop # : Keep with cmovne
- /* Locate the address of the last matched character */
- ctlz t8, t2 # U0 : Latency=3 (0x40 for t8=0)
- nop
-
- cmoveq t8, 0x3f, t2 # E : Compensate for case when no match is seen
- nop # E : hide the cmov latency (2) behind ctlz latency
- lda t5, 0x3f($31) # E :
- subq t5, t2, t5 # E : Normalize leading zero count
-
- addq t6, t5, v0 # E : and add to quadword address
- ret # L0 : Latency=3
- nop
- nop
-
- .end strrchr
diff --git a/ANDROID_3.4.5/arch/alpha/lib/fls.c b/ANDROID_3.4.5/arch/alpha/lib/fls.c
deleted file mode 100644
index ddd048c0..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/fls.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * arch/alpha/lib/fls.c
- */
-
-#include <linux/module.h>
-#include <linux/bitops.h>
-
-/* This is fls(x)-1, except zero is held to zero. This allows most
- efficient input into extbl, plus it allows easy handling of fls(0)=0. */
-
-const unsigned char __flsm1_tab[256] =
-{
- 0,
- 0,
- 1, 1,
- 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-};
-
-EXPORT_SYMBOL(__flsm1_tab);
diff --git a/ANDROID_3.4.5/arch/alpha/lib/fpreg.c b/ANDROID_3.4.5/arch/alpha/lib/fpreg.c
deleted file mode 100644
index 05017ba3..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/fpreg.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * arch/alpha/lib/fpreg.c
- *
- * (C) Copyright 1998 Linus Torvalds
- */
-
-#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
-#define STT(reg,val) asm volatile ("ftoit $f"#reg",%0" : "=r"(val));
-#else
-#define STT(reg,val) asm volatile ("stt $f"#reg",%0" : "=m"(val));
-#endif
-
-unsigned long
-alpha_read_fp_reg (unsigned long reg)
-{
- unsigned long val;
-
- switch (reg) {
- case 0: STT( 0, val); break;
- case 1: STT( 1, val); break;
- case 2: STT( 2, val); break;
- case 3: STT( 3, val); break;
- case 4: STT( 4, val); break;
- case 5: STT( 5, val); break;
- case 6: STT( 6, val); break;
- case 7: STT( 7, val); break;
- case 8: STT( 8, val); break;
- case 9: STT( 9, val); break;
- case 10: STT(10, val); break;
- case 11: STT(11, val); break;
- case 12: STT(12, val); break;
- case 13: STT(13, val); break;
- case 14: STT(14, val); break;
- case 15: STT(15, val); break;
- case 16: STT(16, val); break;
- case 17: STT(17, val); break;
- case 18: STT(18, val); break;
- case 19: STT(19, val); break;
- case 20: STT(20, val); break;
- case 21: STT(21, val); break;
- case 22: STT(22, val); break;
- case 23: STT(23, val); break;
- case 24: STT(24, val); break;
- case 25: STT(25, val); break;
- case 26: STT(26, val); break;
- case 27: STT(27, val); break;
- case 28: STT(28, val); break;
- case 29: STT(29, val); break;
- case 30: STT(30, val); break;
- case 31: STT(31, val); break;
- default: return 0;
- }
- return val;
-}
-
-#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
-#define LDT(reg,val) asm volatile ("itoft %0,$f"#reg : : "r"(val));
-#else
-#define LDT(reg,val) asm volatile ("ldt $f"#reg",%0" : : "m"(val));
-#endif
-
-void
-alpha_write_fp_reg (unsigned long reg, unsigned long val)
-{
- switch (reg) {
- case 0: LDT( 0, val); break;
- case 1: LDT( 1, val); break;
- case 2: LDT( 2, val); break;
- case 3: LDT( 3, val); break;
- case 4: LDT( 4, val); break;
- case 5: LDT( 5, val); break;
- case 6: LDT( 6, val); break;
- case 7: LDT( 7, val); break;
- case 8: LDT( 8, val); break;
- case 9: LDT( 9, val); break;
- case 10: LDT(10, val); break;
- case 11: LDT(11, val); break;
- case 12: LDT(12, val); break;
- case 13: LDT(13, val); break;
- case 14: LDT(14, val); break;
- case 15: LDT(15, val); break;
- case 16: LDT(16, val); break;
- case 17: LDT(17, val); break;
- case 18: LDT(18, val); break;
- case 19: LDT(19, val); break;
- case 20: LDT(20, val); break;
- case 21: LDT(21, val); break;
- case 22: LDT(22, val); break;
- case 23: LDT(23, val); break;
- case 24: LDT(24, val); break;
- case 25: LDT(25, val); break;
- case 26: LDT(26, val); break;
- case 27: LDT(27, val); break;
- case 28: LDT(28, val); break;
- case 29: LDT(29, val); break;
- case 30: LDT(30, val); break;
- case 31: LDT(31, val); break;
- }
-}
-
-#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
-#define STS(reg,val) asm volatile ("ftois $f"#reg",%0" : "=r"(val));
-#else
-#define STS(reg,val) asm volatile ("sts $f"#reg",%0" : "=m"(val));
-#endif
-
-unsigned long
-alpha_read_fp_reg_s (unsigned long reg)
-{
- unsigned long val;
-
- switch (reg) {
- case 0: STS( 0, val); break;
- case 1: STS( 1, val); break;
- case 2: STS( 2, val); break;
- case 3: STS( 3, val); break;
- case 4: STS( 4, val); break;
- case 5: STS( 5, val); break;
- case 6: STS( 6, val); break;
- case 7: STS( 7, val); break;
- case 8: STS( 8, val); break;
- case 9: STS( 9, val); break;
- case 10: STS(10, val); break;
- case 11: STS(11, val); break;
- case 12: STS(12, val); break;
- case 13: STS(13, val); break;
- case 14: STS(14, val); break;
- case 15: STS(15, val); break;
- case 16: STS(16, val); break;
- case 17: STS(17, val); break;
- case 18: STS(18, val); break;
- case 19: STS(19, val); break;
- case 20: STS(20, val); break;
- case 21: STS(21, val); break;
- case 22: STS(22, val); break;
- case 23: STS(23, val); break;
- case 24: STS(24, val); break;
- case 25: STS(25, val); break;
- case 26: STS(26, val); break;
- case 27: STS(27, val); break;
- case 28: STS(28, val); break;
- case 29: STS(29, val); break;
- case 30: STS(30, val); break;
- case 31: STS(31, val); break;
- default: return 0;
- }
- return val;
-}
-
-#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
-#define LDS(reg,val) asm volatile ("itofs %0,$f"#reg : : "r"(val));
-#else
-#define LDS(reg,val) asm volatile ("lds $f"#reg",%0" : : "m"(val));
-#endif
-
-void
-alpha_write_fp_reg_s (unsigned long reg, unsigned long val)
-{
- switch (reg) {
- case 0: LDS( 0, val); break;
- case 1: LDS( 1, val); break;
- case 2: LDS( 2, val); break;
- case 3: LDS( 3, val); break;
- case 4: LDS( 4, val); break;
- case 5: LDS( 5, val); break;
- case 6: LDS( 6, val); break;
- case 7: LDS( 7, val); break;
- case 8: LDS( 8, val); break;
- case 9: LDS( 9, val); break;
- case 10: LDS(10, val); break;
- case 11: LDS(11, val); break;
- case 12: LDS(12, val); break;
- case 13: LDS(13, val); break;
- case 14: LDS(14, val); break;
- case 15: LDS(15, val); break;
- case 16: LDS(16, val); break;
- case 17: LDS(17, val); break;
- case 18: LDS(18, val); break;
- case 19: LDS(19, val); break;
- case 20: LDS(20, val); break;
- case 21: LDS(21, val); break;
- case 22: LDS(22, val); break;
- case 23: LDS(23, val); break;
- case 24: LDS(24, val); break;
- case 25: LDS(25, val); break;
- case 26: LDS(26, val); break;
- case 27: LDS(27, val); break;
- case 28: LDS(28, val); break;
- case 29: LDS(29, val); break;
- case 30: LDS(30, val); break;
- case 31: LDS(31, val); break;
- }
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/memchr.S b/ANDROID_3.4.5/arch/alpha/lib/memchr.S
deleted file mode 100644
index 14427eeb..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/memchr.S
+++ /dev/null
@@ -1,164 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by David Mosberger (davidm@cs.arizona.edu).
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* Finds characters in a memory area. Optimized for the Alpha:
-
- - memory accessed as aligned quadwords only
- - uses cmpbge to compare 8 bytes in parallel
- - does binary search to find 0 byte in last
- quadword (HAKMEM needed 12 instructions to
- do this instead of the 9 instructions that
- binary search needs).
-
-For correctness consider that:
-
- - only minimum number of quadwords may be accessed
- - the third argument is an unsigned long
-*/
-
- .set noreorder
- .set noat
-
- .globl memchr
- .ent memchr
-memchr:
- .frame $30,0,$26,0
- .prologue 0
-
- # Hack -- if someone passes in (size_t)-1, hoping to just
- # search til the end of the address space, we will overflow
- # below when we find the address of the last byte. Given
- # that we will never have a 56-bit address space, cropping
- # the length is the easiest way to avoid trouble.
- zap $18, 0x80, $5 #-e0 :
-
- beq $18, $not_found # .. e1 :
- ldq_u $1, 0($16) # e1 : load first quadword
- insbl $17, 1, $2 # .. e0 : $2 = 000000000000ch00
- and $17, 0xff, $17 #-e0 : $17 = 00000000000000ch
- cmpult $18, 9, $4 # .. e1 :
- or $2, $17, $17 # e0 : $17 = 000000000000chch
- lda $3, -1($31) # .. e1 :
- sll $17, 16, $2 #-e0 : $2 = 00000000chch0000
- addq $16, $5, $5 # .. e1 :
- or $2, $17, $17 # e1 : $17 = 00000000chchchch
- unop # :
- sll $17, 32, $2 #-e0 : $2 = chchchch00000000
- or $2, $17, $17 # e1 : $17 = chchchchchchchch
- extql $1, $16, $7 # e0 :
- beq $4, $first_quad # .. e1 :
-
- ldq_u $6, -1($5) #-e1 : eight or less bytes to search
- extqh $6, $16, $6 # .. e0 :
- mov $16, $0 # e0 :
- or $7, $6, $1 # .. e1 : $1 = quadword starting at $16
-
- # Deal with the case where at most 8 bytes remain to be searched
- # in $1. E.g.:
- # $18 = 6
- # $1 = ????c6c5c4c3c2c1
-$last_quad:
- negq $18, $6 #-e0 :
- xor $17, $1, $1 # .. e1 :
- srl $3, $6, $6 # e0 : $6 = mask of $18 bits set
- cmpbge $31, $1, $2 # .. e1 :
- and $2, $6, $2 #-e0 :
- beq $2, $not_found # .. e1 :
-
-$found_it:
- # Now, determine which byte matched:
- negq $2, $3 # e0 :
- and $2, $3, $2 # e1 :
-
- and $2, 0x0f, $1 #-e0 :
- addq $0, 4, $3 # .. e1 :
- cmoveq $1, $3, $0 # e0 :
-
- addq $0, 2, $3 # .. e1 :
- and $2, 0x33, $1 #-e0 :
- cmoveq $1, $3, $0 # .. e1 :
-
- and $2, 0x55, $1 # e0 :
- addq $0, 1, $3 # .. e1 :
- cmoveq $1, $3, $0 #-e0 :
-
-$done: ret # .. e1 :
-
- # Deal with the case where $18 > 8 bytes remain to be
- # searched. $16 may not be aligned.
- .align 4
-$first_quad:
- andnot $16, 0x7, $0 #-e1 :
- insqh $3, $16, $2 # .. e0 : $2 = 0000ffffffffffff ($16<0:2> ff)
- xor $1, $17, $1 # e0 :
- or $1, $2, $1 # e1 : $1 = ====ffffffffffff
- cmpbge $31, $1, $2 #-e0 :
- bne $2, $found_it # .. e1 :
-
- # At least one byte left to process.
-
- ldq $1, 8($0) # e0 :
- subq $5, 1, $18 # .. e1 :
- addq $0, 8, $0 #-e0 :
-
- # Make $18 point to last quad to be accessed (the
- # last quad may or may not be partial).
-
- andnot $18, 0x7, $18 # .. e1 :
- cmpult $0, $18, $2 # e0 :
- beq $2, $final # .. e1 :
-
- # At least two quads remain to be accessed.
-
- subq $18, $0, $4 #-e0 : $4 <- nr quads to be processed
- and $4, 8, $4 # e1 : odd number of quads?
- bne $4, $odd_quad_count # e1 :
-
- # At least three quads remain to be accessed
-
- mov $1, $4 # e0 : move prefetched value to correct reg
-
- .align 4
-$unrolled_loop:
- ldq $1, 8($0) #-e0 : prefetch $1
- xor $17, $4, $2 # .. e1 :
- cmpbge $31, $2, $2 # e0 :
- bne $2, $found_it # .. e1 :
-
- addq $0, 8, $0 #-e0 :
-$odd_quad_count:
- xor $17, $1, $2 # .. e1 :
- ldq $4, 8($0) # e0 : prefetch $4
- cmpbge $31, $2, $2 # .. e1 :
- addq $0, 8, $6 #-e0 :
- bne $2, $found_it # .. e1 :
-
- cmpult $6, $18, $6 # e0 :
- addq $0, 8, $0 # .. e1 :
- bne $6, $unrolled_loop #-e1 :
-
- mov $4, $1 # e0 : move prefetched value into $1
-$final: subq $5, $0, $18 # .. e1 : $18 <- number of bytes left to do
- bne $18, $last_quad # e1 :
-
-$not_found:
- mov $31, $0 #-e0 :
- ret # .. e1 :
-
- .end memchr
diff --git a/ANDROID_3.4.5/arch/alpha/lib/memcpy.c b/ANDROID_3.4.5/arch/alpha/lib/memcpy.c
deleted file mode 100644
index 64083fc7..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/memcpy.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * linux/arch/alpha/lib/memcpy.c
- *
- * Copyright (C) 1995 Linus Torvalds
- */
-
-/*
- * This is a reasonably optimized memcpy() routine.
- */
-
-/*
- * Note that the C code is written to be optimized into good assembly. However,
- * at this point gcc is unable to sanely compile "if (n >= 0)", resulting in a
- * explicit compare against 0 (instead of just using the proper "blt reg, xx" or
- * "bge reg, xx"). I hope alpha-gcc will be fixed to notice this eventually..
- */
-
-#include <linux/types.h>
-
-/*
- * This should be done in one go with ldq_u*2/mask/stq_u. Do it
- * with a macro so that we can fix it up later..
- */
-#define ALIGN_DEST_TO8_UP(d,s,n) \
- while (d & 7) { \
- if (n <= 0) return; \
- n--; \
- *(char *) d = *(char *) s; \
- d++; s++; \
- }
-#define ALIGN_DEST_TO8_DN(d,s,n) \
- while (d & 7) { \
- if (n <= 0) return; \
- n--; \
- d--; s--; \
- *(char *) d = *(char *) s; \
- }
-
-/*
- * This should similarly be done with ldq_u*2/mask/stq. The destination
- * is aligned, but we don't fill in a full quad-word
- */
-#define DO_REST_UP(d,s,n) \
- while (n > 0) { \
- n--; \
- *(char *) d = *(char *) s; \
- d++; s++; \
- }
-#define DO_REST_DN(d,s,n) \
- while (n > 0) { \
- n--; \
- d--; s--; \
- *(char *) d = *(char *) s; \
- }
-
-/*
- * This should be done with ldq/mask/stq. The source and destination are
- * aligned, but we don't fill in a full quad-word
- */
-#define DO_REST_ALIGNED_UP(d,s,n) DO_REST_UP(d,s,n)
-#define DO_REST_ALIGNED_DN(d,s,n) DO_REST_DN(d,s,n)
-
-/*
- * This does unaligned memory copies. We want to avoid storing to
- * an unaligned address, as that would do a read-modify-write cycle.
- * We also want to avoid double-reading the unaligned reads.
- *
- * Note the ordering to try to avoid load (and address generation) latencies.
- */
-static inline void __memcpy_unaligned_up (unsigned long d, unsigned long s,
- long n)
-{
- ALIGN_DEST_TO8_UP(d,s,n);
- n -= 8; /* to avoid compare against 8 in the loop */
- if (n >= 0) {
- unsigned long low_word, high_word;
- __asm__("ldq_u %0,%1":"=r" (low_word):"m" (*(unsigned long *) s));
- do {
- unsigned long tmp;
- __asm__("ldq_u %0,%1":"=r" (high_word):"m" (*(unsigned long *)(s+8)));
- n -= 8;
- __asm__("extql %1,%2,%0"
- :"=r" (low_word)
- :"r" (low_word), "r" (s));
- __asm__("extqh %1,%2,%0"
- :"=r" (tmp)
- :"r" (high_word), "r" (s));
- s += 8;
- *(unsigned long *) d = low_word | tmp;
- d += 8;
- low_word = high_word;
- } while (n >= 0);
- }
- n += 8;
- DO_REST_UP(d,s,n);
-}
-
-static inline void __memcpy_unaligned_dn (unsigned long d, unsigned long s,
- long n)
-{
- /* I don't understand AXP assembler well enough for this. -Tim */
- s += n;
- d += n;
- while (n--)
- * (char *) --d = * (char *) --s;
-}
-
-/*
- * Hmm.. Strange. The __asm__ here is there to make gcc use an integer register
- * for the load-store. I don't know why, but it would seem that using a floating
- * point register for the move seems to slow things down (very small difference,
- * though).
- *
- * Note the ordering to try to avoid load (and address generation) latencies.
- */
-static inline void __memcpy_aligned_up (unsigned long d, unsigned long s,
- long n)
-{
- ALIGN_DEST_TO8_UP(d,s,n);
- n -= 8;
- while (n >= 0) {
- unsigned long tmp;
- __asm__("ldq %0,%1":"=r" (tmp):"m" (*(unsigned long *) s));
- n -= 8;
- s += 8;
- *(unsigned long *) d = tmp;
- d += 8;
- }
- n += 8;
- DO_REST_ALIGNED_UP(d,s,n);
-}
-static inline void __memcpy_aligned_dn (unsigned long d, unsigned long s,
- long n)
-{
- s += n;
- d += n;
- ALIGN_DEST_TO8_DN(d,s,n);
- n -= 8;
- while (n >= 0) {
- unsigned long tmp;
- s -= 8;
- __asm__("ldq %0,%1":"=r" (tmp):"m" (*(unsigned long *) s));
- n -= 8;
- d -= 8;
- *(unsigned long *) d = tmp;
- }
- n += 8;
- DO_REST_ALIGNED_DN(d,s,n);
-}
-
-void * memcpy(void * dest, const void *src, size_t n)
-{
- if (!(((unsigned long) dest ^ (unsigned long) src) & 7)) {
- __memcpy_aligned_up ((unsigned long) dest, (unsigned long) src,
- n);
- return dest;
- }
- __memcpy_unaligned_up ((unsigned long) dest, (unsigned long) src, n);
- return dest;
-}
-
-/* For backward modules compatibility, define __memcpy. */
-asm("__memcpy = memcpy; .globl __memcpy");
diff --git a/ANDROID_3.4.5/arch/alpha/lib/memmove.S b/ANDROID_3.4.5/arch/alpha/lib/memmove.S
deleted file mode 100644
index eb3b6e02..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/memmove.S
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * arch/alpha/lib/memmove.S
- *
- * Barely optimized memmove routine for Alpha EV5.
- *
- * This is hand-massaged output from the original memcpy.c. We defer to
- * memcpy whenever possible; the backwards copy loops are not unrolled.
- */
-
- .set noat
- .set noreorder
- .text
-
- .align 4
- .globl memmove
- .ent memmove
-memmove:
- ldgp $29, 0($27)
- unop
- nop
- .prologue 1
-
- addq $16,$18,$4
- addq $17,$18,$5
- cmpule $4,$17,$1 /* dest + n <= src */
- cmpule $5,$16,$2 /* dest >= src + n */
-
- bis $1,$2,$1
- mov $16,$0
- xor $16,$17,$2
- bne $1,memcpy !samegp
-
- and $2,7,$2 /* Test for src/dest co-alignment. */
- and $16,7,$1
- cmpule $16,$17,$3
- bne $3,$memmove_up /* dest < src */
-
- and $4,7,$1
- bne $2,$misaligned_dn
- unop
- beq $1,$skip_aligned_byte_loop_head_dn
-
-$aligned_byte_loop_head_dn:
- lda $4,-1($4)
- lda $5,-1($5)
- unop
- ble $18,$egress
-
- ldq_u $3,0($5)
- ldq_u $2,0($4)
- lda $18,-1($18)
- extbl $3,$5,$1
-
- insbl $1,$4,$1
- mskbl $2,$4,$2
- bis $1,$2,$1
- and $4,7,$6
-
- stq_u $1,0($4)
- bne $6,$aligned_byte_loop_head_dn
-
-$skip_aligned_byte_loop_head_dn:
- lda $18,-8($18)
- blt $18,$skip_aligned_word_loop_dn
-
-$aligned_word_loop_dn:
- ldq $1,-8($5)
- nop
- lda $5,-8($5)
- lda $18,-8($18)
-
- stq $1,-8($4)
- nop
- lda $4,-8($4)
- bge $18,$aligned_word_loop_dn
-
-$skip_aligned_word_loop_dn:
- lda $18,8($18)
- bgt $18,$byte_loop_tail_dn
- unop
- ret $31,($26),1
-
- .align 4
-$misaligned_dn:
- nop
- fnop
- unop
- beq $18,$egress
-
-$byte_loop_tail_dn:
- ldq_u $3,-1($5)
- ldq_u $2,-1($4)
- lda $5,-1($5)
- lda $4,-1($4)
-
- lda $18,-1($18)
- extbl $3,$5,$1
- insbl $1,$4,$1
- mskbl $2,$4,$2
-
- bis $1,$2,$1
- stq_u $1,0($4)
- bgt $18,$byte_loop_tail_dn
- br $egress
-
-$memmove_up:
- mov $16,$4
- mov $17,$5
- bne $2,$misaligned_up
- beq $1,$skip_aligned_byte_loop_head_up
-
-$aligned_byte_loop_head_up:
- unop
- ble $18,$egress
- ldq_u $3,0($5)
- ldq_u $2,0($4)
-
- lda $18,-1($18)
- extbl $3,$5,$1
- insbl $1,$4,$1
- mskbl $2,$4,$2
-
- bis $1,$2,$1
- lda $5,1($5)
- stq_u $1,0($4)
- lda $4,1($4)
-
- and $4,7,$6
- bne $6,$aligned_byte_loop_head_up
-
-$skip_aligned_byte_loop_head_up:
- lda $18,-8($18)
- blt $18,$skip_aligned_word_loop_up
-
-$aligned_word_loop_up:
- ldq $1,0($5)
- nop
- lda $5,8($5)
- lda $18,-8($18)
-
- stq $1,0($4)
- nop
- lda $4,8($4)
- bge $18,$aligned_word_loop_up
-
-$skip_aligned_word_loop_up:
- lda $18,8($18)
- bgt $18,$byte_loop_tail_up
- unop
- ret $31,($26),1
-
- .align 4
-$misaligned_up:
- nop
- fnop
- unop
- beq $18,$egress
-
-$byte_loop_tail_up:
- ldq_u $3,0($5)
- ldq_u $2,0($4)
- lda $18,-1($18)
- extbl $3,$5,$1
-
- insbl $1,$4,$1
- mskbl $2,$4,$2
- bis $1,$2,$1
- stq_u $1,0($4)
-
- lda $5,1($5)
- lda $4,1($4)
- nop
- bgt $18,$byte_loop_tail_up
-
-$egress:
- ret $31,($26),1
- nop
- nop
- nop
-
- .end memmove
diff --git a/ANDROID_3.4.5/arch/alpha/lib/memset.S b/ANDROID_3.4.5/arch/alpha/lib/memset.S
deleted file mode 100644
index 311b8cfc..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/memset.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * linux/arch/alpha/lib/memset.S
- *
- * This is an efficient (and small) implementation of the C library "memset()"
- * function for the alpha.
- *
- * (C) Copyright 1996 Linus Torvalds
- *
- * This routine is "moral-ware": you are free to use it any way you wish, and
- * the only obligation I put on you is a moral one: if you make any improvements
- * to the routine, please send me your improvements for me to use similarly.
- *
- * The scheduling comments are according to the EV5 documentation (and done by
- * hand, so they might well be incorrect, please do tell me about it..)
- */
-
- .set noat
- .set noreorder
-.text
- .globl memset
- .globl __memset
- .globl __memsetw
- .globl __constant_c_memset
- .ent __memset
-.align 5
-__memset:
- .frame $30,0,$26,0
- .prologue 0
-
- and $17,255,$1 /* E1 */
- insbl $17,1,$17 /* .. E0 */
- bis $17,$1,$17 /* E0 (p-c latency, next cycle) */
- sll $17,16,$1 /* E1 (p-c latency, next cycle) */
-
- bis $17,$1,$17 /* E0 (p-c latency, next cycle) */
- sll $17,32,$1 /* E1 (p-c latency, next cycle) */
- bis $17,$1,$17 /* E0 (p-c latency, next cycle) */
- ldq_u $31,0($30) /* .. E1 */
-
-.align 5
-__constant_c_memset:
- addq $18,$16,$6 /* E0 */
- bis $16,$16,$0 /* .. E1 */
- xor $16,$6,$1 /* E0 */
- ble $18,end /* .. E1 */
-
- bic $1,7,$1 /* E0 */
- beq $1,within_one_quad /* .. E1 (note EV5 zero-latency forwarding) */
- and $16,7,$3 /* E0 */
- beq $3,aligned /* .. E1 (note EV5 zero-latency forwarding) */
-
- ldq_u $4,0($16) /* E0 */
- bis $16,$16,$5 /* .. E1 */
- insql $17,$16,$2 /* E0 */
- subq $3,8,$3 /* .. E1 */
-
- addq $18,$3,$18 /* E0 $18 is new count ($3 is negative) */
- mskql $4,$16,$4 /* .. E1 (and possible load stall) */
- subq $16,$3,$16 /* E0 $16 is new aligned destination */
- bis $2,$4,$1 /* .. E1 */
-
- bis $31,$31,$31 /* E0 */
- ldq_u $31,0($30) /* .. E1 */
- stq_u $1,0($5) /* E0 */
- bis $31,$31,$31 /* .. E1 */
-
-.align 4
-aligned:
- sra $18,3,$3 /* E0 */
- and $18,7,$18 /* .. E1 */
- bis $16,$16,$5 /* E0 */
- beq $3,no_quad /* .. E1 */
-
-.align 3
-loop:
- stq $17,0($5) /* E0 */
- subq $3,1,$3 /* .. E1 */
- addq $5,8,$5 /* E0 */
- bne $3,loop /* .. E1 */
-
-no_quad:
- bis $31,$31,$31 /* E0 */
- beq $18,end /* .. E1 */
- ldq $7,0($5) /* E0 */
- mskqh $7,$6,$2 /* .. E1 (and load stall) */
-
- insqh $17,$6,$4 /* E0 */
- bis $2,$4,$1 /* .. E1 */
- stq $1,0($5) /* E0 */
- ret $31,($26),1 /* .. E1 */
-
-.align 3
-within_one_quad:
- ldq_u $1,0($16) /* E0 */
- insql $17,$16,$2 /* E1 */
- mskql $1,$16,$4 /* E0 (after load stall) */
- bis $2,$4,$2 /* E0 */
-
- mskql $2,$6,$4 /* E0 */
- mskqh $1,$6,$2 /* .. E1 */
- bis $2,$4,$1 /* E0 */
- stq_u $1,0($16) /* E0 */
-
-end:
- ret $31,($26),1 /* E1 */
- .end __memset
-
- .align 5
- .ent __memsetw
-__memsetw:
- .prologue 0
-
- inswl $17,0,$1 /* E0 */
- inswl $17,2,$2 /* E0 */
- inswl $17,4,$3 /* E0 */
- or $1,$2,$1 /* .. E1 */
- inswl $17,6,$4 /* E0 */
- or $1,$3,$1 /* .. E1 */
- or $1,$4,$17 /* E0 */
- br __constant_c_memset /* .. E1 */
-
- .end __memsetw
-
-memset = __memset
diff --git a/ANDROID_3.4.5/arch/alpha/lib/srm_printk.c b/ANDROID_3.4.5/arch/alpha/lib/srm_printk.c
deleted file mode 100644
index 31b53c49..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/srm_printk.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * arch/alpha/lib/srm_printk.c
- */
-
-#include <linux/kernel.h>
-#include <asm/console.h>
-
-long
-srm_printk(const char *fmt, ...)
-{
- static char buf[1024];
- va_list args;
- long len, num_lf;
- char *src, *dst;
-
- va_start(args, fmt);
- len = vsprintf(buf, fmt, args);
- va_end(args);
-
- /* count number of linefeeds in string: */
-
- num_lf = 0;
- for (src = buf; *src; ++src) {
- if (*src == '\n') {
- ++num_lf;
- }
- }
-
- if (num_lf) {
- /* expand each linefeed into carriage-return/linefeed: */
- for (dst = src + num_lf; src >= buf; ) {
- if (*src == '\n') {
- *dst-- = '\r';
- }
- *dst-- = *src--;
- }
- }
-
- srm_puts(buf, num_lf+len);
- return len;
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/srm_puts.c b/ANDROID_3.4.5/arch/alpha/lib/srm_puts.c
deleted file mode 100644
index 7b60a6f7..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/srm_puts.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * arch/alpha/lib/srm_puts.c
- */
-
-#include <linux/string.h>
-#include <asm/console.h>
-
-long
-srm_puts(const char *str, long len)
-{
- long remaining, written;
-
- if (!callback_init_done)
- return len;
-
- for (remaining = len; remaining > 0; remaining -= written)
- {
- written = callback_puts(0, str, remaining);
- written &= 0xffffffff;
- str += written;
- }
- return len;
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/stacktrace.c b/ANDROID_3.4.5/arch/alpha/lib/stacktrace.c
deleted file mode 100644
index 5e832161..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/stacktrace.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include <linux/kernel.h>
-
-typedef unsigned int instr;
-
-#define MAJOR_OP 0xfc000000
-#define LDA_OP 0x20000000
-#define STQ_OP 0xb4000000
-#define BR_OP 0xc0000000
-
-#define STK_ALLOC_1 0x23de8000 /* lda $30,-X($30) */
-#define STK_ALLOC_1M 0xffff8000
-#define STK_ALLOC_2 0x43c0153e /* subq $30,X,$30 */
-#define STK_ALLOC_2M 0xffe01fff
-
-#define MEM_REG 0x03e00000
-#define MEM_BASE 0x001f0000
-#define MEM_OFF 0x0000ffff
-#define MEM_OFF_SIGN 0x00008000
-#define BASE_SP 0x001e0000
-
-#define STK_ALLOC_MATCH(INSTR) \
- (((INSTR) & STK_ALLOC_1M) == STK_ALLOC_1 \
- || ((INSTR) & STK_ALLOC_2M) == STK_ALLOC_2)
-#define STK_PUSH_MATCH(INSTR) \
- (((INSTR) & (MAJOR_OP | MEM_BASE | MEM_OFF_SIGN)) == (STQ_OP | BASE_SP))
-#define MEM_OP_OFFSET(INSTR) \
- (((long)((INSTR) & MEM_OFF) << 48) >> 48)
-#define MEM_OP_REG(INSTR) \
- (((INSTR) & MEM_REG) >> 22)
-
-/* Branches, jumps, PAL calls, and illegal opcodes end a basic block. */
-#define BB_END(INSTR) \
- (((instr)(INSTR) >= BR_OP) | ((instr)(INSTR) < LDA_OP) | \
- ((((instr)(INSTR) ^ 0x60000000) < 0x20000000) & \
- (((instr)(INSTR) & 0x0c000000) != 0)))
-
-#define IS_KERNEL_TEXT(PC) ((unsigned long)(PC) > START_ADDR)
-
-static char reg_name[][4] = {
- "v0 ", "t0 ", "t1 ", "t2 ", "t3 ", "t4 ", "t5 ", "t6 ", "t7 ",
- "s0 ", "s1 ", "s2 ", "s3 ", "s4 ", "s5 ", "s6 ", "a0 ", "a1 ",
- "a2 ", "a3 ", "a4 ", "a5 ", "t8 ", "t9 ", "t10", "t11", "ra ",
- "pv ", "at ", "gp ", "sp ", "0"
-};
-
-
-static instr *
-display_stored_regs(instr * pro_pc, unsigned char * sp)
-{
- instr * ret_pc = 0;
- int reg;
- unsigned long value;
-
- printk("Prologue [<%p>], Frame %p:\n", pro_pc, sp);
- while (!BB_END(*pro_pc))
- if (STK_PUSH_MATCH(*pro_pc)) {
- reg = (*pro_pc & MEM_REG) >> 21;
- value = *(unsigned long *)(sp + (*pro_pc & MEM_OFF));
- if (reg == 26)
- ret_pc = (instr *)value;
- printk("\t\t%s / 0x%016lx\n", reg_name[reg], value);
- }
- return ret_pc;
-}
-
-static instr *
-seek_prologue(instr * pc)
-{
- while (!STK_ALLOC_MATCH(*pc))
- --pc;
- while (!BB_END(*(pc - 1)))
- --pc;
- return pc;
-}
-
-static long
-stack_increment(instr * prologue_pc)
-{
- while (!STK_ALLOC_MATCH(*prologue_pc))
- ++prologue_pc;
-
- /* Count the bytes allocated. */
- if ((*prologue_pc & STK_ALLOC_1M) == STK_ALLOC_1M)
- return -(((long)(*prologue_pc) << 48) >> 48);
- else
- return (*prologue_pc >> 13) & 0xff;
-}
-
-void
-stacktrace(void)
-{
- instr * ret_pc;
- instr * prologue = (instr *)stacktrace;
- register unsigned char * sp __asm__ ("$30");
-
- printk("\tstack trace:\n");
- do {
- ret_pc = display_stored_regs(prologue, sp);
- sp += stack_increment(prologue);
- prologue = seek_prologue(ret_pc);
- } while (IS_KERNEL_TEXT(ret_pc));
-}
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strcat.S b/ANDROID_3.4.5/arch/alpha/lib/strcat.S
deleted file mode 100644
index 393f5038..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strcat.S
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * arch/alpha/lib/strcat.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Append a null-terminated string from SRC to DST.
- */
-
- .text
-
- .align 3
- .globl strcat
- .ent strcat
-strcat:
- .frame $30, 0, $26
- .prologue 0
-
- mov $16, $0 # set up return value
-
- /* Find the end of the string. */
-
- ldq_u $1, 0($16) # load first quadword (a0 may be misaligned)
- lda $2, -1
- insqh $2, $16, $2
- andnot $16, 7, $16
- or $2, $1, $1
- cmpbge $31, $1, $2 # bits set iff byte == 0
- bne $2, $found
-
-$loop: ldq $1, 8($16)
- addq $16, 8, $16
- cmpbge $31, $1, $2
- beq $2, $loop
-
-$found: negq $2, $3 # clear all but least set bit
- and $2, $3, $2
-
- and $2, 0xf0, $3 # binary search for that set bit
- and $2, 0xcc, $4
- and $2, 0xaa, $5
- cmovne $3, 4, $3
- cmovne $4, 2, $4
- cmovne $5, 1, $5
- addq $3, $4, $3
- addq $16, $5, $16
- addq $16, $3, $16
-
- /* Now do the append. */
-
- mov $26, $23
- br __stxcpy
-
- .end strcat
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strchr.S b/ANDROID_3.4.5/arch/alpha/lib/strchr.S
deleted file mode 100644
index 011a175e..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strchr.S
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * arch/alpha/lib/strchr.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Return the address of a given character within a null-terminated
- * string, or null if it is not found.
- */
-
-#include <asm/regdef.h>
-
- .set noreorder
- .set noat
-
- .align 3
- .globl strchr
- .ent strchr
-strchr:
- .frame sp, 0, ra
- .prologue 0
-
- zapnot a1, 1, a1 # e0 : zero extend the search character
- ldq_u t0, 0(a0) # .. e1 : load first quadword
- sll a1, 8, t5 # e0 : replicate the search character
- andnot a0, 7, v0 # .. e1 : align our loop pointer
- or t5, a1, a1 # e0 :
- lda t4, -1 # .. e1 : build garbage mask
- sll a1, 16, t5 # e0 :
- cmpbge zero, t0, t2 # .. e1 : bits set iff byte == zero
- mskqh t4, a0, t4 # e0 :
- or t5, a1, a1 # .. e1 :
- sll a1, 32, t5 # e0 :
- cmpbge zero, t4, t4 # .. e1 : bits set iff byte is garbage
- or t5, a1, a1 # e0 :
- xor t0, a1, t1 # .. e1 : make bytes == c zero
- cmpbge zero, t1, t3 # e0 : bits set iff byte == c
- or t2, t3, t0 # e1 : bits set iff char match or zero match
- andnot t0, t4, t0 # e0 : clear garbage bits
- bne t0, $found # .. e1 (zdb)
-
-$loop: ldq t0, 8(v0) # e0 :
- addq v0, 8, v0 # .. e1 :
- nop # e0 :
- xor t0, a1, t1 # .. e1 (ev5 data stall)
- cmpbge zero, t0, t2 # e0 : bits set iff byte == 0
- cmpbge zero, t1, t3 # .. e1 : bits set iff byte == c
- or t2, t3, t0 # e0 :
- beq t0, $loop # .. e1 (zdb)
-
-$found: negq t0, t1 # e0 : clear all but least set bit
- and t0, t1, t0 # e1 (stall)
-
- and t0, t3, t1 # e0 : bit set iff byte was the char
- beq t1, $retnull # .. e1 (zdb)
-
- and t0, 0xf0, t2 # e0 : binary search for that set bit
- and t0, 0xcc, t3 # .. e1 :
- and t0, 0xaa, t4 # e0 :
- cmovne t2, 4, t2 # .. e1 :
- cmovne t3, 2, t3 # e0 :
- cmovne t4, 1, t4 # .. e1 :
- addq t2, t3, t2 # e0 :
- addq v0, t4, v0 # .. e1 :
- addq v0, t2, v0 # e0 :
- ret # .. e1 :
-
-$retnull:
- mov zero, v0 # e0 :
- ret # .. e1 :
-
- .end strchr
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strcpy.S b/ANDROID_3.4.5/arch/alpha/lib/strcpy.S
deleted file mode 100644
index e0728e4a..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strcpy.S
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * arch/alpha/lib/strcpy.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Copy a null-terminated string from SRC to DST. Return a pointer
- * to the null-terminator in the source.
- */
-
- .text
-
- .align 3
- .globl strcpy
- .ent strcpy
-strcpy:
- .frame $30, 0, $26
- .prologue 0
-
- mov $16, $0 # set up return value
- mov $26, $23 # set up return address
- unop
- br __stxcpy # do the copy
-
- .end strcpy
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strlen.S b/ANDROID_3.4.5/arch/alpha/lib/strlen.S
deleted file mode 100644
index fe63353d..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strlen.S
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * strlen.S (c) 1995 David Mosberger (davidm@cs.arizona.edu)
- *
- * Finds length of a 0-terminated string. Optimized for the
- * Alpha architecture:
- *
- * - memory accessed as aligned quadwords only
- * - uses bcmpge to compare 8 bytes in parallel
- * - does binary search to find 0 byte in last
- * quadword (HAKMEM needed 12 instructions to
- * do this instead of the 9 instructions that
- * binary search needs).
- */
-
- .set noreorder
- .set noat
-
- .align 3
-
- .globl strlen
- .ent strlen
-
-strlen:
- ldq_u $1, 0($16) # load first quadword ($16 may be misaligned)
- lda $2, -1($31)
- insqh $2, $16, $2
- andnot $16, 7, $0
- or $2, $1, $1
- cmpbge $31, $1, $2 # $2 <- bitmask: bit i == 1 <==> i-th byte == 0
- bne $2, found
-
-loop: ldq $1, 8($0)
- addq $0, 8, $0 # addr += 8
- nop # helps dual issue last two insns
- cmpbge $31, $1, $2
- beq $2, loop
-
-found: blbs $2, done # make aligned case fast
- negq $2, $3
- and $2, $3, $2
-
- and $2, 0x0f, $1
- addq $0, 4, $3
- cmoveq $1, $3, $0
-
- and $2, 0x33, $1
- addq $0, 2, $3
- cmoveq $1, $3, $0
-
- and $2, 0x55, $1
- addq $0, 1, $3
- cmoveq $1, $3, $0
-
-done: subq $0, $16, $0
- ret $31, ($26)
-
- .end strlen
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strlen_user.S b/ANDROID_3.4.5/arch/alpha/lib/strlen_user.S
deleted file mode 100644
index 508a18e9..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strlen_user.S
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * arch/alpha/lib/strlen_user.S
- *
- * Return the length of the string including the NUL terminator
- * (strlen+1) or zero if an error occurred.
- *
- * In places where it is critical to limit the processing time,
- * and the data is not trusted, strnlen_user() should be used.
- * It will return a value greater than its second argument if
- * that limit would be exceeded. This implementation is allowed
- * to access memory beyond the limit, but will not cross a page
- * boundary when doing so.
- */
-
-#include <asm/regdef.h>
-
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EX(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda v0, $exception-99b(zero); \
- .previous
-
-
- .set noreorder
- .set noat
- .text
-
- .globl __strlen_user
- .ent __strlen_user
- .frame sp, 0, ra
-
- .align 3
-__strlen_user:
- ldah a1, 32767(zero) # do not use plain strlen_user() for strings
- # that might be almost 2 GB long; you should
- # be using strnlen_user() instead
-
- .globl __strnlen_user
-
- .align 3
-__strnlen_user:
- .prologue 0
-
- EX( ldq_u t0, 0(a0) ) # load first quadword (a0 may be misaligned)
- lda t1, -1(zero)
- insqh t1, a0, t1
- andnot a0, 7, v0
- or t1, t0, t0
- subq a0, 1, a0 # get our +1 for the return
- cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
- subq a1, 7, t2
- subq a0, v0, t0
- bne t1, $found
-
- addq t2, t0, t2
- addq a1, 1, a1
-
- .align 3
-$loop: ble t2, $limit
- EX( ldq t0, 8(v0) )
- subq t2, 8, t2
- addq v0, 8, v0 # addr += 8
- cmpbge zero, t0, t1
- beq t1, $loop
-
-$found: negq t1, t2 # clear all but least set bit
- and t1, t2, t1
-
- and t1, 0xf0, t2 # binary search for that set bit
- and t1, 0xcc, t3
- and t1, 0xaa, t4
- cmovne t2, 4, t2
- cmovne t3, 2, t3
- cmovne t4, 1, t4
- addq t2, t3, t2
- addq v0, t4, v0
- addq v0, t2, v0
- nop # dual issue next two on ev4 and ev5
- subq v0, a0, v0
-$exception:
- ret
-
- .align 3 # currently redundant
-$limit:
- subq a1, t2, v0
- ret
-
- .end __strlen_user
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strncat.S b/ANDROID_3.4.5/arch/alpha/lib/strncat.S
deleted file mode 100644
index a8278163..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strncat.S
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * arch/alpha/lib/strncat.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Append no more than COUNT characters from the null-terminated string SRC
- * to the null-terminated string DST. Always null-terminate the new DST.
- *
- * This differs slightly from the semantics in libc in that we never write
- * past count, whereas libc may write to count+1. This follows the generic
- * implementation in lib/string.c and is, IMHO, more sensible.
- */
-
- .text
-
- .align 3
- .globl strncat
- .ent strncat
-strncat:
- .frame $30, 0, $26
- .prologue 0
-
- mov $16, $0 # set up return value
- beq $18, $zerocount
-
- /* Find the end of the string. */
-
- ldq_u $1, 0($16) # load first quadword ($16 may be misaligned)
- lda $2, -1($31)
- insqh $2, $16, $2
- andnot $16, 7, $16
- or $2, $1, $1
- cmpbge $31, $1, $2 # bits set iff byte == 0
- bne $2, $found
-
-$loop: ldq $1, 8($16)
- addq $16, 8, $16
- cmpbge $31, $1, $2
- beq $2, $loop
-
-$found: negq $2, $3 # clear all but least set bit
- and $2, $3, $2
-
- and $2, 0xf0, $3 # binary search for that set bit
- and $2, 0xcc, $4
- and $2, 0xaa, $5
- cmovne $3, 4, $3
- cmovne $4, 2, $4
- cmovne $5, 1, $5
- addq $3, $4, $3
- addq $16, $5, $16
- addq $16, $3, $16
-
- /* Now do the append. */
-
- bsr $23, __stxncpy
-
- /* Worry about the null termination. */
-
- zapnot $1, $27, $2 # was last byte a null?
- bne $2, 0f
- ret
-
-0: cmplt $27, $24, $2 # did we fill the buffer completely?
- or $2, $18, $2
- bne $2, 2f
-
- and $24, 0x80, $2 # no zero next byte
- bne $2, 1f
-
- /* Here there are bytes left in the current word. Clear one. */
- addq $24, $24, $24 # end-of-count bit <<= 1
-2: zap $1, $24, $1
- stq_u $1, 0($16)
- ret
-
-1: /* Here we must read the next DST word and clear the first byte. */
- ldq_u $1, 8($16)
- zap $1, 1, $1
- stq_u $1, 8($16)
-
-$zerocount:
- ret
-
- .end strncat
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strncpy.S b/ANDROID_3.4.5/arch/alpha/lib/strncpy.S
deleted file mode 100644
index a46f7f3a..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strncpy.S
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * arch/alpha/lib/strncpy.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Copy no more than COUNT bytes of the null-terminated string from
- * SRC to DST. If SRC does not cover all of COUNT, the balance is
- * zeroed.
- *
- * Or, rather, if the kernel cared about that weird ANSI quirk. This
- * version has cropped that bit o' nastiness as well as assuming that
- * __stxncpy is in range of a branch.
- */
-
- .set noat
- .set noreorder
-
- .text
-
- .align 4
- .globl strncpy
- .ent strncpy
-strncpy:
- .frame $30, 0, $26
- .prologue 0
-
- mov $16, $0 # set return value now
- beq $18, $zerolen
- unop
- bsr $23, __stxncpy # do the work of the copy
-
- unop
- bne $18, $multiword # do we have full words left?
- subq $24, 1, $3 # nope
- subq $27, 1, $4
-
- or $3, $24, $3 # clear the bits between the last
- or $4, $27, $4 # written byte and the last byte in COUNT
- andnot $3, $4, $4
- zap $1, $4, $1
-
- stq_u $1, 0($16)
- ret
-
- .align 4
-$multiword:
- subq $27, 1, $2 # clear the final bits in the prev word
- or $2, $27, $2
- zapnot $1, $2, $1
- subq $18, 1, $18
-
- stq_u $1, 0($16)
- addq $16, 8, $16
- unop
- beq $18, 1f
-
- nop
- unop
- nop
- blbc $18, 0f
-
- stq_u $31, 0($16) # zero one word
- subq $18, 1, $18
- addq $16, 8, $16
- beq $18, 1f
-
-0: stq_u $31, 0($16) # zero two words
- subq $18, 2, $18
- stq_u $31, 8($16)
- addq $16, 16, $16
- bne $18, 0b
-
-1: ldq_u $1, 0($16) # clear the leading bits in the final word
- subq $24, 1, $2
- or $2, $24, $2
-
- zap $1, $2, $1
- stq_u $1, 0($16)
-$zerolen:
- ret
-
- .end strncpy
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strncpy_from_user.S b/ANDROID_3.4.5/arch/alpha/lib/strncpy_from_user.S
deleted file mode 100644
index 73ee2116..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strncpy_from_user.S
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * arch/alpha/lib/strncpy_from_user.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Just like strncpy except in the return value:
- *
- * -EFAULT if an exception occurs before the terminator is copied.
- * N if the buffer filled.
- *
- * Otherwise the length of the string is returned.
- */
-
-
-#include <asm/errno.h>
-#include <asm/regdef.h>
-
-
-/* Allow an exception for an insn; exit if we get one. */
-#define EX(x,y...) \
- 99: x,##y; \
- .section __ex_table,"a"; \
- .long 99b - .; \
- lda $31, $exception-99b($0); \
- .previous
-
-
- .set noat
- .set noreorder
- .text
-
- .globl __strncpy_from_user
- .ent __strncpy_from_user
- .frame $30, 0, $26
- .prologue 0
-
- .align 3
-$aligned:
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == the first source word. */
-
- /* Create the 1st output word and detect 0's in the 1st input word. */
- lda t2, -1 # e1 : build a mask against false zero
- mskqh t2, a1, t2 # e0 : detection in the src word
- mskqh t1, a1, t3 # e0 :
- ornot t1, t2, t2 # .. e1 :
- mskql t0, a1, t0 # e0 : assemble the first output word
- cmpbge zero, t2, t8 # .. e1 : bits set iff null found
- or t0, t3, t0 # e0 :
- beq a2, $a_eoc # .. e1 :
- bne t8, $a_eos # .. e1 :
-
- /* On entry to this basic block:
- t0 == a source word not containing a null. */
-
-$a_loop:
- stq_u t0, 0(a0) # e0 :
- addq a0, 8, a0 # .. e1 :
- EX( ldq_u t0, 0(a1) ) # e0 :
- addq a1, 8, a1 # .. e1 :
- subq a2, 1, a2 # e0 :
- cmpbge zero, t0, t8 # .. e1 (stall)
- beq a2, $a_eoc # e1 :
- beq t8, $a_loop # e1 :
-
- /* Take care of the final (partial) word store. At this point
- the end-of-count bit is set in t8 iff it applies.
-
- On entry to this basic block we have:
- t0 == the source word containing the null
- t8 == the cmpbge mask that found it. */
-
-$a_eos:
- negq t8, t12 # e0 : find low bit set
- and t8, t12, t12 # e1 (stall)
-
- /* For the sake of the cache, don't read a destination word
- if we're not going to need it. */
- and t12, 0x80, t6 # e0 :
- bne t6, 1f # .. e1 (zdb)
-
- /* We're doing a partial word store and so need to combine
- our source and original destination words. */
- ldq_u t1, 0(a0) # e0 :
- subq t12, 1, t6 # .. e1 :
- or t12, t6, t8 # e0 :
- unop #
- zapnot t0, t8, t0 # e0 : clear src bytes > null
- zap t1, t8, t1 # .. e1 : clear dst bytes <= null
- or t0, t1, t0 # e1 :
-
-1: stq_u t0, 0(a0)
- br $finish_up
-
- /* Add the end-of-count bit to the eos detection bitmask. */
-$a_eoc:
- or t10, t8, t8
- br $a_eos
-
- /*** The Function Entry Point ***/
- .align 3
-__strncpy_from_user:
- mov a0, v0 # save the string start
- beq a2, $zerolength
-
- /* Are source and destination co-aligned? */
- xor a0, a1, t1 # e0 :
- and a0, 7, t0 # .. e1 : find dest misalignment
- and t1, 7, t1 # e0 :
- addq a2, t0, a2 # .. e1 : bias count by dest misalignment
- subq a2, 1, a2 # e0 :
- and a2, 7, t2 # e1 :
- srl a2, 3, a2 # e0 : a2 = loop counter = (count - 1)/8
- addq zero, 1, t10 # .. e1 :
- sll t10, t2, t10 # e0 : t10 = bitmask of last count byte
- bne t1, $unaligned # .. e1 :
-
- /* We are co-aligned; take care of a partial first word. */
-
- EX( ldq_u t1, 0(a1) ) # e0 : load first src word
- addq a1, 8, a1 # .. e1 :
-
- beq t0, $aligned # avoid loading dest word if not needed
- ldq_u t0, 0(a0) # e0 :
- br $aligned # .. e1 :
-
-
-/* The source and destination are not co-aligned. Align the destination
- and cope. We have to be very careful about not reading too much and
- causing a SEGV. */
-
- .align 3
-$u_head:
- /* We know just enough now to be able to assemble the first
- full source word. We can still find a zero at the end of it
- that prevents us from outputting the whole thing.
-
- On entry to this basic block:
- t0 == the first dest word, unmasked
- t1 == the shifted low bits of the first source word
- t6 == bytemask that is -1 in dest word bytes */
-
- EX( ldq_u t2, 8(a1) ) # e0 : load second src word
- addq a1, 8, a1 # .. e1 :
- mskql t0, a0, t0 # e0 : mask trailing garbage in dst
- extqh t2, a1, t4 # e0 :
- or t1, t4, t1 # e1 : first aligned src word complete
- mskqh t1, a0, t1 # e0 : mask leading garbage in src
- or t0, t1, t0 # e0 : first output word complete
- or t0, t6, t6 # e1 : mask original data for zero test
- cmpbge zero, t6, t8 # e0 :
- beq a2, $u_eocfin # .. e1 :
- bne t8, $u_final # e1 :
-
- lda t6, -1 # e1 : mask out the bits we have
- mskql t6, a1, t6 # e0 : already seen
- stq_u t0, 0(a0) # e0 : store first output word
- or t6, t2, t2 # .. e1 :
- cmpbge zero, t2, t8 # e0 : find nulls in second partial
- addq a0, 8, a0 # .. e1 :
- subq a2, 1, a2 # e0 :
- bne t8, $u_late_head_exit # .. e1 :
-
- /* Finally, we've got all the stupid leading edge cases taken care
- of and we can set up to enter the main loop. */
-
- extql t2, a1, t1 # e0 : position hi-bits of lo word
- EX( ldq_u t2, 8(a1) ) # .. e1 : read next high-order source word
- addq a1, 8, a1 # e0 :
- cmpbge zero, t2, t8 # e1 (stall)
- beq a2, $u_eoc # e1 :
- bne t8, $u_eos # e1 :
-
- /* Unaligned copy main loop. In order to avoid reading too much,
- the loop is structured to detect zeros in aligned source words.
- This has, unfortunately, effectively pulled half of a loop
- iteration out into the head and half into the tail, but it does
- prevent nastiness from accumulating in the very thing we want
- to run as fast as possible.
-
- On entry to this basic block:
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word
-
- We further know that t2 does not contain a null terminator. */
-
- .align 3
-$u_loop:
- extqh t2, a1, t0 # e0 : extract high bits for current word
- addq a1, 8, a1 # .. e1 :
- extql t2, a1, t3 # e0 : extract low bits for next time
- addq a0, 8, a0 # .. e1 :
- or t0, t1, t0 # e0 : current dst word now complete
- EX( ldq_u t2, 0(a1) ) # .. e1 : load high word for next time
- stq_u t0, -8(a0) # e0 : save the current word
- mov t3, t1 # .. e1 :
- subq a2, 1, a2 # e0 :
- cmpbge zero, t2, t8 # .. e1 : test new word for eos
- beq a2, $u_eoc # e1 :
- beq t8, $u_loop # e1 :
-
- /* We've found a zero somewhere in the source word we just read.
- If it resides in the lower half, we have one (probably partial)
- word to write out, and if it resides in the upper half, we
- have one full and one partial word left to write out.
-
- On entry to this basic block:
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word. */
-$u_eos:
- extqh t2, a1, t0 # e0 :
- or t0, t1, t0 # e1 : first (partial) source word complete
-
- cmpbge zero, t0, t8 # e0 : is the null in this first bit?
- bne t8, $u_final # .. e1 (zdb)
-
- stq_u t0, 0(a0) # e0 : the null was in the high-order bits
- addq a0, 8, a0 # .. e1 :
- subq a2, 1, a2 # e1 :
-
-$u_late_head_exit:
- extql t2, a1, t0 # .. e0 :
- cmpbge zero, t0, t8 # e0 :
- or t8, t10, t6 # e1 :
- cmoveq a2, t6, t8 # e0 :
- nop # .. e1 :
-
- /* Take care of a final (probably partial) result word.
- On entry to this basic block:
- t0 == assembled source word
- t8 == cmpbge mask that found the null. */
-$u_final:
- negq t8, t6 # e0 : isolate low bit set
- and t6, t8, t12 # e1 :
-
- and t12, 0x80, t6 # e0 : avoid dest word load if we can
- bne t6, 1f # .. e1 (zdb)
-
- ldq_u t1, 0(a0) # e0 :
- subq t12, 1, t6 # .. e1 :
- or t6, t12, t8 # e0 :
- zapnot t0, t8, t0 # .. e1 : kill source bytes > null
- zap t1, t8, t1 # e0 : kill dest bytes <= null
- or t0, t1, t0 # e1 :
-
-1: stq_u t0, 0(a0) # e0 :
- br $finish_up
-
-$u_eoc: # end-of-count
- extqh t2, a1, t0
- or t0, t1, t0
- cmpbge zero, t0, t8
-
-$u_eocfin: # end-of-count, final word
- or t10, t8, t8
- br $u_final
-
- /* Unaligned copy entry point. */
- .align 3
-$unaligned:
-
- EX( ldq_u t1, 0(a1) ) # e0 : load first source word
-
- and a0, 7, t4 # .. e1 : find dest misalignment
- and a1, 7, t5 # e0 : find src misalignment
-
- /* Conditionally load the first destination word and a bytemask
- with 0xff indicating that the destination byte is sacrosanct. */
-
- mov zero, t0 # .. e1 :
- mov zero, t6 # e0 :
- beq t4, 1f # .. e1 :
- ldq_u t0, 0(a0) # e0 :
- lda t6, -1 # .. e1 :
- mskql t6, a0, t6 # e0 :
-1:
- subq a1, t4, a1 # .. e1 : sub dest misalignment from src addr
-
- /* If source misalignment is larger than dest misalignment, we need
- extra startup checks to avoid SEGV. */
-
- cmplt t4, t5, t12 # e1 :
- extql t1, a1, t1 # .. e0 : shift src into place
- lda t2, -1 # e0 : for creating masks later
- beq t12, $u_head # e1 :
-
- mskqh t2, t5, t2 # e0 : begin src byte validity mask
- cmpbge zero, t1, t8 # .. e1 : is there a zero?
- extql t2, a1, t2 # e0 :
- or t8, t10, t5 # .. e1 : test for end-of-count too
- cmpbge zero, t2, t3 # e0 :
- cmoveq a2, t5, t8 # .. e1 :
- andnot t8, t3, t8 # e0 :
- beq t8, $u_head # .. e1 (zdb)
-
- /* At this point we've found a zero in the first partial word of
- the source. We need to isolate the valid source data and mask
- it into the original destination data. (Incidentally, we know
- that we'll need at least one byte of that original dest word.) */
-
- ldq_u t0, 0(a0) # e0 :
- negq t8, t6 # .. e1 : build bitmask of bytes <= zero
- mskqh t1, t4, t1 # e0 :
- and t6, t8, t12 # .. e1 :
- subq t12, 1, t6 # e0 :
- or t6, t12, t8 # e1 :
-
- zapnot t2, t8, t2 # e0 : prepare source word; mirror changes
- zapnot t1, t8, t1 # .. e1 : to source validity mask
-
- andnot t0, t2, t0 # e0 : zero place for source to reside
- or t0, t1, t0 # e1 : and put it there
- stq_u t0, 0(a0) # e0 :
-
-$finish_up:
- zapnot t0, t12, t4 # was last byte written null?
- cmovne t4, 1, t4
-
- and t12, 0xf0, t3 # binary search for the address of the
- and t12, 0xcc, t2 # last byte written
- and t12, 0xaa, t1
- bic a0, 7, t0
- cmovne t3, 4, t3
- cmovne t2, 2, t2
- cmovne t1, 1, t1
- addq t0, t3, t0
- addq t1, t2, t1
- addq t0, t1, t0
- addq t0, t4, t0 # add one if we filled the buffer
-
- subq t0, v0, v0 # find string length
- ret
-
-$zerolength:
- clr v0
-$exception:
- ret
-
- .end __strncpy_from_user
diff --git a/ANDROID_3.4.5/arch/alpha/lib/strrchr.S b/ANDROID_3.4.5/arch/alpha/lib/strrchr.S
deleted file mode 100644
index 1970dc07..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/strrchr.S
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * arch/alpha/lib/strrchr.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Return the address of the last occurrence of a given character
- * within a null-terminated string, or null if it is not found.
- */
-
-#include <asm/regdef.h>
-
- .set noreorder
- .set noat
-
- .align 3
- .ent strrchr
- .globl strrchr
-strrchr:
- .frame sp, 0, ra
- .prologue 0
-
- zapnot a1, 1, a1 # e0 : zero extend our test character
- mov zero, t6 # .. e1 : t6 is last match aligned addr
- sll a1, 8, t5 # e0 : replicate our test character
- mov zero, t8 # .. e1 : t8 is last match byte compare mask
- or t5, a1, a1 # e0 :
- ldq_u t0, 0(a0) # .. e1 : load first quadword
- sll a1, 16, t5 # e0 :
- andnot a0, 7, v0 # .. e1 : align source addr
- or t5, a1, a1 # e0 :
- lda t4, -1 # .. e1 : build garbage mask
- sll a1, 32, t5 # e0 :
- cmpbge zero, t0, t1 # .. e1 : bits set iff byte == zero
- mskqh t4, a0, t4 # e0 :
- or t5, a1, a1 # .. e1 : character replication complete
- xor t0, a1, t2 # e0 : make bytes == c zero
- cmpbge zero, t4, t4 # .. e1 : bits set iff byte is garbage
- cmpbge zero, t2, t3 # e0 : bits set iff byte == c
- andnot t1, t4, t1 # .. e1 : clear garbage from null test
- andnot t3, t4, t3 # e0 : clear garbage from char test
- bne t1, $eos # .. e1 : did we already hit the terminator?
-
- /* Character search main loop */
-$loop:
- ldq t0, 8(v0) # e0 : load next quadword
- cmovne t3, v0, t6 # .. e1 : save previous comparisons match
- cmovne t3, t3, t8 # e0 :
- addq v0, 8, v0 # .. e1 :
- xor t0, a1, t2 # e0 :
- cmpbge zero, t0, t1 # .. e1 : bits set iff byte == zero
- cmpbge zero, t2, t3 # e0 : bits set iff byte == c
- beq t1, $loop # .. e1 : if we havnt seen a null, loop
-
- /* Mask out character matches after terminator */
-$eos:
- negq t1, t4 # e0 : isolate first null byte match
- and t1, t4, t4 # e1 :
- subq t4, 1, t5 # e0 : build a mask of the bytes up to...
- or t4, t5, t4 # e1 : ... and including the null
-
- and t3, t4, t3 # e0 : mask out char matches after null
- cmovne t3, t3, t8 # .. e1 : save it, if match found
- cmovne t3, v0, t6 # e0 :
-
- /* Locate the address of the last matched character */
-
- /* Retain the early exit for the ev4 -- the ev5 mispredict penalty
- is 5 cycles -- the same as just falling through. */
- beq t8, $retnull # .. e1 :
-
- and t8, 0xf0, t2 # e0 : binary search for the high bit set
- cmovne t2, t2, t8 # .. e1 (zdb)
- cmovne t2, 4, t2 # e0 :
- and t8, 0xcc, t1 # .. e1 :
- cmovne t1, t1, t8 # e0 :
- cmovne t1, 2, t1 # .. e1 :
- and t8, 0xaa, t0 # e0 :
- cmovne t0, 1, t0 # .. e1 (zdb)
- addq t2, t1, t1 # e0 :
- addq t6, t0, v0 # .. e1 : add our aligned base ptr to the mix
- addq v0, t1, v0 # e0 :
- ret # .. e1 :
-
-$retnull:
- mov zero, v0 # e0 :
- ret # .. e1 :
-
- .end strrchr
diff --git a/ANDROID_3.4.5/arch/alpha/lib/stxcpy.S b/ANDROID_3.4.5/arch/alpha/lib/stxcpy.S
deleted file mode 100644
index 2a8d51bf..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/stxcpy.S
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * arch/alpha/lib/stxcpy.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Copy a null-terminated string from SRC to DST.
- *
- * This is an internal routine used by strcpy, stpcpy, and strcat.
- * As such, it uses special linkage conventions to make implementation
- * of these public functions more efficient.
- *
- * On input:
- * t9 = return address
- * a0 = DST
- * a1 = SRC
- *
- * On output:
- * t12 = bitmask (with one bit set) indicating the last byte written
- * a0 = unaligned address of the last *word* written
- *
- * Furthermore, v0, a3-a5, t11, and t12 are untouched.
- */
-
-#include <asm/regdef.h>
-
- .set noat
- .set noreorder
-
- .text
-
-/* There is a problem with either gdb (as of 4.16) or gas (as of 2.7) that
- doesn't like putting the entry point for a procedure somewhere in the
- middle of the procedure descriptor. Work around this by putting the
- aligned copy in its own procedure descriptor */
-
- .ent stxcpy_aligned
- .align 3
-stxcpy_aligned:
- .frame sp, 0, t9
- .prologue 0
-
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == the first source word. */
-
- /* Create the 1st output word and detect 0's in the 1st input word. */
- lda t2, -1 # e1 : build a mask against false zero
- mskqh t2, a1, t2 # e0 : detection in the src word
- mskqh t1, a1, t3 # e0 :
- ornot t1, t2, t2 # .. e1 :
- mskql t0, a1, t0 # e0 : assemble the first output word
- cmpbge zero, t2, t8 # .. e1 : bits set iff null found
- or t0, t3, t1 # e0 :
- bne t8, $a_eos # .. e1 :
-
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == a source word not containing a null. */
-
-$a_loop:
- stq_u t1, 0(a0) # e0 :
- addq a0, 8, a0 # .. e1 :
- ldq_u t1, 0(a1) # e0 :
- addq a1, 8, a1 # .. e1 :
- cmpbge zero, t1, t8 # e0 (stall)
- beq t8, $a_loop # .. e1 (zdb)
-
- /* Take care of the final (partial) word store.
- On entry to this basic block we have:
- t1 == the source word containing the null
- t8 == the cmpbge mask that found it. */
-$a_eos:
- negq t8, t6 # e0 : find low bit set
- and t8, t6, t12 # e1 (stall)
-
- /* For the sake of the cache, don't read a destination word
- if we're not going to need it. */
- and t12, 0x80, t6 # e0 :
- bne t6, 1f # .. e1 (zdb)
-
- /* We're doing a partial word store and so need to combine
- our source and original destination words. */
- ldq_u t0, 0(a0) # e0 :
- subq t12, 1, t6 # .. e1 :
- zapnot t1, t6, t1 # e0 : clear src bytes >= null
- or t12, t6, t8 # .. e1 :
- zap t0, t8, t0 # e0 : clear dst bytes <= null
- or t0, t1, t1 # e1 :
-
-1: stq_u t1, 0(a0) # e0 :
- ret (t9) # .. e1 :
-
- .end stxcpy_aligned
-
- .align 3
- .ent __stxcpy
- .globl __stxcpy
-__stxcpy:
- .frame sp, 0, t9
- .prologue 0
-
- /* Are source and destination co-aligned? */
- xor a0, a1, t0 # e0 :
- unop # :
- and t0, 7, t0 # e0 :
- bne t0, $unaligned # .. e1 :
-
- /* We are co-aligned; take care of a partial first word. */
- ldq_u t1, 0(a1) # e0 : load first src word
- and a0, 7, t0 # .. e1 : take care not to load a word ...
- addq a1, 8, a1 # e0 :
- beq t0, stxcpy_aligned # .. e1 : ... if we wont need it
- ldq_u t0, 0(a0) # e0 :
- br stxcpy_aligned # .. e1 :
-
-
-/* The source and destination are not co-aligned. Align the destination
- and cope. We have to be very careful about not reading too much and
- causing a SEGV. */
-
- .align 3
-$u_head:
- /* We know just enough now to be able to assemble the first
- full source word. We can still find a zero at the end of it
- that prevents us from outputting the whole thing.
-
- On entry to this basic block:
- t0 == the first dest word, for masking back in, if needed else 0
- t1 == the low bits of the first source word
- t6 == bytemask that is -1 in dest word bytes */
-
- ldq_u t2, 8(a1) # e0 :
- addq a1, 8, a1 # .. e1 :
-
- extql t1, a1, t1 # e0 :
- extqh t2, a1, t4 # e0 :
- mskql t0, a0, t0 # e0 :
- or t1, t4, t1 # .. e1 :
- mskqh t1, a0, t1 # e0 :
- or t0, t1, t1 # e1 :
-
- or t1, t6, t6 # e0 :
- cmpbge zero, t6, t8 # .. e1 :
- lda t6, -1 # e0 : for masking just below
- bne t8, $u_final # .. e1 :
-
- mskql t6, a1, t6 # e0 : mask out the bits we have
- or t6, t2, t2 # e1 : already extracted before
- cmpbge zero, t2, t8 # e0 : testing eos
- bne t8, $u_late_head_exit # .. e1 (zdb)
-
- /* Finally, we've got all the stupid leading edge cases taken care
- of and we can set up to enter the main loop. */
-
- stq_u t1, 0(a0) # e0 : store first output word
- addq a0, 8, a0 # .. e1 :
- extql t2, a1, t0 # e0 : position ho-bits of lo word
- ldq_u t2, 8(a1) # .. e1 : read next high-order source word
- addq a1, 8, a1 # e0 :
- cmpbge zero, t2, t8 # .. e1 :
- nop # e0 :
- bne t8, $u_eos # .. e1 :
-
- /* Unaligned copy main loop. In order to avoid reading too much,
- the loop is structured to detect zeros in aligned source words.
- This has, unfortunately, effectively pulled half of a loop
- iteration out into the head and half into the tail, but it does
- prevent nastiness from accumulating in the very thing we want
- to run as fast as possible.
-
- On entry to this basic block:
- t0 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word
-
- We further know that t2 does not contain a null terminator. */
-
- .align 3
-$u_loop:
- extqh t2, a1, t1 # e0 : extract high bits for current word
- addq a1, 8, a1 # .. e1 :
- extql t2, a1, t3 # e0 : extract low bits for next time
- addq a0, 8, a0 # .. e1 :
- or t0, t1, t1 # e0 : current dst word now complete
- ldq_u t2, 0(a1) # .. e1 : load high word for next time
- stq_u t1, -8(a0) # e0 : save the current word
- mov t3, t0 # .. e1 :
- cmpbge zero, t2, t8 # e0 : test new word for eos
- beq t8, $u_loop # .. e1 :
-
- /* We've found a zero somewhere in the source word we just read.
- If it resides in the lower half, we have one (probably partial)
- word to write out, and if it resides in the upper half, we
- have one full and one partial word left to write out.
-
- On entry to this basic block:
- t0 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word. */
-$u_eos:
- extqh t2, a1, t1 # e0 :
- or t0, t1, t1 # e1 : first (partial) source word complete
-
- cmpbge zero, t1, t8 # e0 : is the null in this first bit?
- bne t8, $u_final # .. e1 (zdb)
-
-$u_late_head_exit:
- stq_u t1, 0(a0) # e0 : the null was in the high-order bits
- addq a0, 8, a0 # .. e1 :
- extql t2, a1, t1 # e0 :
- cmpbge zero, t1, t8 # .. e1 :
-
- /* Take care of a final (probably partial) result word.
- On entry to this basic block:
- t1 == assembled source word
- t8 == cmpbge mask that found the null. */
-$u_final:
- negq t8, t6 # e0 : isolate low bit set
- and t6, t8, t12 # e1 :
-
- and t12, 0x80, t6 # e0 : avoid dest word load if we can
- bne t6, 1f # .. e1 (zdb)
-
- ldq_u t0, 0(a0) # e0 :
- subq t12, 1, t6 # .. e1 :
- or t6, t12, t8 # e0 :
- zapnot t1, t6, t1 # .. e1 : kill source bytes >= null
- zap t0, t8, t0 # e0 : kill dest bytes <= null
- or t0, t1, t1 # e1 :
-
-1: stq_u t1, 0(a0) # e0 :
- ret (t9) # .. e1 :
-
- /* Unaligned copy entry point. */
- .align 3
-$unaligned:
-
- ldq_u t1, 0(a1) # e0 : load first source word
-
- and a0, 7, t4 # .. e1 : find dest misalignment
- and a1, 7, t5 # e0 : find src misalignment
-
- /* Conditionally load the first destination word and a bytemask
- with 0xff indicating that the destination byte is sacrosanct. */
-
- mov zero, t0 # .. e1 :
- mov zero, t6 # e0 :
- beq t4, 1f # .. e1 :
- ldq_u t0, 0(a0) # e0 :
- lda t6, -1 # .. e1 :
- mskql t6, a0, t6 # e0 :
-1:
- subq a1, t4, a1 # .. e1 : sub dest misalignment from src addr
-
- /* If source misalignment is larger than dest misalignment, we need
- extra startup checks to avoid SEGV. */
-
- cmplt t4, t5, t12 # e0 :
- beq t12, $u_head # .. e1 (zdb)
-
- lda t2, -1 # e1 : mask out leading garbage in source
- mskqh t2, t5, t2 # e0 :
- nop # e0 :
- ornot t1, t2, t3 # .. e1 :
- cmpbge zero, t3, t8 # e0 : is there a zero?
- beq t8, $u_head # .. e1 (zdb)
-
- /* At this point we've found a zero in the first partial word of
- the source. We need to isolate the valid source data and mask
- it into the original destination data. (Incidentally, we know
- that we'll need at least one byte of that original dest word.) */
-
- ldq_u t0, 0(a0) # e0 :
-
- negq t8, t6 # .. e1 : build bitmask of bytes <= zero
- and t6, t8, t12 # e0 :
- and a1, 7, t5 # .. e1 :
- subq t12, 1, t6 # e0 :
- or t6, t12, t8 # e1 :
- srl t12, t5, t12 # e0 : adjust final null return value
-
- zapnot t2, t8, t2 # .. e1 : prepare source word; mirror changes
- and t1, t2, t1 # e1 : to source validity mask
- extql t2, a1, t2 # .. e0 :
- extql t1, a1, t1 # e0 :
-
- andnot t0, t2, t0 # .. e1 : zero place for source to reside
- or t0, t1, t1 # e1 : and put it there
- stq_u t1, 0(a0) # .. e0 :
- ret (t9) # e1 :
-
- .end __stxcpy
diff --git a/ANDROID_3.4.5/arch/alpha/lib/stxncpy.S b/ANDROID_3.4.5/arch/alpha/lib/stxncpy.S
deleted file mode 100644
index 3dece252..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/stxncpy.S
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * arch/alpha/lib/stxncpy.S
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * Copy no more than COUNT bytes of the null-terminated string from
- * SRC to DST.
- *
- * This is an internal routine used by strncpy, stpncpy, and strncat.
- * As such, it uses special linkage conventions to make implementation
- * of these public functions more efficient.
- *
- * On input:
- * t9 = return address
- * a0 = DST
- * a1 = SRC
- * a2 = COUNT
- *
- * Furthermore, COUNT may not be zero.
- *
- * On output:
- * t0 = last word written
- * t10 = bitmask (with one bit set) indicating the byte position of
- * the end of the range specified by COUNT
- * t12 = bitmask (with one bit set) indicating the last byte written
- * a0 = unaligned address of the last *word* written
- * a2 = the number of full words left in COUNT
- *
- * Furthermore, v0, a3-a5, t11, and $at are untouched.
- */
-
-#include <asm/regdef.h>
-
- .set noat
- .set noreorder
-
- .text
-
-/* There is a problem with either gdb (as of 4.16) or gas (as of 2.7) that
- doesn't like putting the entry point for a procedure somewhere in the
- middle of the procedure descriptor. Work around this by putting the
- aligned copy in its own procedure descriptor */
-
- .ent stxncpy_aligned
- .align 3
-stxncpy_aligned:
- .frame sp, 0, t9, 0
- .prologue 0
-
- /* On entry to this basic block:
- t0 == the first destination word for masking back in
- t1 == the first source word. */
-
- /* Create the 1st output word and detect 0's in the 1st input word. */
- lda t2, -1 # e1 : build a mask against false zero
- mskqh t2, a1, t2 # e0 : detection in the src word
- mskqh t1, a1, t3 # e0 :
- ornot t1, t2, t2 # .. e1 :
- mskql t0, a1, t0 # e0 : assemble the first output word
- cmpbge zero, t2, t8 # .. e1 : bits set iff null found
- or t0, t3, t0 # e0 :
- beq a2, $a_eoc # .. e1 :
- bne t8, $a_eos # .. e1 :
-
- /* On entry to this basic block:
- t0 == a source word not containing a null. */
-
-$a_loop:
- stq_u t0, 0(a0) # e0 :
- addq a0, 8, a0 # .. e1 :
- ldq_u t0, 0(a1) # e0 :
- addq a1, 8, a1 # .. e1 :
- subq a2, 1, a2 # e0 :
- cmpbge zero, t0, t8 # .. e1 (stall)
- beq a2, $a_eoc # e1 :
- beq t8, $a_loop # e1 :
-
- /* Take care of the final (partial) word store. At this point
- the end-of-count bit is set in t8 iff it applies.
-
- On entry to this basic block we have:
- t0 == the source word containing the null
- t8 == the cmpbge mask that found it. */
-
-$a_eos:
- negq t8, t12 # e0 : find low bit set
- and t8, t12, t12 # e1 (stall)
-
- /* For the sake of the cache, don't read a destination word
- if we're not going to need it. */
- and t12, 0x80, t6 # e0 :
- bne t6, 1f # .. e1 (zdb)
-
- /* We're doing a partial word store and so need to combine
- our source and original destination words. */
- ldq_u t1, 0(a0) # e0 :
- subq t12, 1, t6 # .. e1 :
- or t12, t6, t8 # e0 :
- unop #
- zapnot t0, t8, t0 # e0 : clear src bytes > null
- zap t1, t8, t1 # .. e1 : clear dst bytes <= null
- or t0, t1, t0 # e1 :
-
-1: stq_u t0, 0(a0) # e0 :
- ret (t9) # e1 :
-
- /* Add the end-of-count bit to the eos detection bitmask. */
-$a_eoc:
- or t10, t8, t8
- br $a_eos
-
- .end stxncpy_aligned
-
- .align 3
- .ent __stxncpy
- .globl __stxncpy
-__stxncpy:
- .frame sp, 0, t9, 0
- .prologue 0
-
- /* Are source and destination co-aligned? */
- xor a0, a1, t1 # e0 :
- and a0, 7, t0 # .. e1 : find dest misalignment
- and t1, 7, t1 # e0 :
- addq a2, t0, a2 # .. e1 : bias count by dest misalignment
- subq a2, 1, a2 # e0 :
- and a2, 7, t2 # e1 :
- srl a2, 3, a2 # e0 : a2 = loop counter = (count - 1)/8
- addq zero, 1, t10 # .. e1 :
- sll t10, t2, t10 # e0 : t10 = bitmask of last count byte
- bne t1, $unaligned # .. e1 :
-
- /* We are co-aligned; take care of a partial first word. */
-
- ldq_u t1, 0(a1) # e0 : load first src word
- addq a1, 8, a1 # .. e1 :
-
- beq t0, stxncpy_aligned # avoid loading dest word if not needed
- ldq_u t0, 0(a0) # e0 :
- br stxncpy_aligned # .. e1 :
-
-
-/* The source and destination are not co-aligned. Align the destination
- and cope. We have to be very careful about not reading too much and
- causing a SEGV. */
-
- .align 3
-$u_head:
- /* We know just enough now to be able to assemble the first
- full source word. We can still find a zero at the end of it
- that prevents us from outputting the whole thing.
-
- On entry to this basic block:
- t0 == the first dest word, unmasked
- t1 == the shifted low bits of the first source word
- t6 == bytemask that is -1 in dest word bytes */
-
- ldq_u t2, 8(a1) # e0 : load second src word
- addq a1, 8, a1 # .. e1 :
- mskql t0, a0, t0 # e0 : mask trailing garbage in dst
- extqh t2, a1, t4 # e0 :
- or t1, t4, t1 # e1 : first aligned src word complete
- mskqh t1, a0, t1 # e0 : mask leading garbage in src
- or t0, t1, t0 # e0 : first output word complete
- or t0, t6, t6 # e1 : mask original data for zero test
- cmpbge zero, t6, t8 # e0 :
- beq a2, $u_eocfin # .. e1 :
- lda t6, -1 # e0 :
- bne t8, $u_final # .. e1 :
-
- mskql t6, a1, t6 # e0 : mask out bits already seen
- nop # .. e1 :
- stq_u t0, 0(a0) # e0 : store first output word
- or t6, t2, t2 # .. e1 :
- cmpbge zero, t2, t8 # e0 : find nulls in second partial
- addq a0, 8, a0 # .. e1 :
- subq a2, 1, a2 # e0 :
- bne t8, $u_late_head_exit # .. e1 :
-
- /* Finally, we've got all the stupid leading edge cases taken care
- of and we can set up to enter the main loop. */
-
- extql t2, a1, t1 # e0 : position hi-bits of lo word
- beq a2, $u_eoc # .. e1 :
- ldq_u t2, 8(a1) # e0 : read next high-order source word
- addq a1, 8, a1 # .. e1 :
- extqh t2, a1, t0 # e0 : position lo-bits of hi word (stall)
- cmpbge zero, t2, t8 # .. e1 :
- nop # e0 :
- bne t8, $u_eos # .. e1 :
-
- /* Unaligned copy main loop. In order to avoid reading too much,
- the loop is structured to detect zeros in aligned source words.
- This has, unfortunately, effectively pulled half of a loop
- iteration out into the head and half into the tail, but it does
- prevent nastiness from accumulating in the very thing we want
- to run as fast as possible.
-
- On entry to this basic block:
- t0 == the shifted low-order bits from the current source word
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word
-
- We further know that t2 does not contain a null terminator. */
-
- .align 3
-$u_loop:
- or t0, t1, t0 # e0 : current dst word now complete
- subq a2, 1, a2 # .. e1 : decrement word count
- stq_u t0, 0(a0) # e0 : save the current word
- addq a0, 8, a0 # .. e1 :
- extql t2, a1, t1 # e0 : extract high bits for next time
- beq a2, $u_eoc # .. e1 :
- ldq_u t2, 8(a1) # e0 : load high word for next time
- addq a1, 8, a1 # .. e1 :
- nop # e0 :
- cmpbge zero, t2, t8 # e1 : test new word for eos (stall)
- extqh t2, a1, t0 # e0 : extract low bits for current word
- beq t8, $u_loop # .. e1 :
-
- /* We've found a zero somewhere in the source word we just read.
- If it resides in the lower half, we have one (probably partial)
- word to write out, and if it resides in the upper half, we
- have one full and one partial word left to write out.
-
- On entry to this basic block:
- t0 == the shifted low-order bits from the current source word
- t1 == the shifted high-order bits from the previous source word
- t2 == the unshifted current source word. */
-$u_eos:
- or t0, t1, t0 # e0 : first (partial) source word complete
- nop # .. e1 :
- cmpbge zero, t0, t8 # e0 : is the null in this first bit?
- bne t8, $u_final # .. e1 (zdb)
-
- stq_u t0, 0(a0) # e0 : the null was in the high-order bits
- addq a0, 8, a0 # .. e1 :
- subq a2, 1, a2 # e1 :
-
-$u_late_head_exit:
- extql t2, a1, t0 # .. e0 :
- cmpbge zero, t0, t8 # e0 :
- or t8, t10, t6 # e1 :
- cmoveq a2, t6, t8 # e0 :
- nop # .. e1 :
-
- /* Take care of a final (probably partial) result word.
- On entry to this basic block:
- t0 == assembled source word
- t8 == cmpbge mask that found the null. */
-$u_final:
- negq t8, t6 # e0 : isolate low bit set
- and t6, t8, t12 # e1 :
-
- and t12, 0x80, t6 # e0 : avoid dest word load if we can
- bne t6, 1f # .. e1 (zdb)
-
- ldq_u t1, 0(a0) # e0 :
- subq t12, 1, t6 # .. e1 :
- or t6, t12, t8 # e0 :
- zapnot t0, t8, t0 # .. e1 : kill source bytes > null
- zap t1, t8, t1 # e0 : kill dest bytes <= null
- or t0, t1, t0 # e1 :
-
-1: stq_u t0, 0(a0) # e0 :
- ret (t9) # .. e1 :
-
- /* Got to end-of-count before end of string.
- On entry to this basic block:
- t1 == the shifted high-order bits from the previous source word */
-$u_eoc:
- and a1, 7, t6 # e1 :
- sll t10, t6, t6 # e0 :
- and t6, 0xff, t6 # e0 :
- bne t6, 1f # .. e1 :
-
- ldq_u t2, 8(a1) # e0 : load final src word
- nop # .. e1 :
- extqh t2, a1, t0 # e0 : extract low bits for last word
- or t1, t0, t1 # e1 :
-
-1: cmpbge zero, t1, t8
- mov t1, t0
-
-$u_eocfin: # end-of-count, final word
- or t10, t8, t8
- br $u_final
-
- /* Unaligned copy entry point. */
- .align 3
-$unaligned:
-
- ldq_u t1, 0(a1) # e0 : load first source word
-
- and a0, 7, t4 # .. e1 : find dest misalignment
- and a1, 7, t5 # e0 : find src misalignment
-
- /* Conditionally load the first destination word and a bytemask
- with 0xff indicating that the destination byte is sacrosanct. */
-
- mov zero, t0 # .. e1 :
- mov zero, t6 # e0 :
- beq t4, 1f # .. e1 :
- ldq_u t0, 0(a0) # e0 :
- lda t6, -1 # .. e1 :
- mskql t6, a0, t6 # e0 :
- subq a1, t4, a1 # .. e1 : sub dest misalignment from src addr
-
- /* If source misalignment is larger than dest misalignment, we need
- extra startup checks to avoid SEGV. */
-
-1: cmplt t4, t5, t12 # e1 :
- extql t1, a1, t1 # .. e0 : shift src into place
- lda t2, -1 # e0 : for creating masks later
- beq t12, $u_head # .. e1 :
-
- extql t2, a1, t2 # e0 :
- cmpbge zero, t1, t8 # .. e1 : is there a zero?
- andnot t2, t6, t2 # e0 : dest mask for a single word copy
- or t8, t10, t5 # .. e1 : test for end-of-count too
- cmpbge zero, t2, t3 # e0 :
- cmoveq a2, t5, t8 # .. e1 :
- andnot t8, t3, t8 # e0 :
- beq t8, $u_head # .. e1 (zdb)
-
- /* At this point we've found a zero in the first partial word of
- the source. We need to isolate the valid source data and mask
- it into the original destination data. (Incidentally, we know
- that we'll need at least one byte of that original dest word.) */
-
- ldq_u t0, 0(a0) # e0 :
- negq t8, t6 # .. e1 : build bitmask of bytes <= zero
- mskqh t1, t4, t1 # e0 :
- and t6, t8, t12 # .. e1 :
- subq t12, 1, t6 # e0 :
- or t6, t12, t8 # e1 :
-
- zapnot t2, t8, t2 # e0 : prepare source word; mirror changes
- zapnot t1, t8, t1 # .. e1 : to source validity mask
-
- andnot t0, t2, t0 # e0 : zero place for source to reside
- or t0, t1, t0 # e1 : and put it there
- stq_u t0, 0(a0) # e0 :
- ret (t9) # .. e1 :
-
- .end __stxncpy
diff --git a/ANDROID_3.4.5/arch/alpha/lib/udelay.c b/ANDROID_3.4.5/arch/alpha/lib/udelay.c
deleted file mode 100644
index 69d52aa3..00000000
--- a/ANDROID_3.4.5/arch/alpha/lib/udelay.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 1993, 2000 Linus Torvalds
- *
- * Delay routines, using a pre-computed "loops_per_jiffy" value.
- */
-
-#include <linux/module.h>
-#include <linux/sched.h> /* for udelay's use of smp_processor_id */
-#include <asm/param.h>
-#include <asm/smp.h>
-#include <linux/delay.h>
-
-/*
- * Use only for very small delays (< 1 msec).
- *
- * The active part of our cycle counter is only 32-bits wide, and
- * we're treating the difference between two marks as signed. On
- * a 1GHz box, that's about 2 seconds.
- */
-
-void
-__delay(int loops)
-{
- int tmp;
- __asm__ __volatile__(
- " rpcc %0\n"
- " addl %1,%0,%1\n"
- "1: rpcc %0\n"
- " subl %1,%0,%0\n"
- " bgt %0,1b"
- : "=&r" (tmp), "=r" (loops) : "1"(loops));
-}
-
-#ifdef CONFIG_SMP
-#define LPJ cpu_data[smp_processor_id()].loops_per_jiffy
-#else
-#define LPJ loops_per_jiffy
-#endif
-
-void
-udelay(unsigned long usecs)
-{
- usecs *= (((unsigned long)HZ << 32) / 1000000) * LPJ;
- __delay((long)usecs >> 32);
-}
-EXPORT_SYMBOL(udelay);
-
-void
-ndelay(unsigned long nsecs)
-{
- nsecs *= (((unsigned long)HZ << 32) / 1000000000) * LPJ;
- __delay((long)nsecs >> 32);
-}
-EXPORT_SYMBOL(ndelay);