diff options
author | lixia zhang <zhanglixia-hf@loongson.cn> | 2018-07-04 18:40:48 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2018-07-20 22:53:04 +0000 |
commit | 21be9122aadf7824efe3fc19b2a09ff253a688e1 (patch) | |
tree | d22c41b2361d63169a0bfca4805b3b7990e5e420 /source/scale_argb.cc | |
parent | 55f5d91f11f929c4c59c32621c3d5457cca3ab0b (diff) | |
download | libyuv-21be9122aadf7824efe3fc19b2a09ff253a688e1.tar.gz |
libyuv:loongson optimize compare/row/scale/rotate files with mmi.
Currently, libyuv supports MIPS SIMD Arch(MSA),
but libyuv does not supports MultiMedia Instruction(MMI)(such as loongson3a platform).
In order to improve performance of libyuv on loongson3a platform,
this provides optimize 98 functions with mmi.
BUG=libyuv:804
Change-Id: I8947626009efad769b3103a867363ece25d79629
Reviewed-on: https://chromium-review.googlesource.com/1122064
Commit-Queue: Frank Barchard <fbarchard@chromium.org>
Reviewed-by: Frank Barchard <fbarchard@chromium.org>
Diffstat (limited to 'source/scale_argb.cc')
-rwxr-xr-x[-rw-r--r--] | source/scale_argb.cc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/source/scale_argb.cc b/source/scale_argb.cc index 53a22e8b..beef380a 100644..100755 --- a/source/scale_argb.cc +++ b/source/scale_argb.cc @@ -111,6 +111,22 @@ static void ScaleARGBDown2(int src_width, } } #endif +#if defined(HAS_SCALEARGBROWDOWN2_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ScaleARGBRowDown2 = + filtering == kFilterNone + ? ScaleARGBRowDown2_Any_MMI + : (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_Any_MMI + : ScaleARGBRowDown2Box_Any_MMI); + if (IS_ALIGNED(dst_width, 2)) { + ScaleARGBRowDown2 = + filtering == kFilterNone + ? ScaleARGBRowDown2_MMI + : (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_MMI + : ScaleARGBRowDown2Box_MMI); + } + } +#endif if (filtering == kFilterLinear) { src_stride = 0; @@ -237,6 +253,16 @@ static void ScaleARGBDownEven(int src_width, } } #endif +#if defined(HAS_SCALEARGBROWDOWNEVEN_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_Any_MMI + : ScaleARGBRowDownEven_Any_MMI; + if (IS_ALIGNED(dst_width, 2)) { + ScaleARGBRowDownEven = + filtering ? ScaleARGBRowDownEvenBox_MMI : ScaleARGBRowDownEven_MMI; + } + } +#endif if (filtering == kFilterLinear) { src_stride = 0; @@ -418,6 +444,14 @@ static void ScaleARGBBilinearUp(int src_width, } } #endif +#if defined(HAS_INTERPOLATEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + InterpolateRow = InterpolateRow_Any_MMI; + if (IS_ALIGNED(dst_width, 2)) { + InterpolateRow = InterpolateRow_MMI; + } + } +#endif if (src_width >= 32768) { ScaleARGBFilterCols = filtering ? ScaleARGBFilterCols64_C : ScaleARGBCols64_C; @@ -464,6 +498,14 @@ static void ScaleARGBBilinearUp(int src_width, } } #endif +#if defined(HAS_SCALEARGBCOLS_MMI) + if (!filtering && TestCpuFlag(kCpuHasMMI)) { + ScaleARGBFilterCols = ScaleARGBCols_Any_MMI; + if (IS_ALIGNED(dst_width, 1)) { + ScaleARGBFilterCols = ScaleARGBCols_MMI; + } + } +#endif if (!filtering && src_width * 2 == dst_width && x < 0x8000) { ScaleARGBFilterCols = ScaleARGBColsUp2_C; #if defined(HAS_SCALEARGBCOLSUP2_SSE2) @@ -471,6 +513,11 @@ static void ScaleARGBBilinearUp(int src_width, ScaleARGBFilterCols = ScaleARGBColsUp2_SSE2; } #endif +#if defined(HAS_SCALEARGBCOLSUP2_MMI) + if (TestCpuFlag(kCpuHasMMI) && IS_ALIGNED(dst_width, 4)) { + ScaleARGBFilterCols = ScaleARGBColsUp2_MMI; + } +#endif } if (y > max_y) { @@ -666,6 +713,14 @@ static void ScaleYUVToARGBBilinearUp(int src_width, } } #endif +#if defined(HAS_SCALEARGBCOLS_MMI) + if (!filtering && TestCpuFlag(kCpuHasMMI)) { + ScaleARGBFilterCols = ScaleARGBCols_Any_MMI; + if (IS_ALIGNED(dst_width, 1)) { + ScaleARGBFilterCols = ScaleARGBCols_MMI; + } + } +#endif if (!filtering && src_width * 2 == dst_width && x < 0x8000) { ScaleARGBFilterCols = ScaleARGBColsUp2_C; #if defined(HAS_SCALEARGBCOLSUP2_SSE2) @@ -673,6 +728,11 @@ static void ScaleYUVToARGBBilinearUp(int src_width, ScaleARGBFilterCols = ScaleARGBColsUp2_SSE2; } #endif +#if defined(HAS_SCALEARGBCOLSUP2_MMI) + if (TestCpuFlag(kCpuHasMMI) && IS_ALIGNED(dst_width, 4)) { + ScaleARGBFilterCols = ScaleARGBColsUp2_MMI; + } +#endif } const int max_y = (src_height - 1) << 16; @@ -797,6 +857,14 @@ static void ScaleARGBSimple(int src_width, } } #endif +#if defined(HAS_SCALEARGBCOLS_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ScaleARGBCols = ScaleARGBCols_Any_MMI; + if (IS_ALIGNED(dst_width, 1)) { + ScaleARGBCols = ScaleARGBCols_MMI; + } + } +#endif if (src_width * 2 == dst_width && x < 0x8000) { ScaleARGBCols = ScaleARGBColsUp2_C; #if defined(HAS_SCALEARGBCOLSUP2_SSE2) @@ -804,6 +872,11 @@ static void ScaleARGBSimple(int src_width, ScaleARGBCols = ScaleARGBColsUp2_SSE2; } #endif +#if defined(HAS_SCALEARGBCOLSUP2_MMI) + if (TestCpuFlag(kCpuHasMMI) && IS_ALIGNED(dst_width, 4)) { + ScaleARGBCols = ScaleARGBColsUp2_MMI; + } +#endif } for (j = 0; j < dst_height; ++j) { |