Support ARM SOFTFP ABI for saxpy, sdot, snrm2, sscal, sgemv, sger.
authorZhang Xianyi <traits.zhang@gmail.com>
Mon, 20 Mar 2017 09:39:25 +0000 (17:39 +0800)
committerZhang Xianyi <traits.zhang@gmail.com>
Mon, 20 Mar 2017 09:39:25 +0000 (17:39 +0800)
kernel/arm/axpy_vfp.S
kernel/arm/gemv_n_vfpv3.S
kernel/arm/gemv_t_vfp.S
kernel/arm/nrm2_vfpv3.S
kernel/arm/sdot_vfp.S

index acc5757..8e5334f 100644 (file)
@@ -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
index e7938e8..93bf23e 100644 (file)
@@ -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
 
index c3b4e05..816be54 100644 (file)
@@ -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
 
index f676f51..7af9668 100644 (file)
@@ -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
index aa6748c..f3abdc1 100644 (file)
@@ -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}