From 517660f1922aa1ad33831b08d90359241cb37118 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 1 Apr 1999 16:36:22 +0000 Subject: 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. --- c/src/exec/libnetworking/machine/in_cksum.h | 43 +++++++++++++++++++++++++++++ c/src/exec/libnetworking/rtems/rtems_glue.c | 31 --------------------- c/src/lib/libnetworking/machine/in_cksum.h | 43 +++++++++++++++++++++++++++++ c/src/lib/libnetworking/rtems/rtems_glue.c | 31 --------------------- c/src/libnetworking/machine/in_cksum.h | 43 +++++++++++++++++++++++++++++ c/src/libnetworking/rtems/rtems_glue.c | 31 --------------------- cpukit/libnetworking/machine/in_cksum.h | 43 +++++++++++++++++++++++++++++ cpukit/libnetworking/rtems/rtems_glue.c | 31 --------------------- 8 files changed, 172 insertions(+), 124 deletions(-) diff --git a/c/src/exec/libnetworking/machine/in_cksum.h b/c/src/exec/libnetworking/machine/in_cksum.h index ba3c3668f6..dd2e01d4de 100644 --- a/c/src/exec/libnetworking/machine/in_cksum.h +++ b/c/src/exec/libnetworking/machine/in_cksum.h @@ -157,6 +157,49 @@ in_cksum_update(struct ip *ip) ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); } +/* + * 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. */ diff --git a/c/src/exec/libnetworking/rtems/rtems_glue.c b/c/src/exec/libnetworking/rtems/rtems_glue.c index 73bb8c00a5..aa2452d88b 100644 --- a/c/src/exec/libnetworking/rtems/rtems_glue.c +++ b/c/src/exec/libnetworking/rtems/rtems_glue.c @@ -698,35 +698,6 @@ kmem_malloc (vm_map_t *map, vm_size_t size, boolean_t waitflag) * IP header checksum routine for processors which don't have an inline version */ -#if (defined(__GNUC__) && defined(sparc)) - - asm(" - .text - .global _in_cksum_hdr -_in_cksum_hdr: - - ld [%o0], %o1 - ld [%o0+4], %o2 - addcc %o1, %o2, %o1 - ld [%o0+8], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+12], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+16], %o2 - addxcc %o1, %o2, %o1 - set 0x0ffff, %o3 - srl %o1, 16, %o2 - and %o1, %o3, %o1 - addx %o1, %o2, %o1 - srl %o1, 16, %o1 - add %o1, %g0, %o1 - neg %o1 - retl - and %o1, %o3, %o0 - - "); -#else - u_int in_cksum_hdr (const void *ip) { @@ -743,8 +714,6 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } -#endif - /* * Manipulate routing tables */ diff --git a/c/src/lib/libnetworking/machine/in_cksum.h b/c/src/lib/libnetworking/machine/in_cksum.h index ba3c3668f6..dd2e01d4de 100644 --- a/c/src/lib/libnetworking/machine/in_cksum.h +++ b/c/src/lib/libnetworking/machine/in_cksum.h @@ -157,6 +157,49 @@ in_cksum_update(struct ip *ip) ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); } +/* + * 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. */ diff --git a/c/src/lib/libnetworking/rtems/rtems_glue.c b/c/src/lib/libnetworking/rtems/rtems_glue.c index 73bb8c00a5..aa2452d88b 100644 --- a/c/src/lib/libnetworking/rtems/rtems_glue.c +++ b/c/src/lib/libnetworking/rtems/rtems_glue.c @@ -698,35 +698,6 @@ kmem_malloc (vm_map_t *map, vm_size_t size, boolean_t waitflag) * IP header checksum routine for processors which don't have an inline version */ -#if (defined(__GNUC__) && defined(sparc)) - - asm(" - .text - .global _in_cksum_hdr -_in_cksum_hdr: - - ld [%o0], %o1 - ld [%o0+4], %o2 - addcc %o1, %o2, %o1 - ld [%o0+8], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+12], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+16], %o2 - addxcc %o1, %o2, %o1 - set 0x0ffff, %o3 - srl %o1, 16, %o2 - and %o1, %o3, %o1 - addx %o1, %o2, %o1 - srl %o1, 16, %o1 - add %o1, %g0, %o1 - neg %o1 - retl - and %o1, %o3, %o0 - - "); -#else - u_int in_cksum_hdr (const void *ip) { @@ -743,8 +714,6 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } -#endif - /* * Manipulate routing tables */ diff --git a/c/src/libnetworking/machine/in_cksum.h b/c/src/libnetworking/machine/in_cksum.h index ba3c3668f6..dd2e01d4de 100644 --- a/c/src/libnetworking/machine/in_cksum.h +++ b/c/src/libnetworking/machine/in_cksum.h @@ -157,6 +157,49 @@ in_cksum_update(struct ip *ip) ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); } +/* + * 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. */ diff --git a/c/src/libnetworking/rtems/rtems_glue.c b/c/src/libnetworking/rtems/rtems_glue.c index 73bb8c00a5..aa2452d88b 100644 --- a/c/src/libnetworking/rtems/rtems_glue.c +++ b/c/src/libnetworking/rtems/rtems_glue.c @@ -698,35 +698,6 @@ kmem_malloc (vm_map_t *map, vm_size_t size, boolean_t waitflag) * IP header checksum routine for processors which don't have an inline version */ -#if (defined(__GNUC__) && defined(sparc)) - - asm(" - .text - .global _in_cksum_hdr -_in_cksum_hdr: - - ld [%o0], %o1 - ld [%o0+4], %o2 - addcc %o1, %o2, %o1 - ld [%o0+8], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+12], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+16], %o2 - addxcc %o1, %o2, %o1 - set 0x0ffff, %o3 - srl %o1, 16, %o2 - and %o1, %o3, %o1 - addx %o1, %o2, %o1 - srl %o1, 16, %o1 - add %o1, %g0, %o1 - neg %o1 - retl - and %o1, %o3, %o0 - - "); -#else - u_int in_cksum_hdr (const void *ip) { @@ -743,8 +714,6 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } -#endif - /* * Manipulate routing tables */ 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 @@ -157,6 +157,49 @@ in_cksum_update(struct ip *ip) ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); } +/* + * 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. */ diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c index 73bb8c00a5..aa2452d88b 100644 --- a/cpukit/libnetworking/rtems/rtems_glue.c +++ b/cpukit/libnetworking/rtems/rtems_glue.c @@ -698,35 +698,6 @@ kmem_malloc (vm_map_t *map, vm_size_t size, boolean_t waitflag) * IP header checksum routine for processors which don't have an inline version */ -#if (defined(__GNUC__) && defined(sparc)) - - asm(" - .text - .global _in_cksum_hdr -_in_cksum_hdr: - - ld [%o0], %o1 - ld [%o0+4], %o2 - addcc %o1, %o2, %o1 - ld [%o0+8], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+12], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+16], %o2 - addxcc %o1, %o2, %o1 - set 0x0ffff, %o3 - srl %o1, 16, %o2 - and %o1, %o3, %o1 - addx %o1, %o2, %o1 - srl %o1, 16, %o1 - add %o1, %g0, %o1 - neg %o1 - retl - and %o1, %o3, %o0 - - "); -#else - u_int in_cksum_hdr (const void *ip) { @@ -743,8 +714,6 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } -#endif - /* * Manipulate routing tables */ -- cgit v1.2.3