15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 Google Inc. All Rights Reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// that can be found in the COPYING file in the root of the source
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// tree. An additional intellectual property rights grant can be found
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// in the file PATENTS. All contributing project authors may
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// be found in the AUTHORS file in the root of the source tree.
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -----------------------------------------------------------------------------
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// MIPS version of dsp functions
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Author(s):  Djordje Pesut    (djordje.pesut@imgtec.com)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//             Jovan Zelincevic (jovan.zelincevic@imgtec.com)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "./dsp.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(WEBP_USE_MIPS32)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static const int kC1 = 20091 + (1 << 16);
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static const int kC2 = 35468;
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE int abs_mips32(int x) {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int sign = x >> 31;
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return (x ^ sign) - sign;
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 4 pixels in, 2 pixels out
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE void do_filter2(uint8_t* p, int step) {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step];
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a = 3 * (q0 - p0) + VP8ksclip1[p1 - q1];
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a1 = VP8ksclip2[(a + 4) >> 3];
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a2 = VP8ksclip2[(a + 3) >> 3];
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[-step] = VP8kclip1[p0 + a2];
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[    0] = VP8kclip1[q0 - a1];
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 4 pixels in, 4 pixels out
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE void do_filter4(uint8_t* p, int step) {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step];
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a = 3 * (q0 - p0);
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a1 = VP8ksclip2[(a + 4) >> 3];
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a2 = VP8ksclip2[(a + 3) >> 3];
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a3 = (a1 + 1) >> 1;
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[-2 * step] = VP8kclip1[p1 + a3];
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[-    step] = VP8kclip1[p0 + a2];
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[        0] = VP8kclip1[q0 - a1];
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[     step] = VP8kclip1[q1 - a3];
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 6 pixels in, 6 pixels out
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE void do_filter6(uint8_t* p, int step) {
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p2 = p[-3 * step], p1 = p[-2 * step], p0 = p[-step];
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int q0 = p[0], q1 = p[step], q2 = p[2 * step];
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a = VP8ksclip1[3 * (q0 - p0) + VP8ksclip1[p1 - q1]];
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a1 = (27 * a + 63) >> 7;  // eq. to ((3 * a + 7) * 9) >> 7
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a2 = (18 * a + 63) >> 7;  // eq. to ((2 * a + 7) * 9) >> 7
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int a3 = (9  * a + 63) >> 7;  // eq. to ((1 * a + 7) * 9) >> 7
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[-3 * step] = VP8kclip1[p2 + a3];
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[-2 * step] = VP8kclip1[p1 + a2];
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[-    step] = VP8kclip1[p0 + a1];
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[        0] = VP8kclip1[q0 - a1];
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[     step] = VP8kclip1[q1 - a2];
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p[ 2 * step] = VP8kclip1[q2 - a3];
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE int hev(const uint8_t* p, int step, int thresh) {
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step];
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return (abs_mips32(p1 - p0) > thresh) || (abs_mips32(q1 - q0) > thresh);
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE int needs_filter(const uint8_t* p, int step, int thresh) {
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step];
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ((2 * abs_mips32(p0 - q0) + (abs_mips32(p1 - q1) >> 1)) <= thresh);
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE int needs_filter2(const uint8_t* p,
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     int step, int t, int it) {
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p3 = p[-4 * step], p2 = p[-3 * step];
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int p1 = p[-2 * step], p0 = p[-step];
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int q0 = p[0], q1 = p[step], q2 = p[2 * step], q3 = p[3 * step];
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if ((2 * abs_mips32(p0 - q0) + (abs_mips32(p1 - q1) >> 1)) > t) {
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 0;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return abs_mips32(p3 - p2) <= it && abs_mips32(p2 - p1) <= it &&
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         abs_mips32(p1 - p0) <= it && abs_mips32(q3 - q2) <= it &&
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         abs_mips32(q2 - q1) <= it && abs_mips32(q1 - q0) <= it;
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE void FilterLoop26(uint8_t* p,
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     int hstride, int vstride, int size,
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     int thresh, int ithresh, int hev_thresh) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  while (size-- > 0) {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (needs_filter2(p, hstride, thresh, ithresh)) {
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (hev(p, hstride, hev_thresh)) {
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        do_filter2(p, hstride);
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      } else {
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        do_filter6(p, hstride);
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    p += vstride;
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE void FilterLoop24(uint8_t* p,
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     int hstride, int vstride, int size,
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     int thresh, int ithresh, int hev_thresh) {
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  while (size-- > 0) {
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (needs_filter2(p, hstride, thresh, ithresh)) {
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (hev(p, hstride, hev_thresh)) {
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        do_filter2(p, hstride);
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      } else {
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        do_filter4(p, hstride);
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    p += vstride;
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// on macroblock edges
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void VFilter16(uint8_t* p, int stride,
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      int thresh, int ithresh, int hev_thresh) {
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop26(p, stride, 1, 16, thresh, ithresh, hev_thresh);
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void HFilter16(uint8_t* p, int stride,
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      int thresh, int ithresh, int hev_thresh) {
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop26(p, 1, stride, 16, thresh, ithresh, hev_thresh);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 8-pixels wide variant, for chroma filtering
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void VFilter8(uint8_t* u, uint8_t* v, int stride,
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     int thresh, int ithresh, int hev_thresh) {
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop26(u, stride, 1, 8, thresh, ithresh, hev_thresh);
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop26(v, stride, 1, 8, thresh, ithresh, hev_thresh);
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void HFilter8(uint8_t* u, uint8_t* v, int stride,
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     int thresh, int ithresh, int hev_thresh) {
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop26(u, 1, stride, 8, thresh, ithresh, hev_thresh);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop26(v, 1, stride, 8, thresh, ithresh, hev_thresh);
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void VFilter8i(uint8_t* u, uint8_t* v, int stride,
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      int thresh, int ithresh, int hev_thresh) {
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop24(u + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh);
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop24(v + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh);
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void HFilter8i(uint8_t* u, uint8_t* v, int stride,
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      int thresh, int ithresh, int hev_thresh) {
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop24(u + 4, 1, stride, 8, thresh, ithresh, hev_thresh);
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FilterLoop24(v + 4, 1, stride, 8, thresh, ithresh, hev_thresh);
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// on three inner edges
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void VFilter16i(uint8_t* p, int stride,
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       int thresh, int ithresh, int hev_thresh) {
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int k;
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (k = 3; k > 0; --k) {
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    p += 4 * stride;
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    FilterLoop24(p, stride, 1, 16, thresh, ithresh, hev_thresh);
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void HFilter16i(uint8_t* p, int stride,
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       int thresh, int ithresh, int hev_thresh) {
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int k;
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (k = 3; k > 0; --k) {
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    p += 4;
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    FilterLoop24(p, 1, stride, 16, thresh, ithresh, hev_thresh);
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//------------------------------------------------------------------------------
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Simple In-loop filtering (Paragraph 15.2)
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void SimpleVFilter16(uint8_t* p, int stride, int thresh) {
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int i;
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (i = 0; i < 16; ++i) {
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (needs_filter(p + i, stride, thresh)) {
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      do_filter2(p + i, stride);
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void SimpleHFilter16(uint8_t* p, int stride, int thresh) {
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int i;
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (i = 0; i < 16; ++i) {
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (needs_filter(p + i * stride, 1, thresh)) {
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      do_filter2(p + i * stride, 1);
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void SimpleVFilter16i(uint8_t* p, int stride, int thresh) {
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int k;
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (k = 3; k > 0; --k) {
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    p += 4 * stride;
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SimpleVFilter16(p, stride, thresh);
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void SimpleHFilter16i(uint8_t* p, int stride, int thresh) {
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int k;
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (k = 3; k > 0; --k) {
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    p += 4;
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SimpleHFilter16(p, stride, thresh);
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void TransformOne(const int16_t* in, uint8_t* dst) {
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int temp0, temp1, temp2, temp3, temp4;
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int temp5, temp6, temp7, temp8, temp9;
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int temp10, temp11, temp12, temp13, temp14;
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int temp15, temp16, temp17, temp18;
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int16_t* p_in = (int16_t*)in;
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // loops unrolled and merged to avoid usage of tmp buffer
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // and to reduce number of stalls. MUL macro is written
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // in assembler and inlined
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  __asm__ volatile(
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp0],  0(%[in])                      \n\t"
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp8],  16(%[in])                     \n\t"
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp4],  8(%[in])                      \n\t"
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp12], 24(%[in])                     \n\t"
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp0],  %[temp8]           \n\t"
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp0],  %[temp0],  %[temp8]           \n\t"
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp8],  %[temp4],  %[kC2]             \n\t"
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp17], %[temp12], %[kC1]             \n\t"
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp4],  %[temp4],  %[kC1]             \n\t"
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp12], %[temp12], %[kC2]             \n\t"
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp1],  2(%[in])                      \n\t"
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp5],  10(%[in])                     \n\t"
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp9],  18(%[in])                     \n\t"
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp13], 26(%[in])                     \n\t"
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp8],  %[temp8],  16                 \n\t"
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp17], 16                 \n\t"
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp4],  %[temp4],  16                 \n\t"
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp12], %[temp12], 16                 \n\t"
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp2],  4(%[in])                      \n\t"
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp6],  12(%[in])                     \n\t"
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp10], 20(%[in])                     \n\t"
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp14], 28(%[in])                     \n\t"
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp17], %[temp8],  %[temp17]          \n\t"
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp4],  %[temp4],  %[temp12]          \n\t"
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp8],  %[temp16], %[temp4]           \n\t"
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp4],  %[temp16], %[temp4]           \n\t"
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp1],  %[temp9]           \n\t"
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp1],  %[temp1],  %[temp9]           \n\t"
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp3],  6(%[in])                      \n\t"
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp7],  14(%[in])                     \n\t"
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp11], 22(%[in])                     \n\t"
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lh       %[temp15], 30(%[in])                     \n\t"
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp12], %[temp0],  %[temp17]          \n\t"
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp0],  %[temp0],  %[temp17]          \n\t"
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp9],  %[temp5],  %[kC2]             \n\t"
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp17], %[temp13], %[kC1]             \n\t"
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp5],  %[temp5],  %[kC1]             \n\t"
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp13], %[temp13], %[kC2]             \n\t"
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp9],  %[temp9],  16                 \n\t"
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp17], 16                 \n\t"
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp17], %[temp9],  %[temp17]          \n\t"
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp5],  %[temp5],  16                 \n\t"
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp13], %[temp13], 16                 \n\t"
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp5],  %[temp5],  %[temp13]          \n\t"
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp13], %[temp1],  %[temp17]          \n\t"
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp1],  %[temp1],  %[temp17]          \n\t"
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp17], %[temp14], %[kC1]             \n\t"
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp14], %[temp14], %[kC2]             \n\t"
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp9],  %[temp16], %[temp5]           \n\t"
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp5],  %[temp16], %[temp5]           \n\t"
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp2],  %[temp10]          \n\t"
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp2],  %[temp2],  %[temp10]          \n\t"
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp10], %[temp6],  %[kC2]             \n\t"
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp6],  %[temp6],  %[kC1]             \n\t"
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp17], 16                 \n\t"
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp14], %[temp14], 16                 \n\t"
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp10], %[temp10], 16                 \n\t"
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp6],  %[temp6],  16                 \n\t"
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp17], %[temp10], %[temp17]          \n\t"
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp6],  %[temp6],  %[temp14]          \n\t"
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp10], %[temp16], %[temp6]           \n\t"
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp6],  %[temp16], %[temp6]           \n\t"
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp14], %[temp2],  %[temp17]          \n\t"
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp2],  %[temp2],  %[temp17]          \n\t"
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp17], %[temp15], %[kC1]             \n\t"
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp15], %[temp15], %[kC2]             \n\t"
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp3],  %[temp11]          \n\t"
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp3],  %[temp3],  %[temp11]          \n\t"
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp11], %[temp7],  %[kC2]             \n\t"
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp7],  %[temp7],  %[kC1]             \n\t"
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addiu    %[temp8],  %[temp8],  4                  \n\t"
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addiu    %[temp12], %[temp12], 4                  \n\t"
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addiu    %[temp0],  %[temp0],  4                  \n\t"
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addiu    %[temp4],  %[temp4],  4                  \n\t"
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp17], 16                 \n\t"
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp15], %[temp15], 16                 \n\t"
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp11], %[temp11], 16                 \n\t"
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp7],  %[temp7],  16                 \n\t"
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp17], %[temp11], %[temp17]          \n\t"
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp7],  %[temp7],  %[temp15]          \n\t"
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp15], %[temp3],  %[temp17]          \n\t"
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp3],  %[temp3],  %[temp17]          \n\t"
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp11], %[temp16], %[temp7]           \n\t"
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp7],  %[temp16], %[temp7]           \n\t"
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp8],  %[temp10]          \n\t"
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp8],  %[temp8],  %[temp10]          \n\t"
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp10], %[temp9],  %[kC2]             \n\t"
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp17], %[temp11], %[kC1]             \n\t"
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp9],  %[temp9],  %[kC1]             \n\t"
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp11], %[temp11], %[kC2]             \n\t"
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp10], %[temp10], 16                 \n\t"
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp17], 16                 \n\t"
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp9],  %[temp9],  16                 \n\t"
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp11], %[temp11], 16                 \n\t"
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp17], %[temp10], %[temp17]          \n\t"
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp11], %[temp9],  %[temp11]          \n\t"
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp10], %[temp12], %[temp14]          \n\t"
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp12], %[temp12], %[temp14]          \n\t"
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp14], %[temp13], %[kC2]             \n\t"
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp9],  %[temp15], %[kC1]             \n\t"
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp13], %[temp13], %[kC1]             \n\t"
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp15], %[temp15], %[kC2]             \n\t"
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp14], %[temp14], 16                 \n\t"
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp9],  %[temp9],  16                 \n\t"
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp13], %[temp13], 16                 \n\t"
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp15], %[temp15], 16                 \n\t"
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp9],  %[temp14], %[temp9]           \n\t"
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp15], %[temp13], %[temp15]          \n\t"
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp14], %[temp0],  %[temp2]           \n\t"
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp0],  %[temp0],  %[temp2]           \n\t"
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp2],  %[temp1],  %[kC2]             \n\t"
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp13], %[temp3],  %[kC1]             \n\t"
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp1],  %[temp1],  %[kC1]             \n\t"
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp3],  %[temp3],  %[kC2]             \n\t"
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp2],  %[temp2],  16                 \n\t"
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp13], %[temp13], 16                 \n\t"
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp1],  16                 \n\t"
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp3],  %[temp3],  16                 \n\t"
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp13], %[temp2],  %[temp13]          \n\t"
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp3],  %[temp1],  %[temp3]           \n\t"
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp2],  %[temp4],  %[temp6]           \n\t"
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp4],  %[temp4],  %[temp6]           \n\t"
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp6],  %[temp5],  %[kC2]             \n\t"
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp1],  %[temp7],  %[kC1]             \n\t"
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp5],  %[temp5],  %[kC1]             \n\t"
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "mul      %[temp7],  %[temp7],  %[kC2]             \n\t"
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp6],  %[temp6],  16                 \n\t"
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp1],  16                 \n\t"
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp5],  %[temp5],  16                 \n\t"
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp7],  %[temp7],  16                 \n\t"
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp1],  %[temp6],  %[temp1]           \n\t"
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp7],  %[temp5],  %[temp7]           \n\t"
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp5],  %[temp16], %[temp11]          \n\t"
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp16], %[temp16], %[temp11]          \n\t"
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp11], %[temp8],  %[temp17]          \n\t"
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp8],  %[temp8],  %[temp17]          \n\t"
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp5],  %[temp5],  3                  \n\t"
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp16], %[temp16], 3                  \n\t"
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp11], %[temp11], 3                  \n\t"
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp8],  %[temp8],  3                  \n\t"
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp17], %[temp10], %[temp15]          \n\t"
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp10], %[temp10], %[temp15]          \n\t"
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp15], %[temp12], %[temp9]           \n\t"
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp12], %[temp12], %[temp9]           \n\t"
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp17], 3                  \n\t"
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp10], %[temp10], 3                  \n\t"
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp15], %[temp15], 3                  \n\t"
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp12], %[temp12], 3                  \n\t"
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp9],  %[temp14], %[temp3]           \n\t"
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp14], %[temp14], %[temp3]           \n\t"
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp3],  %[temp0],  %[temp13]          \n\t"
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp0],  %[temp0],  %[temp13]          \n\t"
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp9],  %[temp9],  3                  \n\t"
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp14], %[temp14], 3                  \n\t"
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp3],  %[temp3],  3                  \n\t"
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp0],  %[temp0],  3                  \n\t"
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp13], %[temp2],  %[temp7]           \n\t"
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp2],  %[temp2],  %[temp7]           \n\t"
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp7],  %[temp4],  %[temp1]           \n\t"
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "subu     %[temp4],  %[temp4],  %[temp1]           \n\t"
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp13], %[temp13], 3                  \n\t"
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp2],  %[temp2],  3                  \n\t"
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp7],  %[temp7],  3                  \n\t"
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp4],  %[temp4],  3                  \n\t"
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addiu    %[temp6],  $zero,     255                \n\t"
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp1],  0(%[dst])                     \n\t"
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp1],  %[temp1],  %[temp5]           \n\t"
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp5],  %[temp1],  8                  \n\t"
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp1],  31                 \n\t"
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp5],  1f                            \n\t"
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp1],  %[temp1],  %[temp1]           \n\t"
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp1],  %[temp6],  %[temp18]          \n\t"
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "1:                                                  \n\t"
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp18], 1(%[dst])                     \n\t"
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp1],  0(%[dst])                     \n\t"
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp18], %[temp18], %[temp11]          \n\t"
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp11], %[temp18], 8                  \n\t"
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp18], 31                 \n\t"
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp11], 2f                            \n\t"
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp18], %[temp18], %[temp18]          \n\t"
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp18], %[temp6],  %[temp1]           \n\t"
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "2:                                                  \n\t"
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp1],  2(%[dst])                     \n\t"
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp18], 1(%[dst])                     \n\t"
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp1],  %[temp1],  %[temp8]           \n\t"
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp8],  %[temp1],  8                  \n\t"
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp1],  31                 \n\t"
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp8],  3f                            \n\t"
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp1],  %[temp1],  %[temp1]           \n\t"
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp1],  %[temp6],  %[temp18]          \n\t"
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "3:                                                  \n\t"
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp18], 3(%[dst])                     \n\t"
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp1],  2(%[dst])                     \n\t"
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp18], %[temp18], %[temp16]          \n\t"
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp16], %[temp18], 8                  \n\t"
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp18], 31                 \n\t"
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp16], 4f                            \n\t"
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp18], %[temp18], %[temp18]          \n\t"
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp18], %[temp6],  %[temp1]           \n\t"
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "4:                                                  \n\t"
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp18], 3(%[dst])                     \n\t"
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp5],  32(%[dst])                    \n\t"
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp8],  33(%[dst])                    \n\t"
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp11], 34(%[dst])                    \n\t"
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp16], 35(%[dst])                    \n\t"
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp5],  %[temp5],  %[temp17]          \n\t"
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp8],  %[temp8],  %[temp15]          \n\t"
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp11], %[temp11], %[temp12]          \n\t"
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp16], %[temp10]          \n\t"
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp5],  8                  \n\t"
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp5],  31                 \n\t"
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp18], 5f                            \n\t"
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp5],  %[temp5],  %[temp5]           \n\t"
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp5],  %[temp6],  %[temp1]           \n\t"
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "5:                                                  \n\t"
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp8],  8                  \n\t"
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp8],  31                 \n\t"
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp18], 6f                            \n\t"
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp8],  %[temp8],  %[temp8]           \n\t"
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp8],  %[temp6],  %[temp1]           \n\t"
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "6:                                                  \n\t"
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp11], 8                  \n\t"
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp11], 31                 \n\t"
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp16], 8                  \n\t"
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp15], %[temp16], 31                 \n\t"
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp18], 7f                            \n\t"
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp11], %[temp11], %[temp11]          \n\t"
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp11], %[temp6],  %[temp1]           \n\t"
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "7:                                                  \n\t"
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp17], 8f                            \n\t"
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp16], %[temp16], %[temp16]          \n\t"
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp16], %[temp6],  %[temp15]          \n\t"
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "8:                                                  \n\t"
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp5],  32(%[dst])                    \n\t"
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp8],  33(%[dst])                    \n\t"
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp11], 34(%[dst])                    \n\t"
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp16], 35(%[dst])                    \n\t"
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp5],  64(%[dst])                    \n\t"
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp8],  65(%[dst])                    \n\t"
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp11], 66(%[dst])                    \n\t"
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp16], 67(%[dst])                    \n\t"
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp5],  %[temp5],  %[temp9]           \n\t"
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp8],  %[temp8],  %[temp3]           \n\t"
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp11], %[temp11], %[temp0]           \n\t"
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp16], %[temp14]          \n\t"
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp5],  8                  \n\t"
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp5],  31                 \n\t"
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp8],  8                  \n\t"
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp15], %[temp8],  31                 \n\t"
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp12], %[temp11], 8                  \n\t"
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp10], %[temp11], 31                 \n\t"
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp9],  %[temp16], 8                  \n\t"
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp3],  %[temp16], 31                 \n\t"
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp18], 9f                            \n\t"
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp5],  %[temp5],  %[temp5]           \n\t"
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp5],  %[temp6],  %[temp1]           \n\t"
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "9:                                                  \n\t"
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp17], 10f                           \n\t"
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp8],  %[temp8],  %[temp8]           \n\t"
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp8],  %[temp6],  %[temp15]          \n\t"
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "10:                                                 \n\t"
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp12], 11f                           \n\t"
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp11], %[temp11], %[temp11]          \n\t"
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp11], %[temp6],  %[temp10]          \n\t"
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "11:                                                 \n\t"
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp9],  12f                           \n\t"
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp16], %[temp16], %[temp16]          \n\t"
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp16], %[temp6],  %[temp3]           \n\t"
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "12:                                                 \n\t"
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp5],  64(%[dst])                    \n\t"
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp8],  65(%[dst])                    \n\t"
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp11], 66(%[dst])                    \n\t"
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp16], 67(%[dst])                    \n\t"
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp5],  96(%[dst])                    \n\t"
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp8],  97(%[dst])                    \n\t"
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp11], 98(%[dst])                    \n\t"
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "lbu      %[temp16], 99(%[dst])                    \n\t"
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp5],  %[temp5],  %[temp13]          \n\t"
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp8],  %[temp8],  %[temp7]           \n\t"
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp11], %[temp11], %[temp4]           \n\t"
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "addu     %[temp16], %[temp16], %[temp2]           \n\t"
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp18], %[temp5],  8                  \n\t"
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp1],  %[temp5],  31                 \n\t"
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp17], %[temp8],  8                  \n\t"
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp15], %[temp8],  31                 \n\t"
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp12], %[temp11], 8                  \n\t"
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp10], %[temp11], 31                 \n\t"
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp9],  %[temp16], 8                  \n\t"
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sra      %[temp3],  %[temp16], 31                 \n\t"
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp18], 13f                           \n\t"
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp5],  %[temp5],  %[temp5]           \n\t"
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp5],  %[temp6],  %[temp1]           \n\t"
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "13:                                                 \n\t"
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp17], 14f                           \n\t"
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp8],  %[temp8],  %[temp8]           \n\t"
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp8],  %[temp6],  %[temp15]          \n\t"
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "14:                                                 \n\t"
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp12], 15f                           \n\t"
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp11], %[temp11], %[temp11]          \n\t"
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp11], %[temp6],  %[temp10]          \n\t"
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "15:                                                 \n\t"
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "beqz     %[temp9],  16f                           \n\t"
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "xor      %[temp16], %[temp16], %[temp16]          \n\t"
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "movz     %[temp16], %[temp6],  %[temp3]           \n\t"
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  "16:                                                 \n\t"
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp5],  96(%[dst])                    \n\t"
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp8],  97(%[dst])                    \n\t"
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp11], 98(%[dst])                    \n\t"
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "sb       %[temp16], 99(%[dst])                    \n\t"
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2),
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5),
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8),
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11),
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      [temp12]"=&r"(temp12), [temp13]"=&r"(temp13), [temp14]"=&r"(temp14),
5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      [temp15]"=&r"(temp15), [temp16]"=&r"(temp16), [temp17]"=&r"(temp17),
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      [temp18]"=&r"(temp18)
5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : [in]"r"(p_in), [kC1]"r"(kC1), [kC2]"r"(kC2), [dst]"r"(dst)
5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : "memory", "hi", "lo"
5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  );
5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void TransformTwo(const int16_t* in, uint8_t* dst, int do_two) {
5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TransformOne(in, dst);
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (do_two) {
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TransformOne(in + 16, dst + 4);
5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // WEBP_USE_MIPS32
5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//------------------------------------------------------------------------------
5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Entry point
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)extern void VP8DspInitMIPS32(void);
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VP8DspInitMIPS32(void) {
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(WEBP_USE_MIPS32)
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8InitClipTables();
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8Transform = TransformTwo;
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8VFilter16 = VFilter16;
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8HFilter16 = HFilter16;
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8VFilter8 = VFilter8;
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8HFilter8 = HFilter8;
5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8VFilter16i = VFilter16i;
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8HFilter16i = HFilter16i;
5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8VFilter8i = VFilter8i;
5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8HFilter8i = HFilter8i;
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8SimpleVFilter16 = SimpleVFilter16;
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8SimpleHFilter16 = SimpleHFilter16;
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8SimpleVFilter16i = SimpleVFilter16i;
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VP8SimpleHFilter16i = SimpleHFilter16i;
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // WEBP_USE_MIPS32
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
579