[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;