mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-07 01:06:46 +08:00
Unaligned test/moves for some of the slower functions
BUG=none TEST=none Review URL: https://webrtc-codereview.appspot.com/368011 git-svn-id: http://libyuv.googlecode.com/svn/trunk@162 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
b5b27d131a
commit
b1dd02d66c
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 161
|
Version: 162
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,7 @@ namespace libyuv {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LIBYUV_VERSION 161
|
#define LIBYUV_VERSION 162
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@ -548,8 +548,7 @@ int RGB24ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
||||||
uint8* dst_u, uint8* dst_v, int width);
|
uint8* dst_u, uint8* dst_v, int width);
|
||||||
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||||
IS_ALIGNED(src_frame, 16) && IS_ALIGNED(src_stride_frame, 16)) {
|
|
||||||
RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
|
RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -561,6 +560,11 @@ int RGB24ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
||||||
ARGBToYRow = ARGBToYRow_SSSE3;
|
ARGBToYRow = ARGBToYRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) && width <= kMaxStride) {
|
||||||
|
ARGBToYRow = ARGBToYAnyRow_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYRow = ARGBToYRow_Unaligned_SSSE3;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -569,6 +573,9 @@ int RGB24ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
||||||
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
|
IS_ALIGNED(width, 2) && width <= kMaxStride) {
|
||||||
|
ARGBToUVRow = ARGBToUVAnyRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -610,8 +617,7 @@ int RAWToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
||||||
uint8* dst_u, uint8* dst_v, int width);
|
uint8* dst_u, uint8* dst_v, int width);
|
||||||
#if defined(HAS_RAWTOARGBROW_SSSE3)
|
#if defined(HAS_RAWTOARGBROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||||
IS_ALIGNED(src_frame, 16) && IS_ALIGNED(src_stride_frame, 16)) {
|
|
||||||
RAWToARGBRow = RAWToARGBRow_SSSE3;
|
RAWToARGBRow = RAWToARGBRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -623,6 +629,11 @@ int RAWToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
||||||
ARGBToYRow = ARGBToYRow_SSSE3;
|
ARGBToYRow = ARGBToYRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) && width <= kMaxStride) {
|
||||||
|
ARGBToYRow = ARGBToYAnyRow_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYRow = ARGBToYRow_Unaligned_SSSE3;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -631,6 +642,9 @@ int RAWToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
||||||
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
|
IS_ALIGNED(width, 2) && width <= kMaxStride) {
|
||||||
|
ARGBToUVRow = ARGBToUVAnyRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -672,8 +686,7 @@ int RGB565ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
||||||
uint8* dst_u, uint8* dst_v, int width);
|
uint8* dst_u, uint8* dst_v, int width);
|
||||||
#if defined(HAS_RGB565TOARGBROW_SSE2)
|
#if defined(HAS_RGB565TOARGBROW_SSE2)
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
if (TestCpuFlag(kCpuHasSSE2)) {
|
||||||
IS_ALIGNED(src_frame, 16) && IS_ALIGNED(src_stride_frame, 16)) {
|
|
||||||
RGB565ToARGBRow = RGB565ToARGBRow_SSE2;
|
RGB565ToARGBRow = RGB565ToARGBRow_SSE2;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -685,6 +698,11 @@ int RGB565ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
||||||
ARGBToYRow = ARGBToYRow_SSSE3;
|
ARGBToYRow = ARGBToYRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) && width <= kMaxStride) {
|
||||||
|
ARGBToYRow = ARGBToYAnyRow_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYRow = ARGBToYRow_Unaligned_SSSE3;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -693,6 +711,9 @@ int RGB565ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
||||||
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
|
IS_ALIGNED(width, 2) && width <= kMaxStride) {
|
||||||
|
ARGBToUVRow = ARGBToUVAnyRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -734,8 +755,7 @@ int ARGB1555ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
||||||
uint8* dst_u, uint8* dst_v, int width);
|
uint8* dst_u, uint8* dst_v, int width);
|
||||||
#if defined(HAS_ARGB1555TOARGBROW_SSE2)
|
#if defined(HAS_ARGB1555TOARGBROW_SSE2)
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
if (TestCpuFlag(kCpuHasSSE2)) {
|
||||||
IS_ALIGNED(src_frame, 16) && IS_ALIGNED(src_stride_frame, 16)) {
|
|
||||||
ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2;
|
ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -747,6 +767,11 @@ int ARGB1555ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
||||||
ARGBToYRow = ARGBToYRow_SSSE3;
|
ARGBToYRow = ARGBToYRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) && width <= kMaxStride) {
|
||||||
|
ARGBToYRow = ARGBToYAnyRow_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYRow = ARGBToYRow_Unaligned_SSSE3;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -755,6 +780,9 @@ int ARGB1555ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
||||||
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
|
IS_ALIGNED(width, 2) && width <= kMaxStride) {
|
||||||
|
ARGBToUVRow = ARGBToUVAnyRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -796,8 +824,7 @@ int ARGB4444ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
||||||
uint8* dst_u, uint8* dst_v, int width);
|
uint8* dst_u, uint8* dst_v, int width);
|
||||||
#if defined(HAS_ARGB4444TOARGBROW_SSE2)
|
#if defined(HAS_ARGB4444TOARGBROW_SSE2)
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
if (TestCpuFlag(kCpuHasSSE2)) {
|
||||||
IS_ALIGNED(src_frame, 16) && IS_ALIGNED(src_stride_frame, 16)) {
|
|
||||||
ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2;
|
ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -809,6 +836,11 @@ int ARGB4444ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) {
|
||||||
ARGBToYRow = ARGBToYRow_SSSE3;
|
ARGBToYRow = ARGBToYRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) && width <= kMaxStride) {
|
||||||
|
ARGBToYRow = ARGBToYAnyRow_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYRow = ARGBToYRow_Unaligned_SSSE3;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -817,6 +849,9 @@ int ARGB4444ToI420(const uint8* src_frame, int src_stride_frame,
|
|||||||
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
#if defined(HAS_ARGBTOUVROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
|
||||||
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
||||||
|
} else if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
|
IS_ALIGNED(width, 2) && width <= kMaxStride) {
|
||||||
|
ARGBToUVRow = ARGBToUVAnyRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2147,7 +2147,6 @@ int RAWToARGB(const uint8* src_raw, int src_stride_raw,
|
|||||||
#if defined(HAS_RAWTOARGBROW_SSSE3)
|
#if defined(HAS_RAWTOARGBROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(src_raw, 16) && IS_ALIGNED(src_stride_raw, 16) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
||||||
RAWToARGBRow = RAWToARGBRow_SSSE3;
|
RAWToARGBRow = RAWToARGBRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
@ -2177,7 +2176,6 @@ int BG24ToARGB(const uint8* src_rgb24, int src_stride_rgb24,
|
|||||||
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
IS_ALIGNED(width, 16) &&
|
IS_ALIGNED(width, 16) &&
|
||||||
IS_ALIGNED(src_rgb24, 16) && IS_ALIGNED(src_stride_rgb24, 16) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
||||||
RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
|
RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
|
||||||
} else
|
} else
|
||||||
|
|||||||
@ -172,9 +172,9 @@ __asm {
|
|||||||
movdqa xmm4, kShuffleMaskRGB24ToARGB
|
movdqa xmm4, kShuffleMaskRGB24ToARGB
|
||||||
|
|
||||||
convertloop:
|
convertloop:
|
||||||
movdqa xmm0, [eax]
|
movdqu xmm0, [eax]
|
||||||
movdqa xmm1, [eax + 16]
|
movdqu xmm1, [eax + 16]
|
||||||
movdqa xmm3, [eax + 32]
|
movdqu xmm3, [eax + 32]
|
||||||
lea eax, [eax + 48]
|
lea eax, [eax + 48]
|
||||||
movdqa xmm2, xmm3
|
movdqa xmm2, xmm3
|
||||||
palignr xmm2, xmm1, 8 // xmm2 = { xmm3[0:3] xmm1[8:15]}
|
palignr xmm2, xmm1, 8 // xmm2 = { xmm3[0:3] xmm1[8:15]}
|
||||||
@ -211,9 +211,9 @@ __asm {
|
|||||||
movdqa xmm4, kShuffleMaskRAWToARGB
|
movdqa xmm4, kShuffleMaskRAWToARGB
|
||||||
|
|
||||||
convertloop:
|
convertloop:
|
||||||
movdqa xmm0, [eax]
|
movdqu xmm0, [eax]
|
||||||
movdqa xmm1, [eax + 16]
|
movdqu xmm1, [eax + 16]
|
||||||
movdqa xmm3, [eax + 32]
|
movdqu xmm3, [eax + 32]
|
||||||
lea eax, [eax + 48]
|
lea eax, [eax + 48]
|
||||||
movdqa xmm2, xmm3
|
movdqa xmm2, xmm3
|
||||||
palignr xmm2, xmm1, 8 // xmm2 = { xmm3[0:3] xmm1[8:15]}
|
palignr xmm2, xmm1, 8 // xmm2 = { xmm3[0:3] xmm1[8:15]}
|
||||||
@ -270,7 +270,7 @@ __asm {
|
|||||||
sub edx, eax
|
sub edx, eax
|
||||||
|
|
||||||
convertloop:
|
convertloop:
|
||||||
movdqa xmm0, [eax] // fetch 8 pixels of bgr565
|
movdqu xmm0, [eax] // fetch 8 pixels of bgr565
|
||||||
movdqa xmm1, xmm0
|
movdqa xmm1, xmm0
|
||||||
movdqa xmm2, xmm0
|
movdqa xmm2, xmm0
|
||||||
pand xmm1, xmm3 // R in upper 5 bits
|
pand xmm1, xmm3 // R in upper 5 bits
|
||||||
@ -320,7 +320,7 @@ __asm {
|
|||||||
sub edx, eax
|
sub edx, eax
|
||||||
|
|
||||||
convertloop:
|
convertloop:
|
||||||
movdqa xmm0, [eax] // fetch 8 pixels of 1555
|
movdqu xmm0, [eax] // fetch 8 pixels of 1555
|
||||||
movdqa xmm1, xmm0
|
movdqa xmm1, xmm0
|
||||||
movdqa xmm2, xmm0
|
movdqa xmm2, xmm0
|
||||||
psllw xmm1, 1 // R in upper 5 bits
|
psllw xmm1, 1 // R in upper 5 bits
|
||||||
@ -366,7 +366,7 @@ __asm {
|
|||||||
sub edx, eax
|
sub edx, eax
|
||||||
|
|
||||||
convertloop:
|
convertloop:
|
||||||
movdqa xmm0, [eax] // fetch 8 pixels of bgra4444
|
movdqu xmm0, [eax] // fetch 8 pixels of bgra4444
|
||||||
movdqa xmm2, xmm0
|
movdqa xmm2, xmm0
|
||||||
pand xmm0, xmm4 // mask low nibbles
|
pand xmm0, xmm4 // mask low nibbles
|
||||||
pand xmm2, xmm5 // mask high nibbles
|
pand xmm2, xmm5 // mask high nibbles
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user