1fa39824bb690c5806358871f46940d0450973d8aJames Zern// Copyright 2016 Google Inc. All Rights Reserved.
2fa39824bb690c5806358871f46940d0450973d8aJames Zern//
3fa39824bb690c5806358871f46940d0450973d8aJames Zern// Use of this source code is governed by a BSD-style license
4fa39824bb690c5806358871f46940d0450973d8aJames Zern// that can be found in the COPYING file in the root of the source
5fa39824bb690c5806358871f46940d0450973d8aJames Zern// tree. An additional intellectual property rights grant can be found
6fa39824bb690c5806358871f46940d0450973d8aJames Zern// in the file PATENTS. All contributing project authors may
7fa39824bb690c5806358871f46940d0450973d8aJames Zern// be found in the AUTHORS file in the root of the source tree.
8fa39824bb690c5806358871f46940d0450973d8aJames Zern// -----------------------------------------------------------------------------
9fa39824bb690c5806358871f46940d0450973d8aJames Zern//
10fa39824bb690c5806358871f46940d0450973d8aJames Zern// MSA version of rescaling functions
11fa39824bb690c5806358871f46940d0450973d8aJames Zern//
12fa39824bb690c5806358871f46940d0450973d8aJames Zern// Author: Prashant Patil (prashant.patil@imgtec.com)
13fa39824bb690c5806358871f46940d0450973d8aJames Zern
14fa39824bb690c5806358871f46940d0450973d8aJames Zern#include "./dsp.h"
15fa39824bb690c5806358871f46940d0450973d8aJames Zern
16fa39824bb690c5806358871f46940d0450973d8aJames Zern#if defined(WEBP_USE_MSA)
17fa39824bb690c5806358871f46940d0450973d8aJames Zern
18fa39824bb690c5806358871f46940d0450973d8aJames Zern#include <assert.h>
19fa39824bb690c5806358871f46940d0450973d8aJames Zern
20fa39824bb690c5806358871f46940d0450973d8aJames Zern#include "../utils/rescaler_utils.h"
21fa39824bb690c5806358871f46940d0450973d8aJames Zern#include "./msa_macro.h"
22fa39824bb690c5806358871f46940d0450973d8aJames Zern
23fa39824bb690c5806358871f46940d0450973d8aJames Zern#define ROUNDER (WEBP_RESCALER_ONE >> 1)
24fa39824bb690c5806358871f46940d0450973d8aJames Zern#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
25fa39824bb690c5806358871f46940d0450973d8aJames Zern
26fa39824bb690c5806358871f46940d0450973d8aJames Zern#define CALC_MULT_FIX_16(in0, in1, in2, in3, scale, shift, dst) do {  \
27fa39824bb690c5806358871f46940d0450973d8aJames Zern  v4u32 tmp0, tmp1, tmp2, tmp3;                                       \
28fa39824bb690c5806358871f46940d0450973d8aJames Zern  v16u8 t0, t1, t2, t3, t4, t5;                                       \
29fa39824bb690c5806358871f46940d0450973d8aJames Zern  v2u64 out0, out1, out2, out3;                                       \
30fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in0, tmp0, tmp1);                                 \
31fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in1, tmp2, tmp3);                                 \
32fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1);                  \
33fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp2, tmp3, scale, scale, out2, out3);                  \
34fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D4_UD(out0, out1, out2, out3, shift);                          \
35fa39824bb690c5806358871f46940d0450973d8aJames Zern  PCKEV_B2_UB(out1, out0, out3, out2, t0, t1);                        \
36fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in2, tmp0, tmp1);                                 \
37fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in3, tmp2, tmp3);                                 \
38fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1);                  \
39fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp2, tmp3, scale, scale, out2, out3);                  \
40fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D4_UD(out0, out1, out2, out3, shift);                          \
41fa39824bb690c5806358871f46940d0450973d8aJames Zern  PCKEV_B2_UB(out1, out0, out3, out2, t2, t3);                        \
42fa39824bb690c5806358871f46940d0450973d8aJames Zern  PCKEV_B2_UB(t1, t0, t3, t2, t4, t5);                                \
43fa39824bb690c5806358871f46940d0450973d8aJames Zern  dst = (v16u8)__msa_pckev_b((v16i8)t5, (v16i8)t4);                   \
44fa39824bb690c5806358871f46940d0450973d8aJames Zern} while (0)
45fa39824bb690c5806358871f46940d0450973d8aJames Zern
46fa39824bb690c5806358871f46940d0450973d8aJames Zern#define CALC_MULT_FIX_4(in0, scale, shift, dst) do {  \
47fa39824bb690c5806358871f46940d0450973d8aJames Zern  v4u32 tmp0, tmp1;                                   \
48fa39824bb690c5806358871f46940d0450973d8aJames Zern  v16i8 t0, t1;                                       \
49fa39824bb690c5806358871f46940d0450973d8aJames Zern  v2u64 out0, out1;                                   \
50fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in0, tmp0, tmp1);                 \
51fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1);  \
52fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D2_UD(out0, out1, shift);                      \
53fa39824bb690c5806358871f46940d0450973d8aJames Zern  t0 = __msa_pckev_b((v16i8)out1, (v16i8)out0);       \
54fa39824bb690c5806358871f46940d0450973d8aJames Zern  t1 = __msa_pckev_b(t0, t0);                         \
55fa39824bb690c5806358871f46940d0450973d8aJames Zern  t0 = __msa_pckev_b(t1, t1);                         \
56fa39824bb690c5806358871f46940d0450973d8aJames Zern  dst = __msa_copy_s_w((v4i32)t0, 0);                 \
57fa39824bb690c5806358871f46940d0450973d8aJames Zern} while (0)
58fa39824bb690c5806358871f46940d0450973d8aJames Zern
59fa39824bb690c5806358871f46940d0450973d8aJames Zern#define CALC_MULT_FIX1_16(in0, in1, in2, in3, fyscale, shift,  \
60fa39824bb690c5806358871f46940d0450973d8aJames Zern                          dst0, dst1, dst2, dst3) do {         \
61fa39824bb690c5806358871f46940d0450973d8aJames Zern  v4u32 tmp0, tmp1, tmp2, tmp3;                                \
62fa39824bb690c5806358871f46940d0450973d8aJames Zern  v2u64 out0, out1, out2, out3;                                \
63fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in0, tmp0, tmp1);                          \
64fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in1, tmp2, tmp3);                          \
65fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, fyscale, fyscale, out0, out1);       \
66fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp2, tmp3, fyscale, fyscale, out2, out3);       \
67fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D4_UD(out0, out1, out2, out3, shift);                   \
68fa39824bb690c5806358871f46940d0450973d8aJames Zern  PCKEV_W2_UW(out1, out0, out3, out2, dst0, dst1);             \
69fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in2, tmp0, tmp1);                          \
70fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in3, tmp2, tmp3);                          \
71fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, fyscale, fyscale, out0, out1);       \
72fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp2, tmp3, fyscale, fyscale, out2, out3);       \
73fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D4_UD(out0, out1, out2, out3, shift);                   \
74fa39824bb690c5806358871f46940d0450973d8aJames Zern  PCKEV_W2_UW(out1, out0, out3, out2, dst2, dst3);             \
75fa39824bb690c5806358871f46940d0450973d8aJames Zern} while (0)
76fa39824bb690c5806358871f46940d0450973d8aJames Zern
77fa39824bb690c5806358871f46940d0450973d8aJames Zern#define CALC_MULT_FIX1_4(in0, scale, shift, dst) do {    \
78fa39824bb690c5806358871f46940d0450973d8aJames Zern  v4u32 tmp0, tmp1;                                      \
79fa39824bb690c5806358871f46940d0450973d8aJames Zern  v2u64 out0, out1;                                      \
80fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(zero, in0, tmp0, tmp1);                    \
81fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1);     \
82fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D2_UD(out0, out1, shift);                         \
83fa39824bb690c5806358871f46940d0450973d8aJames Zern  dst = (v4u32)__msa_pckev_w((v4i32)out1, (v4i32)out0);  \
84fa39824bb690c5806358871f46940d0450973d8aJames Zern} while (0)
85fa39824bb690c5806358871f46940d0450973d8aJames Zern
86fa39824bb690c5806358871f46940d0450973d8aJames Zern#define CALC_MULT_FIX2_16(in0, in1, in2, in3, mult, scale, shift,  \
87fa39824bb690c5806358871f46940d0450973d8aJames Zern                          dst0, dst1) do {                         \
88fa39824bb690c5806358871f46940d0450973d8aJames Zern  v4u32 tmp0, tmp1, tmp2, tmp3;                                    \
89fa39824bb690c5806358871f46940d0450973d8aJames Zern  v2u64 out0, out1, out2, out3;                                    \
90fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(in0, in2, tmp0, tmp1);                               \
91fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(in1, in3, tmp2, tmp3);                               \
92fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, mult, mult, out0, out1);                 \
93fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp2, tmp3, mult, mult, out2, out3);                 \
94fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D4_UD(out0, out1, out2, out3, shift);                       \
95fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(out0, out1, scale, scale, out0, out1);               \
96fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(out2, out3, scale, scale, out2, out3);               \
97fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D4_UD(out0, out1, out2, out3, shift);                       \
98fa39824bb690c5806358871f46940d0450973d8aJames Zern  PCKEV_B2_UB(out1, out0, out3, out2, dst0, dst1);                 \
99fa39824bb690c5806358871f46940d0450973d8aJames Zern} while (0)
100fa39824bb690c5806358871f46940d0450973d8aJames Zern
101fa39824bb690c5806358871f46940d0450973d8aJames Zern#define CALC_MULT_FIX2_4(in0, in1, mult, scale, shift, dst) do {  \
102fa39824bb690c5806358871f46940d0450973d8aJames Zern  v4u32 tmp0, tmp1;                                               \
103fa39824bb690c5806358871f46940d0450973d8aJames Zern  v2u64 out0, out1;                                               \
104fa39824bb690c5806358871f46940d0450973d8aJames Zern  v16i8 t0, t1;                                                   \
105fa39824bb690c5806358871f46940d0450973d8aJames Zern  ILVRL_W2_UW(in0, in1, tmp0, tmp1);                              \
106fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(tmp0, tmp1, mult, mult, out0, out1);                \
107fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D2_UD(out0, out1, shift);                                  \
108fa39824bb690c5806358871f46940d0450973d8aJames Zern  DOTP_UW2_UD(out0, out1, scale, scale, out0, out1);              \
109fa39824bb690c5806358871f46940d0450973d8aJames Zern  SRAR_D2_UD(out0, out1, shift);                                  \
110fa39824bb690c5806358871f46940d0450973d8aJames Zern  t0 = __msa_pckev_b((v16i8)out1, (v16i8)out0);                   \
111fa39824bb690c5806358871f46940d0450973d8aJames Zern  t1 = __msa_pckev_b(t0, t0);                                     \
112fa39824bb690c5806358871f46940d0450973d8aJames Zern  t0 = __msa_pckev_b(t1, t1);                                     \
113fa39824bb690c5806358871f46940d0450973d8aJames Zern  dst = __msa_copy_s_w((v4i32)t0, 0);                             \
114fa39824bb690c5806358871f46940d0450973d8aJames Zern} while (0)
115fa39824bb690c5806358871f46940d0450973d8aJames Zern
116fa39824bb690c5806358871f46940d0450973d8aJames Zernstatic WEBP_INLINE void ExportRowExpand_0(const uint32_t* frow, uint8_t* dst,
117fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          int length,
118fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          WebPRescaler* const wrk) {
119fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 scale = (v4u32)__msa_fill_w(wrk->fy_scale);
120fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 shift = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX);
121fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4i32 zero = { 0 };
122fa39824bb690c5806358871f46940d0450973d8aJames Zern
123fa39824bb690c5806358871f46940d0450973d8aJames Zern  while (length >= 16) {
124fa39824bb690c5806358871f46940d0450973d8aJames Zern    v4u32 src0, src1, src2, src3;
125fa39824bb690c5806358871f46940d0450973d8aJames Zern    v16u8 out;
126fa39824bb690c5806358871f46940d0450973d8aJames Zern    LD_UW4(frow, 4, src0, src1, src2, src3);
127fa39824bb690c5806358871f46940d0450973d8aJames Zern    CALC_MULT_FIX_16(src0, src1, src2, src3, scale, shift, out);
128fa39824bb690c5806358871f46940d0450973d8aJames Zern    ST_UB(out, dst);
129fa39824bb690c5806358871f46940d0450973d8aJames Zern    length -= 16;
130fa39824bb690c5806358871f46940d0450973d8aJames Zern    frow   += 16;
131fa39824bb690c5806358871f46940d0450973d8aJames Zern    dst    += 16;
132fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
133fa39824bb690c5806358871f46940d0450973d8aJames Zern  if (length > 0) {
134fa39824bb690c5806358871f46940d0450973d8aJames Zern    int x_out;
135fa39824bb690c5806358871f46940d0450973d8aJames Zern    if (length >= 12) {
136fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m, val2_m;
137fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0, src1, src2;
138fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW3(frow, 4, src0, src1, src2);
139fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, scale, shift, val0_m);
140fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src1, scale, shift, val1_m);
141fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src2, scale, shift, val2_m);
142fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW3(val0_m, val1_m, val2_m, dst, 4);
143fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 12;
144fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 12;
145fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 12;
146fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 8) {
147fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m;
148fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0, src1;
149fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW2(frow, 4, src0, src1);
150fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, scale, shift, val0_m);
151fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src1, scale, shift, val1_m);
152fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW2(val0_m, val1_m, dst, 4);
153fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 8;
154fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 8;
155fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 8;
156fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 4) {
157fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m;
158fa39824bb690c5806358871f46940d0450973d8aJames Zern      const v4u32 src0 = LD_UW(frow);
159fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, scale, shift, val0_m);
160fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW(val0_m, dst);
161fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 4;
162fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 4;
163fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 4;
164fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
165fa39824bb690c5806358871f46940d0450973d8aJames Zern    for (x_out = 0; x_out < length; ++x_out) {
166fa39824bb690c5806358871f46940d0450973d8aJames Zern      const uint32_t J = frow[x_out];
167fa39824bb690c5806358871f46940d0450973d8aJames Zern      const int v = (int)MULT_FIX(J, wrk->fy_scale);
168fa39824bb690c5806358871f46940d0450973d8aJames Zern      assert(v >= 0 && v <= 255);
169fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst[x_out] = v;
170fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
171fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
172fa39824bb690c5806358871f46940d0450973d8aJames Zern}
173fa39824bb690c5806358871f46940d0450973d8aJames Zern
174fa39824bb690c5806358871f46940d0450973d8aJames Zernstatic WEBP_INLINE void ExportRowExpand_1(const uint32_t* frow, uint32_t* irow,
175fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          uint8_t* dst, int length,
176fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          WebPRescaler* const wrk) {
177fa39824bb690c5806358871f46940d0450973d8aJames Zern  const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub);
178fa39824bb690c5806358871f46940d0450973d8aJames Zern  const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B);
179fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4i32 B1 = __msa_fill_w(B);
180fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4i32 A1 = __msa_fill_w(A);
181fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4i32 AB = __msa_ilvr_w(A1, B1);
182fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 scale = (v4u32)__msa_fill_w(wrk->fy_scale);
183fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 shift = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX);
184fa39824bb690c5806358871f46940d0450973d8aJames Zern
185fa39824bb690c5806358871f46940d0450973d8aJames Zern  while (length >= 16) {
186fa39824bb690c5806358871f46940d0450973d8aJames Zern    v4u32 frow0, frow1, frow2, frow3, irow0, irow1, irow2, irow3;
187fa39824bb690c5806358871f46940d0450973d8aJames Zern    v16u8 t0, t1, t2, t3, t4, t5;
188fa39824bb690c5806358871f46940d0450973d8aJames Zern    LD_UW4(frow, 4, frow0, frow1, frow2, frow3);
189fa39824bb690c5806358871f46940d0450973d8aJames Zern    LD_UW4(irow, 4, irow0, irow1, irow2, irow3);
190fa39824bb690c5806358871f46940d0450973d8aJames Zern    CALC_MULT_FIX2_16(frow0, frow1, irow0, irow1, AB, scale, shift, t0, t1);
191fa39824bb690c5806358871f46940d0450973d8aJames Zern    CALC_MULT_FIX2_16(frow2, frow3, irow2, irow3, AB, scale, shift, t2, t3);
192fa39824bb690c5806358871f46940d0450973d8aJames Zern    PCKEV_B2_UB(t1, t0, t3, t2, t4, t5);
193fa39824bb690c5806358871f46940d0450973d8aJames Zern    t0 = (v16u8)__msa_pckev_b((v16i8)t5, (v16i8)t4);
194fa39824bb690c5806358871f46940d0450973d8aJames Zern    ST_UB(t0, dst);
195fa39824bb690c5806358871f46940d0450973d8aJames Zern    frow   += 16;
196fa39824bb690c5806358871f46940d0450973d8aJames Zern    irow   += 16;
197fa39824bb690c5806358871f46940d0450973d8aJames Zern    dst    += 16;
198fa39824bb690c5806358871f46940d0450973d8aJames Zern    length -= 16;
199fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
200fa39824bb690c5806358871f46940d0450973d8aJames Zern  if (length > 0) {
201fa39824bb690c5806358871f46940d0450973d8aJames Zern    int x_out;
202fa39824bb690c5806358871f46940d0450973d8aJames Zern    if (length >= 12) {
203fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m, val2_m;
204fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 frow0, frow1, frow2, irow0, irow1, irow2;
205fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW3(frow, 4, frow0, frow1, frow2);
206fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW3(irow, 4, irow0, irow1, irow2);
207fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX2_4(frow0, irow0, AB, scale, shift, val0_m);
208fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX2_4(frow1, irow1, AB, scale, shift, val1_m);
209fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX2_4(frow2, irow2, AB, scale, shift, val2_m);
210fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW3(val0_m, val1_m, val2_m, dst, 4);
211fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 12;
212fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 12;
213fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 12;
214fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 12;
215fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 8) {
216fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m;
217fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 frow0, frow1, irow0, irow1;
218fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW2(frow, 4, frow0, frow1);
219fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW2(irow, 4, irow0, irow1);
220fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX2_4(frow0, irow0, AB, scale, shift, val0_m);
221fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX2_4(frow1, irow1, AB, scale, shift, val1_m);
222fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW2(val0_m, val1_m, dst, 4);
223fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 4;
224fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 4;
225fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 4;
226fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 4;
227fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 4) {
228fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m;
229fa39824bb690c5806358871f46940d0450973d8aJames Zern      const v4u32 frow0 = LD_UW(frow + 0);
230fa39824bb690c5806358871f46940d0450973d8aJames Zern      const v4u32 irow0 = LD_UW(irow + 0);
231fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX2_4(frow0, irow0, AB, scale, shift, val0_m);
232fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW(val0_m, dst);
233fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 4;
234fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 4;
235fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 4;
236fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 4;
237fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
238fa39824bb690c5806358871f46940d0450973d8aJames Zern    for (x_out = 0; x_out < length; ++x_out) {
239fa39824bb690c5806358871f46940d0450973d8aJames Zern      const uint64_t I = (uint64_t)A * frow[x_out]
240fa39824bb690c5806358871f46940d0450973d8aJames Zern                       + (uint64_t)B * irow[x_out];
241fa39824bb690c5806358871f46940d0450973d8aJames Zern      const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX);
242fa39824bb690c5806358871f46940d0450973d8aJames Zern      const int v = (int)MULT_FIX(J, wrk->fy_scale);
243fa39824bb690c5806358871f46940d0450973d8aJames Zern      assert(v >= 0 && v <= 255);
244fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst[x_out] = v;
245fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
246fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
247fa39824bb690c5806358871f46940d0450973d8aJames Zern}
248fa39824bb690c5806358871f46940d0450973d8aJames Zern
249fa39824bb690c5806358871f46940d0450973d8aJames Zernstatic void RescalerExportRowExpand(WebPRescaler* const wrk) {
250fa39824bb690c5806358871f46940d0450973d8aJames Zern  uint8_t* dst = wrk->dst;
251fa39824bb690c5806358871f46940d0450973d8aJames Zern  rescaler_t* irow = wrk->irow;
252fa39824bb690c5806358871f46940d0450973d8aJames Zern  const int x_out_max = wrk->dst_width * wrk->num_channels;
253fa39824bb690c5806358871f46940d0450973d8aJames Zern  const rescaler_t* frow = wrk->frow;
254fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(!WebPRescalerOutputDone(wrk));
255fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(wrk->y_accum <= 0);
256fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(wrk->y_expand);
257fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(wrk->y_sub != 0);
258fa39824bb690c5806358871f46940d0450973d8aJames Zern  if (wrk->y_accum == 0) {
259fa39824bb690c5806358871f46940d0450973d8aJames Zern    ExportRowExpand_0(frow, dst, x_out_max, wrk);
260fa39824bb690c5806358871f46940d0450973d8aJames Zern  } else {
261fa39824bb690c5806358871f46940d0450973d8aJames Zern    ExportRowExpand_1(frow, irow, dst, x_out_max, wrk);
262fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
263fa39824bb690c5806358871f46940d0450973d8aJames Zern}
264fa39824bb690c5806358871f46940d0450973d8aJames Zern
265fa39824bb690c5806358871f46940d0450973d8aJames Zernstatic WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow,
266fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          uint8_t* dst, int length,
267fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          const uint32_t yscale,
268fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          WebPRescaler* const wrk) {
269fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 y_scale = (v4u32)__msa_fill_w(yscale);
270fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 fxyscale = (v4u32)__msa_fill_w(wrk->fxy_scale);
271fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 shiftval = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX);
272fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4i32 zero = { 0 };
273fa39824bb690c5806358871f46940d0450973d8aJames Zern
274fa39824bb690c5806358871f46940d0450973d8aJames Zern  while (length >= 16) {
275fa39824bb690c5806358871f46940d0450973d8aJames Zern    v4u32 src0, src1, src2, src3, frac0, frac1, frac2, frac3;
276fa39824bb690c5806358871f46940d0450973d8aJames Zern    v16u8 out;
277fa39824bb690c5806358871f46940d0450973d8aJames Zern    LD_UW4(frow, 4, src0, src1, src2, src3);
278fa39824bb690c5806358871f46940d0450973d8aJames Zern    CALC_MULT_FIX1_16(src0, src1, src2, src3, y_scale, shiftval,
279fa39824bb690c5806358871f46940d0450973d8aJames Zern                      frac0, frac1, frac2, frac3);
280fa39824bb690c5806358871f46940d0450973d8aJames Zern    LD_UW4(irow, 4, src0, src1, src2, src3);
281fa39824bb690c5806358871f46940d0450973d8aJames Zern    SUB4(src0, frac0, src1, frac1, src2, frac2, src3, frac3,
282fa39824bb690c5806358871f46940d0450973d8aJames Zern         src0, src1, src2, src3);
283fa39824bb690c5806358871f46940d0450973d8aJames Zern    CALC_MULT_FIX_16(src0, src1, src2, src3, fxyscale, shiftval, out);
284fa39824bb690c5806358871f46940d0450973d8aJames Zern    ST_UB(out, dst);
285fa39824bb690c5806358871f46940d0450973d8aJames Zern    ST_UW4(frac0, frac1, frac2, frac3, irow, 4);
286fa39824bb690c5806358871f46940d0450973d8aJames Zern    frow   += 16;
287fa39824bb690c5806358871f46940d0450973d8aJames Zern    irow   += 16;
288fa39824bb690c5806358871f46940d0450973d8aJames Zern    dst    += 16;
289fa39824bb690c5806358871f46940d0450973d8aJames Zern    length -= 16;
290fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
291fa39824bb690c5806358871f46940d0450973d8aJames Zern  if (length > 0) {
292fa39824bb690c5806358871f46940d0450973d8aJames Zern    int x_out;
293fa39824bb690c5806358871f46940d0450973d8aJames Zern    if (length >= 12) {
294fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m, val2_m;
295fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0, src1, src2, frac0, frac1, frac2;
296fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW3(frow, 4, src0, src1, src2);
297fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX1_4(src0, y_scale, shiftval, frac0);
298fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX1_4(src1, y_scale, shiftval, frac1);
299fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX1_4(src2, y_scale, shiftval, frac2);
300fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW3(irow, 4, src0, src1, src2);
301fa39824bb690c5806358871f46940d0450973d8aJames Zern      SUB3(src0, frac0, src1, frac1, src2, frac2, src0, src1, src2);
302fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, fxyscale, shiftval, val0_m);
303fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src1, fxyscale, shiftval, val1_m);
304fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src2, fxyscale, shiftval, val2_m);
305fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW3(val0_m, val1_m, val2_m, dst, 4);
306fa39824bb690c5806358871f46940d0450973d8aJames Zern      ST_UW3(frac0, frac1, frac2, irow, 4);
307fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 12;
308fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 12;
309fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 12;
310fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 12;
311fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 8) {
312fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m;
313fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0, src1, frac0, frac1;
314fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW2(frow, 4, src0, src1);
315fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX1_4(src0, y_scale, shiftval, frac0);
316fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX1_4(src1, y_scale, shiftval, frac1);
317fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW2(irow, 4, src0, src1);
318fa39824bb690c5806358871f46940d0450973d8aJames Zern      SUB2(src0, frac0, src1, frac1, src0, src1);
319fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, fxyscale, shiftval, val0_m);
320fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src1, fxyscale, shiftval, val1_m);
321fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW2(val0_m, val1_m, dst, 4);
322fa39824bb690c5806358871f46940d0450973d8aJames Zern      ST_UW2(frac0, frac1, irow, 4);
323fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 8;
324fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 8;
325fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 8;
326fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 8;
327fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 4) {
328fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m;
329fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 frac0;
330fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0 = LD_UW(frow);
331fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX1_4(src0, y_scale, shiftval, frac0);
332fa39824bb690c5806358871f46940d0450973d8aJames Zern      src0 = LD_UW(irow);
333fa39824bb690c5806358871f46940d0450973d8aJames Zern      src0 = src0 - frac0;
334fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, fxyscale, shiftval, val0_m);
335fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW(val0_m, dst);
336fa39824bb690c5806358871f46940d0450973d8aJames Zern      ST_UW(frac0, irow);
337fa39824bb690c5806358871f46940d0450973d8aJames Zern      frow   += 4;
338fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 4;
339fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 4;
340fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 4;
341fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
342fa39824bb690c5806358871f46940d0450973d8aJames Zern    for (x_out = 0; x_out < length; ++x_out) {
343fa39824bb690c5806358871f46940d0450973d8aJames Zern      const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
344fa39824bb690c5806358871f46940d0450973d8aJames Zern      const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
345fa39824bb690c5806358871f46940d0450973d8aJames Zern      assert(v >= 0 && v <= 255);
346fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst[x_out] = v;
347fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow[x_out] = frac;
348fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
349fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
350fa39824bb690c5806358871f46940d0450973d8aJames Zern}
351fa39824bb690c5806358871f46940d0450973d8aJames Zern
352fa39824bb690c5806358871f46940d0450973d8aJames Zernstatic WEBP_INLINE void ExportRowShrink_1(uint32_t* irow, uint8_t* dst,
353fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          int length,
354fa39824bb690c5806358871f46940d0450973d8aJames Zern                                          WebPRescaler* const wrk) {
355fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 scale = (v4u32)__msa_fill_w(wrk->fxy_scale);
356fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4u32 shift = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX);
357fa39824bb690c5806358871f46940d0450973d8aJames Zern  const v4i32 zero = { 0 };
358fa39824bb690c5806358871f46940d0450973d8aJames Zern
359fa39824bb690c5806358871f46940d0450973d8aJames Zern  while (length >= 16) {
360fa39824bb690c5806358871f46940d0450973d8aJames Zern    v4u32 src0, src1, src2, src3;
361fa39824bb690c5806358871f46940d0450973d8aJames Zern    v16u8 dst0;
362fa39824bb690c5806358871f46940d0450973d8aJames Zern    LD_UW4(irow, 4, src0, src1, src2, src3);
363fa39824bb690c5806358871f46940d0450973d8aJames Zern    CALC_MULT_FIX_16(src0, src1, src2, src3, scale, shift, dst0);
364fa39824bb690c5806358871f46940d0450973d8aJames Zern    ST_UB(dst0, dst);
365fa39824bb690c5806358871f46940d0450973d8aJames Zern    ST_SW4(zero, zero, zero, zero, irow, 4);
366fa39824bb690c5806358871f46940d0450973d8aJames Zern    length -= 16;
367fa39824bb690c5806358871f46940d0450973d8aJames Zern    irow   += 16;
368fa39824bb690c5806358871f46940d0450973d8aJames Zern    dst    += 16;
369fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
370fa39824bb690c5806358871f46940d0450973d8aJames Zern  if (length > 0) {
371fa39824bb690c5806358871f46940d0450973d8aJames Zern    int x_out;
372fa39824bb690c5806358871f46940d0450973d8aJames Zern    if (length >= 12) {
373fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m, val2_m;
374fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0, src1, src2;
375fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW3(irow, 4, src0, src1, src2);
376fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, scale, shift, val0_m);
377fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src1, scale, shift, val1_m);
378fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src2, scale, shift, val2_m);
379fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW3(val0_m, val1_m, val2_m, dst, 4);
380fa39824bb690c5806358871f46940d0450973d8aJames Zern      ST_SW3(zero, zero, zero, irow, 4);
381fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 12;
382fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 12;
383fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 12;
384fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 8) {
385fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m, val1_m;
386fa39824bb690c5806358871f46940d0450973d8aJames Zern      v4u32 src0, src1;
387fa39824bb690c5806358871f46940d0450973d8aJames Zern      LD_UW2(irow, 4, src0, src1);
388fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, scale, shift, val0_m);
389fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src1, scale, shift, val1_m);
390fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW2(val0_m, val1_m, dst, 4);
391fa39824bb690c5806358871f46940d0450973d8aJames Zern      ST_SW2(zero, zero, irow, 4);
392fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 8;
393fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 8;
394fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 8;
395fa39824bb690c5806358871f46940d0450973d8aJames Zern    } else if (length >= 4) {
396fa39824bb690c5806358871f46940d0450973d8aJames Zern      uint32_t val0_m;
397fa39824bb690c5806358871f46940d0450973d8aJames Zern      const v4u32 src0 = LD_UW(irow + 0);
398fa39824bb690c5806358871f46940d0450973d8aJames Zern      CALC_MULT_FIX_4(src0, scale, shift, val0_m);
399fa39824bb690c5806358871f46940d0450973d8aJames Zern      SW(val0_m, dst);
400fa39824bb690c5806358871f46940d0450973d8aJames Zern      ST_SW(zero, irow);
401fa39824bb690c5806358871f46940d0450973d8aJames Zern      length -= 4;
402fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow   += 4;
403fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst    += 4;
404fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
405fa39824bb690c5806358871f46940d0450973d8aJames Zern    for (x_out = 0; x_out < length; ++x_out) {
406fa39824bb690c5806358871f46940d0450973d8aJames Zern      const int v = (int)MULT_FIX(irow[x_out], wrk->fxy_scale);
407fa39824bb690c5806358871f46940d0450973d8aJames Zern      assert(v >= 0 && v <= 255);
408fa39824bb690c5806358871f46940d0450973d8aJames Zern      dst[x_out] = v;
409fa39824bb690c5806358871f46940d0450973d8aJames Zern      irow[x_out] = 0;
410fa39824bb690c5806358871f46940d0450973d8aJames Zern    }
411fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
412fa39824bb690c5806358871f46940d0450973d8aJames Zern}
413fa39824bb690c5806358871f46940d0450973d8aJames Zern
414fa39824bb690c5806358871f46940d0450973d8aJames Zernstatic void RescalerExportRowShrink(WebPRescaler* const wrk) {
415fa39824bb690c5806358871f46940d0450973d8aJames Zern  uint8_t* dst = wrk->dst;
416fa39824bb690c5806358871f46940d0450973d8aJames Zern  rescaler_t* irow = wrk->irow;
417fa39824bb690c5806358871f46940d0450973d8aJames Zern  const int x_out_max = wrk->dst_width * wrk->num_channels;
418fa39824bb690c5806358871f46940d0450973d8aJames Zern  const rescaler_t* frow = wrk->frow;
419fa39824bb690c5806358871f46940d0450973d8aJames Zern  const uint32_t yscale = wrk->fy_scale * (-wrk->y_accum);
420fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(!WebPRescalerOutputDone(wrk));
421fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(wrk->y_accum <= 0);
422fa39824bb690c5806358871f46940d0450973d8aJames Zern  assert(!wrk->y_expand);
423fa39824bb690c5806358871f46940d0450973d8aJames Zern  if (yscale) {
424fa39824bb690c5806358871f46940d0450973d8aJames Zern    ExportRowShrink_0(frow, irow, dst, x_out_max, yscale, wrk);
425fa39824bb690c5806358871f46940d0450973d8aJames Zern  } else {
426fa39824bb690c5806358871f46940d0450973d8aJames Zern    ExportRowShrink_1(irow, dst, x_out_max, wrk);
427fa39824bb690c5806358871f46940d0450973d8aJames Zern  }
428fa39824bb690c5806358871f46940d0450973d8aJames Zern}
429fa39824bb690c5806358871f46940d0450973d8aJames Zern
430fa39824bb690c5806358871f46940d0450973d8aJames Zern//------------------------------------------------------------------------------
431fa39824bb690c5806358871f46940d0450973d8aJames Zern// Entry point
432fa39824bb690c5806358871f46940d0450973d8aJames Zern
433fa39824bb690c5806358871f46940d0450973d8aJames Zernextern void WebPRescalerDspInitMSA(void);
434fa39824bb690c5806358871f46940d0450973d8aJames Zern
435fa39824bb690c5806358871f46940d0450973d8aJames ZernWEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMSA(void) {
436fa39824bb690c5806358871f46940d0450973d8aJames Zern  WebPRescalerExportRowExpand = RescalerExportRowExpand;
437fa39824bb690c5806358871f46940d0450973d8aJames Zern  WebPRescalerExportRowShrink = RescalerExportRowShrink;
438fa39824bb690c5806358871f46940d0450973d8aJames Zern}
439fa39824bb690c5806358871f46940d0450973d8aJames Zern
440fa39824bb690c5806358871f46940d0450973d8aJames Zern#else     // !WEBP_USE_MSA
441fa39824bb690c5806358871f46940d0450973d8aJames Zern
442fa39824bb690c5806358871f46940d0450973d8aJames ZernWEBP_DSP_INIT_STUB(WebPRescalerDspInitMSA)
443fa39824bb690c5806358871f46940d0450973d8aJames Zern
444fa39824bb690c5806358871f46940d0450973d8aJames Zern#endif    // WEBP_USE_MSA
445