react-native-vision-camera-spoof-detector 1.1.22 → 1.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/android/CMakeLists.txt +12 -0
  2. package/android/build.gradle +10 -9
  3. package/android/src/main/cpp/cpp-adapter.cpp +6 -3
  4. package/android/src/main/java/com/faceantispoof/FaceAntiSpoofingAdvanced.kt +83 -0
  5. package/android/src/main/java/com/margelo/nitro/camera/spoofdetector/HybridSpoofDetectorOutput.kt +26 -11
  6. package/package.json +1 -1
  7. package/android/src/main/cpp/CMakeLists.txt +0 -33
  8. package/android/src/main/cpp/FaceAntiSpoofJSI.cpp +0 -142
  9. package/android/src/main/cpp/FastYuvJni.cpp +0 -111
  10. package/android/src/main/cpp/fast_yuv.cpp +0 -342
  11. package/android/src/main/cpp/fast_yuv.h +0 -23
  12. package/android/src/main/cpp/libyuv/.clang-format +0 -6
  13. package/android/src/main/cpp/libyuv/.gn +0 -40
  14. package/android/src/main/cpp/libyuv/.vpython3 +0 -410
  15. package/android/src/main/cpp/libyuv/AUTHORS +0 -7
  16. package/android/src/main/cpp/libyuv/Android.bp +0 -202
  17. package/android/src/main/cpp/libyuv/Android.mk +0 -106
  18. package/android/src/main/cpp/libyuv/BUILD.gn +0 -490
  19. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +0 -70
  20. package/android/src/main/cpp/libyuv/CMakeLists.txt +0 -259
  21. package/android/src/main/cpp/libyuv/DEPS +0 -935
  22. package/android/src/main/cpp/libyuv/DIR_METADATA +0 -3
  23. package/android/src/main/cpp/libyuv/LICENSE +0 -29
  24. package/android/src/main/cpp/libyuv/OWNERS +0 -11
  25. package/android/src/main/cpp/libyuv/PATENTS +0 -24
  26. package/android/src/main/cpp/libyuv/PRESUBMIT.py +0 -65
  27. package/android/src/main/cpp/libyuv/README.chromium +0 -11
  28. package/android/src/main/cpp/libyuv/README.md +0 -19
  29. package/android/src/main/cpp/libyuv/build_overrides/build.gni +0 -60
  30. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +0 -19
  31. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +0 -17
  32. package/android/src/main/cpp/libyuv/codereview.settings +0 -5
  33. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +0 -409
  34. package/android/src/main/cpp/libyuv/docs/environment_variables.md +0 -64
  35. package/android/src/main/cpp/libyuv/docs/feature_detection.md +0 -108
  36. package/android/src/main/cpp/libyuv/docs/filtering.md +0 -196
  37. package/android/src/main/cpp/libyuv/docs/formats.md +0 -208
  38. package/android/src/main/cpp/libyuv/docs/getting_started.md +0 -296
  39. package/android/src/main/cpp/libyuv/docs/rotation.md +0 -107
  40. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +0 -29
  41. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +0 -68
  42. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +0 -111
  43. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +0 -112
  44. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +0 -1117
  45. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +0 -2335
  46. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +0 -203
  47. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +0 -394
  48. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +0 -147
  49. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +0 -99
  50. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +0 -1949
  51. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +0 -195
  52. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +0 -1131
  53. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +0 -296
  54. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +0 -37
  55. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +0 -265
  56. package/android/src/main/cpp/libyuv/include/libyuv/row.h +0 -6738
  57. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +0 -2154
  58. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +0 -336
  59. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +0 -76
  60. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +0 -42
  61. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +0 -1726
  62. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +0 -51
  63. package/android/src/main/cpp/libyuv/include/libyuv/version.h +0 -16
  64. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +0 -222
  65. package/android/src/main/cpp/libyuv/include/libyuv.h +0 -33
  66. package/android/src/main/cpp/libyuv/infra/config/OWNERS +0 -3
  67. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +0 -17
  68. package/android/src/main/cpp/libyuv/infra/config/README.md +0 -2
  69. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +0 -6
  70. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +0 -144
  71. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +0 -1185
  72. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +0 -9
  73. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +0 -246
  74. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +0 -385
  75. package/android/src/main/cpp/libyuv/infra/config/main.star +0 -402
  76. package/android/src/main/cpp/libyuv/infra/config/project.cfg +0 -16
  77. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +0 -111
  78. package/android/src/main/cpp/libyuv/libyuv.gni +0 -34
  79. package/android/src/main/cpp/libyuv/libyuv.gyp +0 -149
  80. package/android/src/main/cpp/libyuv/libyuv.gypi +0 -87
  81. package/android/src/main/cpp/libyuv/linux.mk +0 -96
  82. package/android/src/main/cpp/libyuv/public.mk +0 -13
  83. package/android/src/main/cpp/libyuv/pylintrc +0 -49
  84. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +0 -74
  85. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +0 -56
  86. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +0 -15
  87. package/android/src/main/cpp/libyuv/source/compare.cc +0 -435
  88. package/android/src/main/cpp/libyuv/source/compare_common.cc +0 -74
  89. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +0 -362
  90. package/android/src/main/cpp/libyuv/source/compare_neon.cc +0 -96
  91. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +0 -223
  92. package/android/src/main/cpp/libyuv/source/compare_win.cc +0 -241
  93. package/android/src/main/cpp/libyuv/source/convert.cc +0 -4746
  94. package/android/src/main/cpp/libyuv/source/convert_argb.cc +0 -9179
  95. package/android/src/main/cpp/libyuv/source/convert_from.cc +0 -866
  96. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +0 -3671
  97. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +0 -602
  98. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +0 -391
  99. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +0 -288
  100. package/android/src/main/cpp/libyuv/source/cpu_id.cc +0 -496
  101. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +0 -580
  102. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +0 -71
  103. package/android/src/main/cpp/libyuv/source/planar_functions.cc +0 -5663
  104. package/android/src/main/cpp/libyuv/source/rotate.cc +0 -1241
  105. package/android/src/main/cpp/libyuv/source/rotate_any.cc +0 -76
  106. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +0 -259
  107. package/android/src/main/cpp/libyuv/source/rotate_common.cc +0 -208
  108. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +0 -505
  109. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +0 -233
  110. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +0 -219
  111. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +0 -273
  112. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +0 -174
  113. package/android/src/main/cpp/libyuv/source/rotate_win.cc +0 -253
  114. package/android/src/main/cpp/libyuv/source/row_any.cc +0 -2519
  115. package/android/src/main/cpp/libyuv/source/row_common.cc +0 -4461
  116. package/android/src/main/cpp/libyuv/source/row_gcc.cc +0 -9570
  117. package/android/src/main/cpp/libyuv/source/row_lasx.cc +0 -2343
  118. package/android/src/main/cpp/libyuv/source/row_lsx.cc +0 -3030
  119. package/android/src/main/cpp/libyuv/source/row_neon.cc +0 -4026
  120. package/android/src/main/cpp/libyuv/source/row_neon64.cc +0 -5617
  121. package/android/src/main/cpp/libyuv/source/row_rvv.cc +0 -2599
  122. package/android/src/main/cpp/libyuv/source/row_sme.cc +0 -1183
  123. package/android/src/main/cpp/libyuv/source/row_sve.cc +0 -1088
  124. package/android/src/main/cpp/libyuv/source/row_win.cc +0 -6453
  125. package/android/src/main/cpp/libyuv/source/scale.cc +0 -2710
  126. package/android/src/main/cpp/libyuv/source/scale_any.cc +0 -991
  127. package/android/src/main/cpp/libyuv/source/scale_argb.cc +0 -1158
  128. package/android/src/main/cpp/libyuv/source/scale_common.cc +0 -1977
  129. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +0 -2947
  130. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +0 -739
  131. package/android/src/main/cpp/libyuv/source/scale_neon.cc +0 -1449
  132. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +0 -1552
  133. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +0 -82
  134. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +0 -1971
  135. package/android/src/main/cpp/libyuv/source/scale_sme.cc +0 -555
  136. package/android/src/main/cpp/libyuv/source/scale_uv.cc +0 -1159
  137. package/android/src/main/cpp/libyuv/source/scale_win.cc +0 -1392
  138. package/android/src/main/cpp/libyuv/source/test.sh +0 -35
  139. package/android/src/main/cpp/libyuv/source/video_common.cc +0 -62
  140. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +0 -4
  141. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +0 -931
  142. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +0 -164
  143. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +0 -21
  144. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +0 -13
  145. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +0 -13
  146. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +0 -38
  147. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +0 -3
  148. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +0 -9
  149. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +0 -3
  150. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +0 -15
  151. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +0 -25
  152. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +0 -43
  153. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +0 -848
  154. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +0 -739
  155. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +0 -2867
  156. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +0 -2133
  157. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +0 -427
  158. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +0 -63
  159. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +0 -160
  160. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +0 -4731
  161. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +0 -334
  162. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +0 -962
  163. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +0 -590
  164. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +0 -465
  165. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +0 -280
  166. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +0 -1135
  167. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +0 -249
  168. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +0 -12
  169. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +0 -7
  170. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +0 -5
  171. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +0 -10
  172. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +0 -7
  173. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +0 -4
  174. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +0 -4
  175. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +0 -4
  176. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +0 -23
  177. package/android/src/main/cpp/libyuv/unit_test/testdata/test0.jpg +0 -0
  178. package/android/src/main/cpp/libyuv/unit_test/testdata/test1.jpg +0 -0
  179. package/android/src/main/cpp/libyuv/unit_test/testdata/test2.jpg +0 -0
  180. package/android/src/main/cpp/libyuv/unit_test/testdata/test3.jpg +0 -0
  181. package/android/src/main/cpp/libyuv/unit_test/testdata/test4.jpg +0 -0
  182. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +0 -581
  183. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +0 -232
  184. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +0 -112
  185. package/android/src/main/cpp/libyuv/util/Makefile +0 -9
  186. package/android/src/main/cpp/libyuv/util/color.cc +0 -120
  187. package/android/src/main/cpp/libyuv/util/compare.cc +0 -67
  188. package/android/src/main/cpp/libyuv/util/cpuid.c +0 -211
  189. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +0 -28
  190. package/android/src/main/cpp/libyuv/util/psnr.cc +0 -291
  191. package/android/src/main/cpp/libyuv/util/psnr.h +0 -47
  192. package/android/src/main/cpp/libyuv/util/psnr_main.cc +0 -620
  193. package/android/src/main/cpp/libyuv/util/ssim.cc +0 -364
  194. package/android/src/main/cpp/libyuv/util/ssim.h +0 -38
  195. package/android/src/main/cpp/libyuv/util/yuvconstants.c +0 -114
  196. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +0 -367
  197. package/android/src/main/cpp/libyuv/winarm.mk +0 -47
  198. package/android/src/main/java/com/faceantispoof/ByteBufferPool.kt +0 -68
  199. package/android/src/main/java/com/faceantispoof/FastYuv.kt +0 -51
  200. package/android/src/main/java/com/faceantispoof/YuvToFloatArrayConverter.kt +0 -584
  201. package/android/src/main/java/com/faceantispoof/YuvToRgbConverter.kt +0 -73
