#include "asm.S"
.section .rodata
.align 4
.text
.align 4
function x265_dct_4x4_neon
mov r2, r2, lsl #1
vld1.16 {d0}, [r0, :64], r2
vld1.16 {d1}, [r0, :64], r2
vld1.16 {d2}, [r0, :64], r2
vld1.16 {d3}, [r0, :64]
vtrn.32 q0, q1
vrev32.16 q1, q1
movconst r0, 0x00240053
movconst r2, 0xFFAD0024
vadd.s16 q2, q0, q1
vsub.s16 q3, q0, q1
vdup.32 d16, r0
vdup.32 d17, r2
vtrn.16 d4, d5
vtrn.32 d6, d7
vmull.s16 q9, d6, d16
vmull.s16 q10, d7, d16
vmull.s16 q11, d6, d17
vmull.s16 q12, d7, d17
vadd.s16 d0, d4, d5
vsub.s16 d1, d4, d5
vpadd.s32 d18, d18, d19
vpadd.s32 d19, d20, d21
vpadd.s32 d20, d22, d23
vpadd.s32 d21, d24, d25
vshll.s16 q1, d0, #6
vshll.s16 q2, d1, #6
vqrshrn.s32 d25, q9, 1
vqrshrn.s32 d24, q1, 1
vqrshrn.s32 d26, q2, 1
vqrshrn.s32 d27, q10, 1
vmovl.s16 q0, d16
vtrn.32 q12, q13
vrev32.16 q13, q13
vaddl.s16 q1, d24, d26
vaddl.s16 q2, d25, d27
vsubl.s16 q3, d24, d26
vsubl.s16 q8, d25, d27
vtrn.32 q1, q2
vtrn.32 q3, q8
vmul.s32 q9, q3, d0[0]
vmul.s32 q10, q8, d0[1]
vmul.s32 q11, q3, d0[1]
vmul.s32 q12, q8, d0[0]
vadd.s32 q0, q1, q2
vsub.s32 q1, q1, q2
vadd.s32 q9, q9, q10
vsub.s32 q10, q11, q12
vshl.s32 q0, q0, #6
vshl.s32 q1, q1, #6
vqrshrn.s32 d25, q9, 8
vqrshrn.s32 d27, q10, 8
vqrshrn.s32 d24, q0, 8
vqrshrn.s32 d26, q1, 8
vst1.16 {d24-d27}, [r1]
bx lr
endfunc
.macro tr4 r0, r1, r2, r3
vsub.s32 q8, \r0, \r3
vadd.s32 q9, \r0, \r3
vadd.s32 q10, \r1, \r2
vsub.s32 q11, \r1, \r2
vmul.s32 \r1, q8, d0[0]
vmul.s32 \r3, q8, d0[1]
vshl.s32 q9, q9, #6
vshl.s32 q10, q10, #6
vmla.s32 \r1, q11, d0[1]
vmls.s32 \r3, q11, d0[0]
vadd.s32 \r0, q9, q10
vsub.s32 \r2, q9, q10
.endm
.macro tr8 r0, r1, r2, r3
vmul.s32 q12, \r0, d1[1]
vmul.s32 q13, \r0, d1[0]
vmul.s32 q14, \r0, d2[1]
vmul.s32 q15, \r0, d2[0]
vmla.s32 q12, \r1, d1[0]
vmls.s32 q13, \r1, d2[0]
vmls.s32 q14, \r1, d1[1]
vmls.s32 q15, \r1, d2[1]
vmla.s32 q12, \r2, d2[1]
vmls.s32 q13, \r2, d1[1]
vmla.s32 q14, \r2, d2[0]
vmla.s32 q15, \r2, d1[0]
vmla.s32 q12, \r3, d2[0]
vmls.s32 q13, \r3, d2[1]
vmla.s32 q14, \r3, d1[0]
vmls.s32 q15, \r3, d1[1]
.endm
function x265_dct_8x8_neon
vpush {q4-q7}
mov r2, r2, lsl #1
adr r3, ctr4
vld1.16 {d0-d2}, [r3]
mov r3, r1
vld1.16 {q12}, [r0], r2
vld1.16 {q13}, [r0], r2
vld1.16 {q14}, [r0], r2
vld1.16 {q15}, [r0], r2
TRANSPOSE4x4x2_16 d24, d26, d28, d30, d25, d27, d29, d31
vaddl.s16 q4, d28, d27
vaddl.s16 q5, d30, d25
vaddl.s16 q2, d24, d31
vaddl.s16 q3, d26, d29
tr4 q2, q3, q4, q5
vqrshrn.s32 d20, q3, 2
vqrshrn.s32 d16, q2, 2
vqrshrn.s32 d17, q4, 2
vqrshrn.s32 d21, q5, 2
vsubl.s16 q2, d24, d31
vsubl.s16 q3, d26, d29
vsubl.s16 q4, d28, d27
vsubl.s16 q5, d30, d25
tr8 q2, q3, q4, q5
vqrshrn.s32 d18, q12, 2
vqrshrn.s32 d22, q13, 2
vqrshrn.s32 d19, q14, 2
vqrshrn.s32 d23, q15, 2
vstm r1!, {d16-d23}
vld1.16 {q12}, [r0], r2
vld1.16 {q13}, [r0], r2
vld1.16 {q14}, [r0], r2
vld1.16 {q15}, [r0], r2
mov r2, #8*2
TRANSPOSE4x4x2_16 d24, d26, d28, d30, d25, d27, d29, d31
vaddl.s16 q4, d28, d27
vaddl.s16 q5, d30, d25
vaddl.s16 q2, d24, d31
vaddl.s16 q3, d26, d29
tr4 q2, q3, q4, q5
vqrshrn.s32 d20, q3, 2
vqrshrn.s32 d16, q2, 2
vqrshrn.s32 d17, q4, 2
vqrshrn.s32 d21, q5, 2
vsubl.s16 q2, d24, d31
vsubl.s16 q3, d26, d29
vsubl.s16 q4, d28, d27
vsubl.s16 q5, d30, d25
tr8 q2, q3, q4, q5
vqrshrn.s32 d18, q12, 2
vqrshrn.s32 d22, q13, 2
vqrshrn.s32 d19, q14, 2
vqrshrn.s32 d23, q15, 2
vstm r1, {d16-d23}
mov r1, r3
vld1.16 {d24}, [r1], r2
vld1.16 {d26}, [r1], r2
vld1.16 {d28}, [r1], r2
vld1.16 {d30}, [r1], r2
vld1.16 {d25}, [r1], r2
vld1.16 {d27}, [r1], r2
vld1.16 {d29}, [r1], r2
vld1.16 {d31}, [r1], r2
mov r1, r3
TRANSPOSE4x4x2_16 d24, d26, d28, d30, d25, d27, d29, d31
vaddl.s16 q4, d28, d27
vaddl.s16 q5, d30, d25
vaddl.s16 q2, d24, d31
vaddl.s16 q3, d26, d29
tr4 q2, q3, q4, q5
vqrshrn.s32 d18, q3, 9
vqrshrn.s32 d16, q2, 9
vqrshrn.s32 d20, q4, 9
vqrshrn.s32 d22, q5, 9
vsubl.s16 q2, d24, d31
vsubl.s16 q3, d26, d29
vsubl.s16 q4, d28, d27
vsubl.s16 q5, d30, d25
tr8 q2, q3, q4, q5
vqrshrn.s32 d17, q12, 9
vqrshrn.s32 d19, q13, 9
vqrshrn.s32 d21, q14, 9
vqrshrn.s32 d23, q15, 9
add r3, #8
vst1.16 {d16}, [r1], r2
vst1.16 {d17}, [r1], r2
vst1.16 {d18}, [r1], r2
vst1.16 {d19}, [r1], r2
vst1.16 {d20}, [r1], r2
vst1.16 {d21}, [r1], r2
vst1.16 {d22}, [r1], r2
vst1.16 {d23}, [r1], r2
mov r1, r3
vld1.16 {d24}, [r1], r2
vld1.16 {d26}, [r1], r2
vld1.16 {d28}, [r1], r2
vld1.16 {d30}, [r1], r2
vld1.16 {d25}, [r1], r2
vld1.16 {d27}, [r1], r2
vld1.16 {d29}, [r1], r2
vld1.16 {d31}, [r1], r2
mov r1, r3
TRANSPOSE4x4x2_16 d24, d26, d28, d30, d25, d27, d29, d31
vaddl.s16 q4, d28, d27
vaddl.s16 q5, d30, d25
vaddl.s16 q2, d24, d31
vaddl.s16 q3, d26, d29
tr4 q2, q3, q4, q5
vqrshrn.s32 d18, q3, 9
vqrshrn.s32 d16, q2, 9
vqrshrn.s32 d20, q4, 9
vqrshrn.s32 d22, q5, 9
vsubl.s16 q2, d24, d31
vsubl.s16 q3, d26, d29
vsubl.s16 q4, d28, d27
vsubl.s16 q5, d30, d25
tr8 q2, q3, q4, q5
vqrshrn.s32 d17, q12, 9
vqrshrn.s32 d19, q13, 9
vqrshrn.s32 d21, q14, 9
vqrshrn.s32 d23, q15, 9
vst1.16 {d16}, [r1], r2
vst1.16 {d17}, [r1], r2
vst1.16 {d18}, [r1], r2
vst1.16 {d19}, [r1], r2
vst1.16 {d20}, [r1], r2
vst1.16 {d21}, [r1], r2
vst1.16 {d22}, [r1], r2
vst1.16 {d23}, [r1], r2
vpop {q4-q7}
bx lr
endfunc
.align 8
pw_tr16: .hword 90, 87, 80, 70, 57, 43, 25, 9
.hword 83, 36, 75, 89, 18, 50, 00, 00
.align 8
ctr4:
.word 83
.word 36
ctr8:
.word 75
.word 89
.word 18
.word 50
ctr16:
.word 90, 87
.word 80, 70
.word 57, 43
.word 25, 9
function x265_dct_16x16_neon
push {lr}
add r2, r2
adr r3, pw_tr16
mov r12, #16/4
vpush {q4-q7}
sub sp, #16*16*2
vld1.16 {d0-d3}, [r3]
mov r3, sp
mov lr, #4*16*2
.loop1:
vld1.16 {q8-q9}, [r0, :64], r2
vld1.16 {q10-q11}, [r0, :64], r2
vld1.16 {q12-q13}, [r0, :64], r2
vld1.16 {q14-q15}, [r0, :64], r2
vtrn.32 q8, q12
vtrn.32 q10, q14
vtrn.32 q9, q13
vtrn.32 q11, q15
vtrn.16 q8, q10
vtrn.16 q12, q14
vtrn.16 q13, q15
vtrn.16 q9, q11
vswp d26, d27
vswp d30, d31
vswp d18, d19
vswp d22, d23
vadd.s16 q4, q8, q15
vadd.s16 q5, q10, q13
vadd.s16 q6, q12, q11
vadd.s16 q7, q14, q9
vsub.s16 q8, q8, q15
vsub.s16 q9, q14, q9
vsub.s16 q10, q10, q13
vsub.s16 q11, q12, q11
vswp d9, d14
vswp d11, d12
vswp d14, d15
vswp d12, d13
vadd.s16 q2, q4, q7
vadd.s16 q3, q5, q6
vsub.s16 q4, q4, q7
vsub.s16 q5, q5, q6
vadd.s16 d12, d4, d5
vadd.s16 d13, d6, d7
vsub.s16 d14, d4, d5
vsub.s16 d15, d6, d7
vmull.s16 q14, d14, d2[0]
vmull.s16 q15, d14, d2[1]
vmlal.s16 q14, d15, d2[1]
vmlsl.s16 q15, d15, d2[0]
vadd.s16 d4, d12, d13
vsub.s16 d12, d13
vmull.s16 q12, d16, d0[0]
vmull.s16 q13, d8, d2[3]
vqrshrn.s32 d14, q14, 3
vqrshrn.s32 d15, q15, 3
vmull.s16 q14, d16, d0[1]
vmull.s16 q15, d16, d0[2]
vshll.s16 q2, d4, #6
vshll.s16 q6, d12, #6
vmlal.s16 q12, d20, d0[1]
vmlal.s16 q13, d10, d2[2]
vmlal.s16 q14, d20, d1[0]
vmlal.s16 q15, d20, d1[3]
vqrshrn.s32 d4, q2, 3
vqrshrn.s32 d12, q6, 3
vmlal.s16 q12, d22, d0[2]
vmlal.s16 q13, d11, d3[1]
vmlal.s16 q14, d22, d1[3]
vmlsl.s16 q15, d22, d0[3]
vmlal.s16 q12, d18, d0[3]
vmlal.s16 q13, d9, d3[0]
vmlsl.s16 q14, d18, d1[1]
vmlsl.s16 q15, d18, d0[1]
vmlal.s16 q12, d17, d1[0]
vmlsl.s16 q14, d17, d0[2]
vmlsl.s16 q15, d17, d1[2]
vqrshrn.s32 d6, q13, 3
vmull.s16 q13, d8, d2[2]
vmlal.s16 q12, d21, d1[1]
vmlsl.s16 q13, d10, d3[0]
vmlsl.s16 q14, d21, d0[0]
vmlal.s16 q15, d21, d1[0]
vmlal.s16 q12, d23, d1[2]
vmlsl.s16 q13, d11, d2[3]
vmlsl.s16 q14, d23, d0[3]
vmlal.s16 q15, d23, d0[0]
vmlal.s16 q12, d19, d1[3]
vmlsl.s16 q13, d9, d3[1]
vmlsl.s16 q14, d19, d1[2]
vmlal.s16 q15, d19, d1[1]
vqrshrn.s32 d5, q12, 3
vmull.s16 q12, d16, d0[3]
vqrshrn.s32 d7, q14, 3
vmull.s16 q14, d16, d1[0]
vmlsl.s16 q12, d20, d1[1]
vmlsl.s16 q14, d20, d0[2]
vmlsl.s16 q12, d22, d0[1]
vmlsl.s16 q14, d22, d1[2]
vmlal.s16 q12, d18, d1[3]
vmlal.s16 q14, d18, d0[0]
vst4.16 {d4-d7}, [r3], lr
vqrshrn.s32 d5, q15, 3
vqrshrn.s32 d6, q13, 3
vmull.s16 q13, d8, d3[1]
vmlal.s16 q12, d17, d0[0]
vmlsl.s16 q14, d17, d1[3]
vmull.s16 q15, d16, d1[1]
vmlsl.s16 q13, d10, d2[3]
vmlal.s16 q12, d21, d1[2]
vmlsl.s16 q14, d21, d0[1]
vmlsl.s16 q15, d20, d0[0]
vmlal.s16 q13, d11, d3[0]
vmlsl.s16 q12, d23, d0[2]
vmlal.s16 q14, d23, d1[1]
vmlal.s16 q15, d22, d1[0]
vmlal.s16 q13, d9, d2[2]
vmlsl.s16 q12, d19, d1[0]
vmlal.s16 q14, d19, d0[3]
vmlal.s16 q15, d18, d1[2]
vmlsl.s16 q15, d17, d0[1]
vmlal.s16 q15, d21, d0[3]
vmlal.s16 q15, d23, d1[3]
vmlsl.s16 q15, d19, d0[2]
vmov d4, d14
vqrshrn.s32 d14, q13, 3
vmull.s16 q13, d8, d3[0]
vqrshrn.s32 d7, q12, 3
vmull.s16 q12, d16, d1[2]
vmlsl.s16 q13, d9, d2[3]
vmull.s16 q4, d16, d1[3]
vmlsl.s16 q12, d20, d0[3]
vmlsl.s16 q13, d10, d3[1]
vmlsl.s16 q4, d20, d1[2]
vmlal.s16 q12, d22, d0[0]
vmlal.s16 q13, d11, d2[2]
vmlal.s16 q4, d22, d1[1]
vmlsl.s16 q12, d18, d0[2]
vmlsl.s16 q4, d18, d1[0]
vmlal.s16 q12, d17, d1[1]
vqrshrn.s32 d13, q14, 3
vmov d28, d15
vqrshrn.s32 d15, q15, 3
vqrshrn.s32 d30, q13, 3
vmlal.s16 q4, d17, d0[3]
vmlal.s16 q12, d21, d1[3]
vmlsl.s16 q4, d21, d0[2]
vmlsl.s16 q12, d23, d1[0]
vmlal.s16 q4, d23, d0[1]
vmlal.s16 q12, d19, d0[1]
vmlsl.s16 q4, d19, d0[0]
vst4.16 {d4-d7}, [r3], lr
vqrshrn.s32 d29, q12, 3
vqrshrn.s32 d31, q4, 3
vst4.16 {d12-d15}, [r3], lr
vst4.16 {d28-d31}, [r3]!
sub r3, #3*4*16*2
subs r12, #1
bgt .loop1
mov r2, sp
mov r3, #16*2*2
mov r12, #16/4
.loop2:
vldm r2, {q8-q15}
vaddl.s16 q2, d16, d31
vaddl.s16 q3, d17, d30
vaddl.s16 q4, d18, d29
vaddl.s16 q5, d19, d28
vaddl.s16 q9, d23, d24
vaddl.s16 q8, d22, d25
vaddl.s16 q7, d21, d26
vaddl.s16 q6, d20, d27
vadd.s32 q13, q2, q9
vsub.s32 q9, q2, q9
vadd.s32 q2, q5, q6
vsub.s32 q12, q5, q6
vadd.s32 q14, q3, q8
vsub.s32 q10, q3, q8
vadd.s32 q15, q4, q7
vsub.s32 q11, q4, q7
vadd.s32 q5, q13, q2
vadd.s32 q6, q14, q15
vsub.s32 q7, q13, q2
vsub.s32 q8, q14, q15
adr r0, ctr4
vld1.32 {d0-d3}, [r0, :64]
vadd.s32 q15, q5, q6
vmul.s32 q2, q9, d1[1]
vmul.s32 q3, q7, d0[0]
vmul.s32 q4, q9, d1[0]
vmul.s32 q14, q9, d2[1]
vshl.s32 q15, #6
vmla.s32 q2, q10, d1[0]
vmla.s32 q3, q8, d0[1]
vmls.s32 q4, q10, d2[0]
vmls.s32 q14, q10, d1[1]
vmul.s32 q13, q7, d0[1]
vqrshrn.s32 d30, q15, 10
vqrshrn.s32 d31, q3, 10
vmls.s32 q4, q11, d1[1]
vsub.s32 q3, q5, q6
vmla.s32 q2, q11, d2[1]
vmla.s32 q14, q11, d2[0]
vmls.s32 q13, q8, d0[0]
vst1.16 {d30}, [r1], r3
vshl.s32 q3, #6
vmls.s32 q4, q12, d2[1]
vmla.s32 q2, q12, d2[0]
vqrshrn.s32 d26, q13, 10
vmla.s32 q14, q12, d1[0]
vqrshrn.s32 d30, q3, 10
vmul.s32 q3, q9, d2[0]
vqrshrn.s32 d4, q2, 10
vmls.s32 q3, q10, d2[1]
vqrshrn.s32 d5, q4, 10
vmla.s32 q3, q11, d1[0]
vqrshrn.s32 d27, q14, 10
vmls.s32 q3, q12, d1[1]
vst1.16 {d4 }, [r1], r3
vst1.16 {d31}, [r1], r3
vst1.16 {d5 }, [r1], r3
vst1.16 {d30}, [r1], r3
vqrshrn.s32 d30, q3, 10
vst1.16 {d27}, [r1], r3
vst1.16 {d26}, [r1], r3
vst1.16 {d30}, [r1], r3
sub r1, #(15*16)*2
vldm r2!, {q8-q15}
vsubl.s16 q2, d16, d31
vsubl.s16 q3, d17, d30
vsubl.s16 q4, d18, d29
vsubl.s16 q5, d19, d28
vsubl.s16 q9, d23, d24
vsubl.s16 q8, d22, d25
vsubl.s16 q7, d21, d26
vsubl.s16 q6, d20, d27
adr r0, ctr16
vld1.32 {d0-d3}, [r0]
vmul.s32 q10, q2, d0[0]
vmul.s32 q11, q2, d0[1]
vmul.s32 q12, q2, d1[0]
vmul.s32 q13, q2, d1[1]
vmul.s32 q14, q2, d2[0]
vmul.s32 q15, q2, d2[1]
vmla.s32 q10, q3, d0[1]
vmla.s32 q11, q3, d2[0]
vmla.s32 q12, q3, d3[1]
vmls.s32 q13, q3, d2[1]
vmls.s32 q14, q3, d1[0]
vmls.s32 q15, q3, d0[0]
vmla.s32 q10, q4, d1[0]
vmla.s32 q11, q4, d3[1]
vmls.s32 q12, q4, d1[1]
vmls.s32 q13, q4, d0[1]
vmls.s32 q14, q4, d3[0]
vmla.s32 q15, q4, d2[0]
vmla.s32 q10, q5, d1[1]
vmls.s32 q11, q5, d2[1]
vmls.s32 q12, q5, d0[1]
vmla.s32 q13, q5, d3[1]
vmla.s32 q14, q5, d0[0]
vmla.s32 q15, q5, d3[0]
vmla.s32 q10, q6, d2[0]
vmls.s32 q11, q6, d1[0]
vmls.s32 q12, q6, d3[0]
vmla.s32 q13, q6, d0[0]
vmls.s32 q14, q6, d3[1]
vmls.s32 q15, q6, d0[1]
vmla.s32 q10, q7, d2[1]
vmls.s32 q11, q7, d0[0]
vmla.s32 q12, q7, d2[0]
vmla.s32 q13, q7, d3[0]
vmls.s32 q14, q7, d0[1]
vmla.s32 q15, q7, d1[1]
vmla.s32 q10, q8, d3[0]
vmls.s32 q11, q8, d1[1]
vmla.s32 q12, q8, d0[0]
vmls.s32 q13, q8, d1[0]
vmla.s32 q14, q8, d2[1]
vmla.s32 q15, q8, d3[1]
vmla.s32 q10, q9, d3[1]
vmls.s32 q11, q9, d3[0]
vmla.s32 q12, q9, d2[1]
vqrshrn.s32 d20, q10, 10
vmls.s32 q13, q9, d2[0]
vqrshrn.s32 d21, q11, 10
vmul.s32 q11, q2, d3[0]
vmul.s32 q2, q2, d3[1]
vst1.16 {d20}, [r1], r3
vst1.16 {d21}, [r1], r3
vmls.s32 q11, q3, d1[1]
vmls.s32 q2, q3, d3[0]
vmla.s32 q14, q9, d1[1]
vmls.s32 q15, q9, d1[0]
vqrshrn.s32 d24, q12, 10
vqrshrn.s32 d25, q13, 10
vqrshrn.s32 d28, q14, 10
vqrshrn.s32 d29, q15, 10
vst1.16 {d24}, [r1], r3
vst1.16 {d25}, [r1], r3
vst1.16 {d28}, [r1], r3
vst1.16 {d29}, [r1], r3
vmla.s32 q11, q4, d0[0]
vmla.s32 q2, q4, d2[1]
vmls.s32 q11, q5, d1[0]
vmls.s32 q2, q5, d2[0]
vmla.s32 q11, q6, d2[1]
vmla.s32 q2, q6, d1[1]
vmla.s32 q11, q7, d3[1]
vmls.s32 q2, q7, d1[0]
vmls.s32 q11, q8, d2[0]
vmla.s32 q2, q8, d0[1]
vmla.s32 q11, q9, d0[1]
vmls.s32 q2, q9, d0[0]
vqrshrn.s32 d6, q11, 10
vqrshrn.s32 d7, q2, 10
vst1.16 {d6}, [r1], r3
vst1.16 {d7}, [r1], r3
sub r1, #(17*16-4)*2
subs r12, #1
bgt .loop2
add sp, #16*16*2
vpop {q4-q7}
pop {pc}
endfunc