From 857899526f8f3faa6943f917f8b333438cc885e9 Mon Sep 17 00:00:00 2001 From: Zhang Xianyi Date: Sat, 26 Sep 2015 14:10:18 +0000 Subject: [PATCH 1/3] ARM soft fp abi branch. --- Makefile.arm | 20 ++++++++++---------- Makefile.system | 11 +++++++++++ common_arm.h | 5 +++++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Makefile.arm b/Makefile.arm index 272220ca9..b93e48c4d 100644 --- a/Makefile.arm +++ b/Makefile.arm @@ -1,27 +1,27 @@ # ifeq logical or ifeq ($(CORE), $(filter $(CORE),CORTEXA9 CORTEXA15)) ifeq ($(OSNAME), Android) -CCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a +CCOMMON_OPT += -mfpu=neon -march=armv7-a +FCOMMON_OPT += -mfpu=neon -march=armv7-a else -CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a -FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a +CCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a +FCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a endif endif ifeq ($(CORE), ARMV7) ifeq ($(OSNAME), Android) -CCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a +CCOMMON_OPT += -mfpu=neon -march=armv7-a +FCOMMON_OPT += -mfpu=neon -march=armv7-a else -CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a -FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a +CCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a +FCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a endif endif ifeq ($(CORE), ARMV6) -CCOMMON_OPT += -marm -mfpu=vfp -mfloat-abi=hard -march=armv6 -FCOMMON_OPT += -marm -mfpu=vfp -mfloat-abi=hard -march=armv6 +CCOMMON_OPT += -mfpu=vfp -march=armv6 +FCOMMON_OPT += -mfpu=vfp -march=armv6 endif diff --git a/Makefile.system b/Makefile.system index 325ee6af9..7a71b1d03 100644 --- a/Makefile.system +++ b/Makefile.system @@ -467,6 +467,17 @@ endif ifeq ($(ARCH), arm) NO_BINARY_MODE = 1 BINARY_DEFINED = 1 + +CCOMMON_OPT += -marm +FCOMMON_OPT += -marm + +ifeq ($(ARM_SOFT_FLOAT_ABI), 1) +CCOMMON_OPT += -mfloat-abi=softfp +FCOMMON_OPT += -mfloat-abi=softfp +else +CCOMMON_OPT += -mfloat-abi=hard +FCOMMON_OPT += -mfloat-abi=hard +endif endif ifeq ($(ARCH), arm64) diff --git a/common_arm.h b/common_arm.h index 6bf836835..375c4b8ae 100644 --- a/common_arm.h +++ b/common_arm.h @@ -112,6 +112,11 @@ REALNAME: #define PROFCODE +#ifdef __ARM_PCS +//-mfloat-abi=softfp +#define SOFT_FLOAT_ABI +#endif + #endif From 90e02ccf686c48b95be8c00716a101a4e788b308 Mon Sep 17 00:00:00 2001 From: Zhang Xianyi Date: Mon, 6 Mar 2017 22:16:13 +0800 Subject: [PATCH 2/3] Support ARM softfp ABI for sgemm on ARMV7. make ARM_SOFTFP_ABI=1 --- Makefile.arm | 8 ++++---- Makefile.system | 6 +++--- kernel/arm/sgemm_kernel_4x4_vfpv3.S | 24 ++++++++++++++++++++++-- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Makefile.arm b/Makefile.arm index 11f809222..c189b0c47 100644 --- a/Makefile.arm +++ b/Makefile.arm @@ -1,4 +1,4 @@ -ifeq logical or +#ifeq logical or ifeq ($(CORE), $(filter $(CORE),CORTEXA9 CORTEXA15)) ifeq ($(OSNAME), Android) CCOMMON_OPT += -mfpu=neon -march=armv7-a @@ -11,12 +11,12 @@ endif ifeq ($(CORE), ARMV7) ifeq ($(OSNAME), Android) -ifeq ($(ARM_SOFTFP), 1) +ifeq ($(ARM_SOFTFP_ABI), 1) CCOMMON_OPT += -mfpu=neon -march=armv7-a FCOMMON_OPT += -mfpu=neon -march=armv7-a else -CCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -Wl,--no-warn-mismatch -FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -Wl,--no-warn-mismatch +CCOMMON_OPT += -mfpu=neon -march=armv7-a -Wl,--no-warn-mismatch +FCOMMON_OPT += -mfpu=neon -march=armv7-a -Wl,--no-warn-mismatch endif else CCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a diff --git a/Makefile.system b/Makefile.system index c4fcc0139..cc7862996 100644 --- a/Makefile.system +++ b/Makefile.system @@ -480,9 +480,9 @@ BINARY_DEFINED = 1 CCOMMON_OPT += -marm FCOMMON_OPT += -marm -ifeq ($(ARM_SOFT_FLOAT_ABI), 1) -CCOMMON_OPT += -mfloat-abi=softfp -FCOMMON_OPT += -mfloat-abi=softfp +ifeq ($(ARM_SOFTFP_ABI), 1) +CCOMMON_OPT += -mfloat-abi=softfp -DARM_SOFTFP_ABI +FCOMMON_OPT += -mfloat-abi=softfp -DARM_SOFTFP_ABI else CCOMMON_OPT += -mfloat-abi=hard FCOMMON_OPT += -mfloat-abi=hard diff --git a/kernel/arm/sgemm_kernel_4x4_vfpv3.S b/kernel/arm/sgemm_kernel_4x4_vfpv3.S index 18527263d..86198ac90 100644 --- a/kernel/arm/sgemm_kernel_4x4_vfpv3.S +++ b/kernel/arm/sgemm_kernel_4x4_vfpv3.S @@ -58,8 +58,14 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define OLD_M r0 #define OLD_N r1 #define OLD_K r2 + +#ifdef ARM_SOFTFP_ABI +#define OLD_ALPHA r3 +//#define OLD_A +#else //hard #define OLD_A r3 #define OLD_ALPHA s0 +#endif /****************************************************** * [fp, #-128] - [fp, #-64] is reserved @@ -71,7 +77,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define M [fp, #-256 ] #define N [fp, #-260 ] #define K [fp, #-264 ] + +#ifndef ARM_SOFTFP_ABI #define A [fp, #-268 ] +#endif #define FP_ZERO [fp, #-240] #define FP_ZERO_0 [fp, #-240] @@ -79,10 +88,17 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define ALPHA [fp, #-280] +#ifdef ARM_SOFTFP_ABI +#define A [fp, #4 ] +#define B [fp, #8 ] +#define C [fp, #12 ] +#define OLD_LDC [fp, #16 ] +#else //hard #define B [fp, #4 ] #define C [fp, #8 ] #define OLD_LDC [fp, #12 ] - +#endif + #define I r0 #define J r1 #define L r2 @@ -854,9 +870,13 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. str OLD_M, M str OLD_N, N str OLD_K, K + +#ifdef ARM_SOFTFP_ABI + str OLD_ALPHA, ALPHA +#else //hard str OLD_A, A vstr OLD_ALPHA, ALPHA - +#endif sub r3, fp, #128 vstm r3, { s8 - s31} // store floating point registers From b5c96fcfcdc82945502a2303116a64d89985daf5 Mon Sep 17 00:00:00 2001 From: Zhang Xianyi Date: Mon, 20 Mar 2017 17:39:25 +0800 Subject: [PATCH 3/3] Support ARM SOFTFP ABI for saxpy, sdot, snrm2, sscal, sgemv, sger. --- kernel/arm/axpy_vfp.S | 18 ++++++++++++++++-- kernel/arm/gemv_n_vfpv3.S | 24 +++++++++++++++++++++++- kernel/arm/gemv_t_vfp.S | 20 ++++++++++++++++++++ kernel/arm/nrm2_vfpv3.S | 3 +++ kernel/arm/sdot_vfp.S | 8 +++++++- 5 files changed, 69 insertions(+), 4 deletions(-) diff --git a/kernel/arm/axpy_vfp.S b/kernel/arm/axpy_vfp.S index acc575707..8e5334f62 100644 --- a/kernel/arm/axpy_vfp.S +++ b/kernel/arm/axpy_vfp.S @@ -38,11 +38,18 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define STACKSIZE 256 +#ifndef ARM_SOFTFP_ABI +//hard #define OLD_INC_X [fp, #0 ] #define OLD_Y [fp, #4 ] #define OLD_INC_Y [fp, #8 ] - - +#else +#define OLD_X [fp, #0 ] +#define OLD_INC_X [fp, #4 ] +#define OLD_Y [fp, #8 ] +#define OLD_INC_Y [fp, #12 ] +#endif + #define N r0 #define Y r1 #define INC_X r2 @@ -363,6 +370,13 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. add fp, sp, #8 sub sp, sp, #STACKSIZE // reserve stack +#ifdef ARM_SOFTFP_ABI +#ifndef DOUBLE + vmov s0, r3 //move alpha to s0 + ldr X, OLD_X +#endif +#endif + ldr INC_X , OLD_INC_X ldr Y, OLD_Y ldr INC_Y , OLD_INC_Y diff --git a/kernel/arm/gemv_n_vfpv3.S b/kernel/arm/gemv_n_vfpv3.S index e7938e81c..93bf23e49 100644 --- a/kernel/arm/gemv_n_vfpv3.S +++ b/kernel/arm/gemv_n_vfpv3.S @@ -38,12 +38,25 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define STACKSIZE 256 +#ifndef ARM_SOFTFP_ABI +//hard #define OLD_LDA [fp, #0 ] #define X [fp, #4 ] #define OLD_INC_X [fp, #8 ] #define Y [fp, #12 ] #define OLD_INC_Y [fp, #16 ] #define OLD_A r3 +#else +#define OLD_A_SOFTFP [fp, #0 ] +#define OLD_LDA [fp, #4 ] +#define X [fp, #8 ] +#define OLD_INC_X [fp, #12 ] +#define Y [fp, #16 ] +#define OLD_INC_Y [fp, #20 ] +#define OLD_ALPHA r3 +#define OLD_A r3 +#endif + #define OLD_M r0 #define AO1 r0 @@ -552,9 +565,18 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cmp N, #0 ble gemvn_kernel_L999 +#ifndef DOUBLE +#ifdef ARM_SOFTFP_ABI + + vmov s0, OLD_ALPHA + ldr OLD_A, OLD_A_SOFTFP +#endif +#endif + str OLD_A, A str OLD_M, M - + + ldr INC_X , OLD_INC_X ldr INC_Y , OLD_INC_Y diff --git a/kernel/arm/gemv_t_vfp.S b/kernel/arm/gemv_t_vfp.S index c3b4e0525..816be54ff 100644 --- a/kernel/arm/gemv_t_vfp.S +++ b/kernel/arm/gemv_t_vfp.S @@ -38,12 +38,25 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define STACKSIZE 256 +#ifndef ARM_SOFTFP_ABI +//hard abi #define OLD_LDA [fp, #0 ] #define X [fp, #4 ] #define OLD_INC_X [fp, #8 ] #define Y [fp, #12 ] #define OLD_INC_Y [fp, #16 ] #define OLD_A r3 +#else +#define OLD_A_SOFTFP [fp, #0 ] +#define OLD_LDA [fp, #4 ] +#define X [fp, #8 ] +#define OLD_INC_X [fp, #12 ] +#define Y [fp, #16 ] +#define OLD_INC_Y [fp, #20 ] +#define OLD_ALPHA r3 +#define OLD_A r3 +#endif + #define OLD_N r1 #define M r0 @@ -505,6 +518,13 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cmp OLD_N, #0 ble gemvt_kernel_L999 +#ifndef DOUBLE +#ifdef ARM_SOFTFP_ABI + vmov s0, OLD_ALPHA + ldr OLD_A, OLD_A_SOFTFP +#endif +#endif + str OLD_A, A str OLD_N, N diff --git a/kernel/arm/nrm2_vfpv3.S b/kernel/arm/nrm2_vfpv3.S index f676f514a..7af966895 100644 --- a/kernel/arm/nrm2_vfpv3.S +++ b/kernel/arm/nrm2_vfpv3.S @@ -503,6 +503,9 @@ nrm2_kernel_L999: #else vsqrt.f32 s1, s1 vmul.f32 s0, s0, s1 +#ifdef ARM_SOFTFP_ABI + vmov r0, s0 +#endif #endif bx lr diff --git a/kernel/arm/sdot_vfp.S b/kernel/arm/sdot_vfp.S index aa6748c9f..f3abdc197 100644 --- a/kernel/arm/sdot_vfp.S +++ b/kernel/arm/sdot_vfp.S @@ -332,10 +332,16 @@ sdot_kernel_L999: vadd.f64 d0 , d0, d1 // set return value +#ifdef ARM_SOFTFP_ABI + vmov r0, r1, d0 +#endif + #else vadd.f32 s0 , s0, s1 // set return value - +#ifdef ARM_SOFTFP_ABI + vmov r0, s0 +#endif #endif sub sp, fp, #24 pop {r4 - r9, fp}