mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-08 01:36:47 +08:00
ARGBToYJ_AVX2 port to AVX2.
BUG=none TEST=none Review URL: https://webrtc-codereview.appspot.com/1272008 git-svn-id: http://libyuv.googlecode.com/svn/trunk@640 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
2f620e18ed
commit
91c50c3a7d
@ -137,6 +137,7 @@ extern "C" {
|
||||
#define HAS_ARGBSHUFFLEROW_AVX2
|
||||
#define HAS_ARGBTOUVROW_AVX2
|
||||
#define HAS_ARGBTOYROW_AVX2
|
||||
#define HAS_ARGBTOYJROW_AVX2
|
||||
#define HAS_HALFROW_AVX2
|
||||
#define HAS_MERGEUVROW_AVX2
|
||||
#define HAS_MIRRORROW_AVX2
|
||||
@ -403,6 +404,8 @@ void UYVYToARGBRow_NEON(const uint8* src_uyvy,
|
||||
void ARGBToYRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix);
|
||||
void ARGBToYRow_Any_AVX2(const uint8* src_argb, uint8* dst_y, int pix);
|
||||
void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
|
||||
void ARGBToYJRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix);
|
||||
void ARGBToYJRow_Any_AVX2(const uint8* src_argb, uint8* dst_y, int pix);
|
||||
void ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
|
||||
void BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix);
|
||||
void ABGRToYRow_SSSE3(const uint8* src_abgr, uint8* dst_y, int pix);
|
||||
|
||||
@ -1012,6 +1012,14 @@ int ARGBToJ420(const uint8* src_argb, int src_stride_argb,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ARGBTOYJROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2) && width >= 32) {
|
||||
ARGBToYJRow = ARGBToYJRow_Any_AVX2;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
ARGBToYJRow = ARGBToYJRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ARGBTOYJROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
||||
ARGBToYJRow = ARGBToYJRow_Any_NEON;
|
||||
@ -1077,6 +1085,14 @@ int ARGBToJ400(const uint8* src_argb, int src_stride_argb,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ARGBTOYJROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2) && width >= 32) {
|
||||
ARGBToYJRow = ARGBToYJRow_Any_AVX2;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
ARGBToYJRow = ARGBToYJRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ARGBTOYJROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
||||
ARGBToYJRow = ARGBToYJRow_Any_NEON;
|
||||
|
||||
@ -204,6 +204,7 @@ BAYERANY(ARGBToBayerRow_Any_NEON, ARGBToBayerRow_NEON, ARGBToBayerRow_C,
|
||||
|
||||
#ifdef HAS_ARGBTOYROW_AVX2
|
||||
YANY(ARGBToYRow_Any_AVX2, ARGBToYRow_AVX2, 4, 1, 32)
|
||||
YANY(ARGBToYJRow_Any_AVX2, ARGBToYJRow_AVX2, 4, 1, 32)
|
||||
YANY(YUY2ToYRow_Any_AVX2, YUY2ToYRow_AVX2, 2, 1, 32)
|
||||
YANY(UYVYToYRow_Any_AVX2, UYVYToYRow_AVX2, 2, 1, 32)
|
||||
#endif
|
||||
|
||||
@ -35,6 +35,11 @@ static const lvec8 kARGBToY_AVX = {
|
||||
13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0
|
||||
};
|
||||
|
||||
static const lvec8 kARGBToYJ_AVX = {
|
||||
15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0,
|
||||
15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0
|
||||
};
|
||||
|
||||
static const vec8 kARGBToU = {
|
||||
112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0
|
||||
};
|
||||
@ -119,6 +124,9 @@ static const uvec8 kAddY16 = {
|
||||
static const vec16 kAddYJ64 = {
|
||||
64, 64, 64, 64, 64, 64, 64, 64
|
||||
};
|
||||
static const lvec16 kAddYJ64_AVX = {
|
||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
||||
};
|
||||
|
||||
static const ulvec8 kAddY16_AVX = {
|
||||
16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
|
||||
@ -760,6 +768,48 @@ void ARGBToYRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix) {
|
||||
}
|
||||
#endif // HAS_ARGBTOYROW_AVX2
|
||||
|
||||
#ifdef HAS_ARGBTOYROW_AVX2
|
||||
// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
|
||||
__declspec(naked) __declspec(align(32))
|
||||
void ARGBToYJRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix) {
|
||||
__asm {
|
||||
mov eax, [esp + 4] /* src_argb */
|
||||
mov edx, [esp + 8] /* dst_y */
|
||||
mov ecx, [esp + 12] /* pix */
|
||||
vmovdqa ymm4, kARGBToYJ_AVX
|
||||
vmovdqa ymm5, kAddYJ64_AVX
|
||||
vmovdqa ymm6, kShufARGBToY_AVX
|
||||
|
||||
align 16
|
||||
convertloop:
|
||||
vmovdqu ymm0, [eax]
|
||||
vmovdqu ymm1, [eax + 32]
|
||||
vmovdqu ymm2, [eax + 64]
|
||||
vmovdqu ymm3, [eax + 96]
|
||||
vpmaddubsw ymm0, ymm0, ymm4
|
||||
vpmaddubsw ymm1, ymm1, ymm4
|
||||
vpmaddubsw ymm2, ymm2, ymm4
|
||||
vpmaddubsw ymm3, ymm3, ymm4
|
||||
lea eax, [eax + 128]
|
||||
vphaddw ymm0, ymm0, ymm1 // mutates.
|
||||
vphaddw ymm2, ymm2, ymm3
|
||||
vpaddw ymm0, ymm0, ymm5 // Add .5 for rounding.
|
||||
vpaddw ymm2, ymm2, ymm5
|
||||
vpsrlw ymm0, ymm0, 7
|
||||
vpsrlw ymm2, ymm2, 7
|
||||
vpackuswb ymm0, ymm0, ymm2 // mutates.
|
||||
vpermd ymm0, ymm6, ymm0 // For vphaddw + vpackuswb mutation.
|
||||
sub ecx, 32
|
||||
vmovdqu [edx], ymm0
|
||||
lea edx, [edx + 32]
|
||||
jg convertloop
|
||||
|
||||
vzeroupper
|
||||
ret
|
||||
}
|
||||
}
|
||||
#endif // HAS_ARGBTOYJROW_AVX2
|
||||
|
||||
__declspec(naked) __declspec(align(16))
|
||||
void ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
|
||||
__asm {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user