Subject: Re: ARM bswap optimizations
To: None <port-arm@netbsd.org>
From: Jason R Thorpe <thorpej@wasabisystems.com>
List: port-arm
Date: 08/13/2002 15:35:19
--Pd0ReVV5GZGQvF3a
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Aug 13, 2002 at 01:51:43PM -0700, Jason R Thorpe wrote:

 > The following patch addresses these issues.  I'd appreciate it if people
 > would read it over to make sure that I didn't screw up the asm (mostly
 > the constraints :-)  I've booted it multi-user on an XScale.

After some feedback from Chris Gilbert and Paul Clifford, here is the
version I'm going to check in.

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>

--Pd0ReVV5GZGQvF3a
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=bswap-diff

Index: Makefile
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/include/Makefile,v
retrieving revision 1.25
diff -c -r1.25 Makefile
*** Makefile	2002/08/07 05:14:58	1.25
--- Makefile	2002/08/13 22:15:08
***************
*** 4,10 ****
  INCSDIR= /usr/include/arm
  
  INCS=	ansi.h aout_machdep.h armreg.h asm.h \
! 	bswap.h bus.h \
  	cdefs.h cpu.h \
  	db_machdep.h disklabel.h \
  	elf_machdep.h endian.h endian_machdep.h \
--- 4,10 ----
  INCSDIR= /usr/include/arm
  
  INCS=	ansi.h aout_machdep.h armreg.h asm.h \
! 	bswap.h byte_swap.h bus.h \
  	cdefs.h cpu.h \
  	db_machdep.h disklabel.h \
  	elf_machdep.h endian.h endian_machdep.h \
Index: bswap.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/include/bswap.h,v
retrieving revision 1.1
diff -c -r1.1 bswap.h
*** bswap.h	2001/01/10 19:02:05	1.1
--- bswap.h	2002/08/13 22:15:08
***************
*** 6,9 ****
--- 6,17 ----
  #define __BSWAP_RENAME
  #include <sys/bswap.h>
  
+ #ifdef __GNUC__
+ 
+ #include <arm/byte_swap.h>
+ #define	bswap16(x)	__byte_swap_word(x)
+ #define	bswap32(x)	__byte_swap_long(x)
+ 
+ #endif /* __GNUC__ */
+ 
  #endif /* !_MACHINE_BSWAP_H_ */
Index: byte_swap.h
===================================================================
RCS file: byte_swap.h
diff -N byte_swap.h
*** /dev/null	Wed Aug 14 01:14:24 2002
--- byte_swap.h	Wed Aug 14 01:15:08 2002
***************
*** 0 ****
--- 1,101 ----
+ /*	$NetBSD$	*/
+ 
+ /*-
+  * Copyright (c) 1997, 1999, 2002 The NetBSD Foundation, Inc.
+  * All rights reserved.
+  *
+  * This code is derived from software contributed to The NetBSD Foundation
+  * by Charles M. Hannum, Neil A. Carson, and Jason R. Thorpe.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in the
+  *    documentation and/or other materials provided with the distribution.
+  * 3. All advertising materials mentioning features or use of this software
+  *    must display the following acknowledgement:
+  *	This product includes software developed by the NetBSD
+  *	Foundation, Inc. and its contributors.
+  * 4. Neither the name of The NetBSD Foundation nor the names of its
+  *    contributors may be used to endorse or promote products derived
+  *    from this software without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+  * POSSIBILITY OF SUCH DAMAGE.
+  */
+ 
+ #ifndef _ARM_BYTE_SWAP_H_
+ #define	_ARM_BYTE_SWAP_H_
+ 
+ #include <sys/types.h>
+ 
+ static __inline u_int32_t
+ __byte_swap_long_variable(u_int32_t v)
+ {
+ 	int tmp;
+ 
+ 	__asm __volatile(
+ 		"eor	%1, %2, %2, ror #16\n"
+ 		"bic	%1, %1, #0x00ff0000\n"
+ 		"mov	%0, %2, ror #8\n"
+ 		"eor	%0, %0, %1, lsr #8"
+ 	: "=r" (v), "=&r" (tmp)
+ 	: "0" (v));
+ 
+ 	return (v);
+ }
+ 
+ static __inline u_int16_t
+ __byte_swap_word_variable(u_int16_t v)
+ {
+ 
+ 	__asm __volatile(
+ 		"mov	%0, %1, ror #8\n"
+ 		"orr	%0, %0, %0, lsr #16\n"
+ 		"bic	%0, %0, %0, lsl #16"
+ 	: "=r" (v)
+ 	: "0" (v));
+ 
+ 	return (v);
+ }
+ 
+ #ifdef __OPTIMIZE__
+ 
+ #define __byte_swap_long_constant(x)	\
+ 	((((x) & 0xff000000) >> 24) |	\
+ 	 (((x) & 0x00ff0000) >>  8) |	\
+ 	 (((x) & 0x0000ff00) <<  8) |	\
+ 	 (((x) & 0x000000ff) << 24))
+ 
+ #define	__byte_swap_word_constant(x)	\
+ 	((((x) & 0xff00) >> 8) |	\
+ 	 (((x) & 0x00ff) << 8))
+ 
+ #define	__byte_swap_long(x)		\
+ 	(__builtin_constant_p((x)) ?	\
+ 	 __byte_swap_long_constant(x) :	__byte_swap_long_variable(x))
+ 
+ #define	__byte_swap_word(x)		\
+ 	(__builtin_constant_p((x)) ?	\
+ 	 __byte_swap_word_constant(x) : __byte_swap_word_variable(x))
+ 
+ #else
+ 
+ #define	__byte_swap_long(x)	__byte_swap_long_variable(x)
+ #define	__byte_swap_word(x)	__byte_swap_word_variable(x)
+ 
+ #endif /* __OPTIMIZE__ */
+ 
+ #endif /* _ARM_BYTE_SWAP_H_ */
Index: endian_machdep.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/include/endian_machdep.h,v
retrieving revision 1.3
diff -c -r1.3 endian_machdep.h
*** endian_machdep.h	2001/02/17 14:55:44	1.3
--- endian_machdep.h	2002/08/13 22:15:08
***************
*** 6,8 ****
--- 6,21 ----
  #else
  #define _BYTE_ORDER _LITTLE_ENDIAN
  #endif
+ 
+ #ifdef __GNUC__
+ 
+ #include <arm/byte_swap.h>
+ 
+ #if _BYTE_ORDER == _LITTLE_ENDIAN
+ #define	ntohl(x)	((in_addr_t)__byte_swap_long((in_addr_t)(x)))
+ #define	ntohs(x)	((in_port_t)__byte_swap_word((in_port_t)(x)))
+ #define	htonl(x)	((in_addr_t)__byte_swap_long((in_addr_t)(x)))
+ #define	htons(x)	((in_port_t)__byte_swap_word((in_port_t)(x)))
+ #endif
+ 
+ #endif

--Pd0ReVV5GZGQvF3a--