mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-10-28 18:07:12 +08:00
Refactor multi-stage SSSE3 scalers into single asm blocks
Consolidate split asm volatile blocks into single blocks across SSSE3 scaling functions in scale_gcc.cc. This prevents potential register corruption or clobbering by compiler optimizations between disjoint asm blocks, and uses named operand constraints for clarity and safety. List of affected functions in scale_gcc.cc: - ScaleRowDown34_SSSE3: merge 2 asm blocks into 1 - ScaleRowDown34_1_Box_SSSE3: merge 3 asm blocks into 1 - ScaleRowDown34_0_Box_SSSE3: merge 3 asm blocks into 1 - ScaleRowDown38_2_Box_SSSE3: merge 2 asm blocks into 1 - ScaleRowDown38_3_Box_SSSE3: merge 2 asm blocks into 1 - ScaleARGBFilterCols_SSSE3: merge 2 asm blocks into 1 Test: ninja -C out/Release libyuv_unittest && ./out/Release/libyuv_unittest Test: ninja -C out/Release_x86 libyuv_unittest && ./out/Release_x86/libyuv_unittest Bug: 489489002 Change-Id: I900a590db2ef21b9f019a115699d3a270877ed28 TAG=agy Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8280666 Reviewed-by: Wan-Teh Chang <wtc@google.com> Commit-Queue: Frank Barchard <fbarchard@google.com>
This commit is contained in:
parent
ba68378488
commit
5689f16923
@ -471,34 +471,30 @@ void ScaleRowDown34_SSSE3(const uint8_t* src_ptr,
|
|||||||
int dst_width) {
|
int dst_width) {
|
||||||
(void)src_stride;
|
(void)src_stride;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movdqa %0,%%xmm3 \n"
|
"movdqa %[kShuf0],%%xmm3 \n"
|
||||||
"movdqa %1,%%xmm4 \n"
|
"movdqa %[kShuf1],%%xmm4 \n"
|
||||||
"movdqa %2,%%xmm5 \n"
|
"movdqa %[kShuf2],%%xmm5 \n"
|
||||||
:
|
|
||||||
: "m"(kShuf0), // %0
|
|
||||||
"m"(kShuf1), // %1
|
|
||||||
"m"(kShuf2) // %2
|
|
||||||
);
|
|
||||||
asm volatile(
|
|
||||||
"1: \n"
|
"1: \n"
|
||||||
"movdqu (%0),%%xmm0 \n"
|
"movdqu (%[src_ptr]),%%xmm0 \n"
|
||||||
"movdqu 0x10(%0),%%xmm2 \n"
|
"movdqu 0x10(%[src_ptr]),%%xmm2 \n"
|
||||||
"lea 0x20(%0),%0 \n"
|
"lea 0x20(%[src_ptr]),%[src_ptr] \n"
|
||||||
"movdqa %%xmm2,%%xmm1 \n"
|
"movdqa %%xmm2,%%xmm1 \n"
|
||||||
"palignr $0x8,%%xmm0,%%xmm1 \n"
|
"palignr $0x8,%%xmm0,%%xmm1 \n"
|
||||||
"pshufb %%xmm3,%%xmm0 \n"
|
"pshufb %%xmm3,%%xmm0 \n"
|
||||||
"pshufb %%xmm4,%%xmm1 \n"
|
"pshufb %%xmm4,%%xmm1 \n"
|
||||||
"pshufb %%xmm5,%%xmm2 \n"
|
"pshufb %%xmm5,%%xmm2 \n"
|
||||||
"movq %%xmm0,(%1) \n"
|
"movq %%xmm0,(%[dst_ptr]) \n"
|
||||||
"movq %%xmm1,0x8(%1) \n"
|
"movq %%xmm1,0x8(%[dst_ptr]) \n"
|
||||||
"movq %%xmm2,0x10(%1) \n"
|
"movq %%xmm2,0x10(%[dst_ptr]) \n"
|
||||||
"lea 0x18(%1),%1 \n"
|
"lea 0x18(%[dst_ptr]),%[dst_ptr] \n"
|
||||||
"sub $0x18,%2 \n"
|
"sub $0x18,%[dst_width] \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
: "+r"(src_ptr), // %0
|
: [src_ptr] "+r"(src_ptr),
|
||||||
"+r"(dst_ptr), // %1
|
[dst_ptr] "+r"(dst_ptr),
|
||||||
"+r"(dst_width) // %2
|
[dst_width] "+r"(dst_width)
|
||||||
:
|
: [kShuf0] "m"(kShuf0),
|
||||||
|
[kShuf1] "m"(kShuf1),
|
||||||
|
[kShuf2] "m"(kShuf2)
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
|
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,61 +503,55 @@ void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
uint8_t* dst_ptr,
|
uint8_t* dst_ptr,
|
||||||
int dst_width) {
|
int dst_width) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movdqa %0,%%xmm2 \n" // kShuf01
|
"movdqa %[kShuf01],%%xmm2 \n"
|
||||||
"movdqa %1,%%xmm3 \n" // kShuf11
|
"movdqa %[kShuf11],%%xmm3 \n"
|
||||||
"movdqa %2,%%xmm4 \n" // kShuf21
|
"movdqa %[kShuf21],%%xmm4 \n"
|
||||||
:
|
"movdqa %[kMadd01],%%xmm5 \n"
|
||||||
: "m"(kShuf01), // %0
|
"movdqa %[kMadd11],%%xmm0 \n"
|
||||||
"m"(kShuf11), // %1
|
"movdqa %[kRound34],%%xmm1 \n"
|
||||||
"m"(kShuf21) // %2
|
|
||||||
);
|
|
||||||
asm volatile(
|
|
||||||
"movdqa %0,%%xmm5 \n" // kMadd01
|
|
||||||
"movdqa %1,%%xmm0 \n" // kMadd11
|
|
||||||
"movdqa %2,%%xmm1 \n" // kRound34
|
|
||||||
:
|
|
||||||
: "m"(kMadd01), // %0
|
|
||||||
"m"(kMadd11), // %1
|
|
||||||
"m"(kRound34) // %2
|
|
||||||
);
|
|
||||||
asm volatile(
|
|
||||||
"1: \n"
|
"1: \n"
|
||||||
"movdqu (%0),%%xmm6 \n"
|
"movdqu (%[src_ptr]),%%xmm6 \n"
|
||||||
"movdqu 0x00(%0,%3,1),%%xmm7 \n"
|
"movdqu 0x00(%[src_ptr],%[src_stride],1),%%xmm7 \n"
|
||||||
"pavgb %%xmm7,%%xmm6 \n"
|
"pavgb %%xmm7,%%xmm6 \n"
|
||||||
"pshufb %%xmm2,%%xmm6 \n"
|
"pshufb %%xmm2,%%xmm6 \n"
|
||||||
"pmaddubsw %%xmm5,%%xmm6 \n"
|
"pmaddubsw %%xmm5,%%xmm6 \n"
|
||||||
"paddsw %%xmm1,%%xmm6 \n"
|
"paddsw %%xmm1,%%xmm6 \n"
|
||||||
"psrlw $0x2,%%xmm6 \n"
|
"psrlw $0x2,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movq %%xmm6,(%1) \n"
|
"movq %%xmm6,(%[dst_ptr]) \n"
|
||||||
"movdqu 0x8(%0),%%xmm6 \n"
|
"movdqu 0x8(%[src_ptr]),%%xmm6 \n"
|
||||||
"movdqu 0x8(%0,%3,1),%%xmm7 \n"
|
"movdqu 0x8(%[src_ptr],%[src_stride],1),%%xmm7 \n"
|
||||||
"pavgb %%xmm7,%%xmm6 \n"
|
"pavgb %%xmm7,%%xmm6 \n"
|
||||||
"pshufb %%xmm3,%%xmm6 \n"
|
"pshufb %%xmm3,%%xmm6 \n"
|
||||||
"pmaddubsw %%xmm0,%%xmm6 \n"
|
"pmaddubsw %%xmm0,%%xmm6 \n"
|
||||||
"paddsw %%xmm1,%%xmm6 \n"
|
"paddsw %%xmm1,%%xmm6 \n"
|
||||||
"psrlw $0x2,%%xmm6 \n"
|
"psrlw $0x2,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movq %%xmm6,0x8(%1) \n"
|
"movq %%xmm6,0x8(%[dst_ptr]) \n"
|
||||||
"movdqu 0x10(%0),%%xmm6 \n"
|
"movdqu 0x10(%[src_ptr]),%%xmm6 \n"
|
||||||
"movdqu 0x10(%0,%3,1),%%xmm7 \n"
|
"movdqu 0x10(%[src_ptr],%[src_stride],1),%%xmm7 \n"
|
||||||
"lea 0x20(%0),%0 \n"
|
"lea 0x20(%[src_ptr]),%[src_ptr] \n"
|
||||||
"pavgb %%xmm7,%%xmm6 \n"
|
"pavgb %%xmm7,%%xmm6 \n"
|
||||||
"pshufb %%xmm4,%%xmm6 \n"
|
"pshufb %%xmm4,%%xmm6 \n"
|
||||||
"pmaddubsw %4,%%xmm6 \n"
|
"pmaddubsw %[kMadd21],%%xmm6 \n"
|
||||||
"paddsw %%xmm1,%%xmm6 \n"
|
"paddsw %%xmm1,%%xmm6 \n"
|
||||||
"psrlw $0x2,%%xmm6 \n"
|
"psrlw $0x2,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movq %%xmm6,0x10(%1) \n"
|
"movq %%xmm6,0x10(%[dst_ptr]) \n"
|
||||||
"lea 0x18(%1),%1 \n"
|
"lea 0x18(%[dst_ptr]),%[dst_ptr] \n"
|
||||||
"sub $0x18,%2 \n"
|
"sub $0x18,%[dst_width] \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
: "+r"(src_ptr), // %0
|
: [src_ptr] "+r"(src_ptr),
|
||||||
"+r"(dst_ptr), // %1
|
[dst_ptr] "+r"(dst_ptr),
|
||||||
"+r"(dst_width) // %2
|
[dst_width] "+r"(dst_width)
|
||||||
: "r"(src_stride), // %3
|
: [src_stride] "r"(src_stride),
|
||||||
"m"(kMadd21) // %4
|
[kShuf01] "m"(kShuf01),
|
||||||
|
[kShuf11] "m"(kShuf11),
|
||||||
|
[kShuf21] "m"(kShuf21),
|
||||||
|
[kMadd01] "m"(kMadd01),
|
||||||
|
[kMadd11] "m"(kMadd11),
|
||||||
|
[kRound34] "m"(kRound34),
|
||||||
|
[kMadd21] "m"(kMadd21)
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||||
"xmm7");
|
"xmm7");
|
||||||
}
|
}
|
||||||
@ -571,28 +561,15 @@ void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
uint8_t* dst_ptr,
|
uint8_t* dst_ptr,
|
||||||
int dst_width) {
|
int dst_width) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movdqa %0,%%xmm2 \n" // kShuf01
|
"movdqa %[kShuf01],%%xmm2 \n" // kShuf01
|
||||||
"movdqa %1,%%xmm3 \n" // kShuf11
|
"movdqa %[kShuf11],%%xmm3 \n" // kShuf11
|
||||||
"movdqa %2,%%xmm4 \n" // kShuf21
|
"movdqa %[kShuf21],%%xmm4 \n" // kShuf21
|
||||||
:
|
"movdqa %[kMadd01],%%xmm5 \n" // kMadd01
|
||||||
: "m"(kShuf01), // %0
|
"movdqa %[kMadd11],%%xmm0 \n" // kMadd11
|
||||||
"m"(kShuf11), // %1
|
"movdqa %[kRound34],%%xmm1 \n" // kRound34
|
||||||
"m"(kShuf21) // %2
|
|
||||||
);
|
|
||||||
asm volatile(
|
|
||||||
"movdqa %0,%%xmm5 \n" // kMadd01
|
|
||||||
"movdqa %1,%%xmm0 \n" // kMadd11
|
|
||||||
"movdqa %2,%%xmm1 \n" // kRound34
|
|
||||||
:
|
|
||||||
: "m"(kMadd01), // %0
|
|
||||||
"m"(kMadd11), // %1
|
|
||||||
"m"(kRound34) // %2
|
|
||||||
);
|
|
||||||
|
|
||||||
asm volatile(
|
|
||||||
"1: \n"
|
"1: \n"
|
||||||
"movdqu (%0),%%xmm6 \n"
|
"movdqu (%[src_ptr]),%%xmm6 \n"
|
||||||
"movdqu 0x00(%0,%3,1),%%xmm7 \n"
|
"movdqu 0x00(%[src_ptr],%[src_stride],1),%%xmm7 \n"
|
||||||
"pavgb %%xmm6,%%xmm7 \n"
|
"pavgb %%xmm6,%%xmm7 \n"
|
||||||
"pavgb %%xmm7,%%xmm6 \n"
|
"pavgb %%xmm7,%%xmm6 \n"
|
||||||
"pshufb %%xmm2,%%xmm6 \n"
|
"pshufb %%xmm2,%%xmm6 \n"
|
||||||
@ -600,9 +577,9 @@ void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
"paddsw %%xmm1,%%xmm6 \n"
|
"paddsw %%xmm1,%%xmm6 \n"
|
||||||
"psrlw $0x2,%%xmm6 \n"
|
"psrlw $0x2,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movq %%xmm6,(%1) \n"
|
"movq %%xmm6,(%[dst_ptr]) \n"
|
||||||
"movdqu 0x8(%0),%%xmm6 \n"
|
"movdqu 0x8(%[src_ptr]),%%xmm6 \n"
|
||||||
"movdqu 0x8(%0,%3,1),%%xmm7 \n"
|
"movdqu 0x8(%[src_ptr],%[src_stride],1),%%xmm7 \n"
|
||||||
"pavgb %%xmm6,%%xmm7 \n"
|
"pavgb %%xmm6,%%xmm7 \n"
|
||||||
"pavgb %%xmm7,%%xmm6 \n"
|
"pavgb %%xmm7,%%xmm6 \n"
|
||||||
"pshufb %%xmm3,%%xmm6 \n"
|
"pshufb %%xmm3,%%xmm6 \n"
|
||||||
@ -610,26 +587,32 @@ void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
"paddsw %%xmm1,%%xmm6 \n"
|
"paddsw %%xmm1,%%xmm6 \n"
|
||||||
"psrlw $0x2,%%xmm6 \n"
|
"psrlw $0x2,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movq %%xmm6,0x8(%1) \n"
|
"movq %%xmm6,0x8(%[dst_ptr]) \n"
|
||||||
"movdqu 0x10(%0),%%xmm6 \n"
|
"movdqu 0x10(%[src_ptr]),%%xmm6 \n"
|
||||||
"movdqu 0x10(%0,%3,1),%%xmm7 \n"
|
"movdqu 0x10(%[src_ptr],%[src_stride],1),%%xmm7 \n"
|
||||||
"lea 0x20(%0),%0 \n"
|
"lea 0x20(%[src_ptr]),%[src_ptr] \n"
|
||||||
"pavgb %%xmm6,%%xmm7 \n"
|
"pavgb %%xmm6,%%xmm7 \n"
|
||||||
"pavgb %%xmm7,%%xmm6 \n"
|
"pavgb %%xmm7,%%xmm6 \n"
|
||||||
"pshufb %%xmm4,%%xmm6 \n"
|
"pshufb %%xmm4,%%xmm6 \n"
|
||||||
"pmaddubsw %4,%%xmm6 \n"
|
"pmaddubsw %[kMadd21],%%xmm6 \n"
|
||||||
"paddsw %%xmm1,%%xmm6 \n"
|
"paddsw %%xmm1,%%xmm6 \n"
|
||||||
"psrlw $0x2,%%xmm6 \n"
|
"psrlw $0x2,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movq %%xmm6,0x10(%1) \n"
|
"movq %%xmm6,0x10(%[dst_ptr]) \n"
|
||||||
"lea 0x18(%1),%1 \n"
|
"lea 0x18(%[dst_ptr]),%[dst_ptr] \n"
|
||||||
"sub $0x18,%2 \n"
|
"sub $0x18,%[dst_width] \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
: "+r"(src_ptr), // %0
|
: [src_ptr] "+r"(src_ptr),
|
||||||
"+r"(dst_ptr), // %1
|
[dst_ptr] "+r"(dst_ptr),
|
||||||
"+r"(dst_width) // %2
|
[dst_width] "+r"(dst_width)
|
||||||
: "r"(src_stride), // %3
|
: [src_stride] "r"(src_stride),
|
||||||
"m"(kMadd21) // %4
|
[kShuf01] "m"(kShuf01),
|
||||||
|
[kShuf11] "m"(kShuf11),
|
||||||
|
[kShuf21] "m"(kShuf21),
|
||||||
|
[kMadd01] "m"(kMadd01),
|
||||||
|
[kMadd11] "m"(kMadd11),
|
||||||
|
[kRound34] "m"(kRound34),
|
||||||
|
[kMadd21] "m"(kMadd21)
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||||
"xmm7");
|
"xmm7");
|
||||||
}
|
}
|
||||||
@ -670,21 +653,14 @@ void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
uint8_t* dst_ptr,
|
uint8_t* dst_ptr,
|
||||||
int dst_width) {
|
int dst_width) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movdqa %0,%%xmm2 \n"
|
"movdqa %[kShufAb0],%%xmm2 \n"
|
||||||
"movdqa %1,%%xmm3 \n"
|
"movdqa %[kShufAb1],%%xmm3 \n"
|
||||||
"movdqa %2,%%xmm4 \n"
|
"movdqa %[kShufAb2],%%xmm4 \n"
|
||||||
"movdqa %3,%%xmm5 \n"
|
"movdqa %[kScaleAb2],%%xmm5 \n"
|
||||||
:
|
|
||||||
: "m"(kShufAb0), // %0
|
|
||||||
"m"(kShufAb1), // %1
|
|
||||||
"m"(kShufAb2), // %2
|
|
||||||
"m"(kScaleAb2) // %3
|
|
||||||
);
|
|
||||||
asm volatile(
|
|
||||||
"1: \n"
|
"1: \n"
|
||||||
"movdqu (%0),%%xmm0 \n"
|
"movdqu (%[src_ptr]),%%xmm0 \n"
|
||||||
"movdqu 0x00(%0,%3,1),%%xmm1 \n"
|
"movdqu 0x00(%[src_ptr],%[src_stride],1),%%xmm1 \n"
|
||||||
"lea 0x10(%0),%0 \n"
|
"lea 0x10(%[src_ptr]),%[src_ptr] \n"
|
||||||
"pavgb %%xmm1,%%xmm0 \n"
|
"pavgb %%xmm1,%%xmm0 \n"
|
||||||
"movdqa %%xmm0,%%xmm1 \n"
|
"movdqa %%xmm0,%%xmm1 \n"
|
||||||
"pshufb %%xmm2,%%xmm1 \n"
|
"pshufb %%xmm2,%%xmm1 \n"
|
||||||
@ -695,16 +671,20 @@ void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
"paddusw %%xmm0,%%xmm1 \n"
|
"paddusw %%xmm0,%%xmm1 \n"
|
||||||
"pmulhuw %%xmm5,%%xmm1 \n"
|
"pmulhuw %%xmm5,%%xmm1 \n"
|
||||||
"packuswb %%xmm1,%%xmm1 \n"
|
"packuswb %%xmm1,%%xmm1 \n"
|
||||||
"movd %%xmm1,(%1) \n"
|
"movd %%xmm1,(%[dst_ptr]) \n"
|
||||||
"psrlq $0x10,%%xmm1 \n"
|
"psrlq $0x10,%%xmm1 \n"
|
||||||
"movd %%xmm1,0x2(%1) \n"
|
"movd %%xmm1,0x2(%[dst_ptr]) \n"
|
||||||
"lea 0x6(%1),%1 \n"
|
"lea 0x6(%[dst_ptr]),%[dst_ptr] \n"
|
||||||
"sub $0x6,%2 \n"
|
"sub $0x6,%[dst_width] \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
: "+r"(src_ptr), // %0
|
: [src_ptr] "+r"(src_ptr),
|
||||||
"+r"(dst_ptr), // %1
|
[dst_ptr] "+r"(dst_ptr),
|
||||||
"+r"(dst_width) // %2
|
[dst_width] "+r"(dst_width)
|
||||||
: "r"(src_stride) // %3
|
: [src_stride] "r"(src_stride),
|
||||||
|
[kShufAb0] "m"(kShufAb0),
|
||||||
|
[kShufAb1] "m"(kShufAb1),
|
||||||
|
[kShufAb2] "m"(kShufAb2),
|
||||||
|
[kScaleAb2] "m"(kScaleAb2)
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
|
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -713,19 +693,13 @@ void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
uint8_t* dst_ptr,
|
uint8_t* dst_ptr,
|
||||||
int dst_width) {
|
int dst_width) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movdqa %0,%%xmm2 \n"
|
"movdqa %[kShufAc],%%xmm2 \n"
|
||||||
"movdqa %1,%%xmm3 \n"
|
"movdqa %[kShufAc3],%%xmm3 \n"
|
||||||
"movdqa %2,%%xmm4 \n"
|
"movdqa %[kScaleAc33],%%xmm4 \n"
|
||||||
"pxor %%xmm5,%%xmm5 \n"
|
"pxor %%xmm5,%%xmm5 \n"
|
||||||
:
|
|
||||||
: "m"(kShufAc), // %0
|
|
||||||
"m"(kShufAc3), // %1
|
|
||||||
"m"(kScaleAc33) // %2
|
|
||||||
);
|
|
||||||
asm volatile(
|
|
||||||
"1: \n"
|
"1: \n"
|
||||||
"movdqu (%0),%%xmm0 \n"
|
"movdqu (%[src_ptr]),%%xmm0 \n"
|
||||||
"movdqu 0x00(%0,%3,1),%%xmm6 \n"
|
"movdqu 0x00(%[src_ptr],%[src_stride],1),%%xmm6 \n"
|
||||||
"movhlps %%xmm0,%%xmm1 \n"
|
"movhlps %%xmm0,%%xmm1 \n"
|
||||||
"movhlps %%xmm6,%%xmm7 \n"
|
"movhlps %%xmm6,%%xmm7 \n"
|
||||||
"punpcklbw %%xmm5,%%xmm0 \n"
|
"punpcklbw %%xmm5,%%xmm0 \n"
|
||||||
@ -734,8 +708,8 @@ void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
"punpcklbw %%xmm5,%%xmm7 \n"
|
"punpcklbw %%xmm5,%%xmm7 \n"
|
||||||
"paddusw %%xmm6,%%xmm0 \n"
|
"paddusw %%xmm6,%%xmm0 \n"
|
||||||
"paddusw %%xmm7,%%xmm1 \n"
|
"paddusw %%xmm7,%%xmm1 \n"
|
||||||
"movdqu 0x00(%0,%3,2),%%xmm6 \n"
|
"movdqu 0x00(%[src_ptr],%[src_stride],2),%%xmm6 \n"
|
||||||
"lea 0x10(%0),%0 \n"
|
"lea 0x10(%[src_ptr]),%[src_ptr] \n"
|
||||||
"movhlps %%xmm6,%%xmm7 \n"
|
"movhlps %%xmm6,%%xmm7 \n"
|
||||||
"punpcklbw %%xmm5,%%xmm6 \n"
|
"punpcklbw %%xmm5,%%xmm6 \n"
|
||||||
"punpcklbw %%xmm5,%%xmm7 \n"
|
"punpcklbw %%xmm5,%%xmm7 \n"
|
||||||
@ -756,16 +730,19 @@ void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr,
|
|||||||
"paddusw %%xmm7,%%xmm6 \n"
|
"paddusw %%xmm7,%%xmm6 \n"
|
||||||
"pmulhuw %%xmm4,%%xmm6 \n"
|
"pmulhuw %%xmm4,%%xmm6 \n"
|
||||||
"packuswb %%xmm6,%%xmm6 \n"
|
"packuswb %%xmm6,%%xmm6 \n"
|
||||||
"movd %%xmm6,(%1) \n"
|
"movd %%xmm6,(%[dst_ptr]) \n"
|
||||||
"psrlq $0x10,%%xmm6 \n"
|
"psrlq $0x10,%%xmm6 \n"
|
||||||
"movd %%xmm6,0x2(%1) \n"
|
"movd %%xmm6,0x2(%[dst_ptr]) \n"
|
||||||
"lea 0x6(%1),%1 \n"
|
"lea 0x6(%[dst_ptr]),%[dst_ptr] \n"
|
||||||
"sub $0x6,%2 \n"
|
"sub $0x6,%[dst_width] \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
: "+r"(src_ptr), // %0
|
: [src_ptr] "+r"(src_ptr),
|
||||||
"+r"(dst_ptr), // %1
|
[dst_ptr] "+r"(dst_ptr),
|
||||||
"+r"(dst_width) // %2
|
[dst_width] "+r"(dst_width)
|
||||||
: "r"(src_stride) // %3
|
: [src_stride] "r"(src_stride),
|
||||||
|
[kShufAc] "m"(kShufAc),
|
||||||
|
[kShufAc3] "m"(kShufAc3),
|
||||||
|
[kScaleAc33] "m"(kScaleAc33)
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||||
"xmm7");
|
"xmm7");
|
||||||
}
|
}
|
||||||
@ -2217,71 +2194,67 @@ void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb,
|
|||||||
int dx) {
|
int dx) {
|
||||||
intptr_t x0, x1;
|
intptr_t x0, x1;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movdqa %0,%%xmm4 \n"
|
"movdqa %[kShuffleColARGB],%%xmm4 \n"
|
||||||
"movdqa %1,%%xmm5 \n"
|
"movdqa %[kShuffleFractions],%%xmm5 \n"
|
||||||
:
|
"movd %[x],%%xmm2 \n"
|
||||||
: "m"(kShuffleColARGB), // %0
|
"movd %[dx],%%xmm3 \n"
|
||||||
"m"(kShuffleFractions) // %1
|
|
||||||
);
|
|
||||||
|
|
||||||
asm volatile(
|
|
||||||
"movd %5,%%xmm2 \n"
|
|
||||||
"movd %6,%%xmm3 \n"
|
|
||||||
"pcmpeqb %%xmm6,%%xmm6 \n"
|
"pcmpeqb %%xmm6,%%xmm6 \n"
|
||||||
"psrlw $0x9,%%xmm6 \n"
|
"psrlw $0x9,%%xmm6 \n"
|
||||||
"pextrw $0x1,%%xmm2,%k3 \n"
|
"pextrw $0x1,%%xmm2,%k[x0] \n"
|
||||||
"sub $0x2,%2 \n"
|
"sub $0x2,%[dst_width] \n"
|
||||||
"jl 29f \n"
|
"jl 29f \n"
|
||||||
"movdqa %%xmm2,%%xmm0 \n"
|
"movdqa %%xmm2,%%xmm0 \n"
|
||||||
"paddd %%xmm3,%%xmm0 \n"
|
"paddd %%xmm3,%%xmm0 \n"
|
||||||
"punpckldq %%xmm0,%%xmm2 \n"
|
"punpckldq %%xmm0,%%xmm2 \n"
|
||||||
"punpckldq %%xmm3,%%xmm3 \n"
|
"punpckldq %%xmm3,%%xmm3 \n"
|
||||||
"paddd %%xmm3,%%xmm3 \n"
|
"paddd %%xmm3,%%xmm3 \n"
|
||||||
"pextrw $0x3,%%xmm2,%k4 \n"
|
"pextrw $0x3,%%xmm2,%k[x1] \n"
|
||||||
|
|
||||||
LABELALIGN
|
LABELALIGN
|
||||||
"2: \n"
|
"2: \n"
|
||||||
"movdqa %%xmm2,%%xmm1 \n"
|
"movdqa %%xmm2,%%xmm1 \n"
|
||||||
"paddd %%xmm3,%%xmm2 \n"
|
"paddd %%xmm3,%%xmm2 \n"
|
||||||
"movq 0x00(%1,%3,4),%%xmm0 \n"
|
"movq 0x00(%[src_argb],%[x0],4),%%xmm0 \n"
|
||||||
"psrlw $0x9,%%xmm1 \n"
|
"psrlw $0x9,%%xmm1 \n"
|
||||||
"movhps 0x00(%1,%4,4),%%xmm0 \n"
|
"movhps 0x00(%[src_argb],%[x1],4),%%xmm0 \n"
|
||||||
"pshufb %%xmm5,%%xmm1 \n"
|
"pshufb %%xmm5,%%xmm1 \n"
|
||||||
"pshufb %%xmm4,%%xmm0 \n"
|
"pshufb %%xmm4,%%xmm0 \n"
|
||||||
"pxor %%xmm6,%%xmm1 \n"
|
"pxor %%xmm6,%%xmm1 \n"
|
||||||
"pmaddubsw %%xmm1,%%xmm0 \n"
|
"pmaddubsw %%xmm1,%%xmm0 \n"
|
||||||
"psrlw $0x7,%%xmm0 \n"
|
"psrlw $0x7,%%xmm0 \n"
|
||||||
"pextrw $0x1,%%xmm2,%k3 \n"
|
"pextrw $0x1,%%xmm2,%k[x0] \n"
|
||||||
"pextrw $0x3,%%xmm2,%k4 \n"
|
"pextrw $0x3,%%xmm2,%k[x1] \n"
|
||||||
"packuswb %%xmm0,%%xmm0 \n"
|
"packuswb %%xmm0,%%xmm0 \n"
|
||||||
"movq %%xmm0,(%0) \n"
|
"movq %%xmm0,(%[dst_argb]) \n"
|
||||||
"lea 0x8(%0),%0 \n"
|
"lea 0x8(%[dst_argb]),%[dst_argb] \n"
|
||||||
"sub $0x2,%2 \n"
|
"sub $0x2,%[dst_width] \n"
|
||||||
"jge 2b \n"
|
"jge 2b \n"
|
||||||
|
|
||||||
LABELALIGN
|
LABELALIGN
|
||||||
"29: \n"
|
"29: \n"
|
||||||
"add $0x1,%2 \n"
|
"add $0x1,%[dst_width] \n"
|
||||||
"jl 99f \n"
|
"jl 99f \n"
|
||||||
"psrlw $0x9,%%xmm2 \n"
|
"psrlw $0x9,%%xmm2 \n"
|
||||||
"movq 0x00(%1,%3,4),%%xmm0 \n"
|
"movq 0x00(%[src_argb],%[x0],4),%%xmm0 \n"
|
||||||
"pshufb %%xmm5,%%xmm2 \n"
|
"pshufb %%xmm5,%%xmm2 \n"
|
||||||
"pshufb %%xmm4,%%xmm0 \n"
|
"pshufb %%xmm4,%%xmm0 \n"
|
||||||
"pxor %%xmm6,%%xmm2 \n"
|
"pxor %%xmm6,%%xmm2 \n"
|
||||||
"pmaddubsw %%xmm2,%%xmm0 \n"
|
"pmaddubsw %%xmm2,%%xmm0 \n"
|
||||||
"psrlw $0x7,%%xmm0 \n"
|
"psrlw $0x7,%%xmm0 \n"
|
||||||
"packuswb %%xmm0,%%xmm0 \n"
|
"packuswb %%xmm0,%%xmm0 \n"
|
||||||
"movd %%xmm0,(%0) \n"
|
"movd %%xmm0,(%[dst_argb]) \n"
|
||||||
|
|
||||||
LABELALIGN "99: \n"
|
LABELALIGN "99: \n"
|
||||||
|
|
||||||
: "+r"(dst_argb), // %0
|
: [dst_argb] "+r"(dst_argb),
|
||||||
"+r"(src_argb), // %1
|
[src_argb] "+r"(src_argb),
|
||||||
"+rm"(dst_width), // %2
|
[dst_width] "+rm"(dst_width),
|
||||||
"=&r"(x0), // %3
|
[x0] "=&r"(x0),
|
||||||
"=&r"(x1) // %4
|
[x1] "=&r"(x1)
|
||||||
: "rm"(x), // %5
|
: [x] "rm"(x),
|
||||||
"rm"(dx) // %6
|
[dx] "rm"(dx),
|
||||||
|
[kShuffleColARGB] "m"(kShuffleColARGB),
|
||||||
|
[kShuffleFractions] "m"(kShuffleFractions)
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
|
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user