@ -534,7 +534,7 @@ function idct16x16_dc_add_neon
endfunc
.ltorg
.macro idct16
function i d c t 1 6
mbutterfly0 d16 , d24 , d16 , d24 , d4 , d6 , q2 , q3 @ d16 = t0a, d24 = t1a
mbutterfly d20 , d28 , d0 [ 1 ] , d0 [ 2 ] , q2 , q3 @ d20 = t2a, d28 = t3a
mbutterfly d18 , d30 , d0 [ 3 ] , d1 [ 0 ] , q2 , q3 @ d18 = t4a, d30 = t7a
@ -580,9 +580,10 @@ endfunc
vmov d4 , d21 @ d4 = t10a
butterfly d20 , d27 , d6 , d27 @ d20 = out[4], d27 = out[11]
butterfly d21 , d26 , d26 , d4 @ 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 - q1 } , [ r12 ,: 1 2 8 ]
@ -653,7 +654,8 @@ endfunc
vmov d16 , d2
vmov d30 , d4
.endm
bx l r
endfunc
.macro itxfm16_1d_funcs txfm
@ Read a vertical 4x16 slice out of a 16x16 matrix, do a transform on it,
@ -662,6 +664,8 @@ endfunc
@ r1 = slice offset
@ r2 = src
function \ t x f m \ ( ) 1 6 _ 1 d _ 4 x16 _ p a s s1 _ n e o n
push { l r }
mov r12 , #32
vmov. s16 q2 , #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
@ -669,7 +673,7 @@ function \txfm\()16_1d_4x16_pass1_neon
vst1 . 1 6 { d4 } , [ r2 ,: 6 4 ] , r12
.endr
\ txfm\ ( ) 1 6
bl \ t x f m \ ( ) 1 6
@ Do four 4x4 transposes. Originally, d16-d31 contain the
@ 16 rows. Afterwards, d16-d19, d20-d23, d24-d27, d28-d31
@ -682,7 +686,7 @@ function \txfm\()16_1d_4x16_pass1_neon
.irp i, 1 6 , 2 0 , 2 4 , 2 8 , 1 7 , 2 1 , 2 5 , 2 9 , 1 8 , 2 2 , 2 6 , 3 0 , 1 9 , 2 3 , 2 7 , 3 1
vst1 . 1 6 { d \ i } , [ r0 ,: 6 4 ] !
.endr
bx l r
pop { p c }
1 :
@ Special case: For the last input column (r1 == 12),
@ which would be stored as the last row in the temp buffer,
@ -709,7 +713,7 @@ function \txfm\()16_1d_4x16_pass1_neon
vmov d29 , d17
vmov d30 , d18
vmov d31 , d19
bx l r
pop { p c }
endfunc
@ Read a vertical 4x16 slice out of a 16x16 matrix, do a transform on it,
@ -719,6 +723,7 @@ endfunc
@ r2 = src (temp buffer)
@ r3 = slice offset
function \ t x f m \ ( ) 1 6 _ 1 d _ 4 x16 _ p a s s2 _ n e o n
push { l r }
mov r12 , #32
.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
vld1 . 1 6 { d \ i } , [ r2 ,: 6 4 ] , r12
@ -732,7 +737,7 @@ function \txfm\()16_1d_4x16_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. s16 \ c o e f0 , \ c o e f0 , #6
@ -773,7 +778,7 @@ function \txfm\()16_1d_4x16_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
@ -908,7 +913,7 @@ function idct32x32_dc_add_neon
bx l r
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
add r12 , r12 , #32
vld1 . 1 6 { q0 - q1 } , [ r12 ,: 1 2 8 ]
@ -967,7 +972,8 @@ endfunc
mbutterfly0 d26 , d21 , d26 , d21 , d4 , d6 , q2 , q3 @ d26 = t26a, d21 = t21a
mbutterfly0 d25 , d22 , d25 , d22 , d4 , d6 , q2 , q3 @ d25 = t25, d22 = t22
mbutterfly0 d24 , d23 , d24 , d23 , d4 , d6 , q2 , q3 @ d24 = t24a, d23 = t23a
.endm
bx l r
endfunc
@ Do an 32-point IDCT of a 4x32 slice out of a 32x32 matrix.
@ We don't have register space to do a single pass IDCT of 4x32 though,
@ -979,6 +985,8 @@ endfunc
@ r1 = unused
@ r2 = src
function i d c t 3 2 _ 1 d _ 4 x32 _ p a s s1 _ n e o n
push { l r }
movrel r12 , i d c t _ c o e f f s
vld1 . 1 6 { q0 - q1 } , [ r12 ,: 1 2 8 ]
@ -992,7 +1000,7 @@ function idct32_1d_4x32_pass1_neon
vst1 . 1 6 { d4 } , [ r2 ,: 6 4 ] , r12
.endr
idc t1 6
bl i d c t 1 6
@ Do four 4x4 transposes. Originally, d16-d31 contain the
@ 16 rows. Afterwards, d16-d19, d20-d23, d24-d27, d28-d31
@ -1028,7 +1036,7 @@ function idct32_1d_4x32_pass1_neon
vst1 . 1 6 { d4 } , [ r2 ,: 6 4 ] , r12
.endr
idc t3 2 _ o d d
bl i d c t 3 2 _ o d d
transpose1 6 _ q _ 4 x _ 4 x4 q15 , q14 , q13 , q12 , q11 , q10 , q9 , q8 , d31 , d30 , d29 , d28 , d27 , d26 , d25 , d24 , d23 , d22 , d21 , d20 , d19 , d18 , d17 , d16
@ -1054,7 +1062,7 @@ function idct32_1d_4x32_pass1_neon
store_ r e v 2 9 , 2 5 , 2 1 , 1 7
store_ r e v 2 8 , 2 4 , 2 0 , 1 6
.purgem store_rev
bx l r
pop { p c }
endfunc
.ltorg
@ -1065,6 +1073,7 @@ endfunc
@ r1 = dst stride
@ r2 = src (temp buffer)
function i d c t 3 2 _ 1 d _ 4 x32 _ p a s s2 _ n e o n
push { l r }
movrel r12 , i d c t _ c o e f f s
vld1 . 1 6 { q0 - q1 } , [ r12 ,: 1 2 8 ]
@ -1075,7 +1084,7 @@ function idct32_1d_4x32_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 . 1 6 { d \ i } , [ r2 ,: 6 4 ] , r12
@ -1091,7 +1100,7 @@ function idct32_1d_4x32_pass2_neon
sub r2 , r2 , r12 , l s l #4
sub r2 , r2 , #64
idc t3 2 _ o d d
bl i d c t 3 2 _ o d d
mov r12 , #128
.macro load_acc_store a, b , c , d , n e g =0
@ -1139,7 +1148,7 @@ function idct32_1d_4x32_pass2_neon
load_ a c c _ s t o r e 2 4 , 2 5 , 2 6 , 2 7 , 1
load_ a c c _ s t o r e 2 8 , 2 9 , 3 0 , 3 1 , 1
.purgem load_acc_store
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