quant: Add implementation for dequant

Provide neon arm64 implementations for dequant functions for high bit
depth. Benchmarks are shown below.

dequant_4x4_cqm_c: 359
dequant_4x4_cqm_neon: 225
dequant_4x4_dc_cqm_c: 344
dequant_4x4_dc_cqm_neon: 208
dequant_4x4_dc_flat_c: 348
dequant_4x4_dc_flat_neon: 210
dequant_4x4_flat_c: 362
dequant_4x4_flat_neon: 227
dequant_8x8_cqm_c: 1526
dequant_8x8_cqm_neon: 517
dequant_8x8_flat_c: 1547
dequant_8x8_flat_neon: 520

Signed-off-by: Hubert Mazur <hum@semihalf.com>
This commit is contained in:
Hubert Mazur
2022-11-14 14:31:15 +00:00
committed by Anton Mitrofanov
parent b8ea87e05c
commit 986dd1f3b7
3 changed files with 142 additions and 3 deletions
+135
View File
@@ -811,4 +811,139 @@ function quant_8x8_neon, export=1
QUANT_END 0
endfunc
.macro DEQUANT_START mf_size offset dc=no
mov w3, #0x2b
mul w3, w3, w2
lsr w3, w3, #8 // i_qbits = i_qp / 6
add w5, w3, w3, lsl #1
sub w2, w2, w5, lsl #1 // i_mf = i_qp % 6
lsl w2, w2, #\mf_size
.ifc \dc,no
add x1, x1, w2, sxtw // dequant_mf[i_mf]
.else
ldr x1, [x1, w2, sxtw] // dequant_mf[i_mf][0][0]
.endif
subs w3, w3, #\offset // 6 for 8x8
.endm
// dequant_4x4( int32_t dct[16], int dequant_mf[6][16], int i_qp )
.macro DEQUANT size bits
function dequant_\size\()_neon, export=1
DEQUANT_START \bits+2, \bits
.ifc \size, 8x8
mov w2, #4
.endif
b.lt dequant_\size\()_rshift
dup v31.4s, w3
dequant_\size\()_lshift_loop:
.ifc \size, 8x8
subs w2, w2, #1
.endif
ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x1], #64
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0]
mul v0.4s, v0.4s, v16.4s
mul v1.4s, v1.4s, v17.4s
mul v2.4s, v2.4s, v18.4s
mul v3.4s, v3.4s, v19.4s
sshl v0.4s, v0.4s, v31.4s
sshl v1.4s, v1.4s, v31.4s
sshl v2.4s, v2.4s, v31.4s
sshl v3.4s, v3.4s, v31.4s
st1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64
.ifc \size, 8x8
b.gt dequant_\size\()_lshift_loop
.endif
ret
dequant_\size\()_rshift:
dup v31.4s, w3
neg w3, w3
mov w5, #1
sub w3, w3, #1
lsl w5, w5, w3
.ifc \size, 8x8
dequant_\size\()_rshift_loop:
subs w2, w2, #1
.endif
ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x1], #64
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0]
dup v20.4s, w5
dup v21.4s, w5
dup v22.4s, w5
dup v23.4s, w5
mla v20.4s, v0.4s, v16.4s
mla v21.4s, v1.4s, v17.4s
mla v22.4s, v2.4s, v18.4s
mla v23.4s, v3.4s, v19.4s
sshl v16.4s, v20.4s, v31.4s
sshl v17.4s, v21.4s, v31.4s
sshl v18.4s, v22.4s, v31.4s
sshl v19.4s, v23.4s, v31.4s
st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x0], #64
.ifc \size, 8x8
b.gt dequant_\size\()_rshift_loop
.endif
ret
endfunc
.endm
DEQUANT 4x4, 4
DEQUANT 8x8, 6
// dequant_4x4_dc( int32_t dct[16], int dequant_mf[6][16], int i_qp )
function dequant_4x4_dc_neon, export=1
DEQUANT_START 6, 6, yes
b.lt dequant_4x4_dc_rshift
lsl w1, w1, w3
dup v31.4s, w1
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0]
mul v0.4s, v0.4s, v31.4s
mul v1.4s, v1.4s, v31.4s
mul v2.4s, v2.4s, v31.4s
mul v3.4s, v3.4s, v31.4s
st1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0]
ret
dequant_4x4_dc_rshift:
dup v31.4s, w1
dup v30.4s, w3
neg w3, w3
mov w5, #1
sub w3, w3, #1
lsl w5, w5, w3
dup v16.4s, w5
dup v17.4s, w5
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0]
dup v18.4s, w5
dup v19.4s, w5
mla v16.4s, v0.4s, v31.4s
mla v17.4s, v1.4s, v31.4s
mla v18.4s, v2.4s, v31.4s
mla v19.4s, v3.4s, v31.4s
sshl v16.4s, v16.4s, v30.4s
sshl v17.4s, v17.4s, v30.4s
sshl v18.4s, v18.4s, v30.4s
sshl v19.4s, v19.4s, v30.4s
st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x0]
ret
endfunc
.endif
+3 -3
View File
@@ -42,11 +42,11 @@ int x264_quant_4x4x4_neon( dctcoef dct[4][16], udctcoef mf[16], udctcoef bias[16
int x264_quant_8x8_neon( dctcoef dct[64], udctcoef mf[64], udctcoef bias[64] );
#define x264_dequant_4x4_dc_neon x264_template(dequant_4x4_dc_neon)
void x264_dequant_4x4_dc_neon( int16_t dct[16], int dequant_mf[6][16], int i_qp );
void x264_dequant_4x4_dc_neon( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
#define x264_dequant_4x4_neon x264_template(dequant_4x4_neon)
void x264_dequant_4x4_neon( int16_t dct[16], int dequant_mf[6][16], int i_qp );
void x264_dequant_4x4_neon( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
#define x264_dequant_8x8_neon x264_template(dequant_8x8_neon)
void x264_dequant_8x8_neon( int16_t dct[64], int dequant_mf[6][64], int i_qp );
void x264_dequant_8x8_neon( dctcoef dct[64], int dequant_mf[6][64], int i_qp );
#define x264_decimate_score15_neon x264_template(decimate_score15_neon)
int x264_decimate_score15_neon( int16_t * );
+4
View File
@@ -566,6 +566,10 @@ void x264_quant_init( x264_t *h, uint32_t cpu, x264_quant_function_t *pf )
pf->quant_4x4 = x264_quant_4x4_neon;
pf->quant_4x4x4 = x264_quant_4x4x4_neon;
pf->quant_8x8 = x264_quant_8x8_neon;
pf->dequant_4x4 = x264_dequant_4x4_neon;
pf->dequant_8x8 = x264_dequant_8x8_neon;
pf->dequant_4x4_dc = x264_dequant_4x4_dc_neon;
}
#endif // HAVE_AARCH64