SPARC optimized version of IP checksum header routine. Submitted

by Jiri Gaisler <jgais@ws.estec.esa.nl>.
This commit is contained in:
Joel Sherrill
1999-03-23 23:06:42 +00:00
parent da7a73e02a
commit e828c2dd40
4 changed files with 128 additions and 0 deletions

View File

@@ -697,6 +697,36 @@ 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
*/
#ifdef (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)
{
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
return ~sum & 0xFFFF;
}
#endif
/*
* Manipulate routing tables
*/

View File

@@ -697,6 +697,36 @@ 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
*/
#ifdef (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)
{
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
return ~sum & 0xFFFF;
}
#endif
/*
* Manipulate routing tables
*/

View File

@@ -697,6 +697,36 @@ 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
*/
#ifdef (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)
{
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
return ~sum & 0xFFFF;
}
#endif
/*
* Manipulate routing tables
*/