@ -807,7 +807,7 @@ function idct16x16_dc_add_neon
endfunc
.ltorg
.macro idct16
function i d c t 1 6
mbutterfly0 d16 , d24 , d16 , d24 , d8 , d10 , q4 , q5 @ d16 = t0a, d24 = t1a
mbutterfly d20 , d28 , d1 [ 0 ] , d1 [ 1 ] , q4 , q5 @ d20 = t2a, d28 = t3a
mbutterfly d18 , d30 , d2 [ 0 ] , d2 [ 1 ] , q4 , q5 @ d18 = t4a, d30 = t7a
@ -853,9 +853,10 @@ endfunc
vmov d8 , d21 @ d8 = t10a
butterfly d20 , d27 , d10 , d27 @ d20 = out[4], d27 = out[11]
butterfly d21 , d26 , d26 , d8 @ d21 = out[5], d26 = out[10]
.endm
bx l r
endfunc
.macro iadst16
function i a d s t 1 6
movrel r12 , i a d s t 1 6 _ c o e f f s
vld1 . 1 6 { q0 } , [ r12 ,: 1 2 8 ] !
vmovl. s16 q1 , d1
@ -933,7 +934,8 @@ endfunc
vmov d16 , d2
vmov d30 , d4
.endm
bx l r
endfunc
.macro itxfm16_1d_funcs txfm
@ Read a vertical 2x16 slice out of a 16x16 matrix, do a transform on it,
@ -941,6 +943,8 @@ endfunc
@ r0 = dst (temp buffer)
@ r2 = src
function \ t x f m \ ( ) 1 6 _ 1 d _ 2 x16 _ p a s s1 _ n e o n
push { l r }
mov r12 , #64
vmov. s32 q4 , #0
.irp i, 1 6 , 1 7 , 1 8 , 1 9 , 2 0 , 2 1 , 2 2 , 2 3 , 2 4 , 2 5 , 2 6 , 2 7 , 2 8 , 2 9 , 3 0 , 3 1
@ -948,7 +952,7 @@ function \txfm\()16_1d_2x16_pass1_neon
vst1 . 3 2 { d8 } , [ r2 ,: 6 4 ] , r12
.endr
\ txfm\ ( ) 1 6
bl \ t x f m \ ( ) 1 6
@ Do eight 2x2 transposes. Originally, d16-d31 contain the
@ 16 rows. Afterwards, d16-d17, d18-d19 etc contain the eight
@ -959,7 +963,7 @@ function \txfm\()16_1d_2x16_pass1_neon
.irp i, 1 6 , 1 8 , 2 0 , 2 2 , 2 4 , 2 6 , 2 8 , 3 0 , 1 7 , 1 9 , 2 1 , 2 3 , 2 5 , 2 7 , 2 9 , 3 1
vst1 . 3 2 { d \ i } , [ r0 ,: 6 4 ] !
.endr
bx l r
pop { p c }
endfunc
@ Read a vertical 2x16 slice out of a 16x16 matrix, do a transform on it,
@ -968,6 +972,8 @@ endfunc
@ r1 = dst stride
@ r2 = src (temp buffer)
function \ t x f m \ ( ) 1 6 _ 1 d _ 2 x16 _ p a s s2 _ n e o n
push { l r }
mov r12 , #64
.irp i, 1 6 , 1 7 , 1 8 , 1 9 , 2 0 , 2 1 , 2 2 , 2 3 , 2 4 , 2 5 , 2 6 , 2 7 , 2 8 , 2 9 , 3 0 , 3 1
vld1 . 1 6 { d \ i } , [ r2 ,: 6 4 ] , r12
@ -975,7 +981,7 @@ function \txfm\()16_1d_2x16_pass2_neon
add r3 , r0 , r1
lsl r1 , r1 , #1
\ txfm\ ( ) 1 6
bl \ t x f m \ ( ) 1 6
.macro load_add_store coef0 , c o e f1 , c o e f2 , c o e f3
vrshr. s32 \ c o e f0 , \ c o e f0 , #6
@ -1019,7 +1025,7 @@ function \txfm\()16_1d_2x16_pass2_neon
load_ a d d _ s t o r e q12 , q13 , q14 , q15
.purgem load_add_store
bx l r
pop { p c }
endfunc
.endm
@ -1193,7 +1199,7 @@ function idct32x32_dc_add_neon
pop { r4 - r9 ,p c }
endfunc
.macro idct32_odd
function i d c t 3 2 _ o d d
movrel r12 , i d c t _ c o e f f s
@ Overwrite the idct16 coeffs with the stored ones for idct32
@ -1262,7 +1268,8 @@ endfunc
mbutterfly0 d26 , d21 , d26 , d21 , d8 , d10 , q4 , q5 @ d26 = t26a, d21 = t21a
mbutterfly0 d25 , d22 , d25 , d22 , d8 , d10 , q4 , q5 @ d25 = t25, d22 = t22
mbutterfly0 d24 , d23 , d24 , d23 , d8 , d10 , q4 , q5 @ d24 = t24a, d23 = t23a
.endm
bx l r
endfunc
@ Do an 32-point IDCT of a 2x32 slice out of a 32x32 matrix.
@ We don't have register space to do a single pass IDCT of 2x32 though,
@ -1274,6 +1281,8 @@ endfunc
@ r1 = unused
@ r2 = src
function i d c t 3 2 _ 1 d _ 2 x32 _ p a s s1 _ n e o n
push { l r }
@ Double stride of the input, since we only read every other line
mov r12 , #256
vmov. s32 d8 , #0
@ -1284,7 +1293,7 @@ function idct32_1d_2x32_pass1_neon
vst1 . 3 2 { d8 } , [ r2 ,: 6 4 ] , r12
.endr
idc t1 6
bl i d c t 1 6
@ Do eight 2x2 transposes. Originally, d16-d31 contain the
@ 16 rows. Afterwards, d16-d17, d18-d19 etc contain the eight
@ -1319,7 +1328,7 @@ function idct32_1d_2x32_pass1_neon
vst1 . 1 6 { d8 } , [ r2 ,: 6 4 ] , r12
.endr
idc t3 2 _ o d d
bl i d c t 3 2 _ o d d
transpose3 2 _ 8 x _ 2 x2 d31 , d30 , d29 , d28 , d27 , d26 , d25 , d24 , d23 , d22 , d21 , d20 , d19 , d18 , d17 , d16
@ -1343,7 +1352,7 @@ function idct32_1d_2x32_pass1_neon
store_ r e v 3 1 , 2 9 , 2 7 , 2 5 , 2 3 , 2 1 , 1 9 , 1 7
store_ r e v 3 0 , 2 8 , 2 6 , 2 4 , 2 2 , 2 0 , 1 8 , 1 6
.purgem store_rev
bx l r
pop { p c }
endfunc
.ltorg
@ -1354,6 +1363,8 @@ endfunc
@ r1 = dst stride
@ r2 = src (temp buffer)
function i d c t 3 2 _ 1 d _ 2 x32 _ p a s s2 _ n e o n
push { l r }
mov r12 , #256
@ d16 = IN(0), d17 = IN(2) ... d31 = IN(30)
.irp i, 1 6 , 1 7 , 1 8 , 1 9 , 2 0 , 2 1 , 2 2 , 2 3 , 2 4 , 2 5 , 2 6 , 2 7 , 2 8 , 2 9 , 3 0 , 3 1
@ -1361,7 +1372,7 @@ function idct32_1d_2x32_pass2_neon
.endr
sub r2 , r2 , r12 , l s l #4
idc t1 6
bl i d c t 1 6
.irp i, 1 6 , 1 7 , 1 8 , 1 9 , 2 0 , 2 1 , 2 2 , 2 3 , 2 4 , 2 5 , 2 6 , 2 7 , 2 8 , 2 9 , 3 0 , 3 1
vst1 . 3 2 { d \ i } , [ r2 ,: 6 4 ] , r12
@ -1377,7 +1388,7 @@ function idct32_1d_2x32_pass2_neon
sub r2 , r2 , r12 , l s l #4
sub r2 , r2 , #128
idc t3 2 _ o d d
bl i d c t 3 2 _ o d d
@ Narrow the ict16 coefficients in q0-q3 into q0-q1, to
@ allow clobbering q2-q3 below.
@ -1439,7 +1450,7 @@ function idct32_1d_2x32_pass2_neon
vmovl. s16 q3 , d3
vmovl. s16 q1 , d1
vmovl. s16 q0 , d0
bx l r
pop { p c }
endfunc
const m i n _ e o b _ i d c t _ i d c t _ 3 2 , a l i g n =4