| @@ -115,7 +115,7 @@ CGEMMONCOPYOBJ = cgemm_oncopy.o | |||||
| CGEMMOTCOPYOBJ = cgemm_otcopy.o | CGEMMOTCOPYOBJ = cgemm_otcopy.o | ||||
| ZGEMMKERNEL = zgemm_kernel_2x2_vfpv3.S | ZGEMMKERNEL = zgemm_kernel_2x2_vfpv3.S | ||||
| ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c | |||||
| ZGEMMONCOPY = zgemm_ncopy_2_vfpv3.S | |||||
| ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c | ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c | ||||
| ZGEMMONCOPYOBJ = zgemm_oncopy.o | ZGEMMONCOPYOBJ = zgemm_oncopy.o | ||||
| ZGEMMOTCOPYOBJ = zgemm_otcopy.o | ZGEMMOTCOPYOBJ = zgemm_otcopy.o | ||||
| @@ -77,7 +77,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| #define B [fp, #4 ] | #define B [fp, #4 ] | ||||
| #define C [fp, #8 ] | #define C [fp, #8 ] | ||||
| #define OLD_LDC [fp, #12 ] | |||||
| #define OLDdgemm_kernel_LDC [fp, #12 ] | |||||
| #define I r0 | #define I r0 | ||||
| #define J r1 | #define J r1 | ||||
| @@ -883,7 +883,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| sub r3, fp, #128 | sub r3, fp, #128 | ||||
| vstm r3, { d8 - d15} // store floating point registers | vstm r3, { d8 - d15} // store floating point registers | ||||
| ldr r3, OLD_LDC | |||||
| ldr r3, OLDdgemm_kernel_LDC | |||||
| lsl r3, r3, #3 // ldc = ldc * 8 | lsl r3, r3, #3 // ldc = ldc * 8 | ||||
| str r3, LDC | str r3, LDC | ||||
| @@ -892,9 +892,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| ldr J, N | ldr J, N | ||||
| asrs J, J, #2 // J = J / 4 | asrs J, J, #2 // J = J / 4 | ||||
| ble _L2_BEGIN | |||||
| ble dgemm_kernel_L2_BEGIN | |||||
| _L4_BEGIN: | |||||
| dgemm_kernel_L4_BEGIN: | |||||
| ldr CO1, C // CO1 = C | ldr CO1, C // CO1 = C | ||||
| ldr r4 , LDC | ldr r4 , LDC | ||||
| @@ -908,21 +908,19 @@ _L4_BEGIN: | |||||
| _L4_M4_BEGIN: | |||||
| dgemm_kernel_L4_M4_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| asrs I, I, #2 // I = I / 4 | asrs I, I, #2 // I = I / 4 | ||||
| ble _L4_M2_BEGIN | |||||
| ble dgemm_kernel_L4_M2_BEGIN | |||||
| _L4_M4_20: | |||||
| dgemm_kernel_L4_M4_20: | |||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| cmp L , #3 | |||||
| blt _L4_M4_30 | |||||
| .align 5 | |||||
| cmp L , #2 | |||||
| blt dgemm_kernel_L4_M4_32 | |||||
| KERNEL4x4_I | KERNEL4x4_I | ||||
| @@ -935,9 +933,11 @@ _L4_M4_20: | |||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| sub L, L, #2 | |||||
| subs L, L, #2 | |||||
| ble dgemm_kernel_L4_M4_22a | |||||
| .align 5 | |||||
| _L4_M4_22: | |||||
| dgemm_kernel_L4_M4_22: | |||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| @@ -950,55 +950,26 @@ _L4_M4_22: | |||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L4_M4_22 | |||||
| bgt dgemm_kernel_L4_M4_22 | |||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| dgemm_kernel_L4_M4_22a: | |||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_E | |||||
| b _L4_M4_44 | |||||
| _L4_M4_30: | |||||
| tst L, #3 | |||||
| ble _L4_M4_40 | |||||
| tst L, #2 | |||||
| ble _L4_M4_32 | |||||
| KERNEL4x4_I | |||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| KERNEL4x4_M1 | |||||
| KERNEL4x4_M2 | |||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_E | KERNEL4x4_E | ||||
| b _L4_M4_44 | |||||
| b dgemm_kernel_L4_M4_44 | |||||
| _L4_M4_32: | |||||
| dgemm_kernel_L4_M4_32: | |||||
| tst L, #1 | tst L, #1 | ||||
| ble _L4_M4_40 | |||||
| ble dgemm_kernel_L4_M4_40 | |||||
| KERNEL4x4_I | KERNEL4x4_I | ||||
| KERNEL4x4_M2 | KERNEL4x4_M2 | ||||
| @@ -1010,54 +981,54 @@ _L4_M4_32: | |||||
| KERNEL4x4_M1 | KERNEL4x4_M1 | ||||
| KERNEL4x4_E | KERNEL4x4_E | ||||
| b _L4_M4_44 | |||||
| b dgemm_kernel_L4_M4_44 | |||||
| _L4_M4_40: | |||||
| dgemm_kernel_L4_M4_40: | |||||
| INIT4x4 | INIT4x4 | ||||
| _L4_M4_44: | |||||
| dgemm_kernel_L4_M4_44: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L4_M4_100 | |||||
| ble dgemm_kernel_L4_M4_100 | |||||
| _L4_M4_46: | |||||
| dgemm_kernel_L4_M4_46: | |||||
| KERNEL4x4_SUB | KERNEL4x4_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bne _L4_M4_46 | |||||
| bne dgemm_kernel_L4_M4_46 | |||||
| _L4_M4_100: | |||||
| dgemm_kernel_L4_M4_100: | |||||
| SAVE4x4 | SAVE4x4 | ||||
| _L4_M4_END: | |||||
| dgemm_kernel_L4_M4_END: | |||||
| subs I, I, #1 | subs I, I, #1 | ||||
| bne _L4_M4_20 | |||||
| bne dgemm_kernel_L4_M4_20 | |||||
| _L4_M2_BEGIN: | |||||
| dgemm_kernel_L4_M2_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| tst I , #3 | tst I , #3 | ||||
| ble _L4_END | |||||
| ble dgemm_kernel_L4_END | |||||
| tst I, #2 // I = I / 2 | tst I, #2 // I = I / 2 | ||||
| ble _L4_M1_BEGIN | |||||
| ble dgemm_kernel_L4_M1_BEGIN | |||||
| _L4_M2_20: | |||||
| dgemm_kernel_L4_M2_20: | |||||
| INIT2x4 | INIT2x4 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L4_M2_40 | |||||
| ble dgemm_kernel_L4_M2_40 | |||||
| _L4_M2_22: | |||||
| dgemm_kernel_L4_M2_22: | |||||
| KERNEL2x4_SUB | KERNEL2x4_SUB | ||||
| KERNEL2x4_SUB | KERNEL2x4_SUB | ||||
| @@ -1070,42 +1041,42 @@ _L4_M2_22: | |||||
| KERNEL2x4_SUB | KERNEL2x4_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L4_M2_22 | |||||
| bgt dgemm_kernel_L4_M2_22 | |||||
| _L4_M2_40: | |||||
| dgemm_kernel_L4_M2_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L4_M2_100 | |||||
| ble dgemm_kernel_L4_M2_100 | |||||
| _L4_M2_42: | |||||
| dgemm_kernel_L4_M2_42: | |||||
| KERNEL2x4_SUB | KERNEL2x4_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L4_M2_42 | |||||
| bgt dgemm_kernel_L4_M2_42 | |||||
| _L4_M2_100: | |||||
| dgemm_kernel_L4_M2_100: | |||||
| SAVE2x4 | SAVE2x4 | ||||
| _L4_M2_END: | |||||
| dgemm_kernel_L4_M2_END: | |||||
| _L4_M1_BEGIN: | |||||
| dgemm_kernel_L4_M1_BEGIN: | |||||
| tst I, #1 // I = I % 2 | tst I, #1 // I = I % 2 | ||||
| ble _L4_END | |||||
| ble dgemm_kernel_L4_END | |||||
| _L4_M1_20: | |||||
| dgemm_kernel_L4_M1_20: | |||||
| INIT1x4 | INIT1x4 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L4_M1_40 | |||||
| ble dgemm_kernel_L4_M1_40 | |||||
| _L4_M1_22: | |||||
| dgemm_kernel_L4_M1_22: | |||||
| KERNEL1x4_SUB | KERNEL1x4_SUB | ||||
| KERNEL1x4_SUB | KERNEL1x4_SUB | ||||
| KERNEL1x4_SUB | KERNEL1x4_SUB | ||||
| @@ -1117,27 +1088,27 @@ _L4_M1_22: | |||||
| KERNEL1x4_SUB | KERNEL1x4_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L4_M1_22 | |||||
| bgt dgemm_kernel_L4_M1_22 | |||||
| _L4_M1_40: | |||||
| dgemm_kernel_L4_M1_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L4_M1_100 | |||||
| ble dgemm_kernel_L4_M1_100 | |||||
| _L4_M1_42: | |||||
| dgemm_kernel_L4_M1_42: | |||||
| KERNEL1x4_SUB | KERNEL1x4_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L4_M1_42 | |||||
| bgt dgemm_kernel_L4_M1_42 | |||||
| _L4_M1_100: | |||||
| dgemm_kernel_L4_M1_100: | |||||
| SAVE1x4 | SAVE1x4 | ||||
| _L4_END: | |||||
| dgemm_kernel_L4_END: | |||||
| mov r3, BC | mov r3, BC | ||||
| mov r4, K1 | mov r4, K1 | ||||
| @@ -1146,20 +1117,20 @@ _L4_END: | |||||
| mov BC, r3 | mov BC, r3 | ||||
| subs J , #1 // j-- | subs J , #1 // j-- | ||||
| bgt _L4_BEGIN | |||||
| bgt dgemm_kernel_L4_BEGIN | |||||
| /*********************************************************************************************/ | /*********************************************************************************************/ | ||||
| _L2_BEGIN: | |||||
| dgemm_kernel_L2_BEGIN: | |||||
| ldr J , N | ldr J , N | ||||
| tst J , #3 | tst J , #3 | ||||
| ble _L999 | |||||
| ble dgemm_kernel_L999 | |||||
| tst J , #2 | tst J , #2 | ||||
| ble _L1_BEGIN | |||||
| ble dgemm_kernel_L1_BEGIN | |||||
| ldr CO1, C // CO1 = C | ldr CO1, C // CO1 = C | ||||
| ldr r4 , LDC | ldr r4 , LDC | ||||
| @@ -1168,28 +1139,25 @@ _L2_BEGIN: | |||||
| str r3 , C // store C | str r3 , C // store C | ||||
| ldr AO, A // AO = A | ldr AO, A // AO = A | ||||
| //pld [AO , #A_PRE-96] | |||||
| //pld [AO , #A_PRE-64] | |||||
| //pld [AO , #A_PRE-32] | |||||
| _L2_M4_BEGIN: | |||||
| dgemm_kernel_L2_M4_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| asrs I, I, #2 // I = I / 4 | asrs I, I, #2 // I = I / 4 | ||||
| ble _L2_M2_BEGIN | |||||
| ble dgemm_kernel_L2_M2_BEGIN | |||||
| _L2_M4_20: | |||||
| dgemm_kernel_L2_M4_20: | |||||
| INIT4x2 | INIT4x2 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L2_M4_40 | |||||
| ble dgemm_kernel_L2_M4_40 | |||||
| .align 5 | .align 5 | ||||
| _L2_M4_22: | |||||
| dgemm_kernel_L2_M4_22: | |||||
| KERNEL4x2_SUB | KERNEL4x2_SUB | ||||
| KERNEL4x2_SUB | KERNEL4x2_SUB | ||||
| KERNEL4x2_SUB | KERNEL4x2_SUB | ||||
| @@ -1201,49 +1169,49 @@ _L2_M4_22: | |||||
| KERNEL4x2_SUB | KERNEL4x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M4_22 | |||||
| bgt dgemm_kernel_L2_M4_22 | |||||
| _L2_M4_40: | |||||
| dgemm_kernel_L2_M4_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L2_M4_100 | |||||
| ble dgemm_kernel_L2_M4_100 | |||||
| _L2_M4_42: | |||||
| dgemm_kernel_L2_M4_42: | |||||
| KERNEL4x2_SUB | KERNEL4x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M4_42 | |||||
| bgt dgemm_kernel_L2_M4_42 | |||||
| _L2_M4_100: | |||||
| dgemm_kernel_L2_M4_100: | |||||
| SAVE4x2 | SAVE4x2 | ||||
| _L2_M4_END: | |||||
| dgemm_kernel_L2_M4_END: | |||||
| subs I, I, #1 | subs I, I, #1 | ||||
| bgt _L2_M4_20 | |||||
| bgt dgemm_kernel_L2_M4_20 | |||||
| _L2_M2_BEGIN: | |||||
| dgemm_kernel_L2_M2_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| tst I , #3 | tst I , #3 | ||||
| ble _L2_END | |||||
| ble dgemm_kernel_L2_END | |||||
| tst I, #2 // I = I / 2 | tst I, #2 // I = I / 2 | ||||
| ble _L2_M1_BEGIN | |||||
| ble dgemm_kernel_L2_M1_BEGIN | |||||
| _L2_M2_20: | |||||
| dgemm_kernel_L2_M2_20: | |||||
| INIT2x2 | INIT2x2 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L2_M2_40 | |||||
| ble dgemm_kernel_L2_M2_40 | |||||
| _L2_M2_22: | |||||
| dgemm_kernel_L2_M2_22: | |||||
| KERNEL2x2_SUB | KERNEL2x2_SUB | ||||
| KERNEL2x2_SUB | KERNEL2x2_SUB | ||||
| @@ -1256,42 +1224,42 @@ _L2_M2_22: | |||||
| KERNEL2x2_SUB | KERNEL2x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M2_22 | |||||
| bgt dgemm_kernel_L2_M2_22 | |||||
| _L2_M2_40: | |||||
| dgemm_kernel_L2_M2_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L2_M2_100 | |||||
| ble dgemm_kernel_L2_M2_100 | |||||
| _L2_M2_42: | |||||
| dgemm_kernel_L2_M2_42: | |||||
| KERNEL2x2_SUB | KERNEL2x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M2_42 | |||||
| bgt dgemm_kernel_L2_M2_42 | |||||
| _L2_M2_100: | |||||
| dgemm_kernel_L2_M2_100: | |||||
| SAVE2x2 | SAVE2x2 | ||||
| _L2_M2_END: | |||||
| dgemm_kernel_L2_M2_END: | |||||
| _L2_M1_BEGIN: | |||||
| dgemm_kernel_L2_M1_BEGIN: | |||||
| tst I, #1 // I = I % 2 | tst I, #1 // I = I % 2 | ||||
| ble _L2_END | |||||
| ble dgemm_kernel_L2_END | |||||
| _L2_M1_20: | |||||
| dgemm_kernel_L2_M1_20: | |||||
| INIT1x2 | INIT1x2 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L2_M1_40 | |||||
| ble dgemm_kernel_L2_M1_40 | |||||
| _L2_M1_22: | |||||
| dgemm_kernel_L2_M1_22: | |||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| @@ -1303,27 +1271,27 @@ _L2_M1_22: | |||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M1_22 | |||||
| bgt dgemm_kernel_L2_M1_22 | |||||
| _L2_M1_40: | |||||
| dgemm_kernel_L2_M1_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L2_M1_100 | |||||
| ble dgemm_kernel_L2_M1_100 | |||||
| _L2_M1_42: | |||||
| dgemm_kernel_L2_M1_42: | |||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M1_42 | |||||
| bgt dgemm_kernel_L2_M1_42 | |||||
| _L2_M1_100: | |||||
| dgemm_kernel_L2_M1_100: | |||||
| SAVE1x2 | SAVE1x2 | ||||
| _L2_END: | |||||
| dgemm_kernel_L2_END: | |||||
| mov r3, BC | mov r3, BC | ||||
| mov r4, K1 | mov r4, K1 | ||||
| @@ -1333,11 +1301,11 @@ _L2_END: | |||||
| /*********************************************************************************************/ | /*********************************************************************************************/ | ||||
| _L1_BEGIN: | |||||
| dgemm_kernel_L1_BEGIN: | |||||
| ldr J , N | ldr J , N | ||||
| tst J , #1 | tst J , #1 | ||||
| ble _L999 | |||||
| ble dgemm_kernel_L999 | |||||
| ldr CO1, C // CO1 = C | ldr CO1, C // CO1 = C | ||||
| @@ -1346,28 +1314,25 @@ _L1_BEGIN: | |||||
| str r3 , C // store C | str r3 , C // store C | ||||
| ldr AO, A // AO = A | ldr AO, A // AO = A | ||||
| //pld [AO , #A_PRE-96] | |||||
| //pld [AO , #A_PRE-64] | |||||
| //pld [AO , #A_PRE-32] | |||||
| _L1_M4_BEGIN: | |||||
| dgemm_kernel_L1_M4_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| asrs I, I, #2 // I = I / 4 | asrs I, I, #2 // I = I / 4 | ||||
| ble _L1_M2_BEGIN | |||||
| ble dgemm_kernel_L1_M2_BEGIN | |||||
| _L1_M4_20: | |||||
| dgemm_kernel_L1_M4_20: | |||||
| INIT4x1 | INIT4x1 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L1_M4_40 | |||||
| ble dgemm_kernel_L1_M4_40 | |||||
| .align 5 | .align 5 | ||||
| _L1_M4_22: | |||||
| dgemm_kernel_L1_M4_22: | |||||
| KERNEL4x1_SUB | KERNEL4x1_SUB | ||||
| KERNEL4x1_SUB | KERNEL4x1_SUB | ||||
| KERNEL4x1_SUB | KERNEL4x1_SUB | ||||
| @@ -1379,49 +1344,49 @@ _L1_M4_22: | |||||
| KERNEL4x1_SUB | KERNEL4x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M4_22 | |||||
| bgt dgemm_kernel_L1_M4_22 | |||||
| _L1_M4_40: | |||||
| dgemm_kernel_L1_M4_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L1_M4_100 | |||||
| ble dgemm_kernel_L1_M4_100 | |||||
| _L1_M4_42: | |||||
| dgemm_kernel_L1_M4_42: | |||||
| KERNEL4x1_SUB | KERNEL4x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M4_42 | |||||
| bgt dgemm_kernel_L1_M4_42 | |||||
| _L1_M4_100: | |||||
| dgemm_kernel_L1_M4_100: | |||||
| SAVE4x1 | SAVE4x1 | ||||
| _L1_M4_END: | |||||
| dgemm_kernel_L1_M4_END: | |||||
| subs I, I, #1 | subs I, I, #1 | ||||
| bgt _L1_M4_20 | |||||
| bgt dgemm_kernel_L1_M4_20 | |||||
| _L1_M2_BEGIN: | |||||
| dgemm_kernel_L1_M2_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| tst I , #3 | tst I , #3 | ||||
| ble _L1_END | |||||
| ble dgemm_kernel_L1_END | |||||
| tst I, #2 // I = I / 2 | tst I, #2 // I = I / 2 | ||||
| ble _L1_M1_BEGIN | |||||
| ble dgemm_kernel_L1_M1_BEGIN | |||||
| _L1_M2_20: | |||||
| dgemm_kernel_L1_M2_20: | |||||
| INIT2x1 | INIT2x1 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L1_M2_40 | |||||
| ble dgemm_kernel_L1_M2_40 | |||||
| _L1_M2_22: | |||||
| dgemm_kernel_L1_M2_22: | |||||
| KERNEL2x1_SUB | KERNEL2x1_SUB | ||||
| KERNEL2x1_SUB | KERNEL2x1_SUB | ||||
| @@ -1434,42 +1399,42 @@ _L1_M2_22: | |||||
| KERNEL2x1_SUB | KERNEL2x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M2_22 | |||||
| bgt dgemm_kernel_L1_M2_22 | |||||
| _L1_M2_40: | |||||
| dgemm_kernel_L1_M2_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L1_M2_100 | |||||
| ble dgemm_kernel_L1_M2_100 | |||||
| _L1_M2_42: | |||||
| dgemm_kernel_L1_M2_42: | |||||
| KERNEL2x1_SUB | KERNEL2x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M2_42 | |||||
| bgt dgemm_kernel_L1_M2_42 | |||||
| _L1_M2_100: | |||||
| dgemm_kernel_L1_M2_100: | |||||
| SAVE2x1 | SAVE2x1 | ||||
| _L1_M2_END: | |||||
| dgemm_kernel_L1_M2_END: | |||||
| _L1_M1_BEGIN: | |||||
| dgemm_kernel_L1_M1_BEGIN: | |||||
| tst I, #1 // I = I % 2 | tst I, #1 // I = I % 2 | ||||
| ble _L1_END | |||||
| ble dgemm_kernel_L1_END | |||||
| _L1_M1_20: | |||||
| dgemm_kernel_L1_M1_20: | |||||
| INIT1x1 | INIT1x1 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L1_M1_40 | |||||
| ble dgemm_kernel_L1_M1_40 | |||||
| _L1_M1_22: | |||||
| dgemm_kernel_L1_M1_22: | |||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| @@ -1481,30 +1446,30 @@ _L1_M1_22: | |||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M1_22 | |||||
| bgt dgemm_kernel_L1_M1_22 | |||||
| _L1_M1_40: | |||||
| dgemm_kernel_L1_M1_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L1_M1_100 | |||||
| ble dgemm_kernel_L1_M1_100 | |||||
| _L1_M1_42: | |||||
| dgemm_kernel_L1_M1_42: | |||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M1_42 | |||||
| bgt dgemm_kernel_L1_M1_42 | |||||
| _L1_M1_100: | |||||
| dgemm_kernel_L1_M1_100: | |||||
| SAVE1x1 | SAVE1x1 | ||||
| _L1_END: | |||||
| dgemm_kernel_L1_END: | |||||
| _L999: | |||||
| dgemm_kernel_L999: | |||||
| sub r3, fp, #128 | sub r3, fp, #128 | ||||
| vldm r3, { d8 - d15} // restore floating point registers | vldm r3, { d8 - d15} // restore floating point registers | ||||
| @@ -26,10 +26,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| *****************************************************************************/ | *****************************************************************************/ | ||||
| /************************************************************************************** | /************************************************************************************** | ||||
| * 2013/10/11 Saar | |||||
| * BLASTEST : xOK | |||||
| * CTEST : xOK | |||||
| * TEST : xOK | |||||
| * 2013/11/05 Saar | |||||
| * BLASTEST : OK | |||||
| * CTEST : OK | |||||
| * TEST : OK | |||||
| * | * | ||||
| **************************************************************************************/ | **************************************************************************************/ | ||||
| @@ -68,7 +68,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| #define I r3 | #define I r3 | ||||
| #define J r12 | #define J r12 | ||||
| #define A_PRE 96 | |||||
| #define A_PRE 256 | |||||
| /************************************************************************************** | /************************************************************************************** | ||||
| * Macro definitions | * Macro definitions | ||||
| @@ -76,6 +76,11 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| .macro COPY4x4 | .macro COPY4x4 | ||||
| pld [ AO1, #A_PRE ] | |||||
| pld [ AO2, #A_PRE ] | |||||
| pld [ AO3, #A_PRE ] | |||||
| pld [ AO4, #A_PRE ] | |||||
| fldd d0 , [ AO1, #0 ] | fldd d0 , [ AO1, #0 ] | ||||
| fldd d1 , [ AO2, #0 ] | fldd d1 , [ AO2, #0 ] | ||||
| fldd d2 , [ AO3, #0 ] | fldd d2 , [ AO3, #0 ] | ||||
| @@ -199,12 +204,12 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| ldr BO, B | ldr BO, B | ||||
| _L4_BEGIN: | |||||
| dgemm_ncopy_L4_BEGIN: | |||||
| asrs J, N, #2 // J = N / 4 | asrs J, N, #2 // J = N / 4 | ||||
| ble _L2_BEGIN | |||||
| ble dgemm_ncopy_L2_BEGIN | |||||
| _L4_M4_BEGIN: | |||||
| dgemm_ncopy_L4_M4_BEGIN: | |||||
| mov AO1, A // AO1 = A | mov AO1, A // AO1 = A | ||||
| ldr r4 , LDA | ldr r4 , LDA | ||||
| @@ -214,47 +219,47 @@ _L4_M4_BEGIN: | |||||
| add A , AO4, r4 // A = A + 4 * LDA | add A , AO4, r4 // A = A + 4 * LDA | ||||
| asrs I, M, #2 // I = M / 4 | asrs I, M, #2 // I = M / 4 | ||||
| ble _L4_M4_40 | |||||
| ble dgemm_ncopy_L4_M4_40 | |||||
| _L4_M4_20: | |||||
| dgemm_ncopy_L4_M4_20: | |||||
| COPY4x4 | COPY4x4 | ||||
| subs I , I , #1 | subs I , I , #1 | ||||
| bne _L4_M4_20 | |||||
| bne dgemm_ncopy_L4_M4_20 | |||||
| _L4_M4_40: | |||||
| dgemm_ncopy_L4_M4_40: | |||||
| ands I, M , #3 | ands I, M , #3 | ||||
| ble _L4_M4_END | |||||
| ble dgemm_ncopy_L4_M4_END | |||||
| _L4_M4_60: | |||||
| dgemm_ncopy_L4_M4_60: | |||||
| COPY1x4 | COPY1x4 | ||||
| subs I , I , #1 | subs I , I , #1 | ||||
| bne _L4_M4_60 | |||||
| bne dgemm_ncopy_L4_M4_60 | |||||
| _L4_M4_END: | |||||
| dgemm_ncopy_L4_M4_END: | |||||
| subs J , J, #1 // j-- | subs J , J, #1 // j-- | ||||
| bne _L4_M4_BEGIN | |||||
| bne dgemm_ncopy_L4_M4_BEGIN | |||||
| /*********************************************************************************************/ | /*********************************************************************************************/ | ||||
| _L2_BEGIN: | |||||
| dgemm_ncopy_L2_BEGIN: | |||||
| tst N, #3 | tst N, #3 | ||||
| ble _L999 | |||||
| ble dgemm_ncopy_L999 | |||||
| tst N, #2 | tst N, #2 | ||||
| ble _L1_BEGIN | |||||
| ble dgemm_ncopy_L1_BEGIN | |||||
| _L2_M4_BEGIN: | |||||
| dgemm_ncopy_L2_M4_BEGIN: | |||||
| mov AO1, A // AO1 = A | mov AO1, A // AO1 = A | ||||
| ldr r4 , LDA | ldr r4 , LDA | ||||
| @@ -262,75 +267,75 @@ _L2_M4_BEGIN: | |||||
| add A , AO2, r4 // A = A + 2 * LDA | add A , AO2, r4 // A = A + 2 * LDA | ||||
| asrs I, M, #2 // I = M / 4 | asrs I, M, #2 // I = M / 4 | ||||
| ble _L2_M4_40 | |||||
| ble dgemm_ncopy_L2_M4_40 | |||||
| _L2_M4_20: | |||||
| dgemm_ncopy_L2_M4_20: | |||||
| COPY4x2 | COPY4x2 | ||||
| subs I , I , #1 | subs I , I , #1 | ||||
| bne _L2_M4_20 | |||||
| bne dgemm_ncopy_L2_M4_20 | |||||
| _L2_M4_40: | |||||
| dgemm_ncopy_L2_M4_40: | |||||
| ands I, M , #3 | ands I, M , #3 | ||||
| ble _L2_M4_END | |||||
| ble dgemm_ncopy_L2_M4_END | |||||
| _L2_M4_60: | |||||
| dgemm_ncopy_L2_M4_60: | |||||
| COPY1x2 | COPY1x2 | ||||
| subs I , I , #1 | subs I , I , #1 | ||||
| bne _L2_M4_60 | |||||
| bne dgemm_ncopy_L2_M4_60 | |||||
| _L2_M4_END: | |||||
| dgemm_ncopy_L2_M4_END: | |||||
| /*********************************************************************************************/ | /*********************************************************************************************/ | ||||
| _L1_BEGIN: | |||||
| dgemm_ncopy_L1_BEGIN: | |||||
| tst N, #1 | tst N, #1 | ||||
| ble _L999 | |||||
| ble dgemm_ncopy_L999 | |||||
| _L1_M4_BEGIN: | |||||
| dgemm_ncopy_L1_M4_BEGIN: | |||||
| mov AO1, A // AO1 = A | mov AO1, A // AO1 = A | ||||
| ldr r4 , LDA | ldr r4 , LDA | ||||
| add A , AO1, r4 // A = A + 1 * LDA | add A , AO1, r4 // A = A + 1 * LDA | ||||
| asrs I, M, #2 // I = M / 4 | asrs I, M, #2 // I = M / 4 | ||||
| ble _L1_M4_40 | |||||
| ble dgemm_ncopy_L1_M4_40 | |||||
| _L1_M4_20: | |||||
| dgemm_ncopy_L1_M4_20: | |||||
| COPY4x1 | COPY4x1 | ||||
| subs I , I , #1 | subs I , I , #1 | ||||
| bne _L1_M4_20 | |||||
| bne dgemm_ncopy_L1_M4_20 | |||||
| _L1_M4_40: | |||||
| dgemm_ncopy_L1_M4_40: | |||||
| ands I, M , #3 | ands I, M , #3 | ||||
| ble _L1_M4_END | |||||
| ble dgemm_ncopy_L1_M4_END | |||||
| _L1_M4_60: | |||||
| dgemm_ncopy_L1_M4_60: | |||||
| COPY1x1 | COPY1x1 | ||||
| subs I , I , #1 | subs I , I , #1 | ||||
| bne _L1_M4_60 | |||||
| bne dgemm_ncopy_L1_M4_60 | |||||
| _L1_M4_END: | |||||
| dgemm_ncopy_L1_M4_END: | |||||
| _L999: | |||||
| dgemm_ncopy_L999: | |||||
| sub r3, fp, #128 | sub r3, fp, #128 | ||||
| vldm r3, { d8 - d15} // restore floating point registers | vldm r3, { d8 - d15} // restore floating point registers | ||||
| @@ -26,7 +26,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| *****************************************************************************/ | *****************************************************************************/ | ||||
| /************************************************************************************** | /************************************************************************************** | ||||
| * 2013/11/02 Saar | |||||
| * 2013/11/05 Saar | |||||
| * BLASTEST : OK | * BLASTEST : OK | ||||
| * CTEST : OK | * CTEST : OK | ||||
| * TEST : OK | * TEST : OK | ||||
| @@ -924,9 +924,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| ldr J, N | ldr J, N | ||||
| asrs J, J, #1 // J = J / 2 | asrs J, J, #1 // J = J / 2 | ||||
| ble _L1_BEGIN | |||||
| ble zgemm_kernel_L1_BEGIN | |||||
| _L2_BEGIN: | |||||
| zgemm_kernel_L2_BEGIN: | |||||
| ldr CO1, C // CO1 = C | ldr CO1, C // CO1 = C | ||||
| ldr r4 , LDC | ldr r4 , LDC | ||||
| @@ -940,19 +940,19 @@ _L2_BEGIN: | |||||
| _L2_M2_BEGIN: | |||||
| zgemm_kernel_L2_M2_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| asrs I, I, #1 // I = I / 2 | asrs I, I, #1 // I = I / 2 | ||||
| ble _L2_M1_BEGIN | |||||
| ble zgemm_kernel_L2_M1_BEGIN | |||||
| _L2_M2_20: | |||||
| zgemm_kernel_L2_M2_20: | |||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| cmp L , #3 | cmp L , #3 | ||||
| blt _L2_M2_30 | |||||
| blt zgemm_kernel_L2_M2_30 | |||||
| .align 5 | .align 5 | ||||
| @@ -969,7 +969,7 @@ _L2_M2_20: | |||||
| sub L, L, #2 | sub L, L, #2 | ||||
| _L2_M2_22: | |||||
| zgemm_kernel_L2_M2_22: | |||||
| KERNEL2x2_M1 | KERNEL2x2_M1 | ||||
| KERNEL2x2_M2 | KERNEL2x2_M2 | ||||
| @@ -982,7 +982,7 @@ _L2_M2_22: | |||||
| KERNEL2x2_M2 | KERNEL2x2_M2 | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M2_22 | |||||
| bgt zgemm_kernel_L2_M2_22 | |||||
| KERNEL2x2_M1 | KERNEL2x2_M1 | ||||
| KERNEL2x2_M2 | KERNEL2x2_M2 | ||||
| @@ -994,15 +994,15 @@ _L2_M2_22: | |||||
| KERNEL2x2_M1 | KERNEL2x2_M1 | ||||
| KERNEL2x2_E | KERNEL2x2_E | ||||
| b _L2_M2_44 | |||||
| b zgemm_kernel_L2_M2_44 | |||||
| _L2_M2_30: | |||||
| zgemm_kernel_L2_M2_30: | |||||
| tst L, #3 | tst L, #3 | ||||
| ble _L2_M2_40 | |||||
| ble zgemm_kernel_L2_M2_40 | |||||
| tst L, #2 | tst L, #2 | ||||
| ble _L2_M2_32 | |||||
| ble zgemm_kernel_L2_M2_32 | |||||
| KERNEL2x2_I | KERNEL2x2_I | ||||
| KERNEL2x2_M2 | KERNEL2x2_M2 | ||||
| @@ -1025,12 +1025,12 @@ _L2_M2_30: | |||||
| KERNEL2x2_M1 | KERNEL2x2_M1 | ||||
| KERNEL2x2_E | KERNEL2x2_E | ||||
| b _L2_M2_44 | |||||
| b zgemm_kernel_L2_M2_44 | |||||
| _L2_M2_32: | |||||
| zgemm_kernel_L2_M2_32: | |||||
| tst L, #1 | tst L, #1 | ||||
| ble _L2_M2_40 | |||||
| ble zgemm_kernel_L2_M2_40 | |||||
| KERNEL2x2_I | KERNEL2x2_I | ||||
| KERNEL2x2_M2 | KERNEL2x2_M2 | ||||
| @@ -1042,51 +1042,51 @@ _L2_M2_32: | |||||
| KERNEL2x2_M1 | KERNEL2x2_M1 | ||||
| KERNEL2x2_E | KERNEL2x2_E | ||||
| b _L2_M2_44 | |||||
| b zgemm_kernel_L2_M2_44 | |||||
| _L2_M2_40: | |||||
| zgemm_kernel_L2_M2_40: | |||||
| INIT2x2 | INIT2x2 | ||||
| _L2_M2_44: | |||||
| zgemm_kernel_L2_M2_44: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L2_M2_100 | |||||
| ble zgemm_kernel_L2_M2_100 | |||||
| _L2_M2_46: | |||||
| zgemm_kernel_L2_M2_46: | |||||
| KERNEL2x2_SUB | KERNEL2x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bne _L2_M2_46 | |||||
| bne zgemm_kernel_L2_M2_46 | |||||
| _L2_M2_100: | |||||
| zgemm_kernel_L2_M2_100: | |||||
| SAVE2x2 | SAVE2x2 | ||||
| _L2_M2_END: | |||||
| zgemm_kernel_L2_M2_END: | |||||
| subs I, I, #1 | subs I, I, #1 | ||||
| bne _L2_M2_20 | |||||
| bne zgemm_kernel_L2_M2_20 | |||||
| _L2_M1_BEGIN: | |||||
| zgemm_kernel_L2_M1_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| tst I, #1 // I = I % 2 | tst I, #1 // I = I % 2 | ||||
| ble _L2_END | |||||
| ble zgemm_kernel_L2_END | |||||
| _L2_M1_20: | |||||
| zgemm_kernel_L2_M1_20: | |||||
| INIT1x2 | INIT1x2 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L2_M1_40 | |||||
| ble zgemm_kernel_L2_M1_40 | |||||
| _L2_M1_22: | |||||
| zgemm_kernel_L2_M1_22: | |||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| @@ -1099,27 +1099,27 @@ _L2_M1_22: | |||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M1_22 | |||||
| bgt zgemm_kernel_L2_M1_22 | |||||
| _L2_M1_40: | |||||
| zgemm_kernel_L2_M1_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L2_M1_100 | |||||
| ble zgemm_kernel_L2_M1_100 | |||||
| _L2_M1_42: | |||||
| zgemm_kernel_L2_M1_42: | |||||
| KERNEL1x2_SUB | KERNEL1x2_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L2_M1_42 | |||||
| bgt zgemm_kernel_L2_M1_42 | |||||
| _L2_M1_100: | |||||
| zgemm_kernel_L2_M1_100: | |||||
| SAVE1x2 | SAVE1x2 | ||||
| _L2_END: | |||||
| zgemm_kernel_L2_END: | |||||
| mov r3, BC | mov r3, BC | ||||
| mov r4, K1 | mov r4, K1 | ||||
| @@ -1128,17 +1128,17 @@ _L2_END: | |||||
| mov BC, r3 | mov BC, r3 | ||||
| subs J , #1 // j-- | subs J , #1 // j-- | ||||
| bgt _L2_BEGIN | |||||
| bgt zgemm_kernel_L2_BEGIN | |||||
| /*********************************************************************************************/ | /*********************************************************************************************/ | ||||
| _L1_BEGIN: | |||||
| zgemm_kernel_L1_BEGIN: | |||||
| ldr J , N | ldr J , N | ||||
| tst J , #1 | tst J , #1 | ||||
| ble _L999 | |||||
| ble zgemm_kernel_L999 | |||||
| ldr CO1, C // CO1 = C | ldr CO1, C // CO1 = C | ||||
| @@ -1148,19 +1148,19 @@ _L1_BEGIN: | |||||
| ldr AO, A // AO = A | ldr AO, A // AO = A | ||||
| _L1_M2_BEGIN: | |||||
| zgemm_kernel_L1_M2_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| asrs I, I, #1 // I = I / 2 | asrs I, I, #1 // I = I / 2 | ||||
| ble _L1_M1_BEGIN | |||||
| ble zgemm_kernel_L1_M1_BEGIN | |||||
| _L1_M2_20: | |||||
| zgemm_kernel_L1_M2_20: | |||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| cmp L , #3 | cmp L , #3 | ||||
| blt _L1_M2_30 | |||||
| blt zgemm_kernel_L1_M2_30 | |||||
| .align 5 | .align 5 | ||||
| @@ -1177,7 +1177,7 @@ _L1_M2_20: | |||||
| sub L, L, #2 | sub L, L, #2 | ||||
| _L1_M2_22: | |||||
| zgemm_kernel_L1_M2_22: | |||||
| KERNEL2x1_M1 | KERNEL2x1_M1 | ||||
| KERNEL2x1_M2 | KERNEL2x1_M2 | ||||
| @@ -1190,7 +1190,7 @@ _L1_M2_22: | |||||
| KERNEL2x1_M2 | KERNEL2x1_M2 | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M2_22 | |||||
| bgt zgemm_kernel_L1_M2_22 | |||||
| KERNEL2x1_M1 | KERNEL2x1_M1 | ||||
| KERNEL2x1_M2 | KERNEL2x1_M2 | ||||
| @@ -1202,15 +1202,15 @@ _L1_M2_22: | |||||
| KERNEL2x1_M1 | KERNEL2x1_M1 | ||||
| KERNEL2x1_E | KERNEL2x1_E | ||||
| b _L1_M2_44 | |||||
| b zgemm_kernel_L1_M2_44 | |||||
| _L1_M2_30: | |||||
| zgemm_kernel_L1_M2_30: | |||||
| tst L, #3 | tst L, #3 | ||||
| ble _L1_M2_40 | |||||
| ble zgemm_kernel_L1_M2_40 | |||||
| tst L, #2 | tst L, #2 | ||||
| ble _L1_M2_32 | |||||
| ble zgemm_kernel_L1_M2_32 | |||||
| KERNEL2x1_I | KERNEL2x1_I | ||||
| KERNEL2x1_M2 | KERNEL2x1_M2 | ||||
| @@ -1233,12 +1233,12 @@ _L1_M2_30: | |||||
| KERNEL2x1_M1 | KERNEL2x1_M1 | ||||
| KERNEL2x1_E | KERNEL2x1_E | ||||
| b _L1_M2_44 | |||||
| b zgemm_kernel_L1_M2_44 | |||||
| _L1_M2_32: | |||||
| zgemm_kernel_L1_M2_32: | |||||
| tst L, #1 | tst L, #1 | ||||
| ble _L1_M2_40 | |||||
| ble zgemm_kernel_L1_M2_40 | |||||
| KERNEL2x1_I | KERNEL2x1_I | ||||
| KERNEL2x1_M2 | KERNEL2x1_M2 | ||||
| @@ -1250,51 +1250,51 @@ _L1_M2_32: | |||||
| KERNEL2x1_M1 | KERNEL2x1_M1 | ||||
| KERNEL2x1_E | KERNEL2x1_E | ||||
| b _L1_M2_44 | |||||
| b zgemm_kernel_L1_M2_44 | |||||
| _L1_M2_40: | |||||
| zgemm_kernel_L1_M2_40: | |||||
| INIT2x1 | INIT2x1 | ||||
| _L1_M2_44: | |||||
| zgemm_kernel_L1_M2_44: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L1_M2_100 | |||||
| ble zgemm_kernel_L1_M2_100 | |||||
| _L1_M2_46: | |||||
| zgemm_kernel_L1_M2_46: | |||||
| KERNEL2x1_SUB | KERNEL2x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bne _L1_M2_46 | |||||
| bne zgemm_kernel_L1_M2_46 | |||||
| _L1_M2_100: | |||||
| zgemm_kernel_L1_M2_100: | |||||
| SAVE2x1 | SAVE2x1 | ||||
| _L1_M2_END: | |||||
| zgemm_kernel_L1_M2_END: | |||||
| subs I, I, #1 | subs I, I, #1 | ||||
| bne _L1_M2_20 | |||||
| bne zgemm_kernel_L1_M2_20 | |||||
| _L1_M1_BEGIN: | |||||
| zgemm_kernel_L1_M1_BEGIN: | |||||
| ldr I, M | ldr I, M | ||||
| tst I, #1 // I = I % 2 | tst I, #1 // I = I % 2 | ||||
| ble _L1_END | |||||
| ble zgemm_kernel_L1_END | |||||
| _L1_M1_20: | |||||
| zgemm_kernel_L1_M1_20: | |||||
| INIT1x1 | INIT1x1 | ||||
| mov BO, BC | mov BO, BC | ||||
| asrs L , K1, #3 // L = L / 8 | asrs L , K1, #3 // L = L / 8 | ||||
| ble _L1_M1_40 | |||||
| ble zgemm_kernel_L1_M1_40 | |||||
| _L1_M1_22: | |||||
| zgemm_kernel_L1_M1_22: | |||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| @@ -1307,31 +1307,31 @@ _L1_M1_22: | |||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M1_22 | |||||
| bgt zgemm_kernel_L1_M1_22 | |||||
| _L1_M1_40: | |||||
| zgemm_kernel_L1_M1_40: | |||||
| ands L , K1, #7 // L = L % 8 | ands L , K1, #7 // L = L % 8 | ||||
| ble _L1_M1_100 | |||||
| ble zgemm_kernel_L1_M1_100 | |||||
| _L1_M1_42: | |||||
| zgemm_kernel_L1_M1_42: | |||||
| KERNEL1x1_SUB | KERNEL1x1_SUB | ||||
| subs L, L, #1 | subs L, L, #1 | ||||
| bgt _L1_M1_42 | |||||
| bgt zgemm_kernel_L1_M1_42 | |||||
| _L1_M1_100: | |||||
| zgemm_kernel_L1_M1_100: | |||||
| SAVE1x1 | SAVE1x1 | ||||
| _L1_END: | |||||
| zgemm_kernel_L1_END: | |||||
| _L999: | |||||
| zgemm_kernel_L999: | |||||
| sub r3, fp, #128 | sub r3, fp, #128 | ||||
| vldm r3, { d8 - d15} // restore floating point registers | vldm r3, { d8 - d15} // restore floating point registers | ||||
| @@ -0,0 +1,254 @@ | |||||
| /*************************************************************************** | |||||
| Copyright (c) 2013, The OpenBLAS Project | |||||
| 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. | |||||
| 3. Neither the name of the OpenBLAS project 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 COPYRIGHT HOLDERS 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 OPENBLAS PROJECT 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. | |||||
| *****************************************************************************/ | |||||
| /************************************************************************************** | |||||
| * 2013/11/05 Saar | |||||
| * BLASTEST : OK | |||||
| * CTEST : OK | |||||
| * TEST : OK | |||||
| * | |||||
| **************************************************************************************/ | |||||
| #define ASSEMBLER | |||||
| #include "common.h" | |||||
| #define STACKSIZE 256 | |||||
| #define OLD_M r0 | |||||
| #define OLD_N r1 | |||||
| #define OLD_A r2 | |||||
| #define OLD_LDA r3 | |||||
| /****************************************************** | |||||
| * [fp, #-128] - [fp, #-64] is reserved | |||||
| * for store and restore of floating point | |||||
| * registers | |||||
| *******************************************************/ | |||||
| #define LDA [fp, #-260 ] | |||||
| #define B [fp, #4 ] | |||||
| #define M r0 | |||||
| #define N r1 | |||||
| #define A r2 | |||||
| #define BO r5 | |||||
| #define AO1 r6 | |||||
| #define AO2 r7 | |||||
| #define I r3 | |||||
| #define J r12 | |||||
| #define A_PRE 256 | |||||
| /************************************************************************************** | |||||
| * Macro definitions | |||||
| **************************************************************************************/ | |||||
| .macro COPY2x2 | |||||
| pld [ AO1, #A_PRE ] | |||||
| pld [ AO2, #A_PRE ] | |||||
| fldd d0 , [ AO1, #0 ] | |||||
| fldd d1 , [ AO1, #8 ] | |||||
| fldd d4 , [ AO1, #16 ] | |||||
| fldd d5 , [ AO1, #24 ] | |||||
| fldd d2 , [ AO2, #0 ] | |||||
| fldd d3 , [ AO2, #8 ] | |||||
| add AO1, AO1, #32 | |||||
| fldd d6 , [ AO2, #16 ] | |||||
| fldd d7 , [ AO2, #24 ] | |||||
| fstmiad BO!, { d0 - d7 } | |||||
| add AO2, AO2, #32 | |||||
| .endm | |||||
| .macro COPY1x2 | |||||
| fldd d0 , [ AO1, #0 ] | |||||
| fldd d1 , [ AO1, #8 ] | |||||
| fldd d2 , [ AO2, #0 ] | |||||
| fldd d3 , [ AO2, #8 ] | |||||
| add AO1, AO1, #16 | |||||
| fstmiad BO!, { d0 - d3 } | |||||
| add AO2, AO2, #16 | |||||
| .endm | |||||
| .macro COPY2x1 | |||||
| fldd d0 , [ AO1, #0 ] | |||||
| fldd d1 , [ AO1, #8 ] | |||||
| fldd d2 , [ AO1, #16 ] | |||||
| fldd d3 , [ AO1, #24 ] | |||||
| fstmiad BO!, { d0 - d3 } | |||||
| add AO1, AO1, #32 | |||||
| .endm | |||||
| .macro COPY1x1 | |||||
| fldd d0 , [ AO1, #0 ] | |||||
| fldd d1 , [ AO1, #8 ] | |||||
| fstmiad BO!, { d0 - d1 } | |||||
| add AO1, AO1, #16 | |||||
| .endm | |||||
| /************************************************************************************** | |||||
| * End of macro definitions | |||||
| **************************************************************************************/ | |||||
| PROLOGUE | |||||
| .align 5 | |||||
| push {r4 - r9, fp} | |||||
| add fp, sp, #24 | |||||
| sub sp, sp, #STACKSIZE // reserve stack | |||||
| lsl r3, r3, #4 // lda = lda * 8 * 2 | |||||
| str r3, LDA | |||||
| sub r4, fp, #128 | |||||
| vstm r4, { d8 - d15} // store floating point registers | |||||
| ldr BO, B | |||||
| /*********************************************************************************************/ | |||||
| zgemm_ncopy_L2_BEGIN: | |||||
| asrs J, N, #1 // J = N / 2 | |||||
| ble zgemm_ncopy_L1_BEGIN | |||||
| zgemm_ncopy_L2_M2_BEGIN: | |||||
| mov AO1, A // AO1 = A | |||||
| ldr r4 , LDA | |||||
| add AO2, AO1, r4 | |||||
| add A , AO2, r4 // A = A + 2 * LDA | |||||
| asrs I, M, #1 // I = M / 2 | |||||
| ble zgemm_ncopy_L2_M2_40 | |||||
| zgemm_ncopy_L2_M2_20: | |||||
| COPY2x2 | |||||
| subs I , I , #1 | |||||
| bne zgemm_ncopy_L2_M2_20 | |||||
| zgemm_ncopy_L2_M2_40: | |||||
| ands I, M , #1 | |||||
| ble zgemm_ncopy_L2_M2_END | |||||
| zgemm_ncopy_L2_M2_60: | |||||
| COPY1x2 | |||||
| subs I , I , #1 | |||||
| bne zgemm_ncopy_L2_M2_60 | |||||
| zgemm_ncopy_L2_M2_END: | |||||
| subs J , J, #1 // j-- | |||||
| bne zgemm_ncopy_L2_M2_BEGIN | |||||
| /*********************************************************************************************/ | |||||
| zgemm_ncopy_L1_BEGIN: | |||||
| tst N, #1 | |||||
| ble zgemm_ncopy_L999 | |||||
| zgemm_ncopy_L1_M2_BEGIN: | |||||
| mov AO1, A // AO1 = A | |||||
| ldr r4 , LDA | |||||
| add A , AO1, r4 // A = A + 1 * LDA | |||||
| asrs I, M, #1 // I = M / 2 | |||||
| ble zgemm_ncopy_L1_M2_40 | |||||
| zgemm_ncopy_L1_M2_20: | |||||
| COPY2x1 | |||||
| subs I , I , #1 | |||||
| bne zgemm_ncopy_L1_M2_20 | |||||
| zgemm_ncopy_L1_M2_40: | |||||
| ands I, M , #1 | |||||
| ble zgemm_ncopy_L1_M2_END | |||||
| zgemm_ncopy_L1_M2_60: | |||||
| COPY1x1 | |||||
| subs I , I , #1 | |||||
| bne zgemm_ncopy_L1_M2_60 | |||||
| zgemm_ncopy_L1_M2_END: | |||||
| zgemm_ncopy_L999: | |||||
| sub r3, fp, #128 | |||||
| vldm r3, { d8 - d15} // restore floating point registers | |||||
| movs r0, #0 // set return value | |||||
| sub sp, fp, #24 | |||||
| pop {r4 - r9, fp} | |||||
| bx lr | |||||
| EPILOGUE | |||||