ARM: Optimize IEEE-754 sqrt implementation
Use the vsqrt.f64 and vsqrt.f32 instructions if available.
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							33297d810d
						
					
				
				
					commit
					baf32fb85f
				
			| @@ -6,6 +6,8 @@ INCLUDES = -I $(newlib_basedir)/../newlib/libm/common $(NEWLIB_CFLAGS) \ | ||||
| 	$(CROSS_CFLAGS) $(TARGET_CFLAGS) | ||||
|  | ||||
| LIB_SOURCES = \ | ||||
| 	e_sqrt.c \ | ||||
| 	ef_sqrt.c \ | ||||
| 	s_ceil.c \ | ||||
| 	s_floor.c \ | ||||
| 	s_nearbyint.c \ | ||||
|   | ||||
| @@ -70,7 +70,8 @@ LIBRARIES = $(noinst_LIBRARIES) | ||||
| ARFLAGS = cru | ||||
| lib_a_AR = $(AR) $(ARFLAGS) | ||||
| lib_a_LIBADD = | ||||
| am__objects_1 = lib_a-s_ceil.$(OBJEXT) lib_a-s_floor.$(OBJEXT) \ | ||||
| am__objects_1 = lib_a-e_sqrt.$(OBJEXT) lib_a-ef_sqrt.$(OBJEXT) \ | ||||
| 	lib_a-s_ceil.$(OBJEXT) lib_a-s_floor.$(OBJEXT) \ | ||||
| 	lib_a-s_nearbyint.$(OBJEXT) lib_a-s_rint.$(OBJEXT) \ | ||||
| 	lib_a-s_round.$(OBJEXT) lib_a-s_trunc.$(OBJEXT) \ | ||||
| 	lib_a-sf_ceil.$(OBJEXT) lib_a-sf_floor.$(OBJEXT) \ | ||||
| @@ -202,6 +203,8 @@ INCLUDES = -I $(newlib_basedir)/../newlib/libm/common $(NEWLIB_CFLAGS) \ | ||||
| 	$(CROSS_CFLAGS) $(TARGET_CFLAGS) | ||||
|  | ||||
| LIB_SOURCES = \ | ||||
| 	e_sqrt.c \ | ||||
| 	ef_sqrt.c \ | ||||
| 	s_ceil.c \ | ||||
| 	s_floor.c \ | ||||
| 	s_nearbyint.c \ | ||||
| @@ -291,6 +294,18 @@ distclean-compile: | ||||
| .c.obj: | ||||
| 	$(COMPILE) -c `$(CYGPATH_W) '$<'` | ||||
|  | ||||
| lib_a-e_sqrt.o: e_sqrt.c | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-e_sqrt.o `test -f 'e_sqrt.c' || echo '$(srcdir)/'`e_sqrt.c | ||||
|  | ||||
| lib_a-e_sqrt.obj: e_sqrt.c | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-e_sqrt.obj `if test -f 'e_sqrt.c'; then $(CYGPATH_W) 'e_sqrt.c'; else $(CYGPATH_W) '$(srcdir)/e_sqrt.c'; fi` | ||||
|  | ||||
| lib_a-ef_sqrt.o: ef_sqrt.c | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-ef_sqrt.o `test -f 'ef_sqrt.c' || echo '$(srcdir)/'`ef_sqrt.c | ||||
|  | ||||
| lib_a-ef_sqrt.obj: ef_sqrt.c | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-ef_sqrt.obj `if test -f 'ef_sqrt.c'; then $(CYGPATH_W) 'ef_sqrt.c'; else $(CYGPATH_W) '$(srcdir)/ef_sqrt.c'; fi` | ||||
|  | ||||
| lib_a-s_ceil.o: s_ceil.c | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_ceil.o `test -f 's_ceil.c' || echo '$(srcdir)/'`s_ceil.c | ||||
|  | ||||
|   | ||||
							
								
								
									
										45
									
								
								newlib/libm/machine/arm/e_sqrt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								newlib/libm/machine/arm/e_sqrt.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /*- | ||||
|  * Copyright (c) 2017 embedded brains GmbH | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. | ||||
|  */ | ||||
|  | ||||
| #if __ARM_FP & 0x8 | ||||
| #include <math.h> | ||||
|  | ||||
| double | ||||
| __ieee754_sqrt(double x) | ||||
| { | ||||
| 	double result; | ||||
| #if __ARM_ARCH >= 6 | ||||
| 	asm ("vsqrt.f64 %P0, %P1" : "=w" (result) : "w" (x)); | ||||
| #else | ||||
| 	/* VFP9 Erratum 760019, see GCC sources "gcc/config/arm/vfp.md" */ | ||||
| 	asm ("vsqrt.f64 %P0, %P1" : "=&w" (result) : "w" (x)); | ||||
| #endif | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| #else | ||||
| #include "../../math/e_sqrt.c" | ||||
| #endif | ||||
							
								
								
									
										45
									
								
								newlib/libm/machine/arm/ef_sqrt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								newlib/libm/machine/arm/ef_sqrt.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /*- | ||||
|  * Copyright (c) 2017 embedded brains GmbH | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. | ||||
|  */ | ||||
|  | ||||
| #if __ARM_FP & 0x4 | ||||
| #include <math.h> | ||||
|  | ||||
| float | ||||
| __ieee754_sqrtf(float x) | ||||
| { | ||||
| 	float result; | ||||
| #if __ARM_ARCH >= 6 | ||||
| 	asm ("vsqrt.f32 %0, %1" : "=w" (result) : "w" (x)); | ||||
| #else | ||||
| 	/* VFP9 Erratum 760019, see GCC sources "gcc/config/arm/vfp.md" */ | ||||
| 	asm ("vsqrt.f32 %0, %1" : "=&w" (result) : "w" (x)); | ||||
| #endif | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| #else | ||||
| #include "../../math/ef_sqrt.c" | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user