diff --git a/Makefile.arm b/Makefile.arm index 62bf275b9..c189b0c47 100644 --- a/Makefile.arm +++ b/Makefile.arm @@ -1,27 +1,32 @@ -# ifeq logical or +#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 -Wl,--no-warn-mismatch -FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -Wl,--no-warn-mismatch +ifeq ($(ARM_SOFTFP_ABI), 1) +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=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 +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 1a725dbdb..29d3efd53 100644 --- a/Makefile.system +++ b/Makefile.system @@ -482,6 +482,17 @@ endif ifeq ($(ARCH), arm) NO_BINARY_MODE = 1 BINARY_DEFINED = 1 + +CCOMMON_OPT += -marm +FCOMMON_OPT += -marm + +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 +endif endif ifeq ($(ARCH), arm64) diff --git a/common_arm.h b/common_arm.h index 27fa76b76..a17acb448 100644 --- a/common_arm.h +++ b/common_arm.h @@ -111,6 +111,11 @@ REALNAME: #define PROFCODE +#ifdef __ARM_PCS +//-mfloat-abi=softfp +#define SOFT_FLOAT_ABI +#endif + #endif 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} 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