blob: 99a6b90829cfdc453ad355baa09c67dd4706d99b [file] [log] [blame]
/*
* Copyright (c) 2018, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file, you can
* obtain it at www.aomedia.org/license/software. If the Alliance for Open
* Media Patent License 1.0 was not distributed with this source code in the
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/
#ifndef AOM_AV1_ENCODER_X86_AV1_FWD_TXFM_SSE2_H_
#define AOM_AV1_ENCODER_X86_AV1_FWD_TXFM_SSE2_H_
#include <immintrin.h>
#include "config/aom_config.h"
#include "config/av1_rtcd.h"
#include "aom/aom_integer.h"
#include "aom_dsp/x86/transpose_sse2.h"
#include "aom_dsp/x86/txfm_common_sse2.h"
#ifdef __cplusplus
extern "C" {
#endif
void fdct8x32_new_sse2(const __m128i *input, __m128i *output, int8_t cos_bit);
void fdct8x64_new_sse2(const __m128i *input, __m128i *output, int8_t cos_bit);
static INLINE void fidentity4x4_new_sse2(const __m128i *const input,
__m128i *const output,
const int8_t cos_bit) {
(void)cos_bit;
const __m128i one = _mm_set1_epi16(1);
for (int i = 0; i < 4; ++i) {
const __m128i a = _mm_unpacklo_epi16(input[i], one);
const __m128i b = scale_round_sse2(a, NewSqrt2);
output[i] = _mm_packs_epi32(b, b);
}
}
static INLINE void fidentity8x4_new_sse2(const __m128i *const input,
__m128i *const output,
const int8_t cos_bit) {
(void)cos_bit;
const __m128i one = _mm_set1_epi16(1);
for (int i = 0; i < 4; ++i) {
const __m128i a_lo = _mm_unpacklo_epi16(input[i], one);
const __m128i a_hi = _mm_unpackhi_epi16(input[i], one);
const __m128i b_lo = scale_round_sse2(a_lo, NewSqrt2);
const __m128i b_hi = scale_round_sse2(a_hi, NewSqrt2);
output[i] = _mm_packs_epi32(b_lo, b_hi);
}
}
static INLINE void fidentity8x8_new_sse2(const __m128i *input, __m128i *output,
int8_t cos_bit) {
(void)cos_bit;
output[0] = _mm_adds_epi16(input[0], input[0]);
output[1] = _mm_adds_epi16(input[1], input[1]);
output[2] = _mm_adds_epi16(input[2], input[2]);
output[3] = _mm_adds_epi16(input[3], input[3]);
output[4] = _mm_adds_epi16(input[4], input[4]);
output[5] = _mm_adds_epi16(input[5], input[5]);
output[6] = _mm_adds_epi16(input[6], input[6]);
output[7] = _mm_adds_epi16(input[7], input[7]);
}
static INLINE void fidentity8x16_new_sse2(const __m128i *input, __m128i *output,
int8_t cos_bit) {
(void)cos_bit;
const __m128i one = _mm_set1_epi16(1);
for (int i = 0; i < 16; ++i) {
const __m128i a_lo = _mm_unpacklo_epi16(input[i], one);
const __m128i a_hi = _mm_unpackhi_epi16(input[i], one);
const __m128i b_lo = scale_round_sse2(a_lo, 2 * NewSqrt2);
const __m128i b_hi = scale_round_sse2(a_hi, 2 * NewSqrt2);
output[i] = _mm_packs_epi32(b_lo, b_hi);
}
}
static INLINE void fidentity8x32_new_sse2(const __m128i *input, __m128i *output,
int8_t cos_bit) {
(void)cos_bit;
for (int i = 0; i < 32; ++i) {
output[i] = _mm_slli_epi16(input[i], 2);
}
}
static const transform_1d_sse2 col_txfm8x32_arr[TX_TYPES] = {
fdct8x32_new_sse2, // DCT_DCT
NULL, // ADST_DCT
NULL, // DCT_ADST
NULL, // ADST_ADST
NULL, // FLIPADST_DCT
NULL, // DCT_FLIPADST
NULL, // FLIPADST_FLIPADST
NULL, // ADST_FLIPADST
NULL, // FLIPADST_ADST
fidentity8x32_new_sse2, // IDTX
fdct8x32_new_sse2, // V_DCT
fidentity8x32_new_sse2, // H_DCT
NULL, // V_ADST
NULL, // H_ADST
NULL, // V_FLIPADST
NULL // H_FLIPADST
};
#ifdef __cplusplus
}
#endif
#endif // AOM_AV1_ENCODER_X86_AV1_FWD_TXFM_SSE2_H_