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:
committed by
Anton Mitrofanov
parent
b8ea87e05c
commit
986dd1f3b7
@@ -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
|
||||
|
||||
@@ -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 * );
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user