mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-08 01:36:47 +08:00
Mark a bunch of kArray variables as const.
This allows the linker to move the variables from the .data section to the .rodata section. Bug: libyuv:254 Test: out/Release/libyuv_unittest --gtest_filter=* --libyuv_width=1280 --libyuv_height=720 --libyuv_repeat=999 --libyuv_flags=-1 --libyuv_cpu_info=-1 Change-Id: I6998570f1af4337d7b80313d9e18e36aa20d6ec0 Reviewed-on: https://chromium-review.googlesource.com/777033 Commit-Queue: Frank Barchard <fbarchard@chromium.org> Reviewed-by: Frank Barchard <fbarchard@chromium.org>
This commit is contained in:
parent
26173eb73e
commit
8445617191
@ -111,9 +111,9 @@ uint32 HammingDistance_SSE42(const uint8* src_a,
|
||||
}
|
||||
#endif
|
||||
|
||||
static vec8 kNibbleMask = {15, 15, 15, 15, 15, 15, 15, 15,
|
||||
15, 15, 15, 15, 15, 15, 15, 15};
|
||||
static vec8 kBitCount = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
|
||||
static const vec8 kNibbleMask = {15, 15, 15, 15, 15, 15, 15, 15,
|
||||
15, 15, 15, 15, 15, 15, 15, 15};
|
||||
static const vec8 kBitCount = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
|
||||
|
||||
uint32 HammingDistance_SSSE3(const uint8* src_a,
|
||||
const uint8* src_b,
|
||||
@ -267,26 +267,26 @@ uint32 SumSquareError_SSE2(const uint8* src_a, const uint8* src_b, int count) {
|
||||
return sse;
|
||||
}
|
||||
|
||||
static uvec32 kHash16x33 = {0x92d9e201, 0, 0, 0}; // 33 ^ 16
|
||||
static uvec32 kHashMul0 = {
|
||||
static const uvec32 kHash16x33 = {0x92d9e201, 0, 0, 0}; // 33 ^ 16
|
||||
static const uvec32 kHashMul0 = {
|
||||
0x0c3525e1, // 33 ^ 15
|
||||
0xa3476dc1, // 33 ^ 14
|
||||
0x3b4039a1, // 33 ^ 13
|
||||
0x4f5f0981, // 33 ^ 12
|
||||
};
|
||||
static uvec32 kHashMul1 = {
|
||||
static const uvec32 kHashMul1 = {
|
||||
0x30f35d61, // 33 ^ 11
|
||||
0x855cb541, // 33 ^ 10
|
||||
0x040a9121, // 33 ^ 9
|
||||
0x747c7101, // 33 ^ 8
|
||||
};
|
||||
static uvec32 kHashMul2 = {
|
||||
static const uvec32 kHashMul2 = {
|
||||
0xec41d4e1, // 33 ^ 7
|
||||
0x4cfa3cc1, // 33 ^ 6
|
||||
0x025528a1, // 33 ^ 5
|
||||
0x00121881, // 33 ^ 4
|
||||
};
|
||||
static uvec32 kHashMul3 = {
|
||||
static const uvec32 kHashMul3 = {
|
||||
0x00008c61, // 33 ^ 3
|
||||
0x00000441, // 33 ^ 2
|
||||
0x00000021, // 33 ^ 1
|
||||
|
||||
@ -995,16 +995,16 @@ int J400ToARGB(const uint8* src_y,
|
||||
}
|
||||
|
||||
// Shuffle table for converting BGRA to ARGB.
|
||||
static uvec8 kShuffleMaskBGRAToARGB = {3u, 2u, 1u, 0u, 7u, 6u, 5u, 4u,
|
||||
11u, 10u, 9u, 8u, 15u, 14u, 13u, 12u};
|
||||
static const uvec8 kShuffleMaskBGRAToARGB = {
|
||||
3u, 2u, 1u, 0u, 7u, 6u, 5u, 4u, 11u, 10u, 9u, 8u, 15u, 14u, 13u, 12u};
|
||||
|
||||
// Shuffle table for converting ABGR to ARGB.
|
||||
static uvec8 kShuffleMaskABGRToARGB = {2u, 1u, 0u, 3u, 6u, 5u, 4u, 7u,
|
||||
10u, 9u, 8u, 11u, 14u, 13u, 12u, 15u};
|
||||
static const uvec8 kShuffleMaskABGRToARGB = {
|
||||
2u, 1u, 0u, 3u, 6u, 5u, 4u, 7u, 10u, 9u, 8u, 11u, 14u, 13u, 12u, 15u};
|
||||
|
||||
// Shuffle table for converting RGBA to ARGB.
|
||||
static uvec8 kShuffleMaskRGBAToARGB = {1u, 2u, 3u, 0u, 5u, 6u, 7u, 4u,
|
||||
9u, 10u, 11u, 8u, 13u, 14u, 15u, 12u};
|
||||
static const uvec8 kShuffleMaskRGBAToARGB = {
|
||||
1u, 2u, 3u, 0u, 5u, 6u, 7u, 4u, 9u, 10u, 11u, 8u, 13u, 14u, 15u, 12u};
|
||||
|
||||
// Convert BGRA to ARGB.
|
||||
LIBYUV_API
|
||||
|
||||
@ -906,8 +906,8 @@ int ARGBToI400(const uint8* src_argb,
|
||||
}
|
||||
|
||||
// Shuffle table for converting ARGB to RGBA.
|
||||
static uvec8 kShuffleMaskARGBToRGBA = {3u, 0u, 1u, 2u, 7u, 4u, 5u, 6u,
|
||||
11u, 8u, 9u, 10u, 15u, 12u, 13u, 14u};
|
||||
static const uvec8 kShuffleMaskARGBToRGBA = {
|
||||
3u, 0u, 1u, 2u, 7u, 4u, 5u, 6u, 11u, 8u, 9u, 10u, 15u, 12u, 13u, 14u};
|
||||
|
||||
// Convert ARGB to RGBA.
|
||||
LIBYUV_API
|
||||
|
||||
@ -21,8 +21,8 @@ extern "C" {
|
||||
#if !defined(LIBYUV_DISABLE_NEON) && defined(__ARM_NEON__) && \
|
||||
!defined(__aarch64__)
|
||||
|
||||
static uvec8 kVTbl4x4Transpose = {0, 4, 8, 12, 1, 5, 9, 13,
|
||||
2, 6, 10, 14, 3, 7, 11, 15};
|
||||
static const uvec8 kVTbl4x4Transpose = {0, 4, 8, 12, 1, 5, 9, 13,
|
||||
2, 6, 10, 14, 3, 7, 11, 15};
|
||||
|
||||
void TransposeWx8_NEON(const uint8* src,
|
||||
int src_stride,
|
||||
@ -189,8 +189,8 @@ void TransposeWx8_NEON(const uint8* src,
|
||||
: "memory", "cc", "q0", "q1", "q2", "q3");
|
||||
}
|
||||
|
||||
static uvec8 kVTbl4x4TransposeDi = {0, 8, 1, 9, 2, 10, 3, 11,
|
||||
4, 12, 5, 13, 6, 14, 7, 15};
|
||||
static const uvec8 kVTbl4x4TransposeDi = {0, 8, 1, 9, 2, 10, 3, 11,
|
||||
4, 12, 5, 13, 6, 14, 7, 15};
|
||||
|
||||
void TransposeUVWx8_NEON(const uint8* src,
|
||||
int src_stride,
|
||||
|
||||
@ -21,8 +21,8 @@ extern "C" {
|
||||
// This module is for GCC Neon armv8 64 bit.
|
||||
#if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__)
|
||||
|
||||
static uvec8 kVTbl4x4Transpose = {0, 4, 8, 12, 1, 5, 9, 13,
|
||||
2, 6, 10, 14, 3, 7, 11, 15};
|
||||
static const uvec8 kVTbl4x4Transpose = {0, 4, 8, 12, 1, 5, 9, 13,
|
||||
2, 6, 10, 14, 3, 7, 11, 15};
|
||||
|
||||
void TransposeWx8_NEON(const uint8* src,
|
||||
int src_stride,
|
||||
@ -196,7 +196,7 @@ void TransposeWx8_NEON(const uint8* src,
|
||||
"v17", "v18", "v19", "v20", "v21", "v22", "v23");
|
||||
}
|
||||
|
||||
static uint8 kVTbl4x4TransposeDi[32] = {
|
||||
static const uint8 kVTbl4x4TransposeDi[32] = {
|
||||
0, 16, 32, 48, 2, 18, 34, 50, 4, 20, 36, 52, 6, 22, 38, 54,
|
||||
1, 17, 33, 49, 3, 19, 35, 51, 5, 21, 37, 53, 7, 23, 39, 55};
|
||||
|
||||
|
||||
@ -22,80 +22,80 @@ extern "C" {
|
||||
#if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3)
|
||||
|
||||
// Constants for ARGB
|
||||
static vec8 kARGBToY = {13, 65, 33, 0, 13, 65, 33, 0,
|
||||
13, 65, 33, 0, 13, 65, 33, 0};
|
||||
static const vec8 kARGBToY = {13, 65, 33, 0, 13, 65, 33, 0,
|
||||
13, 65, 33, 0, 13, 65, 33, 0};
|
||||
|
||||
// JPeg full range.
|
||||
static vec8 kARGBToYJ = {15, 75, 38, 0, 15, 75, 38, 0,
|
||||
15, 75, 38, 0, 15, 75, 38, 0};
|
||||
static const vec8 kARGBToYJ = {15, 75, 38, 0, 15, 75, 38, 0,
|
||||
15, 75, 38, 0, 15, 75, 38, 0};
|
||||
#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3)
|
||||
|
||||
#if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
|
||||
|
||||
static vec8 kARGBToU = {112, -74, -38, 0, 112, -74, -38, 0,
|
||||
112, -74, -38, 0, 112, -74, -38, 0};
|
||||
static const vec8 kARGBToU = {112, -74, -38, 0, 112, -74, -38, 0,
|
||||
112, -74, -38, 0, 112, -74, -38, 0};
|
||||
|
||||
static vec8 kARGBToUJ = {127, -84, -43, 0, 127, -84, -43, 0,
|
||||
127, -84, -43, 0, 127, -84, -43, 0};
|
||||
static const vec8 kARGBToUJ = {127, -84, -43, 0, 127, -84, -43, 0,
|
||||
127, -84, -43, 0, 127, -84, -43, 0};
|
||||
|
||||
static vec8 kARGBToV = {-18, -94, 112, 0, -18, -94, 112, 0,
|
||||
-18, -94, 112, 0, -18, -94, 112, 0};
|
||||
static const vec8 kARGBToV = {-18, -94, 112, 0, -18, -94, 112, 0,
|
||||
-18, -94, 112, 0, -18, -94, 112, 0};
|
||||
|
||||
static vec8 kARGBToVJ = {-20, -107, 127, 0, -20, -107, 127, 0,
|
||||
-20, -107, 127, 0, -20, -107, 127, 0};
|
||||
static const vec8 kARGBToVJ = {-20, -107, 127, 0, -20, -107, 127, 0,
|
||||
-20, -107, 127, 0, -20, -107, 127, 0};
|
||||
|
||||
// Constants for BGRA
|
||||
static vec8 kBGRAToY = {0, 33, 65, 13, 0, 33, 65, 13,
|
||||
0, 33, 65, 13, 0, 33, 65, 13};
|
||||
static const vec8 kBGRAToY = {0, 33, 65, 13, 0, 33, 65, 13,
|
||||
0, 33, 65, 13, 0, 33, 65, 13};
|
||||
|
||||
static vec8 kBGRAToU = {0, -38, -74, 112, 0, -38, -74, 112,
|
||||
0, -38, -74, 112, 0, -38, -74, 112};
|
||||
static const vec8 kBGRAToU = {0, -38, -74, 112, 0, -38, -74, 112,
|
||||
0, -38, -74, 112, 0, -38, -74, 112};
|
||||
|
||||
static vec8 kBGRAToV = {0, 112, -94, -18, 0, 112, -94, -18,
|
||||
0, 112, -94, -18, 0, 112, -94, -18};
|
||||
static const vec8 kBGRAToV = {0, 112, -94, -18, 0, 112, -94, -18,
|
||||
0, 112, -94, -18, 0, 112, -94, -18};
|
||||
|
||||
// Constants for ABGR
|
||||
static vec8 kABGRToY = {33, 65, 13, 0, 33, 65, 13, 0,
|
||||
33, 65, 13, 0, 33, 65, 13, 0};
|
||||
static const vec8 kABGRToY = {33, 65, 13, 0, 33, 65, 13, 0,
|
||||
33, 65, 13, 0, 33, 65, 13, 0};
|
||||
|
||||
static vec8 kABGRToU = {-38, -74, 112, 0, -38, -74, 112, 0,
|
||||
-38, -74, 112, 0, -38, -74, 112, 0};
|
||||
static const vec8 kABGRToU = {-38, -74, 112, 0, -38, -74, 112, 0,
|
||||
-38, -74, 112, 0, -38, -74, 112, 0};
|
||||
|
||||
static vec8 kABGRToV = {112, -94, -18, 0, 112, -94, -18, 0,
|
||||
112, -94, -18, 0, 112, -94, -18, 0};
|
||||
static const vec8 kABGRToV = {112, -94, -18, 0, 112, -94, -18, 0,
|
||||
112, -94, -18, 0, 112, -94, -18, 0};
|
||||
|
||||
// Constants for RGBA.
|
||||
static vec8 kRGBAToY = {0, 13, 65, 33, 0, 13, 65, 33,
|
||||
0, 13, 65, 33, 0, 13, 65, 33};
|
||||
static const vec8 kRGBAToY = {0, 13, 65, 33, 0, 13, 65, 33,
|
||||
0, 13, 65, 33, 0, 13, 65, 33};
|
||||
|
||||
static vec8 kRGBAToU = {0, 112, -74, -38, 0, 112, -74, -38,
|
||||
0, 112, -74, -38, 0, 112, -74, -38};
|
||||
static const vec8 kRGBAToU = {0, 112, -74, -38, 0, 112, -74, -38,
|
||||
0, 112, -74, -38, 0, 112, -74, -38};
|
||||
|
||||
static vec8 kRGBAToV = {0, -18, -94, 112, 0, -18, -94, 112,
|
||||
0, -18, -94, 112, 0, -18, -94, 112};
|
||||
static const vec8 kRGBAToV = {0, -18, -94, 112, 0, -18, -94, 112,
|
||||
0, -18, -94, 112, 0, -18, -94, 112};
|
||||
|
||||
static uvec8 kAddY16 = {16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
|
||||
16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u};
|
||||
static const uvec8 kAddY16 = {16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
|
||||
16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u};
|
||||
|
||||
// 7 bit fixed point 0.5.
|
||||
static vec16 kAddYJ64 = {64, 64, 64, 64, 64, 64, 64, 64};
|
||||
static const vec16 kAddYJ64 = {64, 64, 64, 64, 64, 64, 64, 64};
|
||||
|
||||
static uvec8 kAddUV128 = {128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u};
|
||||
static const uvec8 kAddUV128 = {128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u};
|
||||
|
||||
static uvec16 kAddUVJ128 = {0x8080u, 0x8080u, 0x8080u, 0x8080u,
|
||||
0x8080u, 0x8080u, 0x8080u, 0x8080u};
|
||||
static const uvec16 kAddUVJ128 = {0x8080u, 0x8080u, 0x8080u, 0x8080u,
|
||||
0x8080u, 0x8080u, 0x8080u, 0x8080u};
|
||||
#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
|
||||
|
||||
#ifdef HAS_RGB24TOARGBROW_SSSE3
|
||||
|
||||
// Shuffle table for converting RGB24 to ARGB.
|
||||
static uvec8 kShuffleMaskRGB24ToARGB = {0u, 1u, 2u, 12u, 3u, 4u, 5u, 13u,
|
||||
6u, 7u, 8u, 14u, 9u, 10u, 11u, 15u};
|
||||
static const uvec8 kShuffleMaskRGB24ToARGB = {
|
||||
0u, 1u, 2u, 12u, 3u, 4u, 5u, 13u, 6u, 7u, 8u, 14u, 9u, 10u, 11u, 15u};
|
||||
|
||||
// Shuffle table for converting RAW to ARGB.
|
||||
static uvec8 kShuffleMaskRAWToARGB = {2u, 1u, 0u, 12u, 5u, 4u, 3u, 13u,
|
||||
8u, 7u, 6u, 14u, 11u, 10u, 9u, 15u};
|
||||
static const uvec8 kShuffleMaskRAWToARGB = {2u, 1u, 0u, 12u, 5u, 4u, 3u, 13u,
|
||||
8u, 7u, 6u, 14u, 11u, 10u, 9u, 15u};
|
||||
|
||||
// Shuffle table for converting RAW to RGB24. First 8.
|
||||
static const uvec8 kShuffleMaskRAWToRGB24_0 = {
|
||||
@ -113,15 +113,15 @@ static const uvec8 kShuffleMaskRAWToRGB24_2 = {
|
||||
128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u};
|
||||
|
||||
// Shuffle table for converting ARGB to RGB24.
|
||||
static uvec8 kShuffleMaskARGBToRGB24 = {
|
||||
static const uvec8 kShuffleMaskARGBToRGB24 = {
|
||||
0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 10u, 12u, 13u, 14u, 128u, 128u, 128u, 128u};
|
||||
|
||||
// Shuffle table for converting ARGB to RAW.
|
||||
static uvec8 kShuffleMaskARGBToRAW = {
|
||||
static const uvec8 kShuffleMaskARGBToRAW = {
|
||||
2u, 1u, 0u, 6u, 5u, 4u, 10u, 9u, 8u, 14u, 13u, 12u, 128u, 128u, 128u, 128u};
|
||||
|
||||
// Shuffle table for converting ARGBToRGB24 for I422ToRGB24. First 8 + next 4
|
||||
static uvec8 kShuffleMaskARGBToRGB24_0 = {
|
||||
static const uvec8 kShuffleMaskARGBToRGB24_0 = {
|
||||
0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 128u, 128u, 128u, 128u, 10u, 12u, 13u, 14u};
|
||||
|
||||
// YUY2 shuf 16 Y to 32 Y.
|
||||
@ -2519,8 +2519,8 @@ void I400ToARGBRow_AVX2(const uint8* y_buf, uint8* dst_argb, int width) {
|
||||
|
||||
#ifdef HAS_MIRRORROW_SSSE3
|
||||
// Shuffle table for reversing the bytes.
|
||||
static uvec8 kShuffleMirror = {15u, 14u, 13u, 12u, 11u, 10u, 9u, 8u,
|
||||
7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u};
|
||||
static const uvec8 kShuffleMirror = {15u, 14u, 13u, 12u, 11u, 10u, 9u, 8u,
|
||||
7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u};
|
||||
|
||||
void MirrorRow_SSSE3(const uint8* src, uint8* dst, int width) {
|
||||
intptr_t temp_width = (intptr_t)(width);
|
||||
@ -2573,8 +2573,8 @@ void MirrorRow_AVX2(const uint8* src, uint8* dst, int width) {
|
||||
|
||||
#ifdef HAS_MIRRORUVROW_SSSE3
|
||||
// Shuffle table for reversing the bytes of UV channels.
|
||||
static uvec8 kShuffleMirrorUV = {14u, 12u, 10u, 8u, 6u, 4u, 2u, 0u,
|
||||
15u, 13u, 11u, 9u, 7u, 5u, 3u, 1u};
|
||||
static const uvec8 kShuffleMirrorUV = {14u, 12u, 10u, 8u, 6u, 4u, 2u, 0u,
|
||||
15u, 13u, 11u, 9u, 7u, 5u, 3u, 1u};
|
||||
void MirrorUVRow_SSSE3(const uint8* src,
|
||||
uint8* dst_u,
|
||||
uint8* dst_v,
|
||||
@ -2933,35 +2933,35 @@ void Convert16To8Row_AVX2(const uint16* src_y,
|
||||
#ifdef HAS_SPLITRGBROW_SSSE3
|
||||
|
||||
// Shuffle table for converting RGB to Planar.
|
||||
static uvec8 kShuffleMaskRGBToR0 = {0u, 3u, 6u, 9u, 12u, 15u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRGBToR1 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
2u, 5u, 8u, 11u, 14u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRGBToR2 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 1u,
|
||||
4u, 7u, 10u, 13u};
|
||||
static const uvec8 kShuffleMaskRGBToR0 = {0u, 3u, 6u, 9u, 12u, 15u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRGBToR1 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
2u, 5u, 8u, 11u, 14u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRGBToR2 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 1u,
|
||||
4u, 7u, 10u, 13u};
|
||||
|
||||
static uvec8 kShuffleMaskRGBToG0 = {1u, 4u, 7u, 10u, 13u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRGBToG1 = {128u, 128u, 128u, 128u, 128u, 0u,
|
||||
3u, 6u, 9u, 12u, 15u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRGBToG2 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 2u,
|
||||
5u, 8u, 11u, 14u};
|
||||
static const uvec8 kShuffleMaskRGBToG0 = {1u, 4u, 7u, 10u, 13u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRGBToG1 = {128u, 128u, 128u, 128u, 128u, 0u,
|
||||
3u, 6u, 9u, 12u, 15u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRGBToG2 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 2u,
|
||||
5u, 8u, 11u, 14u};
|
||||
|
||||
static uvec8 kShuffleMaskRGBToB0 = {2u, 5u, 8u, 11u, 14u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRGBToB1 = {128u, 128u, 128u, 128u, 128u, 1u,
|
||||
4u, 7u, 10u, 13u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRGBToB2 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 0u, 3u,
|
||||
6u, 9u, 12u, 15u};
|
||||
static const uvec8 kShuffleMaskRGBToB0 = {2u, 5u, 8u, 11u, 14u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRGBToB1 = {128u, 128u, 128u, 128u, 128u, 1u,
|
||||
4u, 7u, 10u, 13u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRGBToB2 = {128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 0u, 3u,
|
||||
6u, 9u, 12u, 15u};
|
||||
|
||||
void SplitRGBRow_SSSE3(const uint8* src_rgb,
|
||||
uint8* dst_r,
|
||||
@ -3029,35 +3029,35 @@ void SplitRGBRow_SSSE3(const uint8* src_rgb,
|
||||
#ifdef HAS_MERGERGBROW_SSSE3
|
||||
|
||||
// Shuffle table for converting RGB to Planar.
|
||||
static uvec8 kShuffleMaskRToRGB0 = {0u, 128u, 128u, 1u, 128u, 128u,
|
||||
2u, 128u, 128u, 3u, 128u, 128u,
|
||||
4u, 128u, 128u, 5u};
|
||||
static uvec8 kShuffleMaskGToRGB0 = {128u, 0u, 128u, 128u, 1u, 128u,
|
||||
128u, 2u, 128u, 128u, 3u, 128u,
|
||||
128u, 4u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskBToRGB0 = {128u, 128u, 0u, 128u, 128u, 1u,
|
||||
128u, 128u, 2u, 128u, 128u, 3u,
|
||||
128u, 128u, 4u, 128u};
|
||||
static const uvec8 kShuffleMaskRToRGB0 = {0u, 128u, 128u, 1u, 128u, 128u,
|
||||
2u, 128u, 128u, 3u, 128u, 128u,
|
||||
4u, 128u, 128u, 5u};
|
||||
static const uvec8 kShuffleMaskGToRGB0 = {128u, 0u, 128u, 128u, 1u, 128u,
|
||||
128u, 2u, 128u, 128u, 3u, 128u,
|
||||
128u, 4u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskBToRGB0 = {128u, 128u, 0u, 128u, 128u, 1u,
|
||||
128u, 128u, 2u, 128u, 128u, 3u,
|
||||
128u, 128u, 4u, 128u};
|
||||
|
||||
static uvec8 kShuffleMaskGToRGB1 = {5u, 128u, 128u, 6u, 128u, 128u,
|
||||
7u, 128u, 128u, 8u, 128u, 128u,
|
||||
9u, 128u, 128u, 10u};
|
||||
static uvec8 kShuffleMaskBToRGB1 = {128u, 5u, 128u, 128u, 6u, 128u,
|
||||
128u, 7u, 128u, 128u, 8u, 128u,
|
||||
128u, 9u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskRToRGB1 = {128u, 128u, 6u, 128u, 128u, 7u,
|
||||
128u, 128u, 8u, 128u, 128u, 9u,
|
||||
128u, 128u, 10u, 128u};
|
||||
static const uvec8 kShuffleMaskGToRGB1 = {5u, 128u, 128u, 6u, 128u, 128u,
|
||||
7u, 128u, 128u, 8u, 128u, 128u,
|
||||
9u, 128u, 128u, 10u};
|
||||
static const uvec8 kShuffleMaskBToRGB1 = {128u, 5u, 128u, 128u, 6u, 128u,
|
||||
128u, 7u, 128u, 128u, 8u, 128u,
|
||||
128u, 9u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskRToRGB1 = {128u, 128u, 6u, 128u, 128u, 7u,
|
||||
128u, 128u, 8u, 128u, 128u, 9u,
|
||||
128u, 128u, 10u, 128u};
|
||||
|
||||
static uvec8 kShuffleMaskBToRGB2 = {10u, 128u, 128u, 11u, 128u, 128u,
|
||||
12u, 128u, 128u, 13u, 128u, 128u,
|
||||
14u, 128u, 128u, 15u};
|
||||
static uvec8 kShuffleMaskRToRGB2 = {128u, 11u, 128u, 128u, 12u, 128u,
|
||||
128u, 13u, 128u, 128u, 14u, 128u,
|
||||
128u, 15u, 128u, 128u};
|
||||
static uvec8 kShuffleMaskGToRGB2 = {128u, 128u, 11u, 128u, 128u, 12u,
|
||||
128u, 128u, 13u, 128u, 128u, 14u,
|
||||
128u, 128u, 15u, 128u};
|
||||
static const uvec8 kShuffleMaskBToRGB2 = {10u, 128u, 128u, 11u, 128u, 128u,
|
||||
12u, 128u, 128u, 13u, 128u, 128u,
|
||||
14u, 128u, 128u, 15u};
|
||||
static const uvec8 kShuffleMaskRToRGB2 = {128u, 11u, 128u, 128u, 12u, 128u,
|
||||
128u, 13u, 128u, 128u, 14u, 128u,
|
||||
128u, 15u, 128u, 128u};
|
||||
static const uvec8 kShuffleMaskGToRGB2 = {128u, 128u, 11u, 128u, 128u, 12u,
|
||||
128u, 128u, 13u, 128u, 128u, 14u,
|
||||
128u, 128u, 15u, 128u};
|
||||
|
||||
void MergeRGBRow_SSSE3(const uint8* src_r,
|
||||
const uint8* src_g,
|
||||
@ -3867,8 +3867,8 @@ void UYVYToUV422Row_AVX2(const uint8* src_uyvy,
|
||||
|
||||
#ifdef HAS_ARGBBLENDROW_SSSE3
|
||||
// Shuffle table for isolating alpha.
|
||||
static uvec8 kShuffleAlpha = {3u, 0x80, 3u, 0x80, 7u, 0x80, 7u, 0x80,
|
||||
11u, 0x80, 11u, 0x80, 15u, 0x80, 15u, 0x80};
|
||||
static const uvec8 kShuffleAlpha = {3u, 0x80, 3u, 0x80, 7u, 0x80, 7u, 0x80,
|
||||
11u, 0x80, 11u, 0x80, 15u, 0x80, 15u, 0x80};
|
||||
|
||||
// Blend 8 pixels at a time
|
||||
void ARGBBlendRow_SSSE3(const uint8* src_argb0,
|
||||
@ -4068,10 +4068,10 @@ void BlendPlaneRow_AVX2(const uint8* src0,
|
||||
|
||||
#ifdef HAS_ARGBATTENUATEROW_SSSE3
|
||||
// Shuffle table duplicating alpha
|
||||
static uvec8 kShuffleAlpha0 = {3u, 3u, 3u, 3u, 3u, 3u, 128u, 128u,
|
||||
7u, 7u, 7u, 7u, 7u, 7u, 128u, 128u};
|
||||
static uvec8 kShuffleAlpha1 = {11u, 11u, 11u, 11u, 11u, 11u, 128u, 128u,
|
||||
15u, 15u, 15u, 15u, 15u, 15u, 128u, 128u};
|
||||
static const uvec8 kShuffleAlpha0 = {3u, 3u, 3u, 3u, 3u, 3u, 128u, 128u,
|
||||
7u, 7u, 7u, 7u, 7u, 7u, 128u, 128u};
|
||||
static const uvec8 kShuffleAlpha1 = {11u, 11u, 11u, 11u, 11u, 11u, 128u, 128u,
|
||||
15u, 15u, 15u, 15u, 15u, 15u, 128u, 128u};
|
||||
// Attenuate 4 pixels at a time.
|
||||
void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
|
||||
asm volatile (
|
||||
@ -4326,14 +4326,14 @@ void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
|
||||
// g = (r * 45 + g * 88 + b * 22) >> 7
|
||||
// r = (r * 50 + g * 98 + b * 24) >> 7
|
||||
// Constant for ARGB color to sepia tone
|
||||
static vec8 kARGBToSepiaB = {17, 68, 35, 0, 17, 68, 35, 0,
|
||||
17, 68, 35, 0, 17, 68, 35, 0};
|
||||
static const vec8 kARGBToSepiaB = {17, 68, 35, 0, 17, 68, 35, 0,
|
||||
17, 68, 35, 0, 17, 68, 35, 0};
|
||||
|
||||
static vec8 kARGBToSepiaG = {22, 88, 45, 0, 22, 88, 45, 0,
|
||||
22, 88, 45, 0, 22, 88, 45, 0};
|
||||
static const vec8 kARGBToSepiaG = {22, 88, 45, 0, 22, 88, 45, 0,
|
||||
22, 88, 45, 0, 22, 88, 45, 0};
|
||||
|
||||
static vec8 kARGBToSepiaR = {24, 98, 50, 0, 24, 98, 50, 0,
|
||||
24, 98, 50, 0, 24, 98, 50, 0};
|
||||
static const vec8 kARGBToSepiaR = {24, 98, 50, 0, 24, 98, 50, 0,
|
||||
24, 98, 50, 0, 24, 98, 50, 0};
|
||||
|
||||
// Convert 8 ARGB pixels (32 bytes) to 8 Sepia ARGB pixels.
|
||||
void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width) {
|
||||
|
||||
@ -21,72 +21,73 @@ extern "C" {
|
||||
(defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER)))
|
||||
|
||||
// Offsets for source bytes 0 to 9
|
||||
static uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Offsets for source bytes 11 to 20 with 8 subtracted = 3 to 12.
|
||||
static uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31.
|
||||
static uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Offsets for source bytes 0 to 10
|
||||
static uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
|
||||
static const uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
|
||||
|
||||
// Offsets for source bytes 10 to 21 with 8 subtracted = 3 to 13.
|
||||
static uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 12, 13};
|
||||
static const uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7,
|
||||
8, 9, 9, 10, 10, 11, 12, 13};
|
||||
|
||||
// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31.
|
||||
static uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10,
|
||||
10, 11, 12, 13, 13, 14, 14, 15};
|
||||
static const uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10,
|
||||
10, 11, 12, 13, 13, 14, 14, 15};
|
||||
|
||||
// Coefficients for source bytes 0 to 10
|
||||
static uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2};
|
||||
static const uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2};
|
||||
|
||||
// Coefficients for source bytes 10 to 21
|
||||
static uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1};
|
||||
static const uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1};
|
||||
|
||||
// Coefficients for source bytes 21 to 31
|
||||
static uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3};
|
||||
static const uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3};
|
||||
|
||||
// Coefficients for source bytes 21 to 31
|
||||
static vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2};
|
||||
static const vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2};
|
||||
|
||||
static uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
static uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3,
|
||||
6, 8, 11, 14, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3,
|
||||
6, 8, 11, 14, 128, 128, 128, 128};
|
||||
|
||||
// Arrange words 0,3,6 into 0,1,2
|
||||
static uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Arrange words 0,3,6 into 3,4,5
|
||||
static uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1,
|
||||
6, 7, 12, 13, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1,
|
||||
6, 7, 12, 13, 128, 128, 128, 128};
|
||||
|
||||
// Scaling values for boxes of 3x3 and 2x3
|
||||
static uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9,
|
||||
65536 / 9, 65536 / 6, 0, 0};
|
||||
static const uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9,
|
||||
65536 / 9, 65536 / 6, 0, 0};
|
||||
|
||||
// Arrange first value for pixels 0,1,2,3,4,5
|
||||
static uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128,
|
||||
11, 128, 14, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128,
|
||||
11, 128, 14, 128, 128, 128, 128, 128};
|
||||
|
||||
// Arrange second value for pixels 0,1,2,3,4,5
|
||||
static uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128,
|
||||
12, 128, 15, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128,
|
||||
12, 128, 15, 128, 128, 128, 128, 128};
|
||||
|
||||
// Arrange third value for pixels 0,1,2,3,4,5
|
||||
static uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128,
|
||||
13, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128,
|
||||
13, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Scaling values for boxes of 3x2 and 2x2
|
||||
static uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3,
|
||||
65536 / 3, 65536 / 2, 0, 0};
|
||||
static const uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3,
|
||||
65536 / 3, 65536 / 2, 0, 0};
|
||||
|
||||
// GCC versions of row functions are verbatim conversions from Visual C.
|
||||
// Generated using gcc disassembly on Visual C object file:
|
||||
@ -851,12 +852,12 @@ void ScaleAddRow_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width) {
|
||||
|
||||
// Constant for making pixels signed to avoid pmaddubsw
|
||||
// saturation.
|
||||
static uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
|
||||
static const uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
|
||||
|
||||
// Constant for making pixels unsigned and adding .5 for rounding.
|
||||
static uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040,
|
||||
0x4040, 0x4040, 0x4040, 0x4040};
|
||||
static const uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040,
|
||||
0x4040, 0x4040, 0x4040, 0x4040};
|
||||
|
||||
// Bilinear column filtering. SSSE3 version.
|
||||
void ScaleFilterCols_SSSE3(uint8* dst_ptr,
|
||||
@ -1250,13 +1251,13 @@ void ScaleARGBColsUp2_SSE2(uint8* dst_argb,
|
||||
}
|
||||
|
||||
// Shuffle table for arranging 2 pixels into pairs for pmaddubsw
|
||||
static uvec8 kShuffleColARGB = {
|
||||
static const uvec8 kShuffleColARGB = {
|
||||
0u, 4u, 1u, 5u, 2u, 6u, 3u, 7u, // bbggrraa 1st pixel
|
||||
8u, 12u, 9u, 13u, 10u, 14u, 11u, 15u // bbggrraa 2nd pixel
|
||||
};
|
||||
|
||||
// Shuffle table for duplicating 2 fractions into 8 bytes each
|
||||
static uvec8 kShuffleFractions = {
|
||||
static const uvec8 kShuffleFractions = {
|
||||
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
|
||||
};
|
||||
|
||||
|
||||
@ -264,13 +264,16 @@ void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr,
|
||||
}
|
||||
|
||||
#define HAS_SCALEROWDOWN38_NEON
|
||||
static uvec8 kShuf38 = {0, 3, 6, 8, 11, 14, 16, 19, 22, 24, 27, 30, 0, 0, 0, 0};
|
||||
static uvec8 kShuf38_2 = {0, 8, 16, 2, 10, 17, 4, 12,
|
||||
18, 6, 14, 19, 0, 0, 0, 0};
|
||||
static vec16 kMult38_Div6 = {65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12,
|
||||
65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12};
|
||||
static vec16 kMult38_Div9 = {65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18,
|
||||
65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18};
|
||||
static const uvec8 kShuf38 = {0, 3, 6, 8, 11, 14, 16, 19,
|
||||
22, 24, 27, 30, 0, 0, 0, 0};
|
||||
static const uvec8 kShuf38_2 = {0, 8, 16, 2, 10, 17, 4, 12,
|
||||
18, 6, 14, 19, 0, 0, 0, 0};
|
||||
static const vec16 kMult38_Div6 = {65536 / 12, 65536 / 12, 65536 / 12,
|
||||
65536 / 12, 65536 / 12, 65536 / 12,
|
||||
65536 / 12, 65536 / 12};
|
||||
static const vec16 kMult38_Div9 = {65536 / 18, 65536 / 18, 65536 / 18,
|
||||
65536 / 18, 65536 / 18, 65536 / 18,
|
||||
65536 / 18, 65536 / 18};
|
||||
|
||||
// 32 -> 12
|
||||
void ScaleRowDown38_NEON(const uint8* src_ptr,
|
||||
|
||||
@ -261,13 +261,16 @@ void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr,
|
||||
: "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", "memory", "cc");
|
||||
}
|
||||
|
||||
static uvec8 kShuf38 = {0, 3, 6, 8, 11, 14, 16, 19, 22, 24, 27, 30, 0, 0, 0, 0};
|
||||
static uvec8 kShuf38_2 = {0, 16, 32, 2, 18, 33, 4, 20,
|
||||
34, 6, 22, 35, 0, 0, 0, 0};
|
||||
static vec16 kMult38_Div6 = {65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12,
|
||||
65536 / 12, 65536 / 12, 65536 / 12, 65536 / 12};
|
||||
static vec16 kMult38_Div9 = {65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18,
|
||||
65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18};
|
||||
static const uvec8 kShuf38 = {0, 3, 6, 8, 11, 14, 16, 19,
|
||||
22, 24, 27, 30, 0, 0, 0, 0};
|
||||
static const uvec8 kShuf38_2 = {0, 16, 32, 2, 18, 33, 4, 20,
|
||||
34, 6, 22, 35, 0, 0, 0, 0};
|
||||
static const vec16 kMult38_Div6 = {65536 / 12, 65536 / 12, 65536 / 12,
|
||||
65536 / 12, 65536 / 12, 65536 / 12,
|
||||
65536 / 12, 65536 / 12};
|
||||
static const vec16 kMult38_Div9 = {65536 / 18, 65536 / 18, 65536 / 18,
|
||||
65536 / 18, 65536 / 18, 65536 / 18,
|
||||
65536 / 18, 65536 / 18};
|
||||
|
||||
// 32 -> 12
|
||||
void ScaleRowDown38_NEON(const uint8* src_ptr,
|
||||
|
||||
@ -20,72 +20,73 @@ extern "C" {
|
||||
#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER)
|
||||
|
||||
// Offsets for source bytes 0 to 9
|
||||
static uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Offsets for source bytes 11 to 20 with 8 subtracted = 3 to 12.
|
||||
static uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31.
|
||||
static uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Offsets for source bytes 0 to 10
|
||||
static uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
|
||||
static const uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
|
||||
|
||||
// Offsets for source bytes 10 to 21 with 8 subtracted = 3 to 13.
|
||||
static uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 12, 13};
|
||||
static const uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7,
|
||||
8, 9, 9, 10, 10, 11, 12, 13};
|
||||
|
||||
// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31.
|
||||
static uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10,
|
||||
10, 11, 12, 13, 13, 14, 14, 15};
|
||||
static const uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10,
|
||||
10, 11, 12, 13, 13, 14, 14, 15};
|
||||
|
||||
// Coefficients for source bytes 0 to 10
|
||||
static uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2};
|
||||
static const uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2};
|
||||
|
||||
// Coefficients for source bytes 10 to 21
|
||||
static uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1};
|
||||
static const uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1};
|
||||
|
||||
// Coefficients for source bytes 21 to 31
|
||||
static uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3};
|
||||
static const uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3};
|
||||
|
||||
// Coefficients for source bytes 21 to 31
|
||||
static vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2};
|
||||
static const vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2};
|
||||
|
||||
static uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
static uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3,
|
||||
6, 8, 11, 14, 128, 128, 128, 128};
|
||||
static const uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3,
|
||||
6, 8, 11, 14, 128, 128, 128, 128};
|
||||
|
||||
// Arrange words 0,3,6 into 0,1,2
|
||||
static uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Arrange words 0,3,6 into 3,4,5
|
||||
static uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1,
|
||||
6, 7, 12, 13, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1,
|
||||
6, 7, 12, 13, 128, 128, 128, 128};
|
||||
|
||||
// Scaling values for boxes of 3x3 and 2x3
|
||||
static uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9,
|
||||
65536 / 9, 65536 / 6, 0, 0};
|
||||
static const uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9,
|
||||
65536 / 9, 65536 / 6, 0, 0};
|
||||
|
||||
// Arrange first value for pixels 0,1,2,3,4,5
|
||||
static uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128,
|
||||
11, 128, 14, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128,
|
||||
11, 128, 14, 128, 128, 128, 128, 128};
|
||||
|
||||
// Arrange second value for pixels 0,1,2,3,4,5
|
||||
static uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128,
|
||||
12, 128, 15, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128,
|
||||
12, 128, 15, 128, 128, 128, 128, 128};
|
||||
|
||||
// Arrange third value for pixels 0,1,2,3,4,5
|
||||
static uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128,
|
||||
13, 128, 128, 128, 128, 128, 128, 128};
|
||||
static const uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128,
|
||||
13, 128, 128, 128, 128, 128, 128, 128};
|
||||
|
||||
// Scaling values for boxes of 3x2 and 2x2
|
||||
static uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3,
|
||||
65536 / 3, 65536 / 2, 0, 0};
|
||||
static const uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3,
|
||||
65536 / 3, 65536 / 2, 0, 0};
|
||||
|
||||
// Reads 32 pixels, throws half away and writes 16 pixels.
|
||||
__declspec(naked) void ScaleRowDown2_SSSE3(const uint8* src_ptr,
|
||||
@ -870,12 +871,12 @@ __declspec(naked) void ScaleAddRow_AVX2(const uint8* src_ptr,
|
||||
|
||||
// Constant for making pixels signed to avoid pmaddubsw
|
||||
// saturation.
|
||||
static uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
|
||||
static const uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
|
||||
|
||||
// Constant for making pixels unsigned and adding .5 for rounding.
|
||||
static uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040,
|
||||
0x4040, 0x4040, 0x4040, 0x4040};
|
||||
static const uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040,
|
||||
0x4040, 0x4040, 0x4040, 0x4040};
|
||||
|
||||
// Bilinear column filtering. SSSE3 version.
|
||||
__declspec(naked) void ScaleFilterCols_SSSE3(uint8* dst_ptr,
|
||||
@ -1246,13 +1247,13 @@ __declspec(naked) void ScaleARGBCols_SSE2(uint8* dst_argb,
|
||||
// TODO(fbarchard): Port to Neon
|
||||
|
||||
// Shuffle table for arranging 2 pixels into pairs for pmaddubsw
|
||||
static uvec8 kShuffleColARGB = {
|
||||
static const uvec8 kShuffleColARGB = {
|
||||
0u, 4u, 1u, 5u, 2u, 6u, 3u, 7u, // bbggrraa 1st pixel
|
||||
8u, 12u, 9u, 13u, 10u, 14u, 11u, 15u // bbggrraa 2nd pixel
|
||||
};
|
||||
|
||||
// Shuffle table for duplicating 2 fractions into 8 bytes each
|
||||
static uvec8 kShuffleFractions = {
|
||||
static const uvec8 kShuffleFractions = {
|
||||
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user