mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-07 17:26:49 +08:00
Change I422ToARGB_AVX2 register usage to match SSSE3. ymm0 = B, ymm1 = G, ymm2 = R.
BUG=269 TESTED=intelsde passes on unittests. R=harryjin@google.com Review URL: https://webrtc-codereview.appspot.com/28759004 git-svn-id: http://libyuv.googlecode.com/svn/trunk@1132 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
51b78880c5
commit
a063a66de4
@ -1,6 +1,6 @@
|
||||
Name: libyuv
|
||||
URL: http://code.google.com/p/libyuv/
|
||||
Version: 1130
|
||||
Version: 1132
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
||||
#define INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
#define LIBYUV_VERSION 1130
|
||||
#define LIBYUV_VERSION 1132
|
||||
|
||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||
|
||||
@ -1496,9 +1496,9 @@ void RGBAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
#endif // HAS_ARGBTOYROW_SSSE3
|
||||
|
||||
|
||||
#ifdef HAS_I422TOARGBROW_AVX2
|
||||
|
||||
static const lvec8 kUVToB_AVX = {
|
||||
@ -1557,12 +1557,12 @@ void I422ToARGBRow_AVX2(const uint8* y_buf,
|
||||
vpunpcklbw ymm0, ymm0, ymm1 // UV
|
||||
vpermq ymm0, ymm0, 0xd8
|
||||
vpunpcklwd ymm0, ymm0, ymm0 // UVUV
|
||||
vpmaddubsw ymm2, ymm0, kUVToB_AVX // scale B UV
|
||||
vpmaddubsw ymm2, ymm0, kUVToR_AVX // scale R UV
|
||||
vpmaddubsw ymm1, ymm0, kUVToG_AVX // scale G UV
|
||||
vpmaddubsw ymm0, ymm0, kUVToR_AVX // scale R UV
|
||||
vpsubw ymm2, ymm2, kUVBiasB_AVX // unbias back to signed
|
||||
vpmaddubsw ymm0, ymm0, kUVToB_AVX // scale B UV
|
||||
vpsubw ymm2, ymm2, kUVBiasR_AVX // unbias back to signed
|
||||
vpsubw ymm1, ymm1, kUVBiasG_AVX
|
||||
vpsubw ymm0, ymm0, kUVBiasR_AVX
|
||||
vpsubw ymm0, ymm0, kUVBiasB_AVX
|
||||
|
||||
// Step 2: Find Y contribution to 16 R,G,B values
|
||||
vmovdqu xmm3, [eax] // NOLINT
|
||||
@ -1571,25 +1571,25 @@ void I422ToARGBRow_AVX2(const uint8* y_buf,
|
||||
vpunpcklbw ymm3, ymm3, ymm4
|
||||
vpsubsw ymm3, ymm3, kYSub16_AVX
|
||||
vpmullw ymm3, ymm3, kYToRgb_AVX
|
||||
vpaddsw ymm2, ymm2, ymm3 // B += Y
|
||||
vpaddsw ymm0, ymm0, ymm3 // B += Y
|
||||
vpaddsw ymm1, ymm1, ymm3 // G += Y
|
||||
vpaddsw ymm0, ymm0, ymm3 // R += Y
|
||||
vpsraw ymm2, ymm2, 6
|
||||
vpsraw ymm1, ymm1, 6
|
||||
vpaddsw ymm2, ymm2, ymm3 // R += Y
|
||||
vpsraw ymm0, ymm0, 6
|
||||
vpackuswb ymm2, ymm2, ymm2 // B
|
||||
vpsraw ymm1, ymm1, 6
|
||||
vpsraw ymm2, ymm2, 6
|
||||
vpackuswb ymm0, ymm0, ymm0 // B
|
||||
vpackuswb ymm1, ymm1, ymm1 // G
|
||||
vpackuswb ymm0, ymm0, ymm0 // R
|
||||
vpackuswb ymm2, ymm2, ymm2 // R
|
||||
|
||||
// Step 3: Weave into ARGB
|
||||
vpunpcklbw ymm2, ymm2, ymm1 // BG
|
||||
vpermq ymm2, ymm2, 0xd8
|
||||
vpunpcklbw ymm0, ymm0, ymm5 // RA
|
||||
vpunpcklbw ymm0, ymm0, ymm1 // BG
|
||||
vpermq ymm0, ymm0, 0xd8
|
||||
vpunpcklwd ymm1, ymm2, ymm0 // BGRA first 8 pixels
|
||||
vpunpckhwd ymm2, ymm2, ymm0 // BGRA next 8 pixels
|
||||
vpunpcklbw ymm2, ymm2, ymm5 // RA
|
||||
vpermq ymm2, ymm2, 0xd8
|
||||
vpunpcklwd ymm1, ymm0, ymm2 // BGRA first 8 pixels
|
||||
vpunpckhwd ymm0, ymm0, ymm2 // BGRA next 8 pixels
|
||||
vmovdqu [edx], ymm1
|
||||
vmovdqu [edx + 32], ymm2
|
||||
vmovdqu [edx + 32], ymm0
|
||||
lea edx, [edx + 64]
|
||||
sub ecx, 16
|
||||
jg convertloop
|
||||
@ -1630,12 +1630,12 @@ void I422ToBGRARow_AVX2(const uint8* y_buf,
|
||||
vpunpcklbw ymm0, ymm0, ymm1 // UV
|
||||
vpermq ymm0, ymm0, 0xd8
|
||||
vpunpcklwd ymm0, ymm0, ymm0 // UVUV
|
||||
vpmaddubsw ymm2, ymm0, kUVToB_AVX // scale B UV
|
||||
vpmaddubsw ymm2, ymm0, kUVToR_AVX // scale R UV
|
||||
vpmaddubsw ymm1, ymm0, kUVToG_AVX // scale G UV
|
||||
vpmaddubsw ymm0, ymm0, kUVToR_AVX // scale R UV
|
||||
vpsubw ymm2, ymm2, kUVBiasB_AVX // unbias back to signed
|
||||
vpmaddubsw ymm0, ymm0, kUVToB_AVX // scale B UV
|
||||
vpsubw ymm2, ymm2, kUVBiasR_AVX // unbias back to signed
|
||||
vpsubw ymm1, ymm1, kUVBiasG_AVX
|
||||
vpsubw ymm0, ymm0, kUVBiasR_AVX
|
||||
vpsubw ymm0, ymm0, kUVBiasB_AVX
|
||||
|
||||
// Step 2: Find Y contribution to 16 R,G,B values
|
||||
vmovdqu xmm3, [eax] // NOLINT
|
||||
@ -1644,26 +1644,25 @@ void I422ToBGRARow_AVX2(const uint8* y_buf,
|
||||
vpunpcklbw ymm3, ymm3, ymm4
|
||||
vpsubsw ymm3, ymm3, kYSub16_AVX
|
||||
vpmullw ymm3, ymm3, kYToRgb_AVX
|
||||
vpaddsw ymm2, ymm2, ymm3 // B += Y
|
||||
vpaddsw ymm0, ymm0, ymm3 // B += Y
|
||||
vpaddsw ymm1, ymm1, ymm3 // G += Y
|
||||
vpaddsw ymm0, ymm0, ymm3 // R += Y
|
||||
vpsraw ymm2, ymm2, 6
|
||||
vpsraw ymm1, ymm1, 6
|
||||
vpaddsw ymm2, ymm2, ymm3 // R += Y
|
||||
vpsraw ymm0, ymm0, 6
|
||||
// TODO(fbarchard): Switch register order to match SSSE3.
|
||||
vpackuswb ymm2, ymm2, ymm2 // B
|
||||
vpsraw ymm1, ymm1, 6
|
||||
vpsraw ymm2, ymm2, 6
|
||||
vpackuswb ymm0, ymm0, ymm0 // B
|
||||
vpackuswb ymm1, ymm1, ymm1 // G
|
||||
vpackuswb ymm0, ymm0, ymm0 // R
|
||||
vpackuswb ymm2, ymm2, ymm2 // R
|
||||
|
||||
// Step 3: Weave into BGRA
|
||||
vpunpcklbw ymm1, ymm1, ymm2 // GB
|
||||
vpunpcklbw ymm1, ymm1, ymm0 // GB
|
||||
vpermq ymm1, ymm1, 0xd8
|
||||
vpunpcklbw ymm0, ymm5, ymm0 // AR
|
||||
vpermq ymm0, ymm0, 0xd8
|
||||
vpunpcklwd ymm2, ymm0, ymm1 // ARGB first 8 pixels
|
||||
vpunpckhwd ymm0, ymm0, ymm1 // ARGB next 8 pixels
|
||||
vmovdqu [edx], ymm2
|
||||
vmovdqu [edx + 32], ymm0
|
||||
vpunpcklbw ymm2, ymm5, ymm2 // AR
|
||||
vpermq ymm2, ymm2, 0xd8
|
||||
vpunpcklwd ymm0, ymm2, ymm1 // ARGB first 8 pixels
|
||||
vpunpckhwd ymm2, ymm2, ymm1 // ARGB next 8 pixels
|
||||
vmovdqu [edx], ymm0
|
||||
vmovdqu [edx + 32], ymm2
|
||||
lea edx, [edx + 64]
|
||||
sub ecx, 16
|
||||
jg convertloop
|
||||
@ -1677,7 +1676,6 @@ void I422ToBGRARow_AVX2(const uint8* y_buf,
|
||||
#endif // HAS_I422TOARGBROW_AVX2
|
||||
|
||||
#ifdef HAS_I422TOARGBROW_SSSE3
|
||||
|
||||
// TODO(fbarchard): Read that does half size on Y and treats 420 as 444.
|
||||
|
||||
// Read 8 UV from 444.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user