forked from Imagelibrary/rtems
SPARC optimized version of IP checksum header routine. Submitted
by Jiri Gaisler <jgais@ws.estec.esa.nl>.
This commit is contained in:
@@ -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
|
* 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
|
u_int
|
||||||
in_cksum_hdr (const void *ip)
|
in_cksum_hdr (const void *ip)
|
||||||
{
|
{
|
||||||
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
|
|||||||
return ~sum & 0xFFFF;
|
return ~sum & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Manipulate routing tables
|
* Manipulate routing tables
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
* 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
|
u_int
|
||||||
in_cksum_hdr (const void *ip)
|
in_cksum_hdr (const void *ip)
|
||||||
{
|
{
|
||||||
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
|
|||||||
return ~sum & 0xFFFF;
|
return ~sum & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Manipulate routing tables
|
* Manipulate routing tables
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
* 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
|
u_int
|
||||||
in_cksum_hdr (const void *ip)
|
in_cksum_hdr (const void *ip)
|
||||||
{
|
{
|
||||||
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
|
|||||||
return ~sum & 0xFFFF;
|
return ~sum & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Manipulate routing tables
|
* Manipulate routing tables
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
* 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
|
u_int
|
||||||
in_cksum_hdr (const void *ip)
|
in_cksum_hdr (const void *ip)
|
||||||
{
|
{
|
||||||
@@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip)
|
|||||||
return ~sum & 0xFFFF;
|
return ~sum & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Manipulate routing tables
|
* Manipulate routing tables
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user