diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-04-01 16:36:22 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-04-01 16:36:22 +0000 |
commit | 517660f1922aa1ad33831b08d90359241cb37118 (patch) | |
tree | 1ea29cb5382cea645f583593b4a30595bdb29419 /cpukit/libnetworking/machine/in_cksum.h | |
parent | Disable IXON by default based on comment from Eric Norum (diff) | |
download | rtems-517660f1922aa1ad33831b08d90359241cb37118.tar.bz2 |
Moved sparc specific version of in_cksum_hdr to an inline routine like
the reset of the CPU specific implementations after comment from
Eric Norum.
Diffstat (limited to 'cpukit/libnetworking/machine/in_cksum.h')
-rw-r--r-- | cpukit/libnetworking/machine/in_cksum.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/cpukit/libnetworking/machine/in_cksum.h b/cpukit/libnetworking/machine/in_cksum.h index ba3c3668f6..dd2e01d4de 100644 --- a/cpukit/libnetworking/machine/in_cksum.h +++ b/cpukit/libnetworking/machine/in_cksum.h @@ -158,6 +158,49 @@ in_cksum_update(struct ip *ip) } /* + * SPARC Version + */ + +#elif (defined(__GNUC__) && defined(sparc)) + +static __inline u_int +in_cksum_hdr(const struct ip *ip) +{ + register u_int sum = 0; + register u_int tmp_o2; + register u_int tmp_o3; + + __asm__ volatile (" + ld [%0], %1 ; \ + ld [%0+4], %2 ; \ + addcc %1, %2, %1 ; \ + ld [%0+8], %2 ; \ + addxcc %1, %2, %1 ; \ + ld [%0+12], %2 ; \ + addxcc %1, %2, %1 ; \ + ld [%0+16], %2 ; \ + addxcc %1, %2, %1 ; \ + set 0x0ffff, %3 ; \ + srl %1, 16, %2 ; \ + and %1, %3, %1 ; \ + addx %1, %2, %1 ; \ + srl %1, 16, %1 ; \ + add %1, %%g0, %1 ; \ + neg %1 ; \ + and %1, %3, %1 ; \ + " : "=r" (ip), "=r" (sum), "=r" (tmp_o2), "=r" (tmp_o3) + : "0" (ip), "1" (sum) + ); + return sum; +} + +#define in_cksum_update(ip) \ + do { \ + int __tmpsum; \ + __tmpsum = (int)ntohs(ip->ip_sum) + 256; \ + ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); \ + } while(0) +/* * Here is the generic, portable, inefficient algorithm. */ |