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