@@ -1,2947 +0,0 @@
1
- /*
2
- * Copyright 2013 The LibYuv Project Authors. All rights reserved.
3
- *
4
- * Use of this source code is governed by a BSD-style license
5
- * that can be found in the LICENSE file in the root of the source
6
- * tree. An additional intellectual property rights grant can be found
7
- * in the file PATENTS. All contributing project authors may
8
- * be found in the AUTHORS file in the root of the source tree.
9
- */
10
-
11
- #include "libyuv/row.h"
12
- #include "libyuv/scale_row.h"
13
-
14
- #ifdef __cplusplus
15
- namespace libyuv {
16
- extern "C" {
17
- #endif
18
-
19
- // This module is for GCC x86 and x64.
20
- #if !defined(LIBYUV_DISABLE_X86) && \
21
- (defined(__x86_64__) || defined(__i386__)) && \
22
- !defined(LIBYUV_ENABLE_ROWWIN)
23
-
24
- // Offsets for source bytes 0 to 9
25
- static const uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9,
26
- 128, 128, 128, 128, 128, 128, 128, 128};
27
-
28
- // Offsets for source bytes 11 to 20 with 8 subtracted = 3 to 12.
29
- static const uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12,
30
- 128, 128, 128, 128, 128, 128, 128, 128};
31
-
32
- // Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31.
33
- static const uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15,
34
- 128, 128, 128, 128, 128, 128, 128, 128};
35
-
36
- // Offsets for source bytes 0 to 10
37
- static const uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
38
-
39
- // Offsets for source bytes 10 to 21 with 8 subtracted = 3 to 13.
40
- static const uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7,
41
- 8, 9, 9, 10, 10, 11, 12, 13};
42
-
43
- // Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31.
44
- static const uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10,
45
- 10, 11, 12, 13, 13, 14, 14, 15};
46
-
47
- // Coefficients for source bytes 0 to 10
48
- static const uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2};
49
-
50
- // Coefficients for source bytes 10 to 21
51
- static const uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1};
52
-
53
- // Coefficients for source bytes 21 to 31
54
- static const uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3};
55
-
56
- // Coefficients for source bytes 21 to 31
57
- static const vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2};
58
-
59
- static const uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128,
60
- 128, 128, 128, 128, 128, 128, 128, 128};
61
-
62
- static const uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3,
63
- 6, 8, 11, 14, 128, 128, 128, 128};
64
-
65
- // Arrange words 0,3,6 into 0,1,2
66
- static const uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128,
67
- 128, 128, 128, 128, 128, 128, 128, 128};
68
-
69
- // Arrange words 0,3,6 into 3,4,5
70
- static const uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1,
71
- 6, 7, 12, 13, 128, 128, 128, 128};
72
-
73
- // Scaling values for boxes of 3x3 and 2x3
74
- static const uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9,
75
- 65536 / 9, 65536 / 6, 0, 0};
76
-
77
- // Arrange first value for pixels 0,1,2,3,4,5
78
- static const uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128,
79
- 11, 128, 14, 128, 128, 128, 128, 128};
80
-
81
- // Arrange second value for pixels 0,1,2,3,4,5
82
- static const uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128,
83
- 12, 128, 15, 128, 128, 128, 128, 128};
84
-
85
- // Arrange third value for pixels 0,1,2,3,4,5
86
- static const uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128,
87
- 13, 128, 128, 128, 128, 128, 128, 128};
88
-
89
- // Scaling values for boxes of 3x2 and 2x2
90
- static const uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3,
91
- 65536 / 3, 65536 / 2, 0, 0};
92
-
93
- // GCC versions of row functions are verbatim conversions from Visual C.
94
- // Generated using gcc disassembly on Visual C object file:
95
- // objdump -D yuvscaler.obj >yuvscaler.txt
96
-
97
- void ScaleRowDown2_SSSE3(const uint8_t* src_ptr,
98
- ptrdiff_t src_stride,
99
- uint8_t* dst_ptr,
100
- int dst_width) {
101
- (void)src_stride;
102
- asm volatile(
103
- // 16 pixel loop.
104
- LABELALIGN
105
- "1: \n"
106
- "movdqu (%0),%%xmm0 \n"
107
- "movdqu 0x10(%0),%%xmm1 \n"
108
- "lea 0x20(%0),%0 \n"
109
- "psrlw $0x8,%%xmm0 \n"
110
- "psrlw $0x8,%%xmm1 \n"
111
- "packuswb %%xmm1,%%xmm0 \n"
112
- "movdqu %%xmm0,(%1) \n"
113
- "lea 0x10(%1),%1 \n"
114
- "sub $0x10,%2 \n"
115
- "jg 1b \n"
116
- : "+r"(src_ptr), // %0
117
- "+r"(dst_ptr), // %1
118
- "+r"(dst_width) // %2
119
- :
120
- : "memory", "cc", "xmm0", "xmm1");
121
- }
122
-
123
- void ScaleRowDown2Linear_SSSE3(const uint8_t* src_ptr,
124
- ptrdiff_t src_stride,
125
- uint8_t* dst_ptr,
126
- int dst_width) {
127
- (void)src_stride;
128
- asm volatile(
129
- "pcmpeqb %%xmm4,%%xmm4 \n" // 0x0101
130
- "pabsb %%xmm4,%%xmm4 \n"
131
-
132
- "pxor %%xmm5,%%xmm5 \n"
133
-
134
- LABELALIGN
135
- "1: \n"
136
- "movdqu (%0),%%xmm0 \n"
137
- "movdqu 0x10(%0),%%xmm1 \n"
138
- "lea 0x20(%0),%0 \n"
139
- "pmaddubsw %%xmm4,%%xmm0 \n"
140
- "pmaddubsw %%xmm4,%%xmm1 \n"
141
- "pavgw %%xmm5,%%xmm0 \n"
142
- "pavgw %%xmm5,%%xmm1 \n"
143
- "packuswb %%xmm1,%%xmm0 \n"
144
- "movdqu %%xmm0,(%1) \n"
145
- "lea 0x10(%1),%1 \n"
146
- "sub $0x10,%2 \n"
147
- "jg 1b \n"
148
- : "+r"(src_ptr), // %0
149
- "+r"(dst_ptr), // %1
150
- "+r"(dst_width) // %2
151
- :
152
- : "memory", "cc", "xmm0", "xmm1", "xmm4", "xmm5");
153
- }
154
-
155
- void ScaleRowDown2Box_SSSE3(const uint8_t* src_ptr,
156
- ptrdiff_t src_stride,
157
- uint8_t* dst_ptr,
158
- int dst_width) {
159
- asm volatile(
160
- "pcmpeqb %%xmm4,%%xmm4 \n" // 0x0101
161
- "pabsb %%xmm4,%%xmm4 \n"
162
- "pxor %%xmm5,%%xmm5 \n"
163
-
164
- LABELALIGN
165
- "1: \n"
166
- "movdqu (%0),%%xmm0 \n"
167
- "movdqu 0x10(%0),%%xmm1 \n"
168
- "movdqu 0x00(%0,%3,1),%%xmm2 \n"
169
- "movdqu 0x10(%0,%3,1),%%xmm3 \n"
170
- "lea 0x20(%0),%0 \n"
171
- "pmaddubsw %%xmm4,%%xmm0 \n"
172
- "pmaddubsw %%xmm4,%%xmm1 \n"
173
- "pmaddubsw %%xmm4,%%xmm2 \n"
174
- "pmaddubsw %%xmm4,%%xmm3 \n"
175
- "paddw %%xmm2,%%xmm0 \n"
176
- "paddw %%xmm3,%%xmm1 \n"
177
- "psrlw $0x1,%%xmm0 \n"
178
- "psrlw $0x1,%%xmm1 \n"
179
- "pavgw %%xmm5,%%xmm0 \n"
180
- "pavgw %%xmm5,%%xmm1 \n"
181
- "packuswb %%xmm1,%%xmm0 \n"
182
- "movdqu %%xmm0,(%1) \n"
183
- "lea 0x10(%1),%1 \n"
184
- "sub $0x10,%2 \n"
185
- "jg 1b \n"
186
- : "+r"(src_ptr), // %0
187
- "+r"(dst_ptr), // %1
188
- "+r"(dst_width) // %2
189
- : "r"((intptr_t)(src_stride)) // %3
190
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5");
191
- }
192
-
193
- #ifdef HAS_SCALEROWDOWN2_AVX2
194
- void ScaleRowDown2_AVX2(const uint8_t* src_ptr,
195
- ptrdiff_t src_stride,
196
- uint8_t* dst_ptr,
197
- int dst_width) {
198
- (void)src_stride;
199
- asm volatile(
200
- "1: \n"
201
- "vmovdqu (%0),%%ymm0 \n"
202
- "vmovdqu 0x20(%0),%%ymm1 \n"
203
- "lea 0x40(%0),%0 \n"
204
- "vpsrlw $0x8,%%ymm0,%%ymm0 \n"
205
- "vpsrlw $0x8,%%ymm1,%%ymm1 \n"
206
- "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n"
207
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
208
- "vmovdqu %%ymm0,(%1) \n"
209
- "lea 0x20(%1),%1 \n"
210
- "sub $0x20,%2 \n"
211
- "jg 1b \n"
212
- "vzeroupper \n"
213
- : "+r"(src_ptr), // %0
214
- "+r"(dst_ptr), // %1
215
- "+r"(dst_width) // %2
216
- :
217
- : "memory", "cc", "xmm0", "xmm1");
218
- }
219
-
220
- void ScaleRowDown2Linear_AVX2(const uint8_t* src_ptr,
221
- ptrdiff_t src_stride,
222
- uint8_t* dst_ptr,
223
- int dst_width) {
224
- (void)src_stride;
225
- asm volatile(
226
- "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n"
227
- "vpabsb %%ymm4,%%ymm4 \n"
228
- "vpxor %%ymm5,%%ymm5,%%ymm5 \n"
229
-
230
- LABELALIGN
231
- "1: \n"
232
- "vmovdqu (%0),%%ymm0 \n"
233
- "vmovdqu 0x20(%0),%%ymm1 \n"
234
- "lea 0x40(%0),%0 \n"
235
- "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n"
236
- "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n"
237
- "vpavgw %%ymm5,%%ymm0,%%ymm0 \n"
238
- "vpavgw %%ymm5,%%ymm1,%%ymm1 \n"
239
- "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n"
240
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
241
- "vmovdqu %%ymm0,(%1) \n"
242
- "lea 0x20(%1),%1 \n"
243
- "sub $0x20,%2 \n"
244
- "jg 1b \n"
245
- "vzeroupper \n"
246
- : "+r"(src_ptr), // %0
247
- "+r"(dst_ptr), // %1
248
- "+r"(dst_width) // %2
249
- :
250
- : "memory", "cc", "xmm0", "xmm1", "xmm4", "xmm5");
251
- }
252
-
253
- void ScaleRowDown2Box_AVX2(const uint8_t* src_ptr,
254
- ptrdiff_t src_stride,
255
- uint8_t* dst_ptr,
256
- int dst_width) {
257
- asm volatile(
258
- "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n"
259
- "vpabsb %%ymm4,%%ymm4 \n"
260
- "vpxor %%ymm5,%%ymm5,%%ymm5 \n"
261
-
262
- LABELALIGN
263
- "1: \n"
264
- "vmovdqu (%0),%%ymm0 \n"
265
- "vmovdqu 0x20(%0),%%ymm1 \n"
266
- "vmovdqu 0x00(%0,%3,1),%%ymm2 \n"
267
- "vmovdqu 0x20(%0,%3,1),%%ymm3 \n"
268
- "lea 0x40(%0),%0 \n"
269
- "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n"
270
- "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n"
271
- "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n"
272
- "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n"
273
- "vpaddw %%ymm2,%%ymm0,%%ymm0 \n"
274
- "vpaddw %%ymm3,%%ymm1,%%ymm1 \n"
275
- "vpsrlw $0x1,%%ymm0,%%ymm0 \n"
276
- "vpsrlw $0x1,%%ymm1,%%ymm1 \n"
277
- "vpavgw %%ymm5,%%ymm0,%%ymm0 \n"
278
- "vpavgw %%ymm5,%%ymm1,%%ymm1 \n"
279
- "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n"
280
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
281
- "vmovdqu %%ymm0,(%1) \n"
282
- "lea 0x20(%1),%1 \n"
283
- "sub $0x20,%2 \n"
284
- "jg 1b \n"
285
- "vzeroupper \n"
286
- : "+r"(src_ptr), // %0
287
- "+r"(dst_ptr), // %1
288
- "+r"(dst_width) // %2
289
- : "r"((intptr_t)(src_stride)) // %3
290
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5");
291
- }
292
- #endif // HAS_SCALEROWDOWN2_AVX2
293
-
294
- void ScaleRowDown4_SSSE3(const uint8_t* src_ptr,
295
- ptrdiff_t src_stride,
296
- uint8_t* dst_ptr,
297
- int dst_width) {
298
- (void)src_stride;
299
- asm volatile(
300
- "pcmpeqb %%xmm5,%%xmm5 \n"
301
- "psrld $0x18,%%xmm5 \n"
302
- "pslld $0x10,%%xmm5 \n"
303
-
304
- LABELALIGN
305
- "1: \n"
306
- "movdqu (%0),%%xmm0 \n"
307
- "movdqu 0x10(%0),%%xmm1 \n"
308
- "lea 0x20(%0),%0 \n"
309
- "pand %%xmm5,%%xmm0 \n"
310
- "pand %%xmm5,%%xmm1 \n"
311
- "packuswb %%xmm1,%%xmm0 \n"
312
- "psrlw $0x8,%%xmm0 \n"
313
- "packuswb %%xmm0,%%xmm0 \n"
314
- "movq %%xmm0,(%1) \n"
315
- "lea 0x8(%1),%1 \n"
316
- "sub $0x8,%2 \n"
317
- "jg 1b \n"
318
- : "+r"(src_ptr), // %0
319
- "+r"(dst_ptr), // %1
320
- "+r"(dst_width) // %2
321
- :
322
- : "memory", "cc", "xmm0", "xmm1", "xmm5");
323
- }
324
-
325
- void ScaleRowDown4Box_SSSE3(const uint8_t* src_ptr,
326
- ptrdiff_t src_stride,
327
- uint8_t* dst_ptr,
328
- int dst_width) {
329
- intptr_t stridex3;
330
- asm volatile(
331
- "pcmpeqb %%xmm4,%%xmm4 \n"
332
- "pabsw %%xmm4,%%xmm5 \n"
333
- "pabsb %%xmm4,%%xmm4 \n" // 0x0101
334
- "psllw $0x3,%%xmm5 \n" // 0x0008
335
- "lea 0x00(%4,%4,2),%3 \n"
336
-
337
- LABELALIGN
338
- "1: \n"
339
- "movdqu (%0),%%xmm0 \n"
340
- "movdqu 0x10(%0),%%xmm1 \n"
341
- "movdqu 0x00(%0,%4,1),%%xmm2 \n"
342
- "movdqu 0x10(%0,%4,1),%%xmm3 \n"
343
- "pmaddubsw %%xmm4,%%xmm0 \n"
344
- "pmaddubsw %%xmm4,%%xmm1 \n"
345
- "pmaddubsw %%xmm4,%%xmm2 \n"
346
- "pmaddubsw %%xmm4,%%xmm3 \n"
347
- "paddw %%xmm2,%%xmm0 \n"
348
- "paddw %%xmm3,%%xmm1 \n"
349
- "movdqu 0x00(%0,%4,2),%%xmm2 \n"
350
- "movdqu 0x10(%0,%4,2),%%xmm3 \n"
351
- "pmaddubsw %%xmm4,%%xmm2 \n"
352
- "pmaddubsw %%xmm4,%%xmm3 \n"
353
- "paddw %%xmm2,%%xmm0 \n"
354
- "paddw %%xmm3,%%xmm1 \n"
355
- "movdqu 0x00(%0,%3,1),%%xmm2 \n"
356
- "movdqu 0x10(%0,%3,1),%%xmm3 \n"
357
- "lea 0x20(%0),%0 \n"
358
- "pmaddubsw %%xmm4,%%xmm2 \n"
359
- "pmaddubsw %%xmm4,%%xmm3 \n"
360
- "paddw %%xmm2,%%xmm0 \n"
361
- "paddw %%xmm3,%%xmm1 \n"
362
- "phaddw %%xmm1,%%xmm0 \n"
363
- "paddw %%xmm5,%%xmm0 \n"
364
- "psrlw $0x4,%%xmm0 \n"
365
- "packuswb %%xmm0,%%xmm0 \n"
366
- "movq %%xmm0,(%1) \n"
367
- "lea 0x8(%1),%1 \n"
368
- "sub $0x8,%2 \n"
369
- "jg 1b \n"
370
- : "+r"(src_ptr), // %0
371
- "+r"(dst_ptr), // %1
372
- "+r"(dst_width), // %2
373
- "=&r"(stridex3) // %3
374
- : "r"((intptr_t)(src_stride)) // %4
375
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
376
- }
377
-
378
- #ifdef HAS_SCALEROWDOWN4_AVX2
379
- void ScaleRowDown4_AVX2(const uint8_t* src_ptr,
380
- ptrdiff_t src_stride,
381
- uint8_t* dst_ptr,
382
- int dst_width) {
383
- (void)src_stride;
384
- asm volatile(
385
- "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n"
386
- "vpsrld $0x18,%%ymm5,%%ymm5 \n"
387
- "vpslld $0x10,%%ymm5,%%ymm5 \n"
388
-
389
- LABELALIGN
390
- "1: \n"
391
- "vmovdqu (%0),%%ymm0 \n"
392
- "vmovdqu 0x20(%0),%%ymm1 \n"
393
- "lea 0x40(%0),%0 \n"
394
- "vpand %%ymm5,%%ymm0,%%ymm0 \n"
395
- "vpand %%ymm5,%%ymm1,%%ymm1 \n"
396
- "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n"
397
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
398
- "vpsrlw $0x8,%%ymm0,%%ymm0 \n"
399
- "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n"
400
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
401
- "vmovdqu %%xmm0,(%1) \n"
402
- "lea 0x10(%1),%1 \n"
403
- "sub $0x10,%2 \n"
404
- "jg 1b \n"
405
- "vzeroupper \n"
406
- : "+r"(src_ptr), // %0
407
- "+r"(dst_ptr), // %1
408
- "+r"(dst_width) // %2
409
- :
410
- : "memory", "cc", "xmm0", "xmm1", "xmm5");
411
- }
412
-
413
- void ScaleRowDown4Box_AVX2(const uint8_t* src_ptr,
414
- ptrdiff_t src_stride,
415
- uint8_t* dst_ptr,
416
- int dst_width) {
417
- asm volatile(
418
- "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n"
419
- "vpabsw %%ymm4,%%ymm5 \n"
420
- "vpabsb %%ymm4,%%ymm4 \n" // 0x0101
421
- "vpsllw $0x3,%%ymm5,%%ymm5 \n" // 0x0008
422
-
423
- LABELALIGN
424
- "1: \n"
425
- "vmovdqu (%0),%%ymm0 \n"
426
- "vmovdqu 0x20(%0),%%ymm1 \n"
427
- "vmovdqu 0x00(%0,%3,1),%%ymm2 \n"
428
- "vmovdqu 0x20(%0,%3,1),%%ymm3 \n"
429
- "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n"
430
- "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n"
431
- "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n"
432
- "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n"
433
- "vpaddw %%ymm2,%%ymm0,%%ymm0 \n"
434
- "vpaddw %%ymm3,%%ymm1,%%ymm1 \n"
435
- "vmovdqu 0x00(%0,%3,2),%%ymm2 \n"
436
- "vmovdqu 0x20(%0,%3,2),%%ymm3 \n"
437
- "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n"
438
- "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n"
439
- "vpaddw %%ymm2,%%ymm0,%%ymm0 \n"
440
- "vpaddw %%ymm3,%%ymm1,%%ymm1 \n"
441
- "vmovdqu 0x00(%0,%4,1),%%ymm2 \n"
442
- "vmovdqu 0x20(%0,%4,1),%%ymm3 \n"
443
- "lea 0x40(%0),%0 \n"
444
- "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n"
445
- "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n"
446
- "vpaddw %%ymm2,%%ymm0,%%ymm0 \n"
447
- "vpaddw %%ymm3,%%ymm1,%%ymm1 \n"
448
- "vphaddw %%ymm1,%%ymm0,%%ymm0 \n"
449
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
450
- "vpaddw %%ymm5,%%ymm0,%%ymm0 \n"
451
- "vpsrlw $0x4,%%ymm0,%%ymm0 \n"
452
- "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n"
453
- "vpermq $0xd8,%%ymm0,%%ymm0 \n"
454
- "vmovdqu %%xmm0,(%1) \n"
455
- "lea 0x10(%1),%1 \n"
456
- "sub $0x10,%2 \n"
457
- "jg 1b \n"
458
- "vzeroupper \n"
459
- : "+r"(src_ptr), // %0
460
- "+r"(dst_ptr), // %1
461
- "+r"(dst_width) // %2
462
- : "r"((intptr_t)(src_stride)), // %3
463
- "r"((intptr_t)(src_stride * 3)) // %4
464
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
465
- }
466
- #endif // HAS_SCALEROWDOWN4_AVX2
467
-
468
- void ScaleRowDown34_SSSE3(const uint8_t* src_ptr,
469
- ptrdiff_t src_stride,
470
- uint8_t* dst_ptr,
471
- int dst_width) {
472
- (void)src_stride;
473
- asm volatile(
474
- "movdqa %0,%%xmm3 \n"
475
- "movdqa %1,%%xmm4 \n"
476
- "movdqa %2,%%xmm5 \n"
477
- :
478
- : "m"(kShuf0), // %0
479
- "m"(kShuf1), // %1
480
- "m"(kShuf2) // %2
481
- );
482
- asm volatile(
483
- "1: \n"
484
- "movdqu (%0),%%xmm0 \n"
485
- "movdqu 0x10(%0),%%xmm2 \n"
486
- "lea 0x20(%0),%0 \n"
487
- "movdqa %%xmm2,%%xmm1 \n"
488
- "palignr $0x8,%%xmm0,%%xmm1 \n"
489
- "pshufb %%xmm3,%%xmm0 \n"
490
- "pshufb %%xmm4,%%xmm1 \n"
491
- "pshufb %%xmm5,%%xmm2 \n"
492
- "movq %%xmm0,(%1) \n"
493
- "movq %%xmm1,0x8(%1) \n"
494
- "movq %%xmm2,0x10(%1) \n"
495
- "lea 0x18(%1),%1 \n"
496
- "sub $0x18,%2 \n"
497
- "jg 1b \n"
498
- : "+r"(src_ptr), // %0
499
- "+r"(dst_ptr), // %1
500
- "+r"(dst_width) // %2
501
- :
502
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
503
- }
504
-
505
- void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr,
506
- ptrdiff_t src_stride,
507
- uint8_t* dst_ptr,
508
- int dst_width) {
509
- asm volatile(
510
- "movdqa %0,%%xmm2 \n" // kShuf01
511
- "movdqa %1,%%xmm3 \n" // kShuf11
512
- "movdqa %2,%%xmm4 \n" // kShuf21
513
- :
514
- : "m"(kShuf01), // %0
515
- "m"(kShuf11), // %1
516
- "m"(kShuf21) // %2
517
- );
518
- asm volatile(
519
- "movdqa %0,%%xmm5 \n" // kMadd01
520
- "movdqa %1,%%xmm0 \n" // kMadd11
521
- "movdqa %2,%%xmm1 \n" // kRound34
522
- :
523
- : "m"(kMadd01), // %0
524
- "m"(kMadd11), // %1
525
- "m"(kRound34) // %2
526
- );
527
- asm volatile(
528
- "1: \n"
529
- "movdqu (%0),%%xmm6 \n"
530
- "movdqu 0x00(%0,%3,1),%%xmm7 \n"
531
- "pavgb %%xmm7,%%xmm6 \n"
532
- "pshufb %%xmm2,%%xmm6 \n"
533
- "pmaddubsw %%xmm5,%%xmm6 \n"
534
- "paddsw %%xmm1,%%xmm6 \n"
535
- "psrlw $0x2,%%xmm6 \n"
536
- "packuswb %%xmm6,%%xmm6 \n"
537
- "movq %%xmm6,(%1) \n"
538
- "movdqu 0x8(%0),%%xmm6 \n"
539
- "movdqu 0x8(%0,%3,1),%%xmm7 \n"
540
- "pavgb %%xmm7,%%xmm6 \n"
541
- "pshufb %%xmm3,%%xmm6 \n"
542
- "pmaddubsw %%xmm0,%%xmm6 \n"
543
- "paddsw %%xmm1,%%xmm6 \n"
544
- "psrlw $0x2,%%xmm6 \n"
545
- "packuswb %%xmm6,%%xmm6 \n"
546
- "movq %%xmm6,0x8(%1) \n"
547
- "movdqu 0x10(%0),%%xmm6 \n"
548
- "movdqu 0x10(%0,%3,1),%%xmm7 \n"
549
- "lea 0x20(%0),%0 \n"
550
- "pavgb %%xmm7,%%xmm6 \n"
551
- "pshufb %%xmm4,%%xmm6 \n"
552
- "pmaddubsw %4,%%xmm6 \n"
553
- "paddsw %%xmm1,%%xmm6 \n"
554
- "psrlw $0x2,%%xmm6 \n"
555
- "packuswb %%xmm6,%%xmm6 \n"
556
- "movq %%xmm6,0x10(%1) \n"
557
- "lea 0x18(%1),%1 \n"
558
- "sub $0x18,%2 \n"
559
- "jg 1b \n"
560
- : "+r"(src_ptr), // %0
561
- "+r"(dst_ptr), // %1
562
- "+r"(dst_width) // %2
563
- : "r"((intptr_t)(src_stride)), // %3
564
- "m"(kMadd21) // %4
565
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
566
- "xmm7");
567
- }
568
-
569
- void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr,
570
- ptrdiff_t src_stride,
571
- uint8_t* dst_ptr,
572
- int dst_width) {
573
- asm volatile(
574
- "movdqa %0,%%xmm2 \n" // kShuf01
575
- "movdqa %1,%%xmm3 \n" // kShuf11
576
- "movdqa %2,%%xmm4 \n" // kShuf21
577
- :
578
- : "m"(kShuf01), // %0
579
- "m"(kShuf11), // %1
580
- "m"(kShuf21) // %2
581
- );
582
- asm volatile(
583
- "movdqa %0,%%xmm5 \n" // kMadd01
584
- "movdqa %1,%%xmm0 \n" // kMadd11
585
- "movdqa %2,%%xmm1 \n" // kRound34
586
- :
587
- : "m"(kMadd01), // %0
588
- "m"(kMadd11), // %1
589
- "m"(kRound34) // %2
590
- );
591
-
592
- asm volatile(
593
- "1: \n"
594
- "movdqu (%0),%%xmm6 \n"
595
- "movdqu 0x00(%0,%3,1),%%xmm7 \n"
596
- "pavgb %%xmm6,%%xmm7 \n"
597
- "pavgb %%xmm7,%%xmm6 \n"
598
- "pshufb %%xmm2,%%xmm6 \n"
599
- "pmaddubsw %%xmm5,%%xmm6 \n"
600
- "paddsw %%xmm1,%%xmm6 \n"
601
- "psrlw $0x2,%%xmm6 \n"
602
- "packuswb %%xmm6,%%xmm6 \n"
603
- "movq %%xmm6,(%1) \n"
604
- "movdqu 0x8(%0),%%xmm6 \n"
605
- "movdqu 0x8(%0,%3,1),%%xmm7 \n"
606
- "pavgb %%xmm6,%%xmm7 \n"
607
- "pavgb %%xmm7,%%xmm6 \n"
608
- "pshufb %%xmm3,%%xmm6 \n"
609
- "pmaddubsw %%xmm0,%%xmm6 \n"
610
- "paddsw %%xmm1,%%xmm6 \n"
611
- "psrlw $0x2,%%xmm6 \n"
612
- "packuswb %%xmm6,%%xmm6 \n"
613
- "movq %%xmm6,0x8(%1) \n"
614
- "movdqu 0x10(%0),%%xmm6 \n"
615
- "movdqu 0x10(%0,%3,1),%%xmm7 \n"
616
- "lea 0x20(%0),%0 \n"
617
- "pavgb %%xmm6,%%xmm7 \n"
618
- "pavgb %%xmm7,%%xmm6 \n"
619
- "pshufb %%xmm4,%%xmm6 \n"
620
- "pmaddubsw %4,%%xmm6 \n"
621
- "paddsw %%xmm1,%%xmm6 \n"
622
- "psrlw $0x2,%%xmm6 \n"
623
- "packuswb %%xmm6,%%xmm6 \n"
624
- "movq %%xmm6,0x10(%1) \n"
625
- "lea 0x18(%1),%1 \n"
626
- "sub $0x18,%2 \n"
627
- "jg 1b \n"
628
- : "+r"(src_ptr), // %0
629
- "+r"(dst_ptr), // %1
630
- "+r"(dst_width) // %2
631
- : "r"((intptr_t)(src_stride)), // %3
632
- "m"(kMadd21) // %4
633
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
634
- "xmm7");
635
- }
636
-
637
- void ScaleRowDown38_SSSE3(const uint8_t* src_ptr,
638
- ptrdiff_t src_stride,
639
- uint8_t* dst_ptr,
640
- int dst_width) {
641
- (void)src_stride;
642
- asm volatile(
643
- "movdqa %3,%%xmm4 \n"
644
- "movdqa %4,%%xmm5 \n"
645
-
646
- LABELALIGN
647
- "1: \n"
648
- "movdqu (%0),%%xmm0 \n"
649
- "movdqu 0x10(%0),%%xmm1 \n"
650
- "lea 0x20(%0),%0 \n"
651
- "pshufb %%xmm4,%%xmm0 \n"
652
- "pshufb %%xmm5,%%xmm1 \n"
653
- "paddusb %%xmm1,%%xmm0 \n"
654
- "movq %%xmm0,(%1) \n"
655
- "movhlps %%xmm0,%%xmm1 \n"
656
- "movd %%xmm1,0x8(%1) \n"
657
- "lea 0xc(%1),%1 \n"
658
- "sub $0xc,%2 \n"
659
- "jg 1b \n"
660
- : "+r"(src_ptr), // %0
661
- "+r"(dst_ptr), // %1
662
- "+r"(dst_width) // %2
663
- : "m"(kShuf38a), // %3
664
- "m"(kShuf38b) // %4
665
- : "memory", "cc", "xmm0", "xmm1", "xmm4", "xmm5");
666
- }
667
-
668
- void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr,
669
- ptrdiff_t src_stride,
670
- uint8_t* dst_ptr,
671
- int dst_width) {
672
- asm volatile(
673
- "movdqa %0,%%xmm2 \n"
674
- "movdqa %1,%%xmm3 \n"
675
- "movdqa %2,%%xmm4 \n"
676
- "movdqa %3,%%xmm5 \n"
677
- :
678
- : "m"(kShufAb0), // %0
679
- "m"(kShufAb1), // %1
680
- "m"(kShufAb2), // %2
681
- "m"(kScaleAb2) // %3
682
- );
683
- asm volatile(
684
- "1: \n"
685
- "movdqu (%0),%%xmm0 \n"
686
- "movdqu 0x00(%0,%3,1),%%xmm1 \n"
687
- "lea 0x10(%0),%0 \n"
688
- "pavgb %%xmm1,%%xmm0 \n"
689
- "movdqa %%xmm0,%%xmm1 \n"
690
- "pshufb %%xmm2,%%xmm1 \n"
691
- "movdqa %%xmm0,%%xmm6 \n"
692
- "pshufb %%xmm3,%%xmm6 \n"
693
- "paddusw %%xmm6,%%xmm1 \n"
694
- "pshufb %%xmm4,%%xmm0 \n"
695
- "paddusw %%xmm0,%%xmm1 \n"
696
- "pmulhuw %%xmm5,%%xmm1 \n"
697
- "packuswb %%xmm1,%%xmm1 \n"
698
- "movd %%xmm1,(%1) \n"
699
- "psrlq $0x10,%%xmm1 \n"
700
- "movd %%xmm1,0x2(%1) \n"
701
- "lea 0x6(%1),%1 \n"
702
- "sub $0x6,%2 \n"
703
- "jg 1b \n"
704
- : "+r"(src_ptr), // %0
705
- "+r"(dst_ptr), // %1
706
- "+r"(dst_width) // %2
707
- : "r"((intptr_t)(src_stride)) // %3
708
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
709
- }
710
-
711
- void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr,
712
- ptrdiff_t src_stride,
713
- uint8_t* dst_ptr,
714
- int dst_width) {
715
- asm volatile(
716
- "movdqa %0,%%xmm2 \n"
717
- "movdqa %1,%%xmm3 \n"
718
- "movdqa %2,%%xmm4 \n"
719
- "pxor %%xmm5,%%xmm5 \n"
720
- :
721
- : "m"(kShufAc), // %0
722
- "m"(kShufAc3), // %1
723
- "m"(kScaleAc33) // %2
724
- );
725
- asm volatile(
726
- "1: \n"
727
- "movdqu (%0),%%xmm0 \n"
728
- "movdqu 0x00(%0,%3,1),%%xmm6 \n"
729
- "movhlps %%xmm0,%%xmm1 \n"
730
- "movhlps %%xmm6,%%xmm7 \n"
731
- "punpcklbw %%xmm5,%%xmm0 \n"
732
- "punpcklbw %%xmm5,%%xmm1 \n"
733
- "punpcklbw %%xmm5,%%xmm6 \n"
734
- "punpcklbw %%xmm5,%%xmm7 \n"
735
- "paddusw %%xmm6,%%xmm0 \n"
736
- "paddusw %%xmm7,%%xmm1 \n"
737
- "movdqu 0x00(%0,%3,2),%%xmm6 \n"
738
- "lea 0x10(%0),%0 \n"
739
- "movhlps %%xmm6,%%xmm7 \n"
740
- "punpcklbw %%xmm5,%%xmm6 \n"
741
- "punpcklbw %%xmm5,%%xmm7 \n"
742
- "paddusw %%xmm6,%%xmm0 \n"
743
- "paddusw %%xmm7,%%xmm1 \n"
744
- "movdqa %%xmm0,%%xmm6 \n"
745
- "psrldq $0x2,%%xmm0 \n"
746
- "paddusw %%xmm0,%%xmm6 \n"
747
- "psrldq $0x2,%%xmm0 \n"
748
- "paddusw %%xmm0,%%xmm6 \n"
749
- "pshufb %%xmm2,%%xmm6 \n"
750
- "movdqa %%xmm1,%%xmm7 \n"
751
- "psrldq $0x2,%%xmm1 \n"
752
- "paddusw %%xmm1,%%xmm7 \n"
753
- "psrldq $0x2,%%xmm1 \n"
754
- "paddusw %%xmm1,%%xmm7 \n"
755
- "pshufb %%xmm3,%%xmm7 \n"
756
- "paddusw %%xmm7,%%xmm6 \n"
757
- "pmulhuw %%xmm4,%%xmm6 \n"
758
- "packuswb %%xmm6,%%xmm6 \n"
759
- "movd %%xmm6,(%1) \n"
760
- "psrlq $0x10,%%xmm6 \n"
761
- "movd %%xmm6,0x2(%1) \n"
762
- "lea 0x6(%1),%1 \n"
763
- "sub $0x6,%2 \n"
764
- "jg 1b \n"
765
- : "+r"(src_ptr), // %0
766
- "+r"(dst_ptr), // %1
767
- "+r"(dst_width) // %2
768
- : "r"((intptr_t)(src_stride)) // %3
769
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
770
- "xmm7");
771
- }
772
-
773
- static const uvec8 kLinearShuffleFar = {2, 3, 0, 1, 6, 7, 4, 5,
774
- 10, 11, 8, 9, 14, 15, 12, 13};
775
-
776
- static const uvec8 kLinearMadd31 = {3, 1, 1, 3, 3, 1, 1, 3,
777
- 3, 1, 1, 3, 3, 1, 1, 3};
778
-
779
- #ifdef HAS_SCALEROWUP2_LINEAR_SSE2
780
- void ScaleRowUp2_Linear_SSE2(const uint8_t* src_ptr,
781
- uint8_t* dst_ptr,
782
- int dst_width) {
783
- asm volatile(
784
- "pxor %%xmm0,%%xmm0 \n" // 0
785
- "pcmpeqw %%xmm6,%%xmm6 \n"
786
- "psrlw $15,%%xmm6 \n"
787
- "psllw $1,%%xmm6 \n" // all 2
788
-
789
- LABELALIGN
790
- "1: \n"
791
- "movq (%0),%%xmm1 \n" // 01234567
792
- "movq 1(%0),%%xmm2 \n" // 12345678
793
- "movdqa %%xmm1,%%xmm3 \n"
794
- "punpcklbw %%xmm2,%%xmm3 \n" // 0112233445566778
795
- "punpcklbw %%xmm1,%%xmm1 \n" // 0011223344556677
796
- "punpcklbw %%xmm2,%%xmm2 \n" // 1122334455667788
797
- "movdqa %%xmm1,%%xmm4 \n"
798
- "punpcklbw %%xmm0,%%xmm4 \n" // 00112233 (16)
799
- "movdqa %%xmm2,%%xmm5 \n"
800
- "punpcklbw %%xmm0,%%xmm5 \n" // 11223344 (16)
801
- "paddw %%xmm5,%%xmm4 \n"
802
- "movdqa %%xmm3,%%xmm5 \n"
803
- "paddw %%xmm6,%%xmm4 \n"
804
- "punpcklbw %%xmm0,%%xmm5 \n" // 01122334 (16)
805
- "paddw %%xmm5,%%xmm5 \n"
806
- "paddw %%xmm4,%%xmm5 \n" // 3*near+far+2 (lo)
807
- "psrlw $2,%%xmm5 \n" // 3/4*near+1/4*far (lo)
808
-
809
- "punpckhbw %%xmm0,%%xmm1 \n" // 44556677 (16)
810
- "punpckhbw %%xmm0,%%xmm2 \n" // 55667788 (16)
811
- "paddw %%xmm2,%%xmm1 \n"
812
- "punpckhbw %%xmm0,%%xmm3 \n" // 45566778 (16)
813
- "paddw %%xmm6,%%xmm1 \n"
814
- "paddw %%xmm3,%%xmm3 \n"
815
- "paddw %%xmm3,%%xmm1 \n" // 3*near+far+2 (hi)
816
- "psrlw $2,%%xmm1 \n" // 3/4*near+1/4*far (hi)
817
-
818
- "packuswb %%xmm1,%%xmm5 \n"
819
- "movdqu %%xmm5,(%1) \n"
820
-
821
- "lea 0x8(%0),%0 \n"
822
- "lea 0x10(%1),%1 \n" // 8 sample to 16 sample
823
- "sub $0x10,%2 \n"
824
- "jg 1b \n"
825
- : "+r"(src_ptr), // %0
826
- "+r"(dst_ptr), // %1
827
- "+r"(dst_width) // %2
828
- :
829
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
830
- }
831
- #endif
832
-
833
- #ifdef HAS_SCALEROWUP2_BILINEAR_SSE2
834
- void ScaleRowUp2_Bilinear_SSE2(const uint8_t* src_ptr,
835
- ptrdiff_t src_stride,
836
- uint8_t* dst_ptr,
837
- ptrdiff_t dst_stride,
838
- int dst_width) {
839
- asm volatile(
840
- "1: \n"
841
- "pxor %%xmm0,%%xmm0 \n" // 0
842
- // above line
843
- "movq (%0),%%xmm1 \n" // 01234567
844
- "movq 1(%0),%%xmm2 \n" // 12345678
845
- "movdqa %%xmm1,%%xmm3 \n"
846
- "punpcklbw %%xmm2,%%xmm3 \n" // 0112233445566778
847
- "punpcklbw %%xmm1,%%xmm1 \n" // 0011223344556677
848
- "punpcklbw %%xmm2,%%xmm2 \n" // 1122334455667788
849
-
850
- "movdqa %%xmm1,%%xmm4 \n"
851
- "punpcklbw %%xmm0,%%xmm4 \n" // 00112233 (16)
852
- "movdqa %%xmm2,%%xmm5 \n"
853
- "punpcklbw %%xmm0,%%xmm5 \n" // 11223344 (16)
854
- "paddw %%xmm5,%%xmm4 \n" // near+far
855
- "movdqa %%xmm3,%%xmm5 \n"
856
- "punpcklbw %%xmm0,%%xmm5 \n" // 01122334 (16)
857
- "paddw %%xmm5,%%xmm5 \n" // 2*near
858
- "paddw %%xmm5,%%xmm4 \n" // 3*near+far (1, lo)
859
-
860
- "punpckhbw %%xmm0,%%xmm1 \n" // 44556677 (16)
861
- "punpckhbw %%xmm0,%%xmm2 \n" // 55667788 (16)
862
- "paddw %%xmm2,%%xmm1 \n"
863
- "punpckhbw %%xmm0,%%xmm3 \n" // 45566778 (16)
864
- "paddw %%xmm3,%%xmm3 \n" // 2*near
865
- "paddw %%xmm3,%%xmm1 \n" // 3*near+far (1, hi)
866
-
867
- // below line
868
- "movq (%0,%3),%%xmm6 \n" // 01234567
869
- "movq 1(%0,%3),%%xmm2 \n" // 12345678
870
- "movdqa %%xmm6,%%xmm3 \n"
871
- "punpcklbw %%xmm2,%%xmm3 \n" // 0112233445566778
872
- "punpcklbw %%xmm6,%%xmm6 \n" // 0011223344556677
873
- "punpcklbw %%xmm2,%%xmm2 \n" // 1122334455667788
874
-
875
- "movdqa %%xmm6,%%xmm5 \n"
876
- "punpcklbw %%xmm0,%%xmm5 \n" // 00112233 (16)
877
- "movdqa %%xmm2,%%xmm7 \n"
878
- "punpcklbw %%xmm0,%%xmm7 \n" // 11223344 (16)
879
- "paddw %%xmm7,%%xmm5 \n" // near+far
880
- "movdqa %%xmm3,%%xmm7 \n"
881
- "punpcklbw %%xmm0,%%xmm7 \n" // 01122334 (16)
882
- "paddw %%xmm7,%%xmm7 \n" // 2*near
883
- "paddw %%xmm7,%%xmm5 \n" // 3*near+far (2, lo)
884
-
885
- "punpckhbw %%xmm0,%%xmm6 \n" // 44556677 (16)
886
- "punpckhbw %%xmm0,%%xmm2 \n" // 55667788 (16)
887
- "paddw %%xmm6,%%xmm2 \n" // near+far
888
- "punpckhbw %%xmm0,%%xmm3 \n" // 45566778 (16)
889
- "paddw %%xmm3,%%xmm3 \n" // 2*near
890
- "paddw %%xmm3,%%xmm2 \n" // 3*near+far (2, hi)
891
-
892
- // xmm4 xmm1
893
- // xmm5 xmm2
894
- "pcmpeqw %%xmm0,%%xmm0 \n"
895
- "psrlw $15,%%xmm0 \n"
896
- "psllw $3,%%xmm0 \n" // all 8
897
-
898
- "movdqa %%xmm4,%%xmm3 \n"
899
- "movdqa %%xmm5,%%xmm6 \n"
900
- "paddw %%xmm3,%%xmm3 \n" // 6*near+2*far (1, lo)
901
- "paddw %%xmm0,%%xmm6 \n" // 3*near+far+8 (2, lo)
902
- "paddw %%xmm4,%%xmm3 \n" // 9*near+3*far (1, lo)
903
- "paddw %%xmm6,%%xmm3 \n" // 9 3 3 1 + 8 (1, lo)
904
- "psrlw $4,%%xmm3 \n" // ^ div by 16
905
-
906
- "movdqa %%xmm1,%%xmm7 \n"
907
- "movdqa %%xmm2,%%xmm6 \n"
908
- "paddw %%xmm7,%%xmm7 \n" // 6*near+2*far (1, hi)
909
- "paddw %%xmm0,%%xmm6 \n" // 3*near+far+8 (2, hi)
910
- "paddw %%xmm1,%%xmm7 \n" // 9*near+3*far (1, hi)
911
- "paddw %%xmm6,%%xmm7 \n" // 9 3 3 1 + 8 (1, hi)
912
- "psrlw $4,%%xmm7 \n" // ^ div by 16
913
-
914
- "packuswb %%xmm7,%%xmm3 \n"
915
- "movdqu %%xmm3,(%1) \n" // save above line
916
-
917
- "movdqa %%xmm5,%%xmm3 \n"
918
- "paddw %%xmm0,%%xmm4 \n" // 3*near+far+8 (1, lo)
919
- "paddw %%xmm3,%%xmm3 \n" // 6*near+2*far (2, lo)
920
- "paddw %%xmm3,%%xmm5 \n" // 9*near+3*far (2, lo)
921
- "paddw %%xmm4,%%xmm5 \n" // 9 3 3 1 + 8 (lo)
922
- "psrlw $4,%%xmm5 \n" // ^ div by 16
923
-
924
- "movdqa %%xmm2,%%xmm3 \n"
925
- "paddw %%xmm0,%%xmm1 \n" // 3*near+far+8 (1, hi)
926
- "paddw %%xmm3,%%xmm3 \n" // 6*near+2*far (2, hi)
927
- "paddw %%xmm3,%%xmm2 \n" // 9*near+3*far (2, hi)
928
- "paddw %%xmm1,%%xmm2 \n" // 9 3 3 1 + 8 (hi)
929
- "psrlw $4,%%xmm2 \n" // ^ div by 16
930
-
931
- "packuswb %%xmm2,%%xmm5 \n"
932
- "movdqu %%xmm5,(%1,%4) \n" // save below line
933
-
934
- "lea 0x8(%0),%0 \n"
935
- "lea 0x10(%1),%1 \n" // 8 sample to 16 sample
936
- "sub $0x10,%2 \n"
937
- "jg 1b \n"
938
- : "+r"(src_ptr), // %0
939
- "+r"(dst_ptr), // %1
940
- "+r"(dst_width) // %2
941
- : "r"((intptr_t)(src_stride)), // %3
942
- "r"((intptr_t)(dst_stride)) // %4
943
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
944
- "xmm7");
945
- }
946
- #endif
947
-
948
- #ifdef HAS_SCALEROWUP2_LINEAR_12_SSSE3
949
- void ScaleRowUp2_Linear_12_SSSE3(const uint16_t* src_ptr,
950
- uint16_t* dst_ptr,
951
- int dst_width) {
952
- asm volatile(
953
- "movdqa %3,%%xmm5 \n"
954
- "pcmpeqw %%xmm4,%%xmm4 \n"
955
- "psrlw $15,%%xmm4 \n"
956
- "psllw $1,%%xmm4 \n" // all 2
957
-
958
- LABELALIGN
959
- "1: \n"
960
- "movdqu (%0),%%xmm0 \n" // 01234567 (16)
961
- "movdqu 2(%0),%%xmm1 \n" // 12345678 (16)
962
-
963
- "movdqa %%xmm0,%%xmm2 \n"
964
- "punpckhwd %%xmm1,%%xmm2 \n" // 45566778 (16)
965
- "punpcklwd %%xmm1,%%xmm0 \n" // 01122334 (16)
966
-
967
- "movdqa %%xmm2,%%xmm3 \n"
968
- "movdqa %%xmm0,%%xmm1 \n"
969
- "pshufb %%xmm5,%%xmm3 \n" // 54657687 (far)
970
- "pshufb %%xmm5,%%xmm1 \n" // 10213243 (far)
971
-
972
- "paddw %%xmm4,%%xmm1 \n" // far+2
973
- "paddw %%xmm4,%%xmm3 \n" // far+2
974
- "paddw %%xmm0,%%xmm1 \n" // near+far+2
975
- "paddw %%xmm2,%%xmm3 \n" // near+far+2
976
- "paddw %%xmm0,%%xmm0 \n" // 2*near
977
- "paddw %%xmm2,%%xmm2 \n" // 2*near
978
- "paddw %%xmm1,%%xmm0 \n" // 3*near+far+2 (lo)
979
- "paddw %%xmm3,%%xmm2 \n" // 3*near+far+2 (hi)
980
-
981
- "psrlw $2,%%xmm0 \n" // 3/4*near+1/4*far
982
- "psrlw $2,%%xmm2 \n" // 3/4*near+1/4*far
983
- "movdqu %%xmm0,(%1) \n"
984
- "movdqu %%xmm2,16(%1) \n"
985
-
986
- "lea 0x10(%0),%0 \n"
987
- "lea 0x20(%1),%1 \n" // 8 sample to 16 sample
988
- "sub $0x10,%2 \n"
989
- "jg 1b \n"
990
- : "+r"(src_ptr), // %0
991
- "+r"(dst_ptr), // %1
992
- "+r"(dst_width) // %2
993
- : "m"(kLinearShuffleFar) // %3
994
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
995
- }
996
- #endif
997
-
998
- #ifdef HAS_SCALEROWUP2_BILINEAR_12_SSSE3
999
- void ScaleRowUp2_Bilinear_12_SSSE3(const uint16_t* src_ptr,
1000
- ptrdiff_t src_stride,
1001
- uint16_t* dst_ptr,
1002
- ptrdiff_t dst_stride,
1003
- int dst_width) {
1004
- asm volatile(
1005
- "pcmpeqw %%xmm7,%%xmm7 \n"
1006
- "psrlw $15,%%xmm7 \n"
1007
- "psllw $3,%%xmm7 \n" // all 8
1008
- "movdqa %5,%%xmm6 \n"
1009
-
1010
- LABELALIGN
1011
- "1: \n"
1012
- // above line
1013
- "movdqu (%0),%%xmm0 \n" // 01234567 (16)
1014
- "movdqu 2(%0),%%xmm1 \n" // 12345678 (16)
1015
- "movdqa %%xmm0,%%xmm2 \n"
1016
- "punpckhwd %%xmm1,%%xmm2 \n" // 45566778 (16)
1017
- "punpcklwd %%xmm1,%%xmm0 \n" // 01122334 (16)
1018
- "movdqa %%xmm2,%%xmm3 \n"
1019
- "movdqa %%xmm0,%%xmm1 \n"
1020
- "pshufb %%xmm6,%%xmm3 \n" // 54657687 (far)
1021
- "pshufb %%xmm6,%%xmm1 \n" // 10213243 (far)
1022
- "paddw %%xmm0,%%xmm1 \n" // near+far
1023
- "paddw %%xmm2,%%xmm3 \n" // near+far
1024
- "paddw %%xmm0,%%xmm0 \n" // 2*near
1025
- "paddw %%xmm2,%%xmm2 \n" // 2*near
1026
- "paddw %%xmm1,%%xmm0 \n" // 3*near+far (1, lo)
1027
- "paddw %%xmm3,%%xmm2 \n" // 3*near+far (1, hi)
1028
-
1029
- // below line
1030
- "movdqu (%0,%3,2),%%xmm1 \n" // 01234567 (16)
1031
- "movdqu 2(%0,%3,2),%%xmm4 \n" // 12345678 (16)
1032
- "movdqa %%xmm1,%%xmm3 \n"
1033
- "punpckhwd %%xmm4,%%xmm3 \n" // 45566778 (16)
1034
- "punpcklwd %%xmm4,%%xmm1 \n" // 01122334 (16)
1035
- "movdqa %%xmm3,%%xmm5 \n"
1036
- "movdqa %%xmm1,%%xmm4 \n"
1037
- "pshufb %%xmm6,%%xmm5 \n" // 54657687 (far)
1038
- "pshufb %%xmm6,%%xmm4 \n" // 10213243 (far)
1039
- "paddw %%xmm1,%%xmm4 \n" // near+far
1040
- "paddw %%xmm3,%%xmm5 \n" // near+far
1041
- "paddw %%xmm1,%%xmm1 \n" // 2*near
1042
- "paddw %%xmm3,%%xmm3 \n" // 2*near
1043
- "paddw %%xmm4,%%xmm1 \n" // 3*near+far (2, lo)
1044
- "paddw %%xmm5,%%xmm3 \n" // 3*near+far (2, hi)
1045
-
1046
- // xmm0 xmm2
1047
- // xmm1 xmm3
1048
-
1049
- "movdqa %%xmm0,%%xmm4 \n"
1050
- "movdqa %%xmm1,%%xmm5 \n"
1051
- "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (1, lo)
1052
- "paddw %%xmm7,%%xmm5 \n" // 3*near+far+8 (2, lo)
1053
- "paddw %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo)
1054
- "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo)
1055
- "psrlw $4,%%xmm4 \n" // ^ div by 16
1056
- "movdqu %%xmm4,(%1) \n"
1057
-
1058
- "movdqa %%xmm2,%%xmm4 \n"
1059
- "movdqa %%xmm3,%%xmm5 \n"
1060
- "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (1, hi)
1061
- "paddw %%xmm7,%%xmm5 \n" // 3*near+far+8 (2, hi)
1062
- "paddw %%xmm2,%%xmm4 \n" // 9*near+3*far (1, hi)
1063
- "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, hi)
1064
- "psrlw $4,%%xmm4 \n" // ^ div by 16
1065
- "movdqu %%xmm4,0x10(%1) \n"
1066
-
1067
- "movdqa %%xmm1,%%xmm4 \n"
1068
- "paddw %%xmm7,%%xmm0 \n" // 3*near+far+8 (1, lo)
1069
- "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (2, lo)
1070
- "paddw %%xmm4,%%xmm1 \n" // 9*near+3*far (2, lo)
1071
- "paddw %%xmm0,%%xmm1 \n" // 9 3 3 1 + 8 (2, lo)
1072
- "psrlw $4,%%xmm1 \n" // ^ div by 16
1073
- "movdqu %%xmm1,(%1,%4,2) \n"
1074
-
1075
- "movdqa %%xmm3,%%xmm4 \n"
1076
- "paddw %%xmm7,%%xmm2 \n" // 3*near+far+8 (1, hi)
1077
- "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (2, hi)
1078
- "paddw %%xmm4,%%xmm3 \n" // 9*near+3*far (2, hi)
1079
- "paddw %%xmm2,%%xmm3 \n" // 9 3 3 1 + 8 (2, hi)
1080
- "psrlw $4,%%xmm3 \n" // ^ div by 16
1081
- "movdqu %%xmm3,0x10(%1,%4,2) \n"
1082
-
1083
- "lea 0x10(%0),%0 \n"
1084
- "lea 0x20(%1),%1 \n" // 8 sample to 16 sample
1085
- "sub $0x10,%2 \n"
1086
- "jg 1b \n"
1087
- : "+r"(src_ptr), // %0
1088
- "+r"(dst_ptr), // %1
1089
- "+r"(dst_width) // %2
1090
- : "r"((intptr_t)(src_stride)), // %3
1091
- "r"((intptr_t)(dst_stride)), // %4
1092
- "m"(kLinearShuffleFar) // %5
1093
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
1094
- "xmm7");
1095
- }
1096
- #endif
1097
-
1098
- #ifdef HAS_SCALEROWUP2_LINEAR_16_SSE2
1099
- void ScaleRowUp2_Linear_16_SSE2(const uint16_t* src_ptr,
1100
- uint16_t* dst_ptr,
1101
- int dst_width) {
1102
- asm volatile(
1103
- "pxor %%xmm5,%%xmm5 \n"
1104
- "pcmpeqd %%xmm4,%%xmm4 \n"
1105
- "psrld $31,%%xmm4 \n"
1106
- "pslld $1,%%xmm4 \n" // all 2
1107
-
1108
- LABELALIGN
1109
- "1: \n"
1110
- "movq (%0),%%xmm0 \n" // 0123 (16b)
1111
- "movq 2(%0),%%xmm1 \n" // 1234 (16b)
1112
-
1113
- "punpcklwd %%xmm5,%%xmm0 \n" // 0123 (32b)
1114
- "punpcklwd %%xmm5,%%xmm1 \n" // 1234 (32b)
1115
-
1116
- "movdqa %%xmm0,%%xmm2 \n"
1117
- "movdqa %%xmm1,%%xmm3 \n"
1118
-
1119
- "pshufd $0b10110001,%%xmm2,%%xmm2 \n" // 1032 (even, far)
1120
- "pshufd $0b10110001,%%xmm3,%%xmm3 \n" // 2143 (odd, far)
1121
-
1122
- "paddd %%xmm4,%%xmm2 \n" // far+2 (lo)
1123
- "paddd %%xmm4,%%xmm3 \n" // far+2 (hi)
1124
- "paddd %%xmm0,%%xmm2 \n" // near+far+2 (lo)
1125
- "paddd %%xmm1,%%xmm3 \n" // near+far+2 (hi)
1126
- "paddd %%xmm0,%%xmm0 \n" // 2*near (lo)
1127
- "paddd %%xmm1,%%xmm1 \n" // 2*near (hi)
1128
- "paddd %%xmm2,%%xmm0 \n" // 3*near+far+2 (lo)
1129
- "paddd %%xmm3,%%xmm1 \n" // 3*near+far+2 (hi)
1130
-
1131
- "psrld $2,%%xmm0 \n" // 3/4*near+1/4*far (lo)
1132
- "psrld $2,%%xmm1 \n" // 3/4*near+1/4*far (hi)
1133
- "packssdw %%xmm1,%%xmm0 \n"
1134
- "pshufd $0b11011000,%%xmm0,%%xmm0 \n"
1135
- "movdqu %%xmm0,(%1) \n"
1136
-
1137
- "lea 0x8(%0),%0 \n"
1138
- "lea 0x10(%1),%1 \n" // 4 pixel to 8 pixel
1139
- "sub $0x8,%2 \n"
1140
- "jg 1b \n"
1141
- : "+r"(src_ptr), // %0
1142
- "+r"(dst_ptr), // %1
1143
- "+r"(dst_width) // %2
1144
- :
1145
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
1146
- }
1147
- #endif
1148
-
1149
- #ifdef HAS_SCALEROWUP2_BILINEAR_16_SSE2
1150
- void ScaleRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr,
1151
- ptrdiff_t src_stride,
1152
- uint16_t* dst_ptr,
1153
- ptrdiff_t dst_stride,
1154
- int dst_width) {
1155
- asm volatile(
1156
- "pxor %%xmm7,%%xmm7 \n"
1157
- "pcmpeqd %%xmm6,%%xmm6 \n"
1158
- "psrld $31,%%xmm6 \n"
1159
- "pslld $3,%%xmm6 \n" // all 8
1160
-
1161
- LABELALIGN
1162
- "1: \n"
1163
- "movq (%0),%%xmm0 \n" // 0011 (16b, 1u1v)
1164
- "movq 4(%0),%%xmm1 \n" // 1122 (16b, 1u1v)
1165
- "punpcklwd %%xmm7,%%xmm0 \n" // 0011 (near) (32b, 1u1v)
1166
- "punpcklwd %%xmm7,%%xmm1 \n" // 1122 (near) (32b, 1u1v)
1167
- "movdqa %%xmm0,%%xmm2 \n"
1168
- "movdqa %%xmm1,%%xmm3 \n"
1169
- "pshufd $0b01001110,%%xmm2,%%xmm2 \n" // 1100 (far) (1, lo)
1170
- "pshufd $0b01001110,%%xmm3,%%xmm3 \n" // 2211 (far) (1, hi)
1171
- "paddd %%xmm0,%%xmm2 \n" // near+far (1, lo)
1172
- "paddd %%xmm1,%%xmm3 \n" // near+far (1, hi)
1173
- "paddd %%xmm0,%%xmm0 \n" // 2*near (1, lo)
1174
- "paddd %%xmm1,%%xmm1 \n" // 2*near (1, hi)
1175
- "paddd %%xmm2,%%xmm0 \n" // 3*near+far (1, lo)
1176
- "paddd %%xmm3,%%xmm1 \n" // 3*near+far (1, hi)
1177
-
1178
- "movq (%0),%%xmm0 \n" // 0123 (16b)
1179
- "movq 2(%0),%%xmm1 \n" // 1234 (16b)
1180
- "punpcklwd %%xmm7,%%xmm0 \n" // 0123 (32b)
1181
- "punpcklwd %%xmm7,%%xmm1 \n" // 1234 (32b)
1182
- "movdqa %%xmm0,%%xmm2 \n"
1183
- "movdqa %%xmm1,%%xmm3 \n"
1184
- "pshufd $0b10110001,%%xmm2,%%xmm2 \n" // 1032 (even, far)
1185
- "pshufd $0b10110001,%%xmm3,%%xmm3 \n" // 2143 (odd, far)
1186
- "paddd %%xmm0,%%xmm2 \n" // near+far (lo)
1187
- "paddd %%xmm1,%%xmm3 \n" // near+far (hi)
1188
- "paddd %%xmm0,%%xmm0 \n" // 2*near (lo)
1189
- "paddd %%xmm1,%%xmm1 \n" // 2*near (hi)
1190
- "paddd %%xmm2,%%xmm0 \n" // 3*near+far (1, lo)
1191
- "paddd %%xmm3,%%xmm1 \n" // 3*near+far (1, hi)
1192
-
1193
- "movq (%0,%3,2),%%xmm2 \n"
1194
- "movq 2(%0,%3,2),%%xmm3 \n"
1195
- "punpcklwd %%xmm7,%%xmm2 \n" // 0123 (32b)
1196
- "punpcklwd %%xmm7,%%xmm3 \n" // 1234 (32b)
1197
- "movdqa %%xmm2,%%xmm4 \n"
1198
- "movdqa %%xmm3,%%xmm5 \n"
1199
- "pshufd $0b10110001,%%xmm4,%%xmm4 \n" // 1032 (even, far)
1200
- "pshufd $0b10110001,%%xmm5,%%xmm5 \n" // 2143 (odd, far)
1201
- "paddd %%xmm2,%%xmm4 \n" // near+far (lo)
1202
- "paddd %%xmm3,%%xmm5 \n" // near+far (hi)
1203
- "paddd %%xmm2,%%xmm2 \n" // 2*near (lo)
1204
- "paddd %%xmm3,%%xmm3 \n" // 2*near (hi)
1205
- "paddd %%xmm4,%%xmm2 \n" // 3*near+far (2, lo)
1206
- "paddd %%xmm5,%%xmm3 \n" // 3*near+far (2, hi)
1207
-
1208
- "movdqa %%xmm0,%%xmm4 \n"
1209
- "movdqa %%xmm2,%%xmm5 \n"
1210
- "paddd %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo)
1211
- "paddd %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo)
1212
- "paddd %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo)
1213
- "paddd %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo)
1214
- "psrld $4,%%xmm4 \n" // ^ div by 16 (1, lo)
1215
-
1216
- "movdqa %%xmm2,%%xmm5 \n"
1217
- "paddd %%xmm2,%%xmm5 \n" // 6*near+2*far (2, lo)
1218
- "paddd %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo)
1219
- "paddd %%xmm2,%%xmm5 \n" // 9*near+3*far (2, lo)
1220
- "paddd %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo)
1221
- "psrld $4,%%xmm5 \n" // ^ div by 16 (2, lo)
1222
-
1223
- "movdqa %%xmm1,%%xmm0 \n"
1224
- "movdqa %%xmm3,%%xmm2 \n"
1225
- "paddd %%xmm1,%%xmm0 \n" // 6*near+2*far (1, hi)
1226
- "paddd %%xmm6,%%xmm2 \n" // 3*near+far+8 (2, hi)
1227
- "paddd %%xmm1,%%xmm0 \n" // 9*near+3*far (1, hi)
1228
- "paddd %%xmm2,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi)
1229
- "psrld $4,%%xmm0 \n" // ^ div by 16 (1, hi)
1230
-
1231
- "movdqa %%xmm3,%%xmm2 \n"
1232
- "paddd %%xmm3,%%xmm2 \n" // 6*near+2*far (2, hi)
1233
- "paddd %%xmm6,%%xmm1 \n" // 3*near+far+8 (1, hi)
1234
- "paddd %%xmm3,%%xmm2 \n" // 9*near+3*far (2, hi)
1235
- "paddd %%xmm1,%%xmm2 \n" // 9 3 3 1 + 8 (2, hi)
1236
- "psrld $4,%%xmm2 \n" // ^ div by 16 (2, hi)
1237
-
1238
- "packssdw %%xmm0,%%xmm4 \n"
1239
- "pshufd $0b11011000,%%xmm4,%%xmm4 \n"
1240
- "movdqu %%xmm4,(%1) \n" // store above
1241
- "packssdw %%xmm2,%%xmm5 \n"
1242
- "pshufd $0b11011000,%%xmm5,%%xmm5 \n"
1243
- "movdqu %%xmm5,(%1,%4,2) \n" // store below
1244
-
1245
- "lea 0x8(%0),%0 \n"
1246
- "lea 0x10(%1),%1 \n" // 4 pixel to 8 pixel
1247
- "sub $0x8,%2 \n"
1248
- "jg 1b \n"
1249
- : "+r"(src_ptr), // %0
1250
- "+r"(dst_ptr), // %1
1251
- "+r"(dst_width) // %2
1252
- : "r"((intptr_t)(src_stride)), // %3
1253
- "r"((intptr_t)(dst_stride)) // %4
1254
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
1255
- "xmm7");
1256
- }
1257
- #endif
1258
-
1259
- #ifdef HAS_SCALEROWUP2_LINEAR_SSSE3
1260
- void ScaleRowUp2_Linear_SSSE3(const uint8_t* src_ptr,
1261
- uint8_t* dst_ptr,
1262
- int dst_width) {
1263
- asm volatile(
1264
- "pcmpeqw %%xmm4,%%xmm4 \n"
1265
- "psrlw $15,%%xmm4 \n"
1266
- "psllw $1,%%xmm4 \n" // all 2
1267
- "movdqa %3,%%xmm3 \n"
1268
-
1269
- LABELALIGN
1270
- "1: \n"
1271
- "movq (%0),%%xmm0 \n" // 01234567
1272
- "movq 1(%0),%%xmm1 \n" // 12345678
1273
- "punpcklwd %%xmm0,%%xmm0 \n" // 0101232345456767
1274
- "punpcklwd %%xmm1,%%xmm1 \n" // 1212343456567878
1275
- "movdqa %%xmm0,%%xmm2 \n"
1276
- "punpckhdq %%xmm1,%%xmm2 \n" // 4545565667677878
1277
- "punpckldq %%xmm1,%%xmm0 \n" // 0101121223233434
1278
- "pmaddubsw %%xmm3,%%xmm2 \n" // 3*near+far (hi)
1279
- "pmaddubsw %%xmm3,%%xmm0 \n" // 3*near+far (lo)
1280
- "paddw %%xmm4,%%xmm0 \n" // 3*near+far+2 (lo)
1281
- "paddw %%xmm4,%%xmm2 \n" // 3*near+far+2 (hi)
1282
- "psrlw $2,%%xmm0 \n" // 3/4*near+1/4*far (lo)
1283
- "psrlw $2,%%xmm2 \n" // 3/4*near+1/4*far (hi)
1284
- "packuswb %%xmm2,%%xmm0 \n"
1285
- "movdqu %%xmm0,(%1) \n"
1286
- "lea 0x8(%0),%0 \n"
1287
- "lea 0x10(%1),%1 \n" // 8 sample to 16 sample
1288
- "sub $0x10,%2 \n"
1289
- "jg 1b \n"
1290
- : "+r"(src_ptr), // %0
1291
- "+r"(dst_ptr), // %1
1292
- "+r"(dst_width) // %2
1293
- : "m"(kLinearMadd31) // %3
1294
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4");
1295
- }
1296
- #endif
1297
-
1298
- #ifdef HAS_SCALEROWUP2_BILINEAR_SSSE3
1299
- void ScaleRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr,
1300
- ptrdiff_t src_stride,
1301
- uint8_t* dst_ptr,
1302
- ptrdiff_t dst_stride,
1303
- int dst_width) {
1304
- asm volatile(
1305
- "pcmpeqw %%xmm6,%%xmm6 \n"
1306
- "psrlw $15,%%xmm6 \n"
1307
- "psllw $3,%%xmm6 \n" // all 8
1308
- "movdqa %5,%%xmm7 \n"
1309
-
1310
- LABELALIGN
1311
- "1: \n"
1312
- "movq (%0),%%xmm0 \n" // 01234567
1313
- "movq 1(%0),%%xmm1 \n" // 12345678
1314
- "punpcklwd %%xmm0,%%xmm0 \n" // 0101232345456767
1315
- "punpcklwd %%xmm1,%%xmm1 \n" // 1212343456567878
1316
- "movdqa %%xmm0,%%xmm2 \n"
1317
- "punpckhdq %%xmm1,%%xmm2 \n" // 4545565667677878
1318
- "punpckldq %%xmm1,%%xmm0 \n" // 0101121223233434
1319
- "pmaddubsw %%xmm7,%%xmm2 \n" // 3*near+far (1, hi)
1320
- "pmaddubsw %%xmm7,%%xmm0 \n" // 3*near+far (1, lo)
1321
-
1322
- "movq (%0,%3),%%xmm1 \n"
1323
- "movq 1(%0,%3),%%xmm4 \n"
1324
- "punpcklwd %%xmm1,%%xmm1 \n"
1325
- "punpcklwd %%xmm4,%%xmm4 \n"
1326
- "movdqa %%xmm1,%%xmm3 \n"
1327
- "punpckhdq %%xmm4,%%xmm3 \n"
1328
- "punpckldq %%xmm4,%%xmm1 \n"
1329
- "pmaddubsw %%xmm7,%%xmm3 \n" // 3*near+far (2, hi)
1330
- "pmaddubsw %%xmm7,%%xmm1 \n" // 3*near+far (2, lo)
1331
-
1332
- // xmm0 xmm2
1333
- // xmm1 xmm3
1334
-
1335
- "movdqa %%xmm0,%%xmm4 \n"
1336
- "movdqa %%xmm1,%%xmm5 \n"
1337
- "paddw %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo)
1338
- "paddw %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo)
1339
- "paddw %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo)
1340
- "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo)
1341
- "psrlw $4,%%xmm4 \n" // ^ div by 16 (1, lo)
1342
-
1343
- "movdqa %%xmm1,%%xmm5 \n"
1344
- "paddw %%xmm1,%%xmm5 \n" // 6*near+2*far (2, lo)
1345
- "paddw %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo)
1346
- "paddw %%xmm1,%%xmm5 \n" // 9*near+3*far (2, lo)
1347
- "paddw %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo)
1348
- "psrlw $4,%%xmm5 \n" // ^ div by 16 (2, lo)
1349
-
1350
- "movdqa %%xmm2,%%xmm0 \n"
1351
- "movdqa %%xmm3,%%xmm1 \n"
1352
- "paddw %%xmm2,%%xmm0 \n" // 6*near+2*far (1, hi)
1353
- "paddw %%xmm6,%%xmm1 \n" // 3*near+far+8 (2, hi)
1354
- "paddw %%xmm2,%%xmm0 \n" // 9*near+3*far (1, hi)
1355
- "paddw %%xmm1,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi)
1356
- "psrlw $4,%%xmm0 \n" // ^ div by 16 (1, hi)
1357
-
1358
- "movdqa %%xmm3,%%xmm1 \n"
1359
- "paddw %%xmm3,%%xmm1 \n" // 6*near+2*far (2, hi)
1360
- "paddw %%xmm6,%%xmm2 \n" // 3*near+far+8 (1, hi)
1361
- "paddw %%xmm3,%%xmm1 \n" // 9*near+3*far (2, hi)
1362
- "paddw %%xmm2,%%xmm1 \n" // 9 3 3 1 + 8 (2, hi)
1363
- "psrlw $4,%%xmm1 \n" // ^ div by 16 (2, hi)
1364
-
1365
- "packuswb %%xmm0,%%xmm4 \n"
1366
- "movdqu %%xmm4,(%1) \n" // store above
1367
- "packuswb %%xmm1,%%xmm5 \n"
1368
- "movdqu %%xmm5,(%1,%4) \n" // store below
1369
-
1370
- "lea 0x8(%0),%0 \n"
1371
- "lea 0x10(%1),%1 \n" // 8 sample to 16 sample
1372
- "sub $0x10,%2 \n"
1373
- "jg 1b \n"
1374
- : "+r"(src_ptr), // %0
1375
- "+r"(dst_ptr), // %1
1376
- "+r"(dst_width) // %2
1377
- : "r"((intptr_t)(src_stride)), // %3
1378
- "r"((intptr_t)(dst_stride)), // %4
1379
- "m"(kLinearMadd31) // %5
1380
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
1381
- "xmm7");
1382
- }
1383
- #endif
1384
-
1385
- #ifdef HAS_SCALEROWUP2_LINEAR_AVX2
1386
- void ScaleRowUp2_Linear_AVX2(const uint8_t* src_ptr,
1387
- uint8_t* dst_ptr,
1388
- int dst_width) {
1389
- asm volatile(
1390
- "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n"
1391
- "vpsrlw $15,%%ymm4,%%ymm4 \n"
1392
- "vpsllw $1,%%ymm4,%%ymm4 \n" // all 2
1393
- "vbroadcastf128 %3,%%ymm3 \n"
1394
-
1395
- LABELALIGN
1396
- "1: \n"
1397
- "vmovdqu (%0),%%xmm0 \n" // 0123456789ABCDEF
1398
- "vmovdqu 1(%0),%%xmm1 \n" // 123456789ABCDEF0
1399
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n"
1400
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n"
1401
- "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n"
1402
- "vpunpcklwd %%ymm1,%%ymm1,%%ymm1 \n"
1403
- "vpunpckhdq %%ymm1,%%ymm0,%%ymm2 \n"
1404
- "vpunpckldq %%ymm1,%%ymm0,%%ymm0 \n"
1405
- "vpmaddubsw %%ymm3,%%ymm2,%%ymm1 \n" // 3*near+far (hi)
1406
- "vpmaddubsw %%ymm3,%%ymm0,%%ymm0 \n" // 3*near+far (lo)
1407
- "vpaddw %%ymm4,%%ymm0,%%ymm0 \n" // 3*near+far+2 (lo)
1408
- "vpaddw %%ymm4,%%ymm1,%%ymm1 \n" // 3*near+far+2 (hi)
1409
- "vpsrlw $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo)
1410
- "vpsrlw $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi)
1411
- "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n"
1412
- "vmovdqu %%ymm0,(%1) \n"
1413
-
1414
- "lea 0x10(%0),%0 \n"
1415
- "lea 0x20(%1),%1 \n" // 16 sample to 32 sample
1416
- "sub $0x20,%2 \n"
1417
- "jg 1b \n"
1418
- "vzeroupper \n"
1419
- : "+r"(src_ptr), // %0
1420
- "+r"(dst_ptr), // %1
1421
- "+r"(dst_width) // %2
1422
- : "m"(kLinearMadd31) // %3
1423
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4");
1424
- }
1425
- #endif
1426
-
1427
- #ifdef HAS_SCALEROWUP2_BILINEAR_AVX2
1428
- void ScaleRowUp2_Bilinear_AVX2(const uint8_t* src_ptr,
1429
- ptrdiff_t src_stride,
1430
- uint8_t* dst_ptr,
1431
- ptrdiff_t dst_stride,
1432
- int dst_width) {
1433
- asm volatile(
1434
- "vpcmpeqw %%ymm6,%%ymm6,%%ymm6 \n"
1435
- "vpsrlw $15,%%ymm6,%%ymm6 \n"
1436
- "vpsllw $3,%%ymm6,%%ymm6 \n" // all 8
1437
- "vbroadcastf128 %5,%%ymm7 \n"
1438
-
1439
- LABELALIGN
1440
- "1: \n"
1441
- "vmovdqu (%0),%%xmm0 \n" // 0123456789ABCDEF
1442
- "vmovdqu 1(%0),%%xmm1 \n" // 123456789ABCDEF0
1443
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n"
1444
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n"
1445
- "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n"
1446
- "vpunpcklwd %%ymm1,%%ymm1,%%ymm1 \n"
1447
- "vpunpckhdq %%ymm1,%%ymm0,%%ymm2 \n"
1448
- "vpunpckldq %%ymm1,%%ymm0,%%ymm0 \n"
1449
- "vpmaddubsw %%ymm7,%%ymm2,%%ymm1 \n" // 3*near+far (1, hi)
1450
- "vpmaddubsw %%ymm7,%%ymm0,%%ymm0 \n" // 3*near+far (1, lo)
1451
-
1452
- "vmovdqu (%0,%3),%%xmm2 \n" // 0123456789ABCDEF
1453
- "vmovdqu 1(%0,%3),%%xmm3 \n" // 123456789ABCDEF0
1454
- "vpermq $0b11011000,%%ymm2,%%ymm2 \n"
1455
- "vpermq $0b11011000,%%ymm3,%%ymm3 \n"
1456
- "vpunpcklwd %%ymm2,%%ymm2,%%ymm2 \n"
1457
- "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n"
1458
- "vpunpckhdq %%ymm3,%%ymm2,%%ymm4 \n"
1459
- "vpunpckldq %%ymm3,%%ymm2,%%ymm2 \n"
1460
- "vpmaddubsw %%ymm7,%%ymm4,%%ymm3 \n" // 3*near+far (2, hi)
1461
- "vpmaddubsw %%ymm7,%%ymm2,%%ymm2 \n" // 3*near+far (2, lo)
1462
-
1463
- // ymm0 ymm1
1464
- // ymm2 ymm3
1465
-
1466
- "vpaddw %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo)
1467
- "vpaddw %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo)
1468
- "vpaddw %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo)
1469
- "vpaddw %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo)
1470
- "vpsrlw $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo)
1471
-
1472
- "vpaddw %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo)
1473
- "vpaddw %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo)
1474
- "vpaddw %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo)
1475
- "vpaddw %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo)
1476
- "vpsrlw $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo)
1477
-
1478
- "vpaddw %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi)
1479
- "vpaddw %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi)
1480
- "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi)
1481
- "vpaddw %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi)
1482
- "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi)
1483
-
1484
- "vpaddw %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi)
1485
- "vpaddw %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi)
1486
- "vpaddw %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi)
1487
- "vpaddw %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi)
1488
- "vpsrlw $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi)
1489
-
1490
- "vpackuswb %%ymm0,%%ymm4,%%ymm4 \n"
1491
- "vmovdqu %%ymm4,(%1) \n" // store above
1492
- "vpackuswb %%ymm2,%%ymm5,%%ymm5 \n"
1493
- "vmovdqu %%ymm5,(%1,%4) \n" // store below
1494
-
1495
- "lea 0x10(%0),%0 \n"
1496
- "lea 0x20(%1),%1 \n" // 16 sample to 32 sample
1497
- "sub $0x20,%2 \n"
1498
- "jg 1b \n"
1499
- "vzeroupper \n"
1500
- : "+r"(src_ptr), // %0
1501
- "+r"(dst_ptr), // %1
1502
- "+r"(dst_width) // %2
1503
- : "r"((intptr_t)(src_stride)), // %3
1504
- "r"((intptr_t)(dst_stride)), // %4
1505
- "m"(kLinearMadd31) // %5
1506
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
1507
- "xmm7");
1508
- }
1509
- #endif
1510
-
1511
- #ifdef HAS_SCALEROWUP2_LINEAR_12_AVX2
1512
- void ScaleRowUp2_Linear_12_AVX2(const uint16_t* src_ptr,
1513
- uint16_t* dst_ptr,
1514
- int dst_width) {
1515
- asm volatile(
1516
- "vbroadcastf128 %3,%%ymm5 \n"
1517
- "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n"
1518
- "vpsrlw $15,%%ymm4,%%ymm4 \n"
1519
- "vpsllw $1,%%ymm4,%%ymm4 \n" // all 2
1520
-
1521
- LABELALIGN
1522
- "1: \n"
1523
- "vmovdqu (%0),%%ymm0 \n" // 0123456789ABCDEF (16b)
1524
- "vmovdqu 2(%0),%%ymm1 \n" // 123456789ABCDEF0 (16b)
1525
-
1526
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n" // 012389AB4567CDEF
1527
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n" // 12349ABC5678DEF0
1528
-
1529
- "vpunpckhwd %%ymm1,%%ymm0,%%ymm2 \n" // 899AABBCCDDEEFF0 (near)
1530
- "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" // 0112233445566778 (near)
1531
- "vpshufb %%ymm5,%%ymm2,%%ymm3 \n" // 98A9BACBDCEDFE0F (far)
1532
- "vpshufb %%ymm5,%%ymm0,%%ymm1 \n" // 1021324354657687 (far)
1533
-
1534
- "vpaddw %%ymm4,%%ymm1,%%ymm1 \n" // far+2
1535
- "vpaddw %%ymm4,%%ymm3,%%ymm3 \n" // far+2
1536
- "vpaddw %%ymm0,%%ymm1,%%ymm1 \n" // near+far+2
1537
- "vpaddw %%ymm2,%%ymm3,%%ymm3 \n" // near+far+2
1538
- "vpaddw %%ymm0,%%ymm0,%%ymm0 \n" // 2*near
1539
- "vpaddw %%ymm2,%%ymm2,%%ymm2 \n" // 2*near
1540
- "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 3*near+far+2
1541
- "vpaddw %%ymm2,%%ymm3,%%ymm2 \n" // 3*near+far+2
1542
-
1543
- "vpsrlw $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far
1544
- "vpsrlw $2,%%ymm2,%%ymm2 \n" // 3/4*near+1/4*far
1545
- "vmovdqu %%ymm0,(%1) \n"
1546
- "vmovdqu %%ymm2,32(%1) \n"
1547
-
1548
- "lea 0x20(%0),%0 \n"
1549
- "lea 0x40(%1),%1 \n" // 16 sample to 32 sample
1550
- "sub $0x20,%2 \n"
1551
- "jg 1b \n"
1552
- "vzeroupper \n"
1553
- : "+r"(src_ptr), // %0
1554
- "+r"(dst_ptr), // %1
1555
- "+r"(dst_width) // %2
1556
- : "m"(kLinearShuffleFar) // %3
1557
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
1558
- }
1559
- #endif
1560
-
1561
- #ifdef HAS_SCALEROWUP2_BILINEAR_12_AVX2
1562
- void ScaleRowUp2_Bilinear_12_AVX2(const uint16_t* src_ptr,
1563
- ptrdiff_t src_stride,
1564
- uint16_t* dst_ptr,
1565
- ptrdiff_t dst_stride,
1566
- int dst_width) {
1567
- asm volatile(
1568
- "vbroadcastf128 %5,%%ymm5 \n"
1569
- "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n"
1570
- "vpsrlw $15,%%ymm4,%%ymm4 \n"
1571
- "vpsllw $3,%%ymm4,%%ymm4 \n" // all 8
1572
-
1573
- LABELALIGN
1574
- "1: \n"
1575
-
1576
- "vmovdqu (%0),%%xmm0 \n" // 01234567 (16b)
1577
- "vmovdqu 2(%0),%%xmm1 \n" // 12345678 (16b)
1578
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n" // 0123000045670000
1579
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n" // 1234000056780000
1580
- "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" // 0112233445566778 (near)
1581
- "vpshufb %%ymm5,%%ymm0,%%ymm1 \n" // 1021324354657687 (far)
1582
- "vpaddw %%ymm0,%%ymm1,%%ymm1 \n" // near+far
1583
- "vpaddw %%ymm0,%%ymm0,%%ymm0 \n" // 2*near
1584
- "vpaddw %%ymm0,%%ymm1,%%ymm2 \n" // 3*near+far (1)
1585
-
1586
- "vmovdqu (%0,%3,2),%%xmm0 \n" // 01234567 (16b)
1587
- "vmovdqu 2(%0,%3,2),%%xmm1 \n" // 12345678 (16b)
1588
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n" // 0123000045670000
1589
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n" // 1234000056780000
1590
- "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" // 0112233445566778 (near)
1591
- "vpshufb %%ymm5,%%ymm0,%%ymm1 \n" // 1021324354657687 (far)
1592
- "vpaddw %%ymm0,%%ymm1,%%ymm1 \n" // near+far
1593
- "vpaddw %%ymm0,%%ymm0,%%ymm0 \n" // 2*near
1594
- "vpaddw %%ymm0,%%ymm1,%%ymm3 \n" // 3*near+far (2)
1595
-
1596
- "vpaddw %%ymm2,%%ymm2,%%ymm0 \n" // 6*near+2*far (1)
1597
- "vpaddw %%ymm4,%%ymm3,%%ymm1 \n" // 3*near+far+8 (2)
1598
- "vpaddw %%ymm0,%%ymm2,%%ymm0 \n" // 9*near+3*far (1)
1599
- "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9 3 3 1 + 8 (1)
1600
- "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16
1601
- "vmovdqu %%ymm0,(%1) \n" // store above
1602
-
1603
- "vpaddw %%ymm3,%%ymm3,%%ymm0 \n" // 6*near+2*far (2)
1604
- "vpaddw %%ymm4,%%ymm2,%%ymm1 \n" // 3*near+far+8 (1)
1605
- "vpaddw %%ymm0,%%ymm3,%%ymm0 \n" // 9*near+3*far (2)
1606
- "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9 3 3 1 + 8 (2)
1607
- "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16
1608
- "vmovdqu %%ymm0,(%1,%4,2) \n" // store below
1609
-
1610
- "lea 0x10(%0),%0 \n"
1611
- "lea 0x20(%1),%1 \n" // 8 sample to 16 sample
1612
- "sub $0x10,%2 \n"
1613
- "jg 1b \n"
1614
- "vzeroupper \n"
1615
- : "+r"(src_ptr), // %0
1616
- "+r"(dst_ptr), // %1
1617
- "+r"(dst_width) // %2
1618
- : "r"((intptr_t)(src_stride)), // %3
1619
- "r"((intptr_t)(dst_stride)), // %4
1620
- "m"(kLinearShuffleFar) // %5
1621
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
1622
- }
1623
- #endif
1624
-
1625
- #ifdef HAS_SCALEROWUP2_LINEAR_16_AVX2
1626
- void ScaleRowUp2_Linear_16_AVX2(const uint16_t* src_ptr,
1627
- uint16_t* dst_ptr,
1628
- int dst_width) {
1629
- asm volatile(
1630
- "vpcmpeqd %%ymm4,%%ymm4,%%ymm4 \n"
1631
- "vpsrld $31,%%ymm4,%%ymm4 \n"
1632
- "vpslld $1,%%ymm4,%%ymm4 \n" // all 2
1633
-
1634
- LABELALIGN
1635
- "1: \n"
1636
- "vmovdqu (%0),%%xmm0 \n" // 01234567 (16b, 1u1v)
1637
- "vmovdqu 2(%0),%%xmm1 \n" // 12345678 (16b, 1u1v)
1638
-
1639
- "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v)
1640
- "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v)
1641
-
1642
- "vpshufd $0b10110001,%%ymm0,%%ymm2 \n" // 10325476 (lo, far)
1643
- "vpshufd $0b10110001,%%ymm1,%%ymm3 \n" // 21436587 (hi, far)
1644
-
1645
- "vpaddd %%ymm4,%%ymm2,%%ymm2 \n" // far+2 (lo)
1646
- "vpaddd %%ymm4,%%ymm3,%%ymm3 \n" // far+2 (hi)
1647
- "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far+2 (lo)
1648
- "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far+2 (hi)
1649
- "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo)
1650
- "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi)
1651
- "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far+2 (lo)
1652
- "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far+2 (hi)
1653
-
1654
- "vpsrld $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo)
1655
- "vpsrld $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi)
1656
- "vpackusdw %%ymm1,%%ymm0,%%ymm0 \n"
1657
- "vpshufd $0b11011000,%%ymm0,%%ymm0 \n"
1658
- "vmovdqu %%ymm0,(%1) \n"
1659
-
1660
- "lea 0x10(%0),%0 \n"
1661
- "lea 0x20(%1),%1 \n" // 8 pixel to 16 pixel
1662
- "sub $0x10,%2 \n"
1663
- "jg 1b \n"
1664
- "vzeroupper \n"
1665
- : "+r"(src_ptr), // %0
1666
- "+r"(dst_ptr), // %1
1667
- "+r"(dst_width) // %2
1668
- :
1669
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4");
1670
- }
1671
- #endif
1672
-
1673
- #ifdef HAS_SCALEROWUP2_BILINEAR_16_AVX2
1674
- void ScaleRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr,
1675
- ptrdiff_t src_stride,
1676
- uint16_t* dst_ptr,
1677
- ptrdiff_t dst_stride,
1678
- int dst_width) {
1679
- asm volatile(
1680
- "vpcmpeqd %%ymm6,%%ymm6,%%ymm6 \n"
1681
- "vpsrld $31,%%ymm6,%%ymm6 \n"
1682
- "vpslld $3,%%ymm6,%%ymm6 \n" // all 8
1683
-
1684
- LABELALIGN
1685
- "1: \n"
1686
-
1687
- "vmovdqu (%0),%%xmm0 \n" // 01234567 (16b, 1u1v)
1688
- "vmovdqu 2(%0),%%xmm1 \n" // 12345678 (16b, 1u1v)
1689
- "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v)
1690
- "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v)
1691
- "vpshufd $0b10110001,%%ymm0,%%ymm2 \n" // 10325476 (lo, far)
1692
- "vpshufd $0b10110001,%%ymm1,%%ymm3 \n" // 21436587 (hi, far)
1693
- "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far (lo)
1694
- "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far (hi)
1695
- "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo)
1696
- "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi)
1697
- "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far (1, lo)
1698
- "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far (1, hi)
1699
-
1700
- "vmovdqu (%0,%3,2),%%xmm2 \n" // 01234567 (16b, 1u1v)
1701
- "vmovdqu 2(%0,%3,2),%%xmm3 \n" // 12345678 (16b, 1u1v)
1702
- "vpmovzxwd %%xmm2,%%ymm2 \n" // 01234567 (32b, 1u1v)
1703
- "vpmovzxwd %%xmm3,%%ymm3 \n" // 12345678 (32b, 1u1v)
1704
- "vpshufd $0b10110001,%%ymm2,%%ymm4 \n" // 10325476 (lo, far)
1705
- "vpshufd $0b10110001,%%ymm3,%%ymm5 \n" // 21436587 (hi, far)
1706
- "vpaddd %%ymm2,%%ymm4,%%ymm4 \n" // near+far (lo)
1707
- "vpaddd %%ymm3,%%ymm5,%%ymm5 \n" // near+far (hi)
1708
- "vpaddd %%ymm2,%%ymm2,%%ymm2 \n" // 2*near (lo)
1709
- "vpaddd %%ymm3,%%ymm3,%%ymm3 \n" // 2*near (hi)
1710
- "vpaddd %%ymm2,%%ymm4,%%ymm2 \n" // 3*near+far (2, lo)
1711
- "vpaddd %%ymm3,%%ymm5,%%ymm3 \n" // 3*near+far (2, hi)
1712
-
1713
- "vpaddd %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo)
1714
- "vpaddd %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo)
1715
- "vpaddd %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo)
1716
- "vpaddd %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo)
1717
- "vpsrld $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo)
1718
-
1719
- "vpaddd %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo)
1720
- "vpaddd %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo)
1721
- "vpaddd %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo)
1722
- "vpaddd %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo)
1723
- "vpsrld $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo)
1724
-
1725
- "vpaddd %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi)
1726
- "vpaddd %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi)
1727
- "vpaddd %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi)
1728
- "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi)
1729
- "vpsrld $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi)
1730
-
1731
- "vpaddd %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi)
1732
- "vpaddd %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi)
1733
- "vpaddd %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi)
1734
- "vpaddd %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi)
1735
- "vpsrld $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi)
1736
-
1737
- "vpackusdw %%ymm0,%%ymm4,%%ymm4 \n"
1738
- "vpshufd $0b11011000,%%ymm4,%%ymm4 \n"
1739
- "vmovdqu %%ymm4,(%1) \n" // store above
1740
- "vpackusdw %%ymm2,%%ymm5,%%ymm5 \n"
1741
- "vpshufd $0b11011000,%%ymm5,%%ymm5 \n"
1742
- "vmovdqu %%ymm5,(%1,%4,2) \n" // store below
1743
-
1744
- "lea 0x10(%0),%0 \n"
1745
- "lea 0x20(%1),%1 \n" // 8 pixel to 16 pixel
1746
- "sub $0x10,%2 \n"
1747
- "jg 1b \n"
1748
- "vzeroupper \n"
1749
- : "+r"(src_ptr), // %0
1750
- "+r"(dst_ptr), // %1
1751
- "+r"(dst_width) // %2
1752
- : "r"((intptr_t)(src_stride)), // %3
1753
- "r"((intptr_t)(dst_stride)) // %4
1754
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
1755
- }
1756
- #endif
1757
-
1758
- // Reads 16xN bytes and produces 16 shorts at a time.
1759
- void ScaleAddRow_SSE2(const uint8_t* src_ptr,
1760
- uint16_t* dst_ptr,
1761
- int src_width) {
1762
- asm volatile("pxor %%xmm5,%%xmm5 \n"
1763
-
1764
- // 16 pixel loop.
1765
- LABELALIGN
1766
- "1: \n"
1767
- "movdqu (%0),%%xmm3 \n"
1768
- "lea 0x10(%0),%0 \n" // src_ptr += 16
1769
- "movdqu (%1),%%xmm0 \n"
1770
- "movdqu 0x10(%1),%%xmm1 \n"
1771
- "movdqa %%xmm3,%%xmm2 \n"
1772
- "punpcklbw %%xmm5,%%xmm2 \n"
1773
- "punpckhbw %%xmm5,%%xmm3 \n"
1774
- "paddusw %%xmm2,%%xmm0 \n"
1775
- "paddusw %%xmm3,%%xmm1 \n"
1776
- "movdqu %%xmm0,(%1) \n"
1777
- "movdqu %%xmm1,0x10(%1) \n"
1778
- "lea 0x20(%1),%1 \n"
1779
- "sub $0x10,%2 \n"
1780
- "jg 1b \n"
1781
- : "+r"(src_ptr), // %0
1782
- "+r"(dst_ptr), // %1
1783
- "+r"(src_width) // %2
1784
- :
1785
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5");
1786
- }
1787
-
1788
- #ifdef HAS_SCALEADDROW_AVX2
1789
- // Reads 32 bytes and accumulates to 32 shorts at a time.
1790
- void ScaleAddRow_AVX2(const uint8_t* src_ptr,
1791
- uint16_t* dst_ptr,
1792
- int src_width) {
1793
- asm volatile("vpxor %%ymm5,%%ymm5,%%ymm5 \n"
1794
-
1795
- LABELALIGN
1796
- "1: \n"
1797
- "vmovdqu (%0),%%ymm3 \n"
1798
- "lea 0x20(%0),%0 \n" // src_ptr += 32
1799
- "vpermq $0xd8,%%ymm3,%%ymm3 \n"
1800
- "vpunpcklbw %%ymm5,%%ymm3,%%ymm2 \n"
1801
- "vpunpckhbw %%ymm5,%%ymm3,%%ymm3 \n"
1802
- "vpaddusw (%1),%%ymm2,%%ymm0 \n"
1803
- "vpaddusw 0x20(%1),%%ymm3,%%ymm1 \n"
1804
- "vmovdqu %%ymm0,(%1) \n"
1805
- "vmovdqu %%ymm1,0x20(%1) \n"
1806
- "lea 0x40(%1),%1 \n"
1807
- "sub $0x20,%2 \n"
1808
- "jg 1b \n"
1809
- "vzeroupper \n"
1810
- : "+r"(src_ptr), // %0
1811
- "+r"(dst_ptr), // %1
1812
- "+r"(src_width) // %2
1813
- :
1814
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5");
1815
- }
1816
- #endif // HAS_SCALEADDROW_AVX2
1817
-
1818
- // Constant for making pixels signed to avoid pmaddubsw
1819
- // saturation.
1820
- static const uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
1821
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
1822
-
1823
- // Constant for making pixels unsigned and adding .5 for rounding.
1824
- static const uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040,
1825
- 0x4040, 0x4040, 0x4040, 0x4040};
1826
-
1827
- // Bilinear column filtering. SSSE3 version.
1828
- void ScaleFilterCols_SSSE3(uint8_t* dst_ptr,
1829
- const uint8_t* src_ptr,
1830
- int dst_width,
1831
- int x,
1832
- int dx) {
1833
- intptr_t x0, x1, temp_pixel;
1834
- asm volatile(
1835
- "movd %6,%%xmm2 \n"
1836
- "movd %7,%%xmm3 \n"
1837
- "movl $0x04040000,%k2 \n"
1838
- "movd %k2,%%xmm5 \n"
1839
- "pcmpeqb %%xmm6,%%xmm6 \n"
1840
- "psrlw $0x9,%%xmm6 \n" // 0x007f007f
1841
- "pcmpeqb %%xmm7,%%xmm7 \n"
1842
- "psrlw $15,%%xmm7 \n" // 0x00010001
1843
-
1844
- "pextrw $0x1,%%xmm2,%k3 \n"
1845
- "subl $0x2,%5 \n"
1846
- "jl 29f \n"
1847
- "movdqa %%xmm2,%%xmm0 \n"
1848
- "paddd %%xmm3,%%xmm0 \n"
1849
- "punpckldq %%xmm0,%%xmm2 \n"
1850
- "punpckldq %%xmm3,%%xmm3 \n"
1851
- "paddd %%xmm3,%%xmm3 \n"
1852
- "pextrw $0x3,%%xmm2,%k4 \n"
1853
-
1854
- LABELALIGN
1855
- "2: \n"
1856
- "movdqa %%xmm2,%%xmm1 \n"
1857
- "paddd %%xmm3,%%xmm2 \n"
1858
- "movzwl 0x00(%1,%3,1),%k2 \n"
1859
- "movd %k2,%%xmm0 \n"
1860
- "psrlw $0x9,%%xmm1 \n"
1861
- "movzwl 0x00(%1,%4,1),%k2 \n"
1862
- "movd %k2,%%xmm4 \n"
1863
- "pshufb %%xmm5,%%xmm1 \n"
1864
- "punpcklwd %%xmm4,%%xmm0 \n"
1865
- "psubb %8,%%xmm0 \n" // make pixels signed.
1866
- "pxor %%xmm6,%%xmm1 \n" // 128 - f = (f ^ 127 ) +
1867
- // 1
1868
- "paddusb %%xmm7,%%xmm1 \n"
1869
- "pmaddubsw %%xmm0,%%xmm1 \n"
1870
- "pextrw $0x1,%%xmm2,%k3 \n"
1871
- "pextrw $0x3,%%xmm2,%k4 \n"
1872
- "paddw %9,%%xmm1 \n" // make pixels unsigned.
1873
- "psrlw $0x7,%%xmm1 \n"
1874
- "packuswb %%xmm1,%%xmm1 \n"
1875
- "movd %%xmm1,%k2 \n"
1876
- "mov %w2,(%0) \n"
1877
- "lea 0x2(%0),%0 \n"
1878
- "subl $0x2,%5 \n"
1879
- "jge 2b \n"
1880
-
1881
- LABELALIGN
1882
- "29: \n"
1883
- "addl $0x1,%5 \n"
1884
- "jl 99f \n"
1885
- "movzwl 0x00(%1,%3,1),%k2 \n"
1886
- "movd %k2,%%xmm0 \n"
1887
- "psrlw $0x9,%%xmm2 \n"
1888
- "pshufb %%xmm5,%%xmm2 \n"
1889
- "psubb %8,%%xmm0 \n" // make pixels signed.
1890
- "pxor %%xmm6,%%xmm2 \n"
1891
- "paddusb %%xmm7,%%xmm2 \n"
1892
- "pmaddubsw %%xmm0,%%xmm2 \n"
1893
- "paddw %9,%%xmm2 \n" // make pixels unsigned.
1894
- "psrlw $0x7,%%xmm2 \n"
1895
- "packuswb %%xmm2,%%xmm2 \n"
1896
- "movd %%xmm2,%k2 \n"
1897
- "mov %b2,(%0) \n"
1898
- "99: \n"
1899
- : "+r"(dst_ptr), // %0
1900
- "+r"(src_ptr), // %1
1901
- "=&a"(temp_pixel), // %2
1902
- "=&r"(x0), // %3
1903
- "=&r"(x1), // %4
1904
- #if defined(__x86_64__)
1905
- "+rm"(dst_width) // %5
1906
- #else
1907
- "+m"(dst_width) // %5
1908
- #endif
1909
- : "rm"(x), // %6
1910
- "rm"(dx), // %7
1911
- #if defined(__x86_64__)
1912
- "x"(kFsub80), // %8
1913
- "x"(kFadd40) // %9
1914
- #else
1915
- "m"(kFsub80), // %8
1916
- "m"(kFadd40) // %9
1917
- #endif
1918
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
1919
- "xmm7");
1920
- }
1921
-
1922
- // Reads 4 pixels, duplicates them and writes 8 pixels.
1923
- // Alignment requirement: src_argb 16 byte aligned, dst_argb 16 byte aligned.
1924
- void ScaleColsUp2_SSE2(uint8_t* dst_ptr,
1925
- const uint8_t* src_ptr,
1926
- int dst_width,
1927
- int x,
1928
- int dx) {
1929
- (void)x;
1930
- (void)dx;
1931
- asm volatile(
1932
- "1: \n"
1933
- "movdqu (%1),%%xmm0 \n"
1934
- "lea 0x10(%1),%1 \n"
1935
- "movdqa %%xmm0,%%xmm1 \n"
1936
- "punpcklbw %%xmm0,%%xmm0 \n"
1937
- "punpckhbw %%xmm1,%%xmm1 \n"
1938
- "movdqu %%xmm0,(%0) \n"
1939
- "movdqu %%xmm1,0x10(%0) \n"
1940
- "lea 0x20(%0),%0 \n"
1941
- "sub $0x20,%2 \n"
1942
- "jg 1b \n"
1943
-
1944
- : "+r"(dst_ptr), // %0
1945
- "+r"(src_ptr), // %1
1946
- "+r"(dst_width) // %2
1947
- :
1948
- : "memory", "cc", "xmm0", "xmm1");
1949
- }
1950
-
1951
- void ScaleARGBRowDown2_SSE2(const uint8_t* src_argb,
1952
- ptrdiff_t src_stride,
1953
- uint8_t* dst_argb,
1954
- int dst_width) {
1955
- (void)src_stride;
1956
- asm volatile(
1957
- "1: \n"
1958
- "movdqu (%0),%%xmm0 \n"
1959
- "movdqu 0x10(%0),%%xmm1 \n"
1960
- "lea 0x20(%0),%0 \n"
1961
- "shufps $0xdd,%%xmm1,%%xmm0 \n"
1962
- "movdqu %%xmm0,(%1) \n"
1963
- "lea 0x10(%1),%1 \n"
1964
- "sub $0x4,%2 \n"
1965
- "jg 1b \n"
1966
- : "+r"(src_argb), // %0
1967
- "+r"(dst_argb), // %1
1968
- "+r"(dst_width) // %2
1969
- :
1970
- : "memory", "cc", "xmm0", "xmm1");
1971
- }
1972
-
1973
- void ScaleARGBRowDown2Linear_SSE2(const uint8_t* src_argb,
1974
- ptrdiff_t src_stride,
1975
- uint8_t* dst_argb,
1976
- int dst_width) {
1977
- (void)src_stride;
1978
- asm volatile(
1979
- "1: \n"
1980
- "movdqu (%0),%%xmm0 \n"
1981
- "movdqu 0x10(%0),%%xmm1 \n"
1982
- "lea 0x20(%0),%0 \n"
1983
- "movdqa %%xmm0,%%xmm2 \n"
1984
- "shufps $0x88,%%xmm1,%%xmm0 \n"
1985
- "shufps $0xdd,%%xmm1,%%xmm2 \n"
1986
- "pavgb %%xmm2,%%xmm0 \n"
1987
- "movdqu %%xmm0,(%1) \n"
1988
- "lea 0x10(%1),%1 \n"
1989
- "sub $0x4,%2 \n"
1990
- "jg 1b \n"
1991
- : "+r"(src_argb), // %0
1992
- "+r"(dst_argb), // %1
1993
- "+r"(dst_width) // %2
1994
- :
1995
- : "memory", "cc", "xmm0", "xmm1");
1996
- }
1997
-
1998
- void ScaleARGBRowDown2Box_SSE2(const uint8_t* src_argb,
1999
- ptrdiff_t src_stride,
2000
- uint8_t* dst_argb,
2001
- int dst_width) {
2002
- asm volatile(
2003
- "1: \n"
2004
- "movdqu (%0),%%xmm0 \n"
2005
- "movdqu 0x10(%0),%%xmm1 \n"
2006
- "movdqu 0x00(%0,%3,1),%%xmm2 \n"
2007
- "movdqu 0x10(%0,%3,1),%%xmm3 \n"
2008
- "lea 0x20(%0),%0 \n"
2009
- "pavgb %%xmm2,%%xmm0 \n"
2010
- "pavgb %%xmm3,%%xmm1 \n"
2011
- "movdqa %%xmm0,%%xmm2 \n"
2012
- "shufps $0x88,%%xmm1,%%xmm0 \n"
2013
- "shufps $0xdd,%%xmm1,%%xmm2 \n"
2014
- "pavgb %%xmm2,%%xmm0 \n"
2015
- "movdqu %%xmm0,(%1) \n"
2016
- "lea 0x10(%1),%1 \n"
2017
- "sub $0x4,%2 \n"
2018
- "jg 1b \n"
2019
- : "+r"(src_argb), // %0
2020
- "+r"(dst_argb), // %1
2021
- "+r"(dst_width) // %2
2022
- : "r"((intptr_t)(src_stride)) // %3
2023
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3");
2024
- }
2025
-
2026
- // Reads 4 pixels at a time.
2027
- // Alignment requirement: dst_argb 16 byte aligned.
2028
- void ScaleARGBRowDownEven_SSE2(const uint8_t* src_argb,
2029
- ptrdiff_t src_stride,
2030
- int src_stepx,
2031
- uint8_t* dst_argb,
2032
- int dst_width) {
2033
- intptr_t src_stepx_x4 = (intptr_t)(src_stepx);
2034
- intptr_t src_stepx_x12;
2035
- (void)src_stride;
2036
- asm volatile(
2037
- "lea 0x00(,%1,4),%1 \n"
2038
- "lea 0x00(%1,%1,2),%4 \n"
2039
-
2040
- LABELALIGN
2041
- "1: \n"
2042
- "movd (%0),%%xmm0 \n"
2043
- "movd 0x00(%0,%1,1),%%xmm1 \n"
2044
- "punpckldq %%xmm1,%%xmm0 \n"
2045
- "movd 0x00(%0,%1,2),%%xmm2 \n"
2046
- "movd 0x00(%0,%4,1),%%xmm3 \n"
2047
- "lea 0x00(%0,%1,4),%0 \n"
2048
- "punpckldq %%xmm3,%%xmm2 \n"
2049
- "punpcklqdq %%xmm2,%%xmm0 \n"
2050
- "movdqu %%xmm0,(%2) \n"
2051
- "lea 0x10(%2),%2 \n"
2052
- "sub $0x4,%3 \n"
2053
- "jg 1b \n"
2054
- : "+r"(src_argb), // %0
2055
- "+r"(src_stepx_x4), // %1
2056
- "+r"(dst_argb), // %2
2057
- "+r"(dst_width), // %3
2058
- "=&r"(src_stepx_x12) // %4
2059
- :
2060
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3");
2061
- }
2062
-
2063
- // Blends four 2x2 to 4x1.
2064
- // Alignment requirement: dst_argb 16 byte aligned.
2065
- void ScaleARGBRowDownEvenBox_SSE2(const uint8_t* src_argb,
2066
- ptrdiff_t src_stride,
2067
- int src_stepx,
2068
- uint8_t* dst_argb,
2069
- int dst_width) {
2070
- intptr_t src_stepx_x4 = (intptr_t)(src_stepx);
2071
- intptr_t src_stepx_x12;
2072
- intptr_t row1 = (intptr_t)(src_stride);
2073
- asm volatile(
2074
- "lea 0x00(,%1,4),%1 \n"
2075
- "lea 0x00(%1,%1,2),%4 \n"
2076
- "lea 0x00(%0,%5,1),%5 \n"
2077
-
2078
- LABELALIGN
2079
- "1: \n"
2080
- "movq (%0),%%xmm0 \n"
2081
- "movhps 0x00(%0,%1,1),%%xmm0 \n"
2082
- "movq 0x00(%0,%1,2),%%xmm1 \n"
2083
- "movhps 0x00(%0,%4,1),%%xmm1 \n"
2084
- "lea 0x00(%0,%1,4),%0 \n"
2085
- "movq (%5),%%xmm2 \n"
2086
- "movhps 0x00(%5,%1,1),%%xmm2 \n"
2087
- "movq 0x00(%5,%1,2),%%xmm3 \n"
2088
- "movhps 0x00(%5,%4,1),%%xmm3 \n"
2089
- "lea 0x00(%5,%1,4),%5 \n"
2090
- "pavgb %%xmm2,%%xmm0 \n"
2091
- "pavgb %%xmm3,%%xmm1 \n"
2092
- "movdqa %%xmm0,%%xmm2 \n"
2093
- "shufps $0x88,%%xmm1,%%xmm0 \n"
2094
- "shufps $0xdd,%%xmm1,%%xmm2 \n"
2095
- "pavgb %%xmm2,%%xmm0 \n"
2096
- "movdqu %%xmm0,(%2) \n"
2097
- "lea 0x10(%2),%2 \n"
2098
- "sub $0x4,%3 \n"
2099
- "jg 1b \n"
2100
- : "+r"(src_argb), // %0
2101
- "+r"(src_stepx_x4), // %1
2102
- "+r"(dst_argb), // %2
2103
- "+rm"(dst_width), // %3
2104
- "=&r"(src_stepx_x12), // %4
2105
- "+r"(row1) // %5
2106
- :
2107
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3");
2108
- }
2109
-
2110
- void ScaleARGBCols_SSE2(uint8_t* dst_argb,
2111
- const uint8_t* src_argb,
2112
- int dst_width,
2113
- int x,
2114
- int dx) {
2115
- intptr_t x0, x1;
2116
- asm volatile(
2117
- "movd %5,%%xmm2 \n"
2118
- "movd %6,%%xmm3 \n"
2119
- "pshufd $0x0,%%xmm2,%%xmm2 \n"
2120
- "pshufd $0x11,%%xmm3,%%xmm0 \n"
2121
- "paddd %%xmm0,%%xmm2 \n"
2122
- "paddd %%xmm3,%%xmm3 \n"
2123
- "pshufd $0x5,%%xmm3,%%xmm0 \n"
2124
- "paddd %%xmm0,%%xmm2 \n"
2125
- "paddd %%xmm3,%%xmm3 \n"
2126
- "pshufd $0x0,%%xmm3,%%xmm3 \n"
2127
- "pextrw $0x1,%%xmm2,%k0 \n"
2128
- "pextrw $0x3,%%xmm2,%k1 \n"
2129
- "cmp $0x0,%4 \n"
2130
- "jl 99f \n"
2131
- "sub $0x4,%4 \n"
2132
- "jl 49f \n"
2133
-
2134
- LABELALIGN
2135
- "40: \n"
2136
- "movd 0x00(%3,%0,4),%%xmm0 \n"
2137
- "movd 0x00(%3,%1,4),%%xmm1 \n"
2138
- "pextrw $0x5,%%xmm2,%k0 \n"
2139
- "pextrw $0x7,%%xmm2,%k1 \n"
2140
- "paddd %%xmm3,%%xmm2 \n"
2141
- "punpckldq %%xmm1,%%xmm0 \n"
2142
- "movd 0x00(%3,%0,4),%%xmm1 \n"
2143
- "movd 0x00(%3,%1,4),%%xmm4 \n"
2144
- "pextrw $0x1,%%xmm2,%k0 \n"
2145
- "pextrw $0x3,%%xmm2,%k1 \n"
2146
- "punpckldq %%xmm4,%%xmm1 \n"
2147
- "punpcklqdq %%xmm1,%%xmm0 \n"
2148
- "movdqu %%xmm0,(%2) \n"
2149
- "lea 0x10(%2),%2 \n"
2150
- "sub $0x4,%4 \n"
2151
- "jge 40b \n"
2152
-
2153
- "49: \n"
2154
- "test $0x2,%4 \n"
2155
- "je 29f \n"
2156
- "movd 0x00(%3,%0,4),%%xmm0 \n"
2157
- "movd 0x00(%3,%1,4),%%xmm1 \n"
2158
- "pextrw $0x5,%%xmm2,%k0 \n"
2159
- "punpckldq %%xmm1,%%xmm0 \n"
2160
- "movq %%xmm0,(%2) \n"
2161
- "lea 0x8(%2),%2 \n"
2162
- "29: \n"
2163
- "test $0x1,%4 \n"
2164
- "je 99f \n"
2165
- "movd 0x00(%3,%0,4),%%xmm0 \n"
2166
- "movd %%xmm0,(%2) \n"
2167
- "99: \n"
2168
- : "=&a"(x0), // %0
2169
- "=&d"(x1), // %1
2170
- "+r"(dst_argb), // %2
2171
- "+r"(src_argb), // %3
2172
- "+r"(dst_width) // %4
2173
- : "rm"(x), // %5
2174
- "rm"(dx) // %6
2175
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4");
2176
- }
2177
-
2178
- // Reads 4 pixels, duplicates them and writes 8 pixels.
2179
- // Alignment requirement: src_argb 16 byte aligned, dst_argb 16 byte aligned.
2180
- void ScaleARGBColsUp2_SSE2(uint8_t* dst_argb,
2181
- const uint8_t* src_argb,
2182
- int dst_width,
2183
- int x,
2184
- int dx) {
2185
- (void)x;
2186
- (void)dx;
2187
- asm volatile(
2188
- "1: \n"
2189
- "movdqu (%1),%%xmm0 \n"
2190
- "lea 0x10(%1),%1 \n"
2191
- "movdqa %%xmm0,%%xmm1 \n"
2192
- "punpckldq %%xmm0,%%xmm0 \n"
2193
- "punpckhdq %%xmm1,%%xmm1 \n"
2194
- "movdqu %%xmm0,(%0) \n"
2195
- "movdqu %%xmm1,0x10(%0) \n"
2196
- "lea 0x20(%0),%0 \n"
2197
- "sub $0x8,%2 \n"
2198
- "jg 1b \n"
2199
-
2200
- : "+r"(dst_argb), // %0
2201
- "+r"(src_argb), // %1
2202
- "+r"(dst_width) // %2
2203
- :
2204
- : "memory", "cc", "xmm0", "xmm1");
2205
- }
2206
-
2207
- // Shuffle table for arranging 2 pixels into pairs for pmaddubsw
2208
- static const uvec8 kShuffleColARGB = {
2209
- 0u, 4u, 1u, 5u, 2u, 6u, 3u, 7u, // bbggrraa 1st pixel
2210
- 8u, 12u, 9u, 13u, 10u, 14u, 11u, 15u // bbggrraa 2nd pixel
2211
- };
2212
-
2213
- // Shuffle table for duplicating 2 fractions into 8 bytes each
2214
- static const uvec8 kShuffleFractions = {
2215
- 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
2216
- };
2217
-
2218
- // Bilinear row filtering combines 4x2 -> 4x1. SSSE3 version
2219
- void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb,
2220
- const uint8_t* src_argb,
2221
- int dst_width,
2222
- int x,
2223
- int dx) {
2224
- intptr_t x0, x1;
2225
- asm volatile(
2226
- "movdqa %0,%%xmm4 \n"
2227
- "movdqa %1,%%xmm5 \n"
2228
- :
2229
- : "m"(kShuffleColARGB), // %0
2230
- "m"(kShuffleFractions) // %1
2231
- );
2232
-
2233
- asm volatile(
2234
- "movd %5,%%xmm2 \n"
2235
- "movd %6,%%xmm3 \n"
2236
- "pcmpeqb %%xmm6,%%xmm6 \n"
2237
- "psrlw $0x9,%%xmm6 \n"
2238
- "pextrw $0x1,%%xmm2,%k3 \n"
2239
- "sub $0x2,%2 \n"
2240
- "jl 29f \n"
2241
- "movdqa %%xmm2,%%xmm0 \n"
2242
- "paddd %%xmm3,%%xmm0 \n"
2243
- "punpckldq %%xmm0,%%xmm2 \n"
2244
- "punpckldq %%xmm3,%%xmm3 \n"
2245
- "paddd %%xmm3,%%xmm3 \n"
2246
- "pextrw $0x3,%%xmm2,%k4 \n"
2247
-
2248
- LABELALIGN
2249
- "2: \n"
2250
- "movdqa %%xmm2,%%xmm1 \n"
2251
- "paddd %%xmm3,%%xmm2 \n"
2252
- "movq 0x00(%1,%3,4),%%xmm0 \n"
2253
- "psrlw $0x9,%%xmm1 \n"
2254
- "movhps 0x00(%1,%4,4),%%xmm0 \n"
2255
- "pshufb %%xmm5,%%xmm1 \n"
2256
- "pshufb %%xmm4,%%xmm0 \n"
2257
- "pxor %%xmm6,%%xmm1 \n"
2258
- "pmaddubsw %%xmm1,%%xmm0 \n"
2259
- "psrlw $0x7,%%xmm0 \n"
2260
- "pextrw $0x1,%%xmm2,%k3 \n"
2261
- "pextrw $0x3,%%xmm2,%k4 \n"
2262
- "packuswb %%xmm0,%%xmm0 \n"
2263
- "movq %%xmm0,(%0) \n"
2264
- "lea 0x8(%0),%0 \n"
2265
- "sub $0x2,%2 \n"
2266
- "jge 2b \n"
2267
-
2268
- LABELALIGN
2269
- "29: \n"
2270
- "add $0x1,%2 \n"
2271
- "jl 99f \n"
2272
- "psrlw $0x9,%%xmm2 \n"
2273
- "movq 0x00(%1,%3,4),%%xmm0 \n"
2274
- "pshufb %%xmm5,%%xmm2 \n"
2275
- "pshufb %%xmm4,%%xmm0 \n"
2276
- "pxor %%xmm6,%%xmm2 \n"
2277
- "pmaddubsw %%xmm2,%%xmm0 \n"
2278
- "psrlw $0x7,%%xmm0 \n"
2279
- "packuswb %%xmm0,%%xmm0 \n"
2280
- "movd %%xmm0,(%0) \n"
2281
-
2282
- LABELALIGN "99: \n"
2283
-
2284
- : "+r"(dst_argb), // %0
2285
- "+r"(src_argb), // %1
2286
- "+rm"(dst_width), // %2
2287
- "=&r"(x0), // %3
2288
- "=&r"(x1) // %4
2289
- : "rm"(x), // %5
2290
- "rm"(dx) // %6
2291
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
2292
- }
2293
-
2294
- // Divide num by div and return as 16.16 fixed point result.
2295
- int FixedDiv_X86(int num, int div) {
2296
- asm volatile(
2297
- "cdq \n"
2298
- "shld $0x10,%%eax,%%edx \n"
2299
- "shl $0x10,%%eax \n"
2300
- "idiv %1 \n"
2301
- "mov %0, %%eax \n"
2302
- : "+a"(num) // %0
2303
- : "c"(div) // %1
2304
- : "memory", "cc", "edx");
2305
- return num;
2306
- }
2307
-
2308
- // Divide num - 1 by div - 1 and return as 16.16 fixed point result.
2309
- int FixedDiv1_X86(int num, int div) {
2310
- asm volatile(
2311
- "cdq \n"
2312
- "shld $0x10,%%eax,%%edx \n"
2313
- "shl $0x10,%%eax \n"
2314
- "sub $0x10001,%%eax \n"
2315
- "sbb $0x0,%%edx \n"
2316
- "sub $0x1,%1 \n"
2317
- "idiv %1 \n"
2318
- "mov %0, %%eax \n"
2319
- : "+a"(num) // %0
2320
- : "c"(div) // %1
2321
- : "memory", "cc", "edx");
2322
- return num;
2323
- }
2324
-
2325
- #if defined(HAS_SCALEUVROWDOWN2BOX_SSSE3) || \
2326
- defined(HAS_SCALEUVROWDOWN2BOX_AVX2)
2327
-
2328
- // Shuffle table for splitting UV into upper and lower part of register.
2329
- static const uvec8 kShuffleSplitUV = {0u, 2u, 4u, 6u, 8u, 10u, 12u, 14u,
2330
- 1u, 3u, 5u, 7u, 9u, 11u, 13u, 15u};
2331
- static const uvec8 kShuffleMergeUV = {0u, 8u, 2u, 10u, 4u, 12u,
2332
- 6u, 14u, 0x80, 0x80, 0x80, 0x80,
2333
- 0x80, 0x80, 0x80, 0x80};
2334
- #endif
2335
-
2336
- #ifdef HAS_SCALEUVROWDOWN2BOX_SSSE3
2337
-
2338
- void ScaleUVRowDown2Box_SSSE3(const uint8_t* src_ptr,
2339
- ptrdiff_t src_stride,
2340
- uint8_t* dst_ptr,
2341
- int dst_width) {
2342
- asm volatile(
2343
- "pcmpeqb %%xmm4,%%xmm4 \n" // 01010101
2344
- "psrlw $0xf,%%xmm4 \n"
2345
- "packuswb %%xmm4,%%xmm4 \n"
2346
- "pxor %%xmm5, %%xmm5 \n" // zero
2347
- "movdqa %4,%%xmm1 \n" // split shuffler
2348
- "movdqa %5,%%xmm3 \n" // merge shuffler
2349
-
2350
- LABELALIGN
2351
- "1: \n"
2352
- "movdqu (%0),%%xmm0 \n" // 8 UV row 0
2353
- "movdqu 0x00(%0,%3,1),%%xmm2 \n" // 8 UV row 1
2354
- "lea 0x10(%0),%0 \n"
2355
- "pshufb %%xmm1,%%xmm0 \n" // uuuuvvvv
2356
- "pshufb %%xmm1,%%xmm2 \n"
2357
- "pmaddubsw %%xmm4,%%xmm0 \n" // horizontal add
2358
- "pmaddubsw %%xmm4,%%xmm2 \n"
2359
- "paddw %%xmm2,%%xmm0 \n" // vertical add
2360
- "psrlw $0x1,%%xmm0 \n" // round
2361
- "pavgw %%xmm5,%%xmm0 \n"
2362
- "pshufb %%xmm3,%%xmm0 \n" // merge uv
2363
- "movq %%xmm0,(%1) \n"
2364
- "lea 0x8(%1),%1 \n" // 4 UV
2365
- "sub $0x4,%2 \n"
2366
- "jg 1b \n"
2367
- : "+r"(src_ptr), // %0
2368
- "+r"(dst_ptr), // %1
2369
- "+r"(dst_width) // %2
2370
- : "r"((intptr_t)(src_stride)), // %3
2371
- "m"(kShuffleSplitUV), // %4
2372
- "m"(kShuffleMergeUV) // %5
2373
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
2374
- }
2375
- #endif // HAS_SCALEUVROWDOWN2BOX_SSSE3
2376
-
2377
- #ifdef HAS_SCALEUVROWDOWN2BOX_AVX2
2378
- void ScaleUVRowDown2Box_AVX2(const uint8_t* src_ptr,
2379
- ptrdiff_t src_stride,
2380
- uint8_t* dst_ptr,
2381
- int dst_width) {
2382
- asm volatile(
2383
- "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" // 01010101
2384
- "vpabsb %%ymm4,%%ymm4 \n"
2385
- "vpxor %%ymm5,%%ymm5,%%ymm5 \n" // zero
2386
- "vbroadcastf128 %4,%%ymm1 \n" // split shuffler
2387
- "vbroadcastf128 %5,%%ymm3 \n" // merge shuffler
2388
-
2389
- LABELALIGN
2390
- "1: \n"
2391
- "vmovdqu (%0),%%ymm0 \n" // 16 UV row 0
2392
- "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" // 16 UV row 1
2393
- "lea 0x20(%0),%0 \n"
2394
- "vpshufb %%ymm1,%%ymm0,%%ymm0 \n" // uuuuvvvv
2395
- "vpshufb %%ymm1,%%ymm2,%%ymm2 \n"
2396
- "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" // horizontal add
2397
- "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n"
2398
- "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" // vertical add
2399
- "vpsrlw $0x1,%%ymm0,%%ymm0 \n" // round
2400
- "vpavgw %%ymm5,%%ymm0,%%ymm0 \n"
2401
- "vpshufb %%ymm3,%%ymm0,%%ymm0 \n" // merge uv
2402
- "vpermq $0xd8,%%ymm0,%%ymm0 \n" // combine qwords
2403
- "vmovdqu %%xmm0,(%1) \n"
2404
- "lea 0x10(%1),%1 \n" // 8 UV
2405
- "sub $0x8,%2 \n"
2406
- "jg 1b \n"
2407
- "vzeroupper \n"
2408
- : "+r"(src_ptr), // %0
2409
- "+r"(dst_ptr), // %1
2410
- "+r"(dst_width) // %2
2411
- : "r"((intptr_t)(src_stride)), // %3
2412
- "m"(kShuffleSplitUV), // %4
2413
- "m"(kShuffleMergeUV) // %5
2414
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
2415
- }
2416
- #endif // HAS_SCALEUVROWDOWN2BOX_AVX2
2417
-
2418
- static const uvec8 kUVLinearMadd31 = {3, 1, 3, 1, 1, 3, 1, 3,
2419
- 3, 1, 3, 1, 1, 3, 1, 3};
2420
-
2421
- #ifdef HAS_SCALEUVROWUP2_LINEAR_SSSE3
2422
- void ScaleUVRowUp2_Linear_SSSE3(const uint8_t* src_ptr,
2423
- uint8_t* dst_ptr,
2424
- int dst_width) {
2425
- asm volatile(
2426
- "pcmpeqw %%xmm4,%%xmm4 \n"
2427
- "psrlw $15,%%xmm4 \n"
2428
- "psllw $1,%%xmm4 \n" // all 2
2429
- "movdqa %3,%%xmm3 \n"
2430
-
2431
- LABELALIGN
2432
- "1: \n"
2433
- "movq (%0),%%xmm0 \n" // 00112233 (1u1v)
2434
- "movq 2(%0),%%xmm1 \n" // 11223344 (1u1v)
2435
- "punpcklbw %%xmm1,%%xmm0 \n" // 0101121223233434 (2u2v)
2436
- "movdqa %%xmm0,%%xmm2 \n"
2437
- "punpckhdq %%xmm0,%%xmm2 \n" // 2323232334343434 (2u2v)
2438
- "punpckldq %%xmm0,%%xmm0 \n" // 0101010112121212 (2u2v)
2439
- "pmaddubsw %%xmm3,%%xmm2 \n" // 3*near+far (1u1v16, hi)
2440
- "pmaddubsw %%xmm3,%%xmm0 \n" // 3*near+far (1u1v16, lo)
2441
- "paddw %%xmm4,%%xmm0 \n" // 3*near+far+2 (lo)
2442
- "paddw %%xmm4,%%xmm2 \n" // 3*near+far+2 (hi)
2443
- "psrlw $2,%%xmm0 \n" // 3/4*near+1/4*far (lo)
2444
- "psrlw $2,%%xmm2 \n" // 3/4*near+1/4*far (hi)
2445
- "packuswb %%xmm2,%%xmm0 \n"
2446
- "movdqu %%xmm0,(%1) \n"
2447
-
2448
- "lea 0x8(%0),%0 \n"
2449
- "lea 0x10(%1),%1 \n" // 4 uv to 8 uv
2450
- "sub $0x8,%2 \n"
2451
- "jg 1b \n"
2452
- : "+r"(src_ptr), // %0
2453
- "+r"(dst_ptr), // %1
2454
- "+r"(dst_width) // %2
2455
- : "m"(kUVLinearMadd31) // %3
2456
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
2457
- }
2458
- #endif
2459
-
2460
- #ifdef HAS_SCALEUVROWUP2_BILINEAR_SSSE3
2461
- void ScaleUVRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr,
2462
- ptrdiff_t src_stride,
2463
- uint8_t* dst_ptr,
2464
- ptrdiff_t dst_stride,
2465
- int dst_width) {
2466
- asm volatile(
2467
- "pcmpeqw %%xmm6,%%xmm6 \n"
2468
- "psrlw $15,%%xmm6 \n"
2469
- "psllw $3,%%xmm6 \n" // all 8
2470
- "movdqa %5,%%xmm7 \n"
2471
-
2472
- LABELALIGN
2473
- "1: \n"
2474
- "movq (%0),%%xmm0 \n" // 00112233 (1u1v)
2475
- "movq 2(%0),%%xmm1 \n" // 11223344 (1u1v)
2476
- "punpcklbw %%xmm1,%%xmm0 \n" // 0101121223233434 (2u2v)
2477
- "movdqa %%xmm0,%%xmm2 \n"
2478
- "punpckhdq %%xmm0,%%xmm2 \n" // 2323232334343434 (2u2v)
2479
- "punpckldq %%xmm0,%%xmm0 \n" // 0101010112121212 (2u2v)
2480
- "pmaddubsw %%xmm7,%%xmm2 \n" // 3*near+far (1u1v16, hi)
2481
- "pmaddubsw %%xmm7,%%xmm0 \n" // 3*near+far (1u1v16, lo)
2482
-
2483
- "movq (%0,%3),%%xmm1 \n"
2484
- "movq 2(%0,%3),%%xmm4 \n"
2485
- "punpcklbw %%xmm4,%%xmm1 \n"
2486
- "movdqa %%xmm1,%%xmm3 \n"
2487
- "punpckhdq %%xmm1,%%xmm3 \n"
2488
- "punpckldq %%xmm1,%%xmm1 \n"
2489
- "pmaddubsw %%xmm7,%%xmm3 \n" // 3*near+far (2, hi)
2490
- "pmaddubsw %%xmm7,%%xmm1 \n" // 3*near+far (2, lo)
2491
-
2492
- // xmm0 xmm2
2493
- // xmm1 xmm3
2494
-
2495
- "movdqa %%xmm0,%%xmm4 \n"
2496
- "movdqa %%xmm1,%%xmm5 \n"
2497
- "paddw %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo)
2498
- "paddw %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo)
2499
- "paddw %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo)
2500
- "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo)
2501
- "psrlw $4,%%xmm4 \n" // ^ div by 16 (1, lo)
2502
-
2503
- "movdqa %%xmm1,%%xmm5 \n"
2504
- "paddw %%xmm1,%%xmm5 \n" // 6*near+2*far (2, lo)
2505
- "paddw %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo)
2506
- "paddw %%xmm1,%%xmm5 \n" // 9*near+3*far (2, lo)
2507
- "paddw %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo)
2508
- "psrlw $4,%%xmm5 \n" // ^ div by 16 (2, lo)
2509
-
2510
- "movdqa %%xmm2,%%xmm0 \n"
2511
- "movdqa %%xmm3,%%xmm1 \n"
2512
- "paddw %%xmm2,%%xmm0 \n" // 6*near+2*far (1, hi)
2513
- "paddw %%xmm6,%%xmm1 \n" // 3*near+far+8 (2, hi)
2514
- "paddw %%xmm2,%%xmm0 \n" // 9*near+3*far (1, hi)
2515
- "paddw %%xmm1,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi)
2516
- "psrlw $4,%%xmm0 \n" // ^ div by 16 (1, hi)
2517
-
2518
- "movdqa %%xmm3,%%xmm1 \n"
2519
- "paddw %%xmm3,%%xmm1 \n" // 6*near+2*far (2, hi)
2520
- "paddw %%xmm6,%%xmm2 \n" // 3*near+far+8 (1, hi)
2521
- "paddw %%xmm3,%%xmm1 \n" // 9*near+3*far (2, hi)
2522
- "paddw %%xmm2,%%xmm1 \n" // 9 3 3 1 + 8 (2, hi)
2523
- "psrlw $4,%%xmm1 \n" // ^ div by 16 (2, hi)
2524
-
2525
- "packuswb %%xmm0,%%xmm4 \n"
2526
- "movdqu %%xmm4,(%1) \n" // store above
2527
- "packuswb %%xmm1,%%xmm5 \n"
2528
- "movdqu %%xmm5,(%1,%4) \n" // store below
2529
-
2530
- "lea 0x8(%0),%0 \n"
2531
- "lea 0x10(%1),%1 \n" // 4 uv to 8 uv
2532
- "sub $0x8,%2 \n"
2533
- "jg 1b \n"
2534
- : "+r"(src_ptr), // %0
2535
- "+r"(dst_ptr), // %1
2536
- "+r"(dst_width) // %2
2537
- : "r"((intptr_t)(src_stride)), // %3
2538
- "r"((intptr_t)(dst_stride)), // %4
2539
- "m"(kUVLinearMadd31) // %5
2540
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
2541
- "xmm7");
2542
- }
2543
- #endif
2544
-
2545
- #ifdef HAS_SCALEUVROWUP2_LINEAR_AVX2
2546
-
2547
- void ScaleUVRowUp2_Linear_AVX2(const uint8_t* src_ptr,
2548
- uint8_t* dst_ptr,
2549
- int dst_width) {
2550
- asm volatile(
2551
- "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n"
2552
- "vpsrlw $15,%%ymm4,%%ymm4 \n"
2553
- "vpsllw $1,%%ymm4,%%ymm4 \n" // all 2
2554
- "vbroadcastf128 %3,%%ymm3 \n"
2555
-
2556
- LABELALIGN
2557
- "1: \n"
2558
- "vmovdqu (%0),%%xmm0 \n"
2559
- "vmovdqu 2(%0),%%xmm1 \n"
2560
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n"
2561
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n"
2562
- "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n"
2563
- "vpunpckhdq %%ymm0,%%ymm0,%%ymm2 \n"
2564
- "vpunpckldq %%ymm0,%%ymm0,%%ymm0 \n"
2565
- "vpmaddubsw %%ymm3,%%ymm2,%%ymm1 \n" // 3*near+far (hi)
2566
- "vpmaddubsw %%ymm3,%%ymm0,%%ymm0 \n" // 3*near+far (lo)
2567
- "vpaddw %%ymm4,%%ymm0,%%ymm0 \n" // 3*near+far+2 (lo)
2568
- "vpaddw %%ymm4,%%ymm1,%%ymm1 \n" // 3*near+far+2 (hi)
2569
- "vpsrlw $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo)
2570
- "vpsrlw $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi)
2571
- "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n"
2572
- "vmovdqu %%ymm0,(%1) \n"
2573
-
2574
- "lea 0x10(%0),%0 \n"
2575
- "lea 0x20(%1),%1 \n" // 8 uv to 16 uv
2576
- "sub $0x10,%2 \n"
2577
- "jg 1b \n"
2578
- "vzeroupper \n"
2579
- : "+r"(src_ptr), // %0
2580
- "+r"(dst_ptr), // %1
2581
- "+r"(dst_width) // %2
2582
- : "m"(kUVLinearMadd31) // %3
2583
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4");
2584
- }
2585
- #endif
2586
-
2587
- #ifdef HAS_SCALEUVROWUP2_BILINEAR_AVX2
2588
- void ScaleUVRowUp2_Bilinear_AVX2(const uint8_t* src_ptr,
2589
- ptrdiff_t src_stride,
2590
- uint8_t* dst_ptr,
2591
- ptrdiff_t dst_stride,
2592
- int dst_width) {
2593
- asm volatile(
2594
- "vpcmpeqw %%ymm6,%%ymm6,%%ymm6 \n"
2595
- "vpsrlw $15,%%ymm6,%%ymm6 \n"
2596
- "vpsllw $3,%%ymm6,%%ymm6 \n" // all 8
2597
- "vbroadcastf128 %5,%%ymm7 \n"
2598
-
2599
- LABELALIGN
2600
- "1: \n"
2601
- "vmovdqu (%0),%%xmm0 \n"
2602
- "vmovdqu 2(%0),%%xmm1 \n"
2603
- "vpermq $0b11011000,%%ymm0,%%ymm0 \n"
2604
- "vpermq $0b11011000,%%ymm1,%%ymm1 \n"
2605
- "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n"
2606
- "vpunpckhdq %%ymm0,%%ymm0,%%ymm2 \n"
2607
- "vpunpckldq %%ymm0,%%ymm0,%%ymm0 \n"
2608
- "vpmaddubsw %%ymm7,%%ymm2,%%ymm1 \n" // 3*near+far (1, hi)
2609
- "vpmaddubsw %%ymm7,%%ymm0,%%ymm0 \n" // 3*near+far (1, lo)
2610
-
2611
- "vmovdqu (%0,%3),%%xmm2 \n" // 0123456789ABCDEF
2612
- "vmovdqu 2(%0,%3),%%xmm3 \n" // 123456789ABCDEF0
2613
- "vpermq $0b11011000,%%ymm2,%%ymm2 \n"
2614
- "vpermq $0b11011000,%%ymm3,%%ymm3 \n"
2615
- "vpunpcklbw %%ymm3,%%ymm2,%%ymm2 \n"
2616
- "vpunpckhdq %%ymm2,%%ymm2,%%ymm4 \n"
2617
- "vpunpckldq %%ymm2,%%ymm2,%%ymm2 \n"
2618
- "vpmaddubsw %%ymm7,%%ymm4,%%ymm3 \n" // 3*near+far (2, hi)
2619
- "vpmaddubsw %%ymm7,%%ymm2,%%ymm2 \n" // 3*near+far (2, lo)
2620
-
2621
- // ymm0 ymm1
2622
- // ymm2 ymm3
2623
-
2624
- "vpaddw %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo)
2625
- "vpaddw %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo)
2626
- "vpaddw %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo)
2627
- "vpaddw %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo)
2628
- "vpsrlw $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo)
2629
-
2630
- "vpaddw %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo)
2631
- "vpaddw %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo)
2632
- "vpaddw %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo)
2633
- "vpaddw %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo)
2634
- "vpsrlw $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo)
2635
-
2636
- "vpaddw %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi)
2637
- "vpaddw %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi)
2638
- "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi)
2639
- "vpaddw %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi)
2640
- "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi)
2641
-
2642
- "vpaddw %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi)
2643
- "vpaddw %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi)
2644
- "vpaddw %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi)
2645
- "vpaddw %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi)
2646
- "vpsrlw $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi)
2647
-
2648
- "vpackuswb %%ymm0,%%ymm4,%%ymm4 \n"
2649
- "vmovdqu %%ymm4,(%1) \n" // store above
2650
- "vpackuswb %%ymm2,%%ymm5,%%ymm5 \n"
2651
- "vmovdqu %%ymm5,(%1,%4) \n" // store below
2652
-
2653
- "lea 0x10(%0),%0 \n"
2654
- "lea 0x20(%1),%1 \n" // 8 uv to 16 uv
2655
- "sub $0x10,%2 \n"
2656
- "jg 1b \n"
2657
- "vzeroupper \n"
2658
- : "+r"(src_ptr), // %0
2659
- "+r"(dst_ptr), // %1
2660
- "+r"(dst_width) // %2
2661
- : "r"((intptr_t)(src_stride)), // %3
2662
- "r"((intptr_t)(dst_stride)), // %4
2663
- "m"(kUVLinearMadd31) // %5
2664
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
2665
- "xmm7");
2666
- }
2667
- #endif
2668
-
2669
- #ifdef HAS_SCALEUVROWUP2_LINEAR_16_SSE41
2670
- void ScaleUVRowUp2_Linear_16_SSE41(const uint16_t* src_ptr,
2671
- uint16_t* dst_ptr,
2672
- int dst_width) {
2673
- asm volatile(
2674
- "pxor %%xmm5,%%xmm5 \n"
2675
- "pcmpeqd %%xmm4,%%xmm4 \n"
2676
- "psrld $31,%%xmm4 \n"
2677
- "pslld $1,%%xmm4 \n" // all 2
2678
-
2679
- LABELALIGN
2680
- "1: \n"
2681
- "movq (%0),%%xmm0 \n" // 0011 (16b, 1u1v)
2682
- "movq 4(%0),%%xmm1 \n" // 1122 (16b, 1u1v)
2683
-
2684
- "punpcklwd %%xmm5,%%xmm0 \n" // 0011 (32b, 1u1v)
2685
- "punpcklwd %%xmm5,%%xmm1 \n" // 1122 (32b, 1u1v)
2686
-
2687
- "movdqa %%xmm0,%%xmm2 \n"
2688
- "movdqa %%xmm1,%%xmm3 \n"
2689
-
2690
- "pshufd $0b01001110,%%xmm2,%%xmm2 \n" // 1100 (lo, far)
2691
- "pshufd $0b01001110,%%xmm3,%%xmm3 \n" // 2211 (hi, far)
2692
-
2693
- "paddd %%xmm4,%%xmm2 \n" // far+2 (lo)
2694
- "paddd %%xmm4,%%xmm3 \n" // far+2 (hi)
2695
- "paddd %%xmm0,%%xmm2 \n" // near+far+2 (lo)
2696
- "paddd %%xmm1,%%xmm3 \n" // near+far+2 (hi)
2697
- "paddd %%xmm0,%%xmm0 \n" // 2*near (lo)
2698
- "paddd %%xmm1,%%xmm1 \n" // 2*near (hi)
2699
- "paddd %%xmm2,%%xmm0 \n" // 3*near+far+2 (lo)
2700
- "paddd %%xmm3,%%xmm1 \n" // 3*near+far+2 (hi)
2701
-
2702
- "psrld $2,%%xmm0 \n" // 3/4*near+1/4*far (lo)
2703
- "psrld $2,%%xmm1 \n" // 3/4*near+1/4*far (hi)
2704
- "packusdw %%xmm1,%%xmm0 \n"
2705
- "movdqu %%xmm0,(%1) \n"
2706
-
2707
- "lea 0x8(%0),%0 \n"
2708
- "lea 0x10(%1),%1 \n" // 2 uv to 4 uv
2709
- "sub $0x4,%2 \n"
2710
- "jg 1b \n"
2711
- : "+r"(src_ptr), // %0
2712
- "+r"(dst_ptr), // %1
2713
- "+r"(dst_width) // %2
2714
- :
2715
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5");
2716
- }
2717
- #endif
2718
-
2719
- #ifdef HAS_SCALEUVROWUP2_BILINEAR_16_SSE41
2720
- void ScaleUVRowUp2_Bilinear_16_SSE41(const uint16_t* src_ptr,
2721
- ptrdiff_t src_stride,
2722
- uint16_t* dst_ptr,
2723
- ptrdiff_t dst_stride,
2724
- int dst_width) {
2725
- asm volatile(
2726
- "pxor %%xmm7,%%xmm7 \n"
2727
- "pcmpeqd %%xmm6,%%xmm6 \n"
2728
- "psrld $31,%%xmm6 \n"
2729
- "pslld $3,%%xmm6 \n" // all 8
2730
-
2731
- LABELALIGN
2732
- "1: \n"
2733
- "movq (%0),%%xmm0 \n" // 0011 (16b, 1u1v)
2734
- "movq 4(%0),%%xmm1 \n" // 1122 (16b, 1u1v)
2735
- "punpcklwd %%xmm7,%%xmm0 \n" // 0011 (near) (32b, 1u1v)
2736
- "punpcklwd %%xmm7,%%xmm1 \n" // 1122 (near) (32b, 1u1v)
2737
- "movdqa %%xmm0,%%xmm2 \n"
2738
- "movdqa %%xmm1,%%xmm3 \n"
2739
- "pshufd $0b01001110,%%xmm2,%%xmm2 \n" // 1100 (far) (1, lo)
2740
- "pshufd $0b01001110,%%xmm3,%%xmm3 \n" // 2211 (far) (1, hi)
2741
- "paddd %%xmm0,%%xmm2 \n" // near+far (1, lo)
2742
- "paddd %%xmm1,%%xmm3 \n" // near+far (1, hi)
2743
- "paddd %%xmm0,%%xmm0 \n" // 2*near (1, lo)
2744
- "paddd %%xmm1,%%xmm1 \n" // 2*near (1, hi)
2745
- "paddd %%xmm2,%%xmm0 \n" // 3*near+far (1, lo)
2746
- "paddd %%xmm3,%%xmm1 \n" // 3*near+far (1, hi)
2747
-
2748
- "movq (%0,%3,2),%%xmm2 \n"
2749
- "movq 4(%0,%3,2),%%xmm3 \n"
2750
- "punpcklwd %%xmm7,%%xmm2 \n"
2751
- "punpcklwd %%xmm7,%%xmm3 \n"
2752
- "movdqa %%xmm2,%%xmm4 \n"
2753
- "movdqa %%xmm3,%%xmm5 \n"
2754
- "pshufd $0b01001110,%%xmm4,%%xmm4 \n" // 1100 (far) (2, lo)
2755
- "pshufd $0b01001110,%%xmm5,%%xmm5 \n" // 2211 (far) (2, hi)
2756
- "paddd %%xmm2,%%xmm4 \n" // near+far (2, lo)
2757
- "paddd %%xmm3,%%xmm5 \n" // near+far (2, hi)
2758
- "paddd %%xmm2,%%xmm2 \n" // 2*near (2, lo)
2759
- "paddd %%xmm3,%%xmm3 \n" // 2*near (2, hi)
2760
- "paddd %%xmm4,%%xmm2 \n" // 3*near+far (2, lo)
2761
- "paddd %%xmm5,%%xmm3 \n" // 3*near+far (2, hi)
2762
-
2763
- "movdqa %%xmm0,%%xmm4 \n"
2764
- "movdqa %%xmm2,%%xmm5 \n"
2765
- "paddd %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo)
2766
- "paddd %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo)
2767
- "paddd %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo)
2768
- "paddd %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo)
2769
- "psrld $4,%%xmm4 \n" // ^ div by 16 (1, lo)
2770
-
2771
- "movdqa %%xmm2,%%xmm5 \n"
2772
- "paddd %%xmm2,%%xmm5 \n" // 6*near+2*far (2, lo)
2773
- "paddd %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo)
2774
- "paddd %%xmm2,%%xmm5 \n" // 9*near+3*far (2, lo)
2775
- "paddd %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo)
2776
- "psrld $4,%%xmm5 \n" // ^ div by 16 (2, lo)
2777
-
2778
- "movdqa %%xmm1,%%xmm0 \n"
2779
- "movdqa %%xmm3,%%xmm2 \n"
2780
- "paddd %%xmm1,%%xmm0 \n" // 6*near+2*far (1, hi)
2781
- "paddd %%xmm6,%%xmm2 \n" // 3*near+far+8 (2, hi)
2782
- "paddd %%xmm1,%%xmm0 \n" // 9*near+3*far (1, hi)
2783
- "paddd %%xmm2,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi)
2784
- "psrld $4,%%xmm0 \n" // ^ div by 16 (1, hi)
2785
-
2786
- "movdqa %%xmm3,%%xmm2 \n"
2787
- "paddd %%xmm3,%%xmm2 \n" // 6*near+2*far (2, hi)
2788
- "paddd %%xmm6,%%xmm1 \n" // 3*near+far+8 (1, hi)
2789
- "paddd %%xmm3,%%xmm2 \n" // 9*near+3*far (2, hi)
2790
- "paddd %%xmm1,%%xmm2 \n" // 9 3 3 1 + 8 (2, hi)
2791
- "psrld $4,%%xmm2 \n" // ^ div by 16 (2, hi)
2792
-
2793
- "packusdw %%xmm0,%%xmm4 \n"
2794
- "movdqu %%xmm4,(%1) \n" // store above
2795
- "packusdw %%xmm2,%%xmm5 \n"
2796
- "movdqu %%xmm5,(%1,%4,2) \n" // store below
2797
-
2798
- "lea 0x8(%0),%0 \n"
2799
- "lea 0x10(%1),%1 \n" // 2 uv to 4 uv
2800
- "sub $0x4,%2 \n"
2801
- "jg 1b \n"
2802
- : "+r"(src_ptr), // %0
2803
- "+r"(dst_ptr), // %1
2804
- "+r"(dst_width) // %2
2805
- : "r"((intptr_t)(src_stride)), // %3
2806
- "r"((intptr_t)(dst_stride)) // %4
2807
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
2808
- "xmm7");
2809
- }
2810
- #endif
2811
-
2812
- #ifdef HAS_SCALEUVROWUP2_LINEAR_16_AVX2
2813
- void ScaleUVRowUp2_Linear_16_AVX2(const uint16_t* src_ptr,
2814
- uint16_t* dst_ptr,
2815
- int dst_width) {
2816
- asm volatile(
2817
- "vpcmpeqd %%ymm4,%%ymm4,%%ymm4 \n"
2818
- "vpsrld $31,%%ymm4,%%ymm4 \n"
2819
- "vpslld $1,%%ymm4,%%ymm4 \n" // all 2
2820
-
2821
- LABELALIGN
2822
- "1: \n"
2823
- "vmovdqu (%0),%%xmm0 \n" // 00112233 (16b, 1u1v)
2824
- "vmovdqu 4(%0),%%xmm1 \n" // 11223344 (16b, 1u1v)
2825
-
2826
- "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v)
2827
- "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v)
2828
-
2829
- "vpshufd $0b01001110,%%ymm0,%%ymm2 \n" // 11003322 (lo, far)
2830
- "vpshufd $0b01001110,%%ymm1,%%ymm3 \n" // 22114433 (hi, far)
2831
-
2832
- "vpaddd %%ymm4,%%ymm2,%%ymm2 \n" // far+2 (lo)
2833
- "vpaddd %%ymm4,%%ymm3,%%ymm3 \n" // far+2 (hi)
2834
- "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far+2 (lo)
2835
- "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far+2 (hi)
2836
- "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo)
2837
- "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi)
2838
- "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far+2 (lo)
2839
- "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far+2 (hi)
2840
-
2841
- "vpsrld $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo)
2842
- "vpsrld $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi)
2843
- "vpackusdw %%ymm1,%%ymm0,%%ymm0 \n"
2844
- "vmovdqu %%ymm0,(%1) \n"
2845
-
2846
- "lea 0x10(%0),%0 \n"
2847
- "lea 0x20(%1),%1 \n" // 4 uv to 8 uv
2848
- "sub $0x8,%2 \n"
2849
- "jg 1b \n"
2850
- "vzeroupper \n"
2851
- : "+r"(src_ptr), // %0
2852
- "+r"(dst_ptr), // %1
2853
- "+r"(dst_width) // %2
2854
- :
2855
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4");
2856
- }
2857
- #endif
2858
-
2859
- #ifdef HAS_SCALEUVROWUP2_BILINEAR_16_AVX2
2860
- void ScaleUVRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr,
2861
- ptrdiff_t src_stride,
2862
- uint16_t* dst_ptr,
2863
- ptrdiff_t dst_stride,
2864
- int dst_width) {
2865
- asm volatile(
2866
- "vpcmpeqd %%ymm6,%%ymm6,%%ymm6 \n"
2867
- "vpsrld $31,%%ymm6,%%ymm6 \n"
2868
- "vpslld $3,%%ymm6,%%ymm6 \n" // all 8
2869
-
2870
- LABELALIGN
2871
- "1: \n"
2872
-
2873
- "vmovdqu (%0),%%xmm0 \n" // 00112233 (16b, 1u1v)
2874
- "vmovdqu 4(%0),%%xmm1 \n" // 11223344 (16b, 1u1v)
2875
- "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v)
2876
- "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v)
2877
- "vpshufd $0b01001110,%%ymm0,%%ymm2 \n" // 11003322 (lo, far)
2878
- "vpshufd $0b01001110,%%ymm1,%%ymm3 \n" // 22114433 (hi, far)
2879
- "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far (lo)
2880
- "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far (hi)
2881
- "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo)
2882
- "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi)
2883
- "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far (lo)
2884
- "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far (hi)
2885
-
2886
- "vmovdqu (%0,%3,2),%%xmm2 \n" // 00112233 (16b, 1u1v)
2887
- "vmovdqu 4(%0,%3,2),%%xmm3 \n" // 11223344 (16b, 1u1v)
2888
- "vpmovzxwd %%xmm2,%%ymm2 \n" // 01234567 (32b, 1u1v)
2889
- "vpmovzxwd %%xmm3,%%ymm3 \n" // 12345678 (32b, 1u1v)
2890
- "vpshufd $0b01001110,%%ymm2,%%ymm4 \n" // 11003322 (lo, far)
2891
- "vpshufd $0b01001110,%%ymm3,%%ymm5 \n" // 22114433 (hi, far)
2892
- "vpaddd %%ymm2,%%ymm4,%%ymm4 \n" // near+far (lo)
2893
- "vpaddd %%ymm3,%%ymm5,%%ymm5 \n" // near+far (hi)
2894
- "vpaddd %%ymm2,%%ymm2,%%ymm2 \n" // 2*near (lo)
2895
- "vpaddd %%ymm3,%%ymm3,%%ymm3 \n" // 2*near (hi)
2896
- "vpaddd %%ymm2,%%ymm4,%%ymm2 \n" // 3*near+far (lo)
2897
- "vpaddd %%ymm3,%%ymm5,%%ymm3 \n" // 3*near+far (hi)
2898
-
2899
- "vpaddd %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo)
2900
- "vpaddd %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo)
2901
- "vpaddd %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo)
2902
- "vpaddd %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo)
2903
- "vpsrld $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo)
2904
-
2905
- "vpaddd %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo)
2906
- "vpaddd %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo)
2907
- "vpaddd %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo)
2908
- "vpaddd %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo)
2909
- "vpsrld $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo)
2910
-
2911
- "vpaddd %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi)
2912
- "vpaddd %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi)
2913
- "vpaddd %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi)
2914
- "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi)
2915
- "vpsrld $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi)
2916
-
2917
- "vpaddd %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi)
2918
- "vpaddd %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi)
2919
- "vpaddd %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi)
2920
- "vpaddd %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi)
2921
- "vpsrld $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi)
2922
-
2923
- "vpackusdw %%ymm0,%%ymm4,%%ymm4 \n"
2924
- "vmovdqu %%ymm4,(%1) \n" // store above
2925
- "vpackusdw %%ymm2,%%ymm5,%%ymm5 \n"
2926
- "vmovdqu %%ymm5,(%1,%4,2) \n" // store below
2927
-
2928
- "lea 0x10(%0),%0 \n"
2929
- "lea 0x20(%1),%1 \n" // 4 uv to 8 uv
2930
- "sub $0x8,%2 \n"
2931
- "jg 1b \n"
2932
- "vzeroupper \n"
2933
- : "+r"(src_ptr), // %0
2934
- "+r"(dst_ptr), // %1
2935
- "+r"(dst_width) // %2
2936
- : "r"((intptr_t)(src_stride)), // %3
2937
- "r"((intptr_t)(dst_stride)) // %4
2938
- : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
2939
- }
2940
- #endif
2941
-
2942
- #endif // defined(__x86_64__) || defined(__i386__)
2943
-
2944
- #ifdef __cplusplus
2945
- } // extern "C"
2946
- } // namespace libyuv
2947
- #endif