mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-03 18:31:04 +00:00
5f72b00591
This patch add two abi combinations support for C-SKY ABIV2: soft-float little endian, hard float little endian. C-SKY ABI manual and architecture user guide are available from: https://github.com/c-sky/csky-doc * config.h.in (CSKYABI, CSKY_HARD_FLOAT): New Define. * scripts/build-many-glibcs.py: Add C-SKY targets. * sysdeps/csky/Implies: New file. * sysdeps/csky/Makefile: Likewise. * sysdeps/csky/abiv2/__longjmp.S: Likewise. * sysdeps/csky/abiv2/csky-mcount.S: Likewise. * sysdeps/csky/abiv2/dl-trampoline.S: Likewise. * sysdeps/csky/abiv2/memcmp.S: Likewise. * sysdeps/csky/abiv2/memcpy.S: Likewise. * sysdeps/csky/abiv2/memmove.S: Likewise. * sysdeps/csky/abiv2/memset.S: Likewise. * sysdeps/csky/abiv2/setjmp.S: Likewise. * sysdeps/csky/abiv2/start.S: Likewise. * sysdeps/csky/abiv2/strcmp.S: Likewise. * sysdeps/csky/abiv2/strcpy.S: Likewise. * sysdeps/csky/abiv2/strlen.S: Likewise. * sysdeps/csky/abiv2/tls-macros.h: Likewise. * sysdeps/csky/abort-instr.h: Likewise. * sysdeps/csky/atomic-machine.h: Likewise. * sysdeps/csky/bits/endian.h: Likewise. * sysdeps/csky/bits/fenv.h: Likewise. * sysdeps/csky/bits/link.h: Likewise. * sysdeps/csky/bits/setjmp.h: Likewise. * sysdeps/csky/bsd-_setjmp.S: Likewise. * sysdeps/csky/bsd-setjmp.S: Likewise. * sysdeps/csky/configure: Likewise. * sysdeps/csky/configure.ac: Likewise. * sysdeps/csky/dl-machine.h: Likewise. * sysdeps/csky/dl-procinfo.c: Likewise. * sysdeps/csky/dl-procinfo.h: Likewise. * sysdeps/csky/dl-sysdep.h: Likewise. * sysdeps/csky/dl-tls.h: Likewise. * sysdeps/csky/fpu/fclrexcpt.c: Likewise. * sysdeps/csky/fpu/fedisblxcpt.c: Likewise. * sysdeps/csky/fpu/feenablxcpt.c: Likewise. * sysdeps/csky/fpu/fegetenv.c: Likewise. * sysdeps/csky/fpu/fegetexcept.c: Likewise. * sysdeps/csky/fpu/fegetmode.c: Likewise. * sysdeps/csky/fpu/fegetround.c: Likewise. * sysdeps/csky/fpu/feholdexcpt.c: Likewise. * sysdeps/csky/fpu/fenv_libc.h: Likewise. * sysdeps/csky/fpu/fenv_private.h: Likewise. * sysdeps/csky/fpu/fesetenv.c: Likewise. * sysdeps/csky/fpu/fesetexcept.c: Likewise. * sysdeps/csky/fpu/fesetmode.c: Likewise. * sysdeps/csky/fpu/fesetround.c: Likewise. * sysdeps/csky/fpu/feupdateenv.c: Likewise. * sysdeps/csky/fpu/fgetexcptflg.c: Likewise. * sysdeps/csky/fpu/fix-fp-int-convert-overflow.h: Likewise. * sysdeps/csky/fpu/fraiseexcpt.c: Likewise. * sysdeps/csky/fpu/fsetexcptflg.c: Likewise. * sysdeps/csky/fpu/ftestexcept.c: Likewise. * sysdeps/csky/fpu/libm-test-ulps: Likewise. * sysdeps/csky/fpu/libm-test-ulps-name: Likewise. * sysdeps/csky/fpu_control.h: Likewise. * sysdeps/csky/gccframe.h: Likewise. * sysdeps/csky/jmpbuf-unwind.h: Likewise. * sysdeps/csky/ldsodefs.h: Likewise. * sysdeps/csky/libc-tls.c: Likewise. * sysdeps/csky/linkmap.h: Likewise. * sysdeps/csky/machine-gmon.h: Likewise. * sysdeps/csky/memusage.h: Likewise. * sysdeps/csky/nofpu/Implies: Likewise. * sysdeps/csky/nofpu/libm-test-ulps: Likewise. * sysdeps/csky/nofpu/libm-test-ulps-name: Likewise. * sysdeps/csky/nptl/Makefile: Likewise. * sysdeps/csky/nptl/bits/pthreadtypes-arch.h: Likewise. * sysdeps/csky/nptl/bits/semaphore.h: Likewise. * sysdeps/csky/nptl/pthread-offsets.h: Likewise. * sysdeps/csky/nptl/pthreaddef.h: Likewise. * sysdeps/csky/nptl/tcb-offsets.sym: Likewise. * sysdeps/csky/nptl/tls.h: Likewise. * sysdeps/csky/preconfigure: Likewise. * sysdeps/csky/sfp-machine.h: Likewise. * sysdeps/csky/sotruss-lib.c: Likewise. * sysdeps/csky/stackinfo.h: Likewise. * sysdeps/csky/sysdep.h: Likewise. * sysdeps/csky/tininess.h: Likewise. * sysdeps/csky/tst-audit.h: Likewise. * sysdeps/unix/sysv/linux/csky/Implies: Likewise. * sysdeps/unix/sysv/linux/csky/Makefile: Likewise. * sysdeps/unix/sysv/linux/csky/Versions: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/____longjmp_chk.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/clone.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/getcontext.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/swapcontext.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/syscall.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/sysdep.S: Likewise. * sysdeps/unix/sysv/linux/csky/abiv2/ucontext_i.sym: Likewise. * sysdeps/unix/sysv/linux/csky/bits/procfs.h: Likewise. * sysdeps/unix/sysv/linux/csky/bits/shmlba.h: Likewise. * sysdeps/unix/sysv/linux/csky/c++-types.data: Likewise. * sysdeps/unix/sysv/linux/csky/configure: Likewise. * sysdeps/unix/sysv/linux/csky/configure.ac: Likewise. * sysdeps/unix/sysv/linux/csky/ipc_priv.h: Likewise. * sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h: Likewise. * sysdeps/unix/sysv/linux/csky/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/csky/ld.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/ldconfig.h: Likewise. * sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libanl.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libcrypt.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libdl.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libresolv.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/librt.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libthread_db.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/libutil.abilist: Likewise. * sysdeps/unix/sysv/linux/csky/localplt.data: Likewise. * sysdeps/unix/sysv/linux/csky/makecontext.c: Likewise. * sysdeps/unix/sysv/linux/csky/profil-counter.h: Likewise. * sysdeps/unix/sysv/linux/csky/pt-vfork.S: Likewise. * sysdeps/unix/sysv/linux/csky/register-dump.h: Likewise. * sysdeps/unix/sysv/linux/csky/shlib-versions: Likewise. * sysdeps/unix/sysv/linux/csky/sigcontextinfo.h: Likewise. * sysdeps/unix/sysv/linux/csky/sys/cachectl.h: Likewise. * sysdeps/unix/sysv/linux/csky/sys/ucontext.h: Likewise. * sysdeps/unix/sysv/linux/csky/sys/user.h: Likewise. * sysdeps/unix/sysv/linux/csky/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/csky/sysdep.h: Likewise.
143 lines
2.9 KiB
ArmAsm
143 lines
2.9 KiB
ArmAsm
/* The assembly function for memory compare. C-SKY ABIV2 version.
|
|
Copyright (C) 2018 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 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
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <sysdep.h>
|
|
|
|
ENTRY (memcmp)
|
|
/* Test if len less than 4 bytes. */
|
|
mov r3, r0
|
|
movi r0, 0
|
|
mov r12, r4
|
|
cmplti r2, 4
|
|
jbt .L_compare_by_byte
|
|
|
|
andi r13, r0, 3
|
|
movi r19, 4
|
|
/* Test if s1 is not 4 bytes aligned. */
|
|
bnez r13, .L_s1_not_aligned
|
|
|
|
LABLE_ALIGN
|
|
.L_s1_aligned:
|
|
/* If dest is aligned, then copy. */
|
|
zext r18, r2, 31, 4
|
|
/* Test if len less than 16 bytes. */
|
|
bez r18, .L_compare_by_word
|
|
|
|
.L_compare_by_4word:
|
|
/* If aligned, load word each time. */
|
|
ldw r20, (r3, 0)
|
|
ldw r21, (r1, 0)
|
|
/* If s1[i] != s2[i], goto .L_byte_check. */
|
|
cmpne r20, r21
|
|
bt .L_byte_check
|
|
|
|
ldw r20, (r3, 4)
|
|
ldw r21, (r1, 4)
|
|
cmpne r20, r21
|
|
bt .L_byte_check
|
|
|
|
ldw r20, (r3, 8)
|
|
ldw r21, (r1, 8)
|
|
cmpne r20, r21
|
|
bt .L_byte_check
|
|
|
|
ldw r20, (r3, 12)
|
|
ldw r21, (r1, 12)
|
|
cmpne r20, r21
|
|
bt .L_byte_check
|
|
|
|
PRE_BNEZAD (r18)
|
|
addi a3, 16
|
|
addi a1, 16
|
|
|
|
BNEZAD (r18, .L_compare_by_4word)
|
|
|
|
.L_compare_by_word:
|
|
zext r18, r2, 3, 2
|
|
bez r18, .L_compare_by_byte
|
|
.L_compare_by_word_loop:
|
|
ldw r20, (r3, 0)
|
|
ldw r21, (r1, 0)
|
|
addi r3, 4
|
|
PRE_BNEZAD (r18)
|
|
cmpne r20, r21
|
|
addi r1, 4
|
|
bt .L_byte_check
|
|
BNEZAD (r18, .L_compare_by_word_loop)
|
|
|
|
.L_compare_by_byte:
|
|
zext r18, r2, 1, 0
|
|
bez r18, .L_return
|
|
.L_compare_by_byte_loop:
|
|
ldb r0, (r3, 0)
|
|
ldb r4, (r1, 0)
|
|
addi r3, 1
|
|
subu r0, r4
|
|
PRE_BNEZAD (r18)
|
|
addi r1, 1
|
|
bnez r0, .L_return
|
|
BNEZAD (r18, .L_compare_by_byte_loop)
|
|
|
|
.L_return:
|
|
mov r4, r12
|
|
rts
|
|
|
|
/* s1[i] != s2[i] in word, so we check byte 3. */
|
|
.L_byte_check:
|
|
xtrb3 r0, r20
|
|
xtrb3 r2, r21
|
|
subu r0, r2
|
|
bnez r0, .L_return
|
|
|
|
/* check byte 2 */
|
|
xtrb2 r0, r20
|
|
xtrb2 r2, r21
|
|
subu r0, r2
|
|
bnez r0, .L_return
|
|
|
|
/* check byte 1 */
|
|
xtrb1 r0, r20
|
|
xtrb1 r2, r21
|
|
subu r0, r2
|
|
bnez r0, .L_return
|
|
|
|
/* check byte 0 */
|
|
xtrb0 r0, r20
|
|
xtrb0 r2, r21
|
|
subu r0, r2
|
|
br .L_return
|
|
|
|
/* Compare when s1 is not aligned. */
|
|
.L_s1_not_aligned:
|
|
sub r13, r19, r13
|
|
sub r2, r13
|
|
.L_s1_not_aligned_loop:
|
|
ldb r0, (r3, 0)
|
|
ldb r4, (r1, 0)
|
|
addi r3, 1
|
|
subu r0, r4
|
|
PRE_BNEZAD (r13)
|
|
addi r1, 1
|
|
bnez r0, .L_return
|
|
BNEZAD (r13, .L_s1_not_aligned_loop)
|
|
br .L_s1_aligned
|
|
END (memcmp)
|
|
weak_alias (memcmp, bcmp)
|
|
libc_hidden_def (memcmp)
|
|
.weak memcmp
|