[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: -fno-strict-alias (Re: optimization/7427)



Tsubai Masanari <tsubai@iri.co.jp> writes:

> >	in4_cksum.cに対するパッチがあるなら送って下さい。
> 
> 以下のパッチで動作することを確認しました。

ところで, 頭の 8 byte を 0 にして, その 0 を足すのって無駄に思えるのは
貧乏症過ぎかしらん.

下の patch で, 少なくとも二つ目の chunk がないと checksum を間違うパター
ンがあることは確認しています.

enami.
Index: in_cksum.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/powerpc/powerpc/in_cksum.c,v
retrieving revision 1.3
diff -u -r1.3 in_cksum.c
--- in_cksum.c	2001/06/13 06:01:50	1.3
+++ in_cksum.c	2002/07/29 09:13:46
@@ -103,7 +103,7 @@
 		 * Force to a word boundary.
 		 */
 		if ((3 & (long) w) && (mlen > 0)) {
-			if ((1 & (long) w) && (mlen > 0)) {
+			if ((1 & (long) w)) {
 				REDUCE;
 				sum <<= 8;
 				s_util.c[0] = *w++;
@@ -111,7 +111,19 @@
 				byte_swapped = 1;
 			}
 			if ((2 & (long) w) && (mlen > 1)) {
-				sum += *(uint16_t *)w;
+				/*
+				 * Since the `sum' may contain full 32 bit
+				 * value, we can't simply add any value.
+				 */
+				__asm __volatile(
+				    "addic 0,0,0;"	/* clear carry */
+				    "lhz 7,0(%1);"	/* load current data
+							   half word */
+				    "adde %0,%0,7;"	/* add to sum */
+				    "addze %0,%0;"	/* add carry bit */
+				    : "+r"(sum)
+				    : "b"(w)
+				    : "7");		/* clobber r7 */
 				w += 2;
 				mlen -= 2;
 			}
@@ -124,7 +136,7 @@
 			n = mlen >> 6;
 			tmpw = w - 4;
 			asm volatile(
-				"addze 7,7;"		/* clear carry */
+				"addic 0,0,0;"		/* clear carry */
 				"mtctr %1;"		/* load loop count */
 				"1:"
 				"lwzu 7,4(%2);"		/* load current data word */
@@ -162,7 +174,7 @@
 				"bdnz 1b;"		/* loop */
 				"addze %0,%0;"		/* add carry bit */
 				: "+r"(sum)
-				: "r"(n), "r"(tmpw)
+				: "r"(n), "b"(tmpw)
 				: "7", "8", "9", "10");	/* clobber r7, r8, r9, r10 */
 			w += n * 64;
 			mlen -= n * 64;
@@ -175,7 +187,7 @@
 			n = mlen >> 3;
 			tmpw = w - 4;
 			asm volatile(
-				"addze %1,%1;"		/* clear carry */
+				"addic 0,0,0;"		/* clear carry */
 				"mtctr %1;"		/* load loop count */
 				"1:"
 				"lwzu 7,4(%2);"		/* load current data word */
@@ -185,7 +197,7 @@
 				"bdnz 1b;"		/* loop */
 				"addze %0,%0;"		/* add carry bit */
 				: "+r"(sum)
-				: "r"(n), "r"(tmpw)
+				: "r"(n), "b"(tmpw)
 				: "7", "8");		/* clobber r7, r8 */
 			w += n * 8;
 			mlen -= n * 8;