Improvements to COPY and IAMAX kernels
This commit is contained in:
parent
8d86d14d3f
commit
78782485b6
|
@ -58,43 +58,43 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
str TMPF, [Y], #SZ
|
str TMPF, [Y], #SZ
|
||||||
#else
|
#else
|
||||||
#if !defined(DOUBLE)
|
#if !defined(DOUBLE)
|
||||||
ld1 {v0.2s}, [X], #8
|
ldr d0, [X], #8
|
||||||
st1 {v0.2s}, [Y], #8
|
str d0, [Y], #8
|
||||||
#else
|
#else
|
||||||
ld1 {v0.2d}, [X], #16
|
ldr q0, [X], #16
|
||||||
st1 {v0.2d}, [Y], #16
|
str q0, [Y], #16
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro KERNEL_F4
|
.macro KERNEL_F4
|
||||||
|
|
||||||
#if !defined(COMPLEX)
|
#if !defined(COMPLEX)
|
||||||
#if !defined(DOUBLE)
|
#if !defined(DOUBLE)
|
||||||
ld1 {v0.4s}, [X], #16
|
ldr q0, [X], #16
|
||||||
st1 {v0.4s}, [Y], #16
|
str q0, [Y], #16
|
||||||
#else // DOUBLE
|
#else // DOUBLE
|
||||||
ld1 {v0.4s}, [X], #16
|
ldr q0, [X], #16
|
||||||
ld1 {v1.4s}, [X], #16
|
str q0, [Y], #16
|
||||||
st1 {v0.4s}, [Y], #16
|
ldr q1, [X], #16
|
||||||
st1 {v1.4s}, [Y], #16
|
str q1, [Y], #16
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#else // COMPLEX
|
#else // COMPLEX
|
||||||
#if !defined(DOUBLE)
|
#if !defined(DOUBLE)
|
||||||
ld1 {v0.4s}, [X], #16
|
ldr q0, [X], #16
|
||||||
ld1 {v1.4s}, [X], #16
|
str q0, [Y], #16
|
||||||
st1 {v0.4s}, [Y], #16
|
ldr q1, [X], #16
|
||||||
st1 {v1.4s}, [Y], #16
|
str q1, [Y], #16
|
||||||
#else // DOUBLE
|
#else // DOUBLE
|
||||||
ld1 {v0.4s}, [X], #16
|
ldr q0, [X], #16
|
||||||
ld1 {v1.4s}, [X], #16
|
str q0, [Y], #16
|
||||||
ld1 {v2.4s}, [X], #16
|
ldr q1, [X], #16
|
||||||
ld1 {v3.4s}, [X], #16
|
str q1, [Y], #16
|
||||||
st1 {v0.4s}, [Y], #16
|
ldr q2, [X], #16
|
||||||
st1 {v1.4s}, [Y], #16
|
str q2, [Y], #16
|
||||||
st1 {v2.4s}, [Y], #16
|
ldr q3, [X], #16
|
||||||
st1 {v3.4s}, [Y], #16
|
str q3, [Y], #16
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,148 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
fabs MAXF, MAXF
|
fabs MAXF, MAXF
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro KERNEL_F8
|
||||||
|
#if !defined(DOUBLE)
|
||||||
|
ldp q2, q3, [X], #32
|
||||||
|
fabs v2.4s, v2.4s
|
||||||
|
fabs v3.4s, v3.4s
|
||||||
|
fmax v2.4s, v2.4s, v3.4s
|
||||||
|
fmaxv TMPF, v2.4s
|
||||||
|
fcmp MAXF, TMPF
|
||||||
|
fcsel MAXF, MAXF, TMPF, COND
|
||||||
|
csel INDEX, INDEX, Z, COND
|
||||||
|
add Z, Z, #8
|
||||||
|
#else
|
||||||
|
ldp q2, q3, [X], #32
|
||||||
|
ldp q4, q5, [X], #32
|
||||||
|
fabs v2.2d, v2.2d
|
||||||
|
fabs v3.2d, v3.2d
|
||||||
|
fabs v4.2d, v4.2d
|
||||||
|
fabs v5.2d, v5.2d
|
||||||
|
|
||||||
|
fmax v2.2d, v2.2d, v3.2d
|
||||||
|
fmax v4.2d, v4.2d, v5.2d
|
||||||
|
fmax v2.2d, v2.2d, v4.2d
|
||||||
|
fmaxp TMPF, v2.2d
|
||||||
|
|
||||||
|
fcmp MAXF, TMPF
|
||||||
|
fcsel MAXF, MAXF, TMPF, COND
|
||||||
|
csel INDEX, INDEX, Z, COND
|
||||||
|
add Z, Z, #8
|
||||||
|
#endif
|
||||||
|
PRFM PLDL1KEEP, [X, #1024]
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro KERNEL_F8_FINALIZE
|
||||||
|
sub x6, INDEX, #1
|
||||||
|
#if !defined(DOUBLE)
|
||||||
|
lsl x6, x6, #2
|
||||||
|
add x7, x7, x6
|
||||||
|
ldp q2, q3, [x7]
|
||||||
|
fabs v2.4s, v2.4s
|
||||||
|
fabs v3.4s, v3.4s
|
||||||
|
|
||||||
|
ins v4.s[0], v3.s[0]
|
||||||
|
ins v5.s[0], v3.s[1]
|
||||||
|
ins v6.s[0], v3.s[2]
|
||||||
|
ins v7.s[0], v3.s[3]
|
||||||
|
|
||||||
|
add x6, INDEX, #7
|
||||||
|
fcmp MAXF, s7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s6
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s5
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v2.s[0]
|
||||||
|
ins v5.s[0], v2.s[1]
|
||||||
|
ins v6.s[0], v2.s[2]
|
||||||
|
ins v7.s[0], v2.s[3]
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s6
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s5
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
#else
|
||||||
|
add x6, x6, #4
|
||||||
|
lsl x6, x6, #3
|
||||||
|
add x7, x7, x6
|
||||||
|
ldp q2, q3, [x7]
|
||||||
|
|
||||||
|
fabs v2.2d, v2.2d
|
||||||
|
fabs v3.2d, v3.2d
|
||||||
|
|
||||||
|
ins v4.d[0], v2.d[0]
|
||||||
|
ins v5.d[0], v2.d[1]
|
||||||
|
ins v6.d[0], v3.d[0]
|
||||||
|
ins v7.d[0], v3.d[1]
|
||||||
|
|
||||||
|
add x6, INDEX, #7
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d6
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d5
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x7, x7, #32
|
||||||
|
ldp q2, q3, [x7]
|
||||||
|
|
||||||
|
fabs v2.2d, v2.2d
|
||||||
|
fabs v3.2d, v3.2d
|
||||||
|
|
||||||
|
ins v4.d[0], v2.d[0]
|
||||||
|
ins v5.d[0], v2.d[1]
|
||||||
|
ins v6.d[0], v3.d[0]
|
||||||
|
ins v7.d[0], v3.d[1]
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d6
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d5
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
.macro KERNEL_S1
|
.macro KERNEL_S1
|
||||||
ld1 TMPVF, [X], INC_X
|
ld1 TMPVF, [X], INC_X
|
||||||
add Z, Z, #1
|
add Z, Z, #1
|
||||||
|
@ -92,6 +234,48 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
cmp INC_X, xzr
|
cmp INC_X, xzr
|
||||||
ble iamax_kernel_zero
|
ble iamax_kernel_zero
|
||||||
|
|
||||||
|
cmp INC_X, #1
|
||||||
|
bne iamax_kernel_S_BEGIN
|
||||||
|
mov x7, X
|
||||||
|
|
||||||
|
iamax_kernel_F_BEGIN:
|
||||||
|
|
||||||
|
INIT_S
|
||||||
|
|
||||||
|
subs N, N, #1
|
||||||
|
ble iamax_kernel_L999
|
||||||
|
|
||||||
|
asr I, N, #3
|
||||||
|
cmp I, xzr
|
||||||
|
beq iamax_kernel_F1
|
||||||
|
|
||||||
|
add Z, Z, #1
|
||||||
|
iamax_kernel_F8:
|
||||||
|
|
||||||
|
KERNEL_F8
|
||||||
|
|
||||||
|
subs I, I, #1
|
||||||
|
bne iamax_kernel_F8
|
||||||
|
|
||||||
|
KERNEL_F8_FINALIZE
|
||||||
|
|
||||||
|
sub Z, Z, #1
|
||||||
|
iamax_kernel_F1:
|
||||||
|
|
||||||
|
ands I, N, #7
|
||||||
|
ble iamax_kernel_L999
|
||||||
|
|
||||||
|
iamax_kernel_F10:
|
||||||
|
|
||||||
|
KERNEL_S1
|
||||||
|
|
||||||
|
subs I, I, #1
|
||||||
|
bne iamax_kernel_F10
|
||||||
|
|
||||||
|
b iamax_kernel_L999
|
||||||
|
|
||||||
|
iamax_kernel_S_BEGIN:
|
||||||
|
|
||||||
INIT_S
|
INIT_S
|
||||||
|
|
||||||
subs N, N, #1
|
subs N, N, #1
|
||||||
|
|
|
@ -78,6 +78,179 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro KERNEL_F8
|
||||||
|
#if !defined(DOUBLE)
|
||||||
|
ldp q2, q3, [X], #32
|
||||||
|
ldp q4, q5, [X], #32
|
||||||
|
|
||||||
|
fabs v2.4s, v2.4s
|
||||||
|
fabs v3.4s, v3.4s
|
||||||
|
fabs v4.4s, v4.4s
|
||||||
|
fabs v5.4s, v5.4s
|
||||||
|
|
||||||
|
faddp v2.4s, v2.4s, v3.4s
|
||||||
|
faddp v3.4s, v4.4s, v5.4s
|
||||||
|
|
||||||
|
fmax v2.4s, v2.4s, v3.4s
|
||||||
|
fmaxv TMPF, v2.4s
|
||||||
|
fcmp MAXF, TMPF
|
||||||
|
fcsel MAXF, MAXF, TMPF, COND
|
||||||
|
csel INDEX, INDEX, Z, COND
|
||||||
|
add Z, Z, #8
|
||||||
|
#else
|
||||||
|
ldp q2, q3, [X], #32
|
||||||
|
ldp q4, q5, [X], #32
|
||||||
|
ldp q16, q17, [X], #32
|
||||||
|
ldp q18, q19, [X], #32
|
||||||
|
|
||||||
|
fabs v2.2d, v2.2d
|
||||||
|
fabs v3.2d, v3.2d
|
||||||
|
fabs v4.2d, v4.2d
|
||||||
|
fabs v5.2d, v5.2d
|
||||||
|
fabs v16.2d, v16.2d
|
||||||
|
fabs v17.2d, v17.2d
|
||||||
|
fabs v18.2d, v18.2d
|
||||||
|
fabs v19.2d, v19.2d
|
||||||
|
|
||||||
|
faddp v2.2d, v2.2d, v3.2d
|
||||||
|
faddp v3.2d, v4.2d, v5.2d
|
||||||
|
faddp v4.2d, v16.2d, v17.2d
|
||||||
|
faddp v5.2d, v18.2d, v19.2d
|
||||||
|
|
||||||
|
fmax v2.2d, v2.2d, v3.2d
|
||||||
|
fmax v4.2d, v4.2d, v5.2d
|
||||||
|
fmax v2.2d, v2.2d, v4.2d
|
||||||
|
fmaxp TMPF, v2.2d
|
||||||
|
|
||||||
|
fcmp MAXF, TMPF
|
||||||
|
fcsel MAXF, MAXF, TMPF, COND
|
||||||
|
csel INDEX, INDEX, Z, COND
|
||||||
|
add Z, Z, #8
|
||||||
|
#endif
|
||||||
|
PRFM PLDL1KEEP, [X, #1024]
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro KERNEL_F8_FINALIZE
|
||||||
|
sub x6, INDEX, #1
|
||||||
|
#if !defined(DOUBLE)
|
||||||
|
lsl x6, x6, #3
|
||||||
|
add x7, x7, x6
|
||||||
|
|
||||||
|
ldp q2, q3, [x7]
|
||||||
|
ldp q4, q5, [x7, #32]
|
||||||
|
|
||||||
|
fabs v2.4s, v2.4s
|
||||||
|
fabs v3.4s, v3.4s
|
||||||
|
fabs v4.4s, v4.4s
|
||||||
|
fabs v5.4s, v5.4s
|
||||||
|
|
||||||
|
faddp v2.4s, v2.4s, v3.4s
|
||||||
|
faddp v3.4s, v4.4s, v5.4s
|
||||||
|
|
||||||
|
ins v4.s[0], v3.s[3]
|
||||||
|
add x6, INDEX, #7
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v3.s[2]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v3.s[1]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v3.s[0]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v2.s[3]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v2.s[2]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v2.s[1]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v4.s[0], v2.s[0]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, s4
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
#else
|
||||||
|
lsl x6, x6, #4
|
||||||
|
add x7, x7, x6
|
||||||
|
|
||||||
|
ldp q2, q3, [x7]
|
||||||
|
ldp q4, q5, [x7, #32]
|
||||||
|
ldp q16, q17, [x7, #64]
|
||||||
|
ldp q18, q19, [x7, #96]
|
||||||
|
|
||||||
|
fabs v2.2d, v2.2d
|
||||||
|
fabs v3.2d, v3.2d
|
||||||
|
fabs v4.2d, v4.2d
|
||||||
|
fabs v5.2d, v5.2d
|
||||||
|
fabs v16.2d, v16.2d
|
||||||
|
fabs v17.2d, v17.2d
|
||||||
|
fabs v18.2d, v18.2d
|
||||||
|
fabs v19.2d, v19.2d
|
||||||
|
|
||||||
|
faddp v2.2d, v2.2d, v3.2d
|
||||||
|
faddp v3.2d, v4.2d, v5.2d
|
||||||
|
faddp v4.2d, v16.2d, v17.2d
|
||||||
|
faddp v5.2d, v18.2d, v19.2d
|
||||||
|
|
||||||
|
ins v7.d[0], v5.d[1]
|
||||||
|
add x6, INDEX, #7
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v5.d[0]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v4.d[1]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v4.d[0]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v3.d[1]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v3.d[0]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v2.d[1]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
|
||||||
|
ins v7.d[0], v2.d[0]
|
||||||
|
sub x6, x6, #1
|
||||||
|
fcmp MAXF, d7
|
||||||
|
csel INDEX, x6, INDEX, eq
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro KERNEL_S1
|
.macro KERNEL_S1
|
||||||
#if !defined(DOUBLE)
|
#if !defined(DOUBLE)
|
||||||
ld1 {v1.2s}, [X], INC_X
|
ld1 {v1.2s}, [X], INC_X
|
||||||
|
@ -107,6 +280,50 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
cmp INC_X, xzr
|
cmp INC_X, xzr
|
||||||
ble iamax_kernel_zero
|
ble iamax_kernel_zero
|
||||||
|
|
||||||
|
cmp INC_X, #1
|
||||||
|
bne iamax_kernel_S_BEGIN
|
||||||
|
mov x7, X
|
||||||
|
|
||||||
|
|
||||||
|
iamax_kernel_F_BEGIN:
|
||||||
|
|
||||||
|
INIT_S
|
||||||
|
|
||||||
|
subs N, N, #1
|
||||||
|
ble iamax_kernel_L999
|
||||||
|
|
||||||
|
asr I, N, #3
|
||||||
|
cmp I, xzr
|
||||||
|
ble iamax_kernel_F1
|
||||||
|
|
||||||
|
add Z, Z, #1
|
||||||
|
|
||||||
|
iamax_kernel_F8:
|
||||||
|
|
||||||
|
KERNEL_F8
|
||||||
|
|
||||||
|
subs I, I, #1
|
||||||
|
bne iamax_kernel_F8
|
||||||
|
|
||||||
|
KERNEL_F8_FINALIZE
|
||||||
|
|
||||||
|
sub Z, Z, #1
|
||||||
|
iamax_kernel_F1:
|
||||||
|
|
||||||
|
ands I, N, #7
|
||||||
|
ble iamax_kernel_L999
|
||||||
|
|
||||||
|
iamax_kernel_F10:
|
||||||
|
|
||||||
|
KERNEL_S1
|
||||||
|
|
||||||
|
subs I, I, #1
|
||||||
|
bne iamax_kernel_F10
|
||||||
|
|
||||||
|
b iamax_kernel_L999
|
||||||
|
|
||||||
|
iamax_kernel_S_BEGIN:
|
||||||
|
|
||||||
INIT_S
|
INIT_S
|
||||||
|
|
||||||
subs N, N, #1
|
subs N, N, #1
|
||||||
|
|
Loading…
Reference in New Issue