mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: Joakim Tjernlund <Joakim.Tjernlund@lumentis.se>
Cc: alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Shared crc32 for 2.4.
Date: Tue, 27 May 2003 12:26:36 +0100	[thread overview]
Message-ID: <1054034796.2082.82.camel@passion.cambridge.redhat.com> (raw)
In-Reply-To: <03ee01c320b4$c3040ad0$020120b0@jockeXP>

On Thu, 2003-05-22 at 23:51, Joakim Tjernlund wrote:
> David, please use my latest crc32 mods in the 2.5 tree.
> I think I sent them to you too.
> It is a cleanup and optimization for x86.

Oops, sorry I thought I had, but in fact I'd used a slightly older
version. BK tree (and linux-2.4.21-rc4-shared-crc32.patch on
ftp.kernel.org) updated accordingly...

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or
higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1226.1.1 -> 1.1226.1.2
#	         lib/crc32.c	1.3     -> 1.4    
#	     lib/crc32defs.h	1.1     -> 1.2    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/05/27	dwmw2@infradead.org	1.1226.1.2
# Back-port Jocke's CRC32 optimisations from 2.5.
# --------------------------------------------
#
diff -Nru a/lib/crc32.c b/lib/crc32.c
--- a/lib/crc32.c	Tue May 27 11:45:55 2003
+++ b/lib/crc32.c	Tue May 27 11:45:55 2003
@@ -90,32 +90,29 @@
 	const u32      *tab = crc32table_le;
 
 # ifdef __LITTLE_ENDIAN
-#  define DO_CRC crc = (crc>>8) ^ tab[ crc & 255 ]
-#  define ENDIAN_SHIFT 0
+#  define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
 # else
-#  define DO_CRC crc = (crc<<8) ^ tab[ crc >> 24 ]
-#  define ENDIAN_SHIFT 24
+#  define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8)
 # endif
 
 	crc = __cpu_to_le32(crc);
 	/* Align it */
-	if( ((u32)b)&3 && len){
+	if(unlikely(((long)b)&3 && len)){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
-		} while ((--len) && ((u32)b)&3 );
+			DO_CRC(*((u8 *)b)++);
+		} while ((--len) && ((long)b)&3 );
 	}
-	if(len >= 4){
+	if(likely(len >= 4)){
 		/* load data 32 bits wide, xor data 32 bits wide. */
 		size_t save_len = len & 3;
 	        len = len >> 2;
 		--b; /* use pre increment below(*++b) for speed */
 		do {
 			crc ^= *++b;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
 		} while (--len);
 		b++; /* point to next byte(s) */
 		len = save_len;
@@ -123,8 +120,7 @@
 	/* And the last few bytes */
 	if(len){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
+			DO_CRC(*((u8 *)b)++);
 		} while (--len);
 	}
 
@@ -195,32 +191,29 @@
 	const u32      *tab = crc32table_be;
 
 # ifdef __LITTLE_ENDIAN
-#  define DO_CRC crc = (crc>>8) ^ tab[ crc & 255 ]
-#  define ENDIAN_SHIFT 24
+#  define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
 # else
-#  define DO_CRC crc = (crc<<8) ^ tab[ crc >> 24 ]
-#  define ENDIAN_SHIFT 0
+#  define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8)
 # endif
 
 	crc = __cpu_to_be32(crc);
 	/* Align it */
-	if( ((u32)b)&3 && len){
+	if(unlikely(((long)b)&3 && len)){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
-		} while ((--len) && ((u32)b)&3 );
+			DO_CRC(*((u8 *)b)++);
+		} while ((--len) && ((long)b)&3 );
 	}
-	if(len >= 4){
+	if(likely(len >= 4)){
 		/* load data 32 bits wide, xor data 32 bits wide. */
 		size_t save_len = len & 3;
 	        len = len >> 2;
 		--b; /* use pre increment below(*++b) for speed */
 		do {
 			crc ^= *++b;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
 		} while (--len);
 		b++; /* point to next byte(s) */
 		len = save_len;
@@ -228,8 +221,7 @@
 	/* And the last few bytes */
 	if(len){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
+			DO_CRC(*((u8 *)b)++);
 		} while (--len);
 	}
 	return __be32_to_cpu(crc);
diff -Nru a/lib/crc32defs.h b/lib/crc32defs.h
--- a/lib/crc32defs.h	Tue May 27 11:45:55 2003
+++ b/lib/crc32defs.h	Tue May 27 11:45:55 2003
@@ -8,8 +8,12 @@
 
 /* How many bits at a time to use.  Requires a table of 4<<CRC_xx_BITS
bytes. */
 /* For less performance-sensitive, use 4 */
-#define CRC_LE_BITS 8
-#define CRC_BE_BITS 8
+#ifndef CRC_LE_BITS 
+# define CRC_LE_BITS 8
+#endif
+#ifndef CRC_BE_BITS
+# define CRC_BE_BITS 8
+#endif
 
 /*
  * Little-endian CRC computation.  Used with serial bit streams sent



-- 
dwmw2


       reply	other threads:[~2003-05-27 11:13 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <03ee01c320b4$c3040ad0$020120b0@jockeXP>
2003-05-27 11:26 ` David Woodhouse [this message]
2003-05-17 17:43 David Woodhouse
2003-05-19  7:24 ` Duncan Sands
2003-05-19 15:06   ` David Woodhouse
2003-05-21 23:50 ` J.A. Magallon
2003-05-22 21:11   ` David Woodhouse
2003-05-23  9:28     ` David Woodhouse
2003-05-22 20:23 ` Marcelo Tosatti
2003-05-23  6:44   ` David Woodhouse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1054034796.2082.82.camel@passion.cambridge.redhat.com \
    --to=dwmw2@infradead.org \
    --cc=Joakim.Tjernlund@lumentis.se \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®