Module Name: src Committed By: matt Date: Thu Jul 18 22:42:51 UTC 2013
Modified Files: src/common/lib/libc/arch/m68k/gen: bswap16.S bswap32.S bswap64.S src/common/lib/libc/arch/m68k/string: bcmp.S bcopy.S bzero.S ffs.S memcmp.S memset.S strcmp.S strncmp.S strncpy.S Log Message: Adjust for Coldfire To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/arch/m68k/gen/bswap16.S \ src/common/lib/libc/arch/m68k/gen/bswap32.S cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/m68k/gen/bswap64.S cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/arch/m68k/string/bcmp.S \ src/common/lib/libc/arch/m68k/string/bcopy.S \ src/common/lib/libc/arch/m68k/string/bzero.S \ src/common/lib/libc/arch/m68k/string/ffs.S \ src/common/lib/libc/arch/m68k/string/memset.S \ src/common/lib/libc/arch/m68k/string/strcmp.S \ src/common/lib/libc/arch/m68k/string/strncmp.S cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/m68k/string/memcmp.S \ src/common/lib/libc/arch/m68k/string/strncpy.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libc/arch/m68k/gen/bswap16.S diff -u src/common/lib/libc/arch/m68k/gen/bswap16.S:1.4 src/common/lib/libc/arch/m68k/gen/bswap16.S:1.5 --- src/common/lib/libc/arch/m68k/gen/bswap16.S:1.4 Tue Jul 16 23:24:18 2013 +++ src/common/lib/libc/arch/m68k/gen/bswap16.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bswap16.S,v 1.4 2013/07/16 23:24:18 matt Exp $ */ +/* $NetBSD: bswap16.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /* * Copyright (C) 1996 Scott Reynolds. All rights reserved. @@ -35,7 +35,20 @@ #endif /* defined(_KERNEL) || defined(_STANDALONE) */ _ENTRY(BSWAP16) +#ifdef __mcfisac__ + mvzw 6(%sp),%d0 + swap %d0 + byterev %d0 +#elif defined(__mcoldfire__) + mvzw 6(%sp),%d0 + movl %d0,%d1 + mvzb %d0,%d0 + lsll #8,%d0 + lsrl #8,%d1 + orl %d1,%d0 +#else movl 4(%sp),%d0 rolw #8,%d0 +#endif rts END(BSWAP16) Index: src/common/lib/libc/arch/m68k/gen/bswap32.S diff -u src/common/lib/libc/arch/m68k/gen/bswap32.S:1.4 src/common/lib/libc/arch/m68k/gen/bswap32.S:1.5 --- src/common/lib/libc/arch/m68k/gen/bswap32.S:1.4 Tue Jul 16 23:24:18 2013 +++ src/common/lib/libc/arch/m68k/gen/bswap32.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bswap32.S,v 1.4 2013/07/16 23:24:18 matt Exp $ */ +/* $NetBSD: bswap32.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /* * Copyright (C) 1996 Scott Reynolds. All rights reserved. @@ -36,8 +36,20 @@ _ENTRY(BSWAP32) movl 4(%sp),%d0 +#ifdef __mcfisac__ + byterev %d0 +#elif defined(__mcoldfire__) + movl %d0,%d1 + lsrl #8,%d0 | ABCD -> 0ABC + andl #0x00ff00ff,%d0 | 0ABC -> 0A0C + andl #0x00ff00ff,%d1 | ABCD -> 0B0D + lsll #8,%d1 | 0B0D -> B0D0 + orl %d1,%d0 | 0A0C | B0D0 -> BADC + swap %d0 | BADC -> DCBA +#else + rolw #8,%d0 + swap %d0 rolw #8,%d0 - swap %d0 - rolw #8,%d0 +#endif rts END(BSWAP32) Index: src/common/lib/libc/arch/m68k/gen/bswap64.S diff -u src/common/lib/libc/arch/m68k/gen/bswap64.S:1.3 src/common/lib/libc/arch/m68k/gen/bswap64.S:1.4 --- src/common/lib/libc/arch/m68k/gen/bswap64.S:1.3 Tue Jul 16 23:24:18 2013 +++ src/common/lib/libc/arch/m68k/gen/bswap64.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bswap64.S,v 1.3 2013/07/16 23:24:18 matt Exp $ */ +/* $NetBSD: bswap64.S,v 1.4 2013/07/18 22:42:50 matt Exp $ */ /* * Copyright (C) 1996 Scott Reynolds. All rights reserved. @@ -31,11 +31,34 @@ ENTRY(bswap64) movl 4(%sp),%d1 movl 8(%sp),%d0 +#ifdef __mcfisac__ + byterev %d0 + byterev %d1 +#elif defined(__mcoldfire__) + movl %d3,-(%sp) + movl %d2,-(%sp) + movl #0x00ff00ff, %d3 + movl %d0,%d2 + andl %d3,%d2 + lsll #8,%d2 + lsrl #8,%d0 + andl %d3,%d0 + orl %d2,%d0 + movl %d1,%d2 + andl %d3,%d2 + lsll #8,%d2 + lsrl #8,%d1 + andl %d3,%d1 + orl %d2,%d1 + movl (%sp)+,%d2 + movl (%sp)+,%d3 +#else rolw #8,%d1 rolw #8,%d0 swap %d1 swap %d0 rolw #8,%d0 rolw #8,%d1 +#endif rts END(bswap64) Index: src/common/lib/libc/arch/m68k/string/bcmp.S diff -u src/common/lib/libc/arch/m68k/string/bcmp.S:1.4 src/common/lib/libc/arch/m68k/string/bcmp.S:1.5 --- src/common/lib/libc/arch/m68k/string/bcmp.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/bcmp.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bcmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: bcmp.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -68,14 +68,27 @@ #if 0 RCSID("from: @(#)bcmp.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: bcmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: bcmp.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ +#ifdef __mcoldfire__ +#define CMPMB(a,b) movb b,%d2; cmpb a,%d2 +#define CMPMW(a,b) movw b,%d2; cmpw a,%d2 +#define CMPML(a,b) movl b,%d2; cmpl a,%d2 +#else +#define CMPMB(a,b) cmpmb a,b +#define CMPMW(a,b) cmpmw a,b +#define CMPML(a,b) cmpml a,b +#endif + ENTRY(bcmp) movl 4(%sp),%a0 | string 1 movl 8(%sp),%a1 | string 2 movl 12(%sp),%d1 | length +#ifdef __mcoldfire__ + movl %d2,-(%sp) | save temp +#endif /* * It isn't worth the overhead of aligning to {long}word boundries @@ -100,14 +113,14 @@ ENTRY(bcmp) movl %a0,%d0 btst #0,%d0 jeq Lbcalgndw - cmpmb (%a0)+,(%a1)+ + CMPMB((%a0)+,(%a1)+) jne Lbcnoteq subql #1,%d1 Lbcalgndw: /* long word align */ btst #1,%d0 jeq Lbcalgndl - cmpmw (%a0)+,(%a1)+ + CMPMW((%a0)+,(%a1)+) jne Lbcnoteq subql #2,%d1 Lbcalgndl: @@ -118,24 +131,26 @@ Lbcalgndl: andl #31,%d1 | len %= 32 subql #1,%d0 | set up for dbf Lbc32loop: - cmpml (%a0)+,(%a1)+ | compare 8 longwords + CMPML((%a0)+,(%a1)+) | compare 1 of 8 longwords jne Lbcnoteq | not equal, return non-zero - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 2 of 8 longwords jne Lbcnoteq - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 3 of 8 longwords jne Lbcnoteq - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 4 of 8 longwords jne Lbcnoteq - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 5 of 8 longwords jne Lbcnoteq - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 6 of 8 longwords jne Lbcnoteq - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 7 of 8 longwords jne Lbcnoteq - cmpml (%a0)+,(%a1)+ + CMPML((%a0)+,(%a1)+) | compare 8 of 8 longwords jne Lbcnoteq +#ifndef __mcoldfire__ dbf %d0,Lbc32loop | till done clrw %d0 +#endif subql #1,%d0 jcc Lbc32loop @@ -146,19 +161,32 @@ Lbclong: jeq Lbcbyte | if (cnt) subql #1,%d0 | set up for dbf Lbclloop: - cmpml (%a0)+,(%a1)+ | compare a longword + CMPML((%a0)+,(%a1)+) | compare a longword jne Lbcnoteq | not equal, return non-zero +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbclloop | till done +#else dbf %d0,Lbclloop | till done +#endif andl #3,%d1 | len %= 4 jeq Lbcdone subql #1,%d1 | set up for dbf Lbcbloop: - cmpmb (%a0)+,(%a1)+ | compare a byte + CMPMB((%a0)+,(%a1)+) | compare a byte jne Lbcnoteq | not equal, return non-zero Lbcbyte: +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbcbloop | till done +#else dbf %d1,Lbcbloop +#endif Lbcdone: +#ifdef __mcoldfire__ + movl (%sp)+,%d2 | restore temp +#endif movql #0,%d0 rts Index: src/common/lib/libc/arch/m68k/string/bcopy.S diff -u src/common/lib/libc/arch/m68k/string/bcopy.S:1.4 src/common/lib/libc/arch/m68k/string/bcopy.S:1.5 --- src/common/lib/libc/arch/m68k/string/bcopy.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/bcopy.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bcopy.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: bcopy.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ #if 0 RCSID("from: @(#)bcopy.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: bcopy.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: bcopy.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ @@ -141,8 +141,10 @@ Lbcf32loop: movl (%a0)+,(%a1)+ movl (%a0)+,(%a1)+ movl (%a0)+,(%a1)+ +#ifndef __mcoldfire__ dbf %d0,Lbcf32loop | till done clrw %d0 +#endif subql #1,%d0 jcc Lbcf32loop @@ -154,7 +156,12 @@ Lbcflong: subql #1,%d0 | set up for dbf Lbcflloop: movl (%a0)+,(%a1)+ | copy longwords +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbcflloop | til done +#else dbf %d0,Lbcflloop | til done +#endif andl #3,%d1 | len %= 4 jeq Lbcdone @@ -162,7 +169,12 @@ Lbcflloop: Lbcfbloop: movb (%a0)+,(%a1)+ | copy bytes Lbcfbyte: +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbcfbloop | til done +#else dbf %d1,Lbcfbloop | till done +#endif Lbcdone: #if defined(MEMCOPY) || defined(MEMMOVE) movl 4(%sp),%d0 | dest address @@ -224,8 +236,10 @@ Lbcb32loop: movl -(%a0),-(%a1) movl -(%a0),-(%a1) movl -(%a0),-(%a1) +#ifndef __mcoldfire__ dbf %d0,Lbcb32loop | till done clrw %d0 +#endif subql #1,%d0 jcc Lbcb32loop @@ -237,7 +251,12 @@ Lbcblong: subql #1,%d0 | set up for dbf Lbcblloop: movl -(%a0),-(%a1) | copy longwords +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbcblloop | til done +#else dbf %d0,Lbcblloop | til done +#endif andl #3,%d1 | len %= 4 jeq Lbcdone @@ -245,7 +264,12 @@ Lbcblloop: Lbcbbloop: movb -(%a0),-(%a1) | copy bytes Lbcbbyte: +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbcbbloop | til done +#else dbf %d1,Lbcbbloop | till done +#endif #if defined(MEMCOPY) || defined(MEMMOVE) movl 4(%sp),%d0 | dest address Index: src/common/lib/libc/arch/m68k/string/bzero.S diff -u src/common/lib/libc/arch/m68k/string/bzero.S:1.4 src/common/lib/libc/arch/m68k/string/bzero.S:1.5 --- src/common/lib/libc/arch/m68k/string/bzero.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/bzero.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bzero.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: bzero.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ #if 0 RCSID("from: @(#)bzero.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: bzero.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: bzero.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ @@ -77,7 +77,7 @@ ENTRY(bzero) movl 8(%sp),%a0 | destination movl 12(%sp),%d1 | count - movql #0,%d2 + clrl %d2 /* * It isn't worth the overhead of aligning to {long}word boundries @@ -114,8 +114,10 @@ Lbz32loop: movl %d2,(%a0)+ movl %d2,(%a0)+ movl %d2,(%a0)+ +#ifndef __mcoldfire__ dbf %d0,Lbz32loop | till done clrw %d0 +#endif subql #1,%d0 jcc Lbz32loop @@ -127,7 +129,12 @@ Lbzlong: subql #1,%d0 | set up for dbf Lbzlloop: movl %d2,(%a0)+ | clear longwords +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbzlloop | till done +#else dbf %d0,Lbzlloop | till done +#endif andl #3,%d1 | len %= 4 jeq Lbzdone @@ -135,7 +142,12 @@ Lbzlloop: Lbzbloop: movb %d2,(%a0)+ | zero bytes Lbzbyte: +#ifdef __mcoldfire__ + subql #1,%d0 | decrement + jcc Lbzbloop | till done +#else dbf %d1,Lbzbloop | till done +#endif Lbzdone: movl (%sp)+,%d2 rts Index: src/common/lib/libc/arch/m68k/string/ffs.S diff -u src/common/lib/libc/arch/m68k/string/ffs.S:1.4 src/common/lib/libc/arch/m68k/string/ffs.S:1.5 --- src/common/lib/libc/arch/m68k/string/ffs.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/ffs.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: ffs.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. @@ -39,7 +39,7 @@ #if 0 RCSID("from: @(#)ffs.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: ffs.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: ffs.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ @@ -47,7 +47,7 @@ WEAK_ALIAS(__ffssi2,ffs) -#ifndef __mc68010__ +#if (!defined(__mc68010__) && !defined(__mcoldfire__)) || defined(__mcfisac__) ENTRY(ffs) movl 4(%sp),%d0 @@ -55,11 +55,28 @@ ENTRY(ffs) negl %d0 andl %d0,%d1 movql #32,%d0 +#if defined(__mcfisac__) + ff1.l %d1 | count leading zeros +#else bfffo %d1{#0:#32},%d1 +#endif subl %d1,%d0 rts END(ffs) +#elif defined(__mcoldfire__) + +ENTRY(ffs) + clrl %d0 + movl 4(%sp),%d1 + jeq L2 | return 0 if 0 +L1: + addql #1,%d0 + lsrl #1,%d1 | shift low bit into carry + jcc L1 | keep looping while carry is clear. +L2: + rts + #else /* __mc68010__ */ ENTRY(ffs) Index: src/common/lib/libc/arch/m68k/string/memset.S diff -u src/common/lib/libc/arch/m68k/string/memset.S:1.4 src/common/lib/libc/arch/m68k/string/memset.S:1.5 --- src/common/lib/libc/arch/m68k/string/memset.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/memset.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: memset.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: memset.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ #if 0 RCSID("from: @(#)bzero.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: memset.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: memset.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ @@ -76,7 +76,11 @@ ENTRY(memset) movl %d2,-(%sp) movl 8(%sp),%a0 | destination movl 16(%sp),%d1 | count - movb 15(%sp),%d2 | character +#ifdef __mcoldfire__ + mvzb 15(%sp),%d2 | zero extend fill character +#else + movb 15(%sp),%d2 | get fill character +#endif /* * It isn't worth the overhead of aligning to {long}word boundries @@ -85,15 +89,15 @@ ENTRY(memset) cmpl #15,%d1 jlt Lbzbyte - clrl %d0 | replicate byte to fill longword - movb %d2,%d0 - movl %d0,%d2 - lsll #8,%d0 - orl %d0,%d2 - lsll #8,%d0 - orl %d0,%d2 - lsll #8,%d0 - orl %d0,%d2 +#ifndef __mcoldfire__ + andb 0xff,%d2 | clear high bytes +#endif + movl %d2,%d0 + lsll #8,%d0 | shift to 8-15 + orl %d0,%d2 | merge so low word is done + movl %d2,%d0 | copy word + swap %d0 | swap it + orl %d0,%d2 | put it upper half /* word align */ movl %a0,%d0 @@ -125,8 +129,10 @@ Lbz32loop: movl %d2,(%a0)+ movl %d2,(%a0)+ movl %d2,(%a0)+ +#ifndef __mcoldfire__ dbf %d0,Lbz32loop | till done clrw %d0 +#endif subql #1,%d0 jcc Lbz32loop #endif /* !__mc68010__ */ @@ -139,12 +145,16 @@ Lbzlong: subql #1,%d0 | set up for dbf Lbzlloop: movl %d2,(%a0)+ | clear longwords +#ifndef __mcoldfire__ dbf %d0,Lbzlloop | till done +#endif #ifdef __mc68010__ clrw %d0 +#endif /* __mc68010__ */ +#if defined(__m68010) || defined(__mcoldfire__) subql #1,%d0 jcc Lbzlloop -#endif /* __mc68010__ */ +#endif /* __mc68010__ || __mcoldfire__ */ andl #3,%d1 | len %= 4 jeq Lbzdone @@ -152,7 +162,12 @@ Lbzlloop: Lbzbloop: movb %d2,(%a0)+ | set bytes Lbzbyte: +#ifdef __mcoldfire__ + subql #1,%d1 | decrement + jcc Lbzbloop | till done +#else dbf %d1,Lbzbloop | till done +#endif Lbzdone: movl 8(%sp),%d0 | return destination #ifdef __SVR4_ABI__ Index: src/common/lib/libc/arch/m68k/string/strcmp.S diff -u src/common/lib/libc/arch/m68k/string/strcmp.S:1.4 src/common/lib/libc/arch/m68k/string/strcmp.S:1.5 --- src/common/lib/libc/arch/m68k/string/strcmp.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/strcmp.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: strcmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: strcmp.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -33,36 +33,46 @@ #include <machine/asm.h> #if defined(LIBC_SCCS) && !defined(lint) - RCSID("$NetBSD: strcmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: strcmp.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif /* LIBC_SCCS and not lint */ +#ifdef __mcoldfire__ +#define GETC(a,b) mvsb a,b +#define SUBC(a,b) mvsb a,%d0; subl %d0,b +#else +#define GETC(a,b) movb a,b +#define SUBC(a,b) subb a,b +#endif + ENTRY(strcmp) movl 4(%sp),%a0 movl 8(%sp),%a1 L1: /* unrolled by 4 for 680[23]0's */ - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jeq L1 -L3: scs %d0 - EXTBL(%d0) - movb %d1,%d0 +L3: +#ifndef __mcoldfire__ + EXTBL(%d1) +#endif + movl %d1,%d0 rts L2: movq #0,%d0 Index: src/common/lib/libc/arch/m68k/string/strncmp.S diff -u src/common/lib/libc/arch/m68k/string/strncmp.S:1.4 src/common/lib/libc/arch/m68k/string/strncmp.S:1.5 --- src/common/lib/libc/arch/m68k/string/strncmp.S:1.4 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/strncmp.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: strncmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: strncmp.S,v 1.5 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -33,47 +33,64 @@ #include <machine/asm.h> #if defined(LIBC_SCCS) && !defined(lint) - RCSID("$NetBSD: strncmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: strncmp.S,v 1.5 2013/07/18 22:42:50 matt Exp $") #endif /* LIBC_SCCS and not lint */ + +#ifdef __mcoldfire__ +#define GETC(a,b) mvsb a,b +#define SUBC(a,b) mvsb a,%d2; subl %d2,b +#else +#define GETC(a,b) movb a,b +#define SUBC(a,b) subb a,b +#endif + ENTRY(strncmp) movl 12(%sp),%d0 jeq L4 movl 4(%sp),%a0 movl 8(%sp),%a1 + movl %d2,-(%sp) | save temp L1: /* unroll by 4 for m680[23]0's */ - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 subql #1,%d0 jeq L4 - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 subql #1,%d0 jeq L4 - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 subql #1,%d0 jeq L4 - movb (%a0)+,%d1 + GETC((%a0)+,%d1) jeq L2 - subb (%a1)+,%d1 + SUBC((%a1)+,%d1) jne L3 subql #1,%d0 jne L1 +#ifdef __mcoldfire__ + movl (%sp)+,%d2 | restore temp +#endif L4: rts -L2: subb (%a1),%d1 -L3: scs %d0 - EXTBL(%d0) - movb %d1,%d0 +L2: SUBC((%a1),%d1) +L3: +#ifdef __mcoldfire__ + movl (%sp)+,%d2 | restore temp +#else + EXTBL(%d1) +#endif + movl %d1,%d0 rts END(strncmp) Index: src/common/lib/libc/arch/m68k/string/memcmp.S diff -u src/common/lib/libc/arch/m68k/string/memcmp.S:1.3 src/common/lib/libc/arch/m68k/string/memcmp.S:1.4 --- src/common/lib/libc/arch/m68k/string/memcmp.S:1.3 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/memcmp.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: memcmp.S,v 1.3 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: memcmp.S,v 1.4 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. @@ -39,12 +39,22 @@ #if 0 RCSID("from: @(#)bcmp.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: memcmp.S,v 1.3 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: memcmp.S,v 1.4 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ /* memcmp(s1, s2, n) */ +#ifdef __mcoldfire__ +#define CMPMB(a,b) movb b,%d2; cmpb a,%d2 +#define CMPMW(a,b) movw b,%d2; cmpw a,%d2 +#define CMPML(a,b) movl b,%d2; cmpl a,%d2 +#else +#define CMPMB(a,b) cmpmb a,b +#define CMPMW(a,b) cmpmw a,b +#define CMPML(a,b) cmpml a,b +#endif + /* * This is probably not the best we can do, but it is still 2-10 times * faster than the C version in the portable gen directory. @@ -57,11 +67,14 @@ ENTRY(memcmp) movl 4(%sp),%a0 | string 1 movl 8(%sp),%a1 | string 2 movl 12(%sp),%d0 | length +#ifdef __mcoldfire__ + movl %d2,-(%sp) | save temp +#endif jeq bcdone | if zero, nothing to do movl %a0,%d1 btst #0,%d1 | string 1 address odd? jeq bceven | no, skip alignment - cmpmb (%a0)+,(%a1)+ | yes, compare a byte + CMPMB((%a0)+,(%a1)+) | yes, compare a byte jne bcnoteq | not equal, return non-zero subql #1,%d0 | adjust count jeq bcdone | count 0, reutrn zero @@ -73,14 +86,14 @@ bceven: lsrl #2,%d1 | convert count to longword count jeq bcbloop | count 0, skip longword loop bclloop: - cmpml (%a0)+,(%a1)+ | compare a longword + CMPML((%a0)+,(%a1)+) | compare a longword jne bcnoteql | not equal, return non-zero subql #1,%d1 | adjust count jne bclloop | still more, keep comparing andl #3,%d0 | what remains jeq bcdone | nothing, all done bcbloop: - cmpmb (%a0)+,(%a1)+ | compare a byte + CMPMB((%a0)+,(%a1)+) | compare a byte jne bcnoteq | not equal, return non-zero subql #1,%d0 | adjust count jne bcbloop | still more, keep going @@ -97,5 +110,8 @@ bcnoteq: movb -(%a1),%d1 subl %d1,%d0 bcdone: +#ifdef __mcoldfire__ + movl (%sp)+,%sp | restore temp +#endif rts END(memcmp) Index: src/common/lib/libc/arch/m68k/string/strncpy.S diff -u src/common/lib/libc/arch/m68k/string/strncpy.S:1.3 src/common/lib/libc/arch/m68k/string/strncpy.S:1.4 --- src/common/lib/libc/arch/m68k/string/strncpy.S:1.3 Tue Jul 16 23:24:19 2013 +++ src/common/lib/libc/arch/m68k/string/strncpy.S Thu Jul 18 22:42:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: strncpy.S,v 1.3 2013/07/16 23:24:19 matt Exp $ */ +/* $NetBSD: strncpy.S,v 1.4 2013/07/18 22:42:50 matt Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. @@ -39,7 +39,7 @@ #if 0 RCSID("from: @(#)strncpy.s 5.1 (Berkeley) 5/12/90") #else - RCSID("$NetBSD: strncpy.S,v 1.3 2013/07/16 23:24:19 matt Exp $") + RCSID("$NetBSD: strncpy.S,v 1.4 2013/07/18 22:42:50 matt Exp $") #endif #endif /* LIBC_SCCS and not lint */ @@ -52,9 +52,13 @@ ENTRY(strncpy) subql #1,%d1 Lscloop: movb (%a0)+,(%a1)+ | copy a byte +#ifndef __mcoldfire__ dbeq %d1,Lscloop | loop through low word of d1 +#endif jeq Lscpadding | copied null, padding if necessary +#ifndef __mcoldfire__ clrw %d1 | clear low word of d1 +#endif subql #1,%d1 | adjust count for long copies jcc Lscloop | more room, keep going Lscdone: @@ -65,8 +69,10 @@ Lscdone: Lscploop: clrb (%a1)+ | clear a byte +#ifndef __mcoldfire__ dbra %d1,Lscploop | keep going clrw %d1 +#endif Lscpadding: subql #1,%d1 jcc Lscploop