aboutsummaryrefslogtreecommitdiff
path: root/vpx_dsp/x86/quantize_ssse3.c
diff options
context:
space:
mode:
Diffstat (limited to 'vpx_dsp/x86/quantize_ssse3.c')
-rw-r--r--vpx_dsp/x86/quantize_ssse3.c51
1 files changed, 12 insertions, 39 deletions
diff --git a/vpx_dsp/x86/quantize_ssse3.c b/vpx_dsp/x86/quantize_ssse3.c
index 476230286..2c6d851a1 100644
--- a/vpx_dsp/x86/quantize_ssse3.c
+++ b/vpx_dsp/x86/quantize_ssse3.c
@@ -16,16 +16,17 @@
#include "vpx_dsp/x86/bitdepth_conversion_sse2.h"
#include "vpx_dsp/x86/quantize_sse2.h"
#include "vpx_dsp/x86/quantize_ssse3.h"
+#include "vp9/common/vp9_scan.h"
+#include "vp9/encoder/vp9_block.h"
void vpx_quantize_b_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
- const int16_t *zbin_ptr, const int16_t *round_ptr,
- const int16_t *quant_ptr,
- const int16_t *quant_shift_ptr,
+ const struct macroblock_plane *const mb_plane,
tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
const int16_t *dequant_ptr, uint16_t *eob_ptr,
- const int16_t *scan, const int16_t *iscan) {
+ const struct ScanOrder *const scan_order) {
const __m128i zero = _mm_setzero_si128();
int index = 16;
+ const int16_t *iscan = scan_order->iscan;
__m128i zbin, round, quant, dequant, shift;
__m128i coeff0, coeff1;
@@ -33,10 +34,7 @@ void vpx_quantize_b_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
__m128i cmp_mask0, cmp_mask1;
__m128i eob, eob0;
- (void)scan;
-
- load_b_values(zbin_ptr, &zbin, round_ptr, &round, quant_ptr, &quant,
- dequant_ptr, &dequant, quant_shift_ptr, &shift);
+ load_b_values(mb_plane, &zbin, &round, &quant, dequant_ptr, &dequant, &shift);
// Do DC and first 15 AC.
coeff0 = load_tran_low(coeff_ptr);
@@ -107,17 +105,14 @@ void vpx_quantize_b_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
*eob_ptr = accumulate_eob(eob);
}
-void vpx_quantize_b_32x32_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
- const int16_t *zbin_ptr,
- const int16_t *round_ptr,
- const int16_t *quant_ptr,
- const int16_t *quant_shift_ptr,
+void vpx_quantize_b_32x32_ssse3(const tran_low_t *coeff_ptr,
+ const struct macroblock_plane *const mb_plane,
tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
const int16_t *dequant_ptr, uint16_t *eob_ptr,
- const int16_t *scan, const int16_t *iscan) {
+ const struct ScanOrder *const scan_order) {
const __m128i zero = _mm_setzero_si128();
- const __m128i one = _mm_set1_epi16(1);
int index;
+ const int16_t *iscan = scan_order->iscan;
__m128i zbin, round, quant, dequant, shift;
__m128i coeff0, coeff1;
@@ -126,30 +121,8 @@ void vpx_quantize_b_32x32_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
__m128i all_zero;
__m128i eob = zero, eob0;
- (void)scan;
- (void)n_coeffs;
-
- // Setup global values.
- // The 32x32 halves zbin and round.
- zbin = _mm_load_si128((const __m128i *)zbin_ptr);
- // Shift with rounding.
- zbin = _mm_add_epi16(zbin, one);
- zbin = _mm_srli_epi16(zbin, 1);
- // x86 has no "greater *or equal*" comparison. Subtract 1 from zbin so
- // it is a strict "greater" comparison.
- zbin = _mm_sub_epi16(zbin, one);
-
- round = _mm_load_si128((const __m128i *)round_ptr);
- round = _mm_add_epi16(round, one);
- round = _mm_srli_epi16(round, 1);
-
- quant = _mm_load_si128((const __m128i *)quant_ptr);
- dequant = _mm_load_si128((const __m128i *)dequant_ptr);
- shift = _mm_load_si128((const __m128i *)quant_shift_ptr);
- // I suspect this is not technically OK because quant_shift can be up
- // to 1 << 16 and shifting up again will outrange that, but the test is not
- // comprehensive enough to catch that and "it's been that way forever"
- shift = _mm_slli_epi16(shift, 1);
+ load_b_values32x32(mb_plane, &zbin, &round, &quant, dequant_ptr, &dequant,
+ &shift);
// Do DC and first 15 AC.
coeff0 = load_tran_low(coeff_ptr);