blob: 362fd1cfcc02cf1aca32859a8522731e6ecc7b34 [file] [log] [blame]
/*
* Copyright 2011 The LibYuv Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "libyuv/row.h"
#include <string.h> // For memcpy and memset.
#include "libyuv/basic_types.h"
#ifdef __cplusplus
namespace libyuv {
extern "C" {
#endif
// This module is for Mips MMI.
#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A)
// clang-format off
void RGB24ToARGBRow_MMI(const uint8_t* src_rgb24,
uint8_t* dst_argb,
int width) {
uint64_t src0, src1, dest;
const uint64_t mask = 0xff000000ULL;
__asm__ volatile(
"1: \n\t"
"gslwlc1 %[src0], 0x03(%[src_ptr]) \n\t"
"gslwrc1 %[src0], 0x00(%[src_ptr]) \n\t"
"gslwlc1 %[src1], 0x06(%[src_ptr]) \n\t"
"gslwrc1 %[src1], 0x03(%[src_ptr]) \n\t"
"or %[src0], %[src0], %[mask] \n\t"
"or %[src1], %[src1], %[mask] \n\t"
"punpcklwd %[dest], %[src0], %[src1] \n\t"
"gssdlc1 %[dest], 0x07(%[dst_ptr]) \n\t"
"gssdrc1 %[dest], 0x00(%[dst_ptr]) \n\t"
"gslwlc1 %[src0], 0x09(%[src_ptr]) \n\t"
"gslwrc1 %[src0], 0x06(%[src_ptr]) \n\t"
"gslwlc1 %[src1], 0x0c(%[src_ptr]) \n\t"
"gslwrc1 %[src1], 0x09(%[src_ptr]) \n\t"
"or %[src0], %[src0], %[mask] \n\t"
"or %[src1], %[src1], %[mask] \n\t"
"punpcklwd %[dest], %[src0], %[src1] \n\t"
"gssdlc1 %[dest], 0x0f(%[dst_ptr]) \n\t"
"gssdrc1 %[dest], 0x08(%[dst_ptr]) \n\t"
"daddiu %[src_ptr], %[src_ptr], 0x0c \n\t"
"daddiu %[dst_ptr], %[dst_ptr], 0x10 \n\t"
"daddi %[width], %[width], -0x04 \n\t"
"bnez %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [dest] "=&f"(dest)
: [src_ptr] "r"(src_rgb24), [dst_ptr] "r"(dst_argb), [width] "r"(width),
[mask] "f"(mask)
: "memory");
}
void RAWToARGBRow_MMI(const uint8_t* src_raw, uint8_t* dst_argb, int width) {
uint64_t src0, src1, dest;
const uint64_t mask0 = 0x0;
const uint64_t mask1 = 0xff000000ULL;
const uint64_t mask2 = 0xc6;
__asm__ volatile(
"1: \n\t"
"gslwlc1 %[src0], 0x03(%[src_ptr]) \n\t"
"gslwrc1 %[src0], 0x00(%[src_ptr]) \n\t"
"gslwlc1 %[src1], 0x06(%[src_ptr]) \n\t"
"gslwrc1 %[src1], 0x03(%[src_ptr]) \n\t"
"or %[src0], %[src0], %[mask1] \n\t"
"punpcklbh %[src0], %[src0], %[mask0] \n\t"
"pshufh %[src0], %[src0], %[mask2] \n\t"
"or %[src1], %[src1], %[mask1] \n\t"
"punpcklbh %[src1], %[src1], %[mask0] \n\t"
"pshufh %[src1], %[src1], %[mask2] \n\t"
"packushb %[dest], %[src0], %[src1] \n\t"
"gssdlc1 %[dest], 0x07(%[dst_ptr]) \n\t"
"gssdrc1 %[dest], 0x00(%[dst_ptr]) \n\t"
"gslwlc1 %[src0], 0x09(%[src_ptr]) \n\t"
"gslwrc1 %[src0], 0x06(%[src_ptr]) \n\t"
"gslwlc1 %[src1], 0x0c(%[src_ptr]) \n\t"
"gslwrc1 %[src1], 0x09(%[src_ptr]) \n\t"
"or %[src0], %[src0], %[mask1] \n\t"
"punpcklbh %[src0], %[src0], %[mask0] \n\t"
"pshufh %[src0], %[src0], %[mask2] \n\t"
"or %[src1], %[src1], %[mask1] \n\t"
"punpcklbh %[src1], %[src1], %[mask0] \n\t"
"pshufh %[src1], %[src1], %[mask2] \n\t"
"packushb %[dest], %[src0], %[src1] \n\t"
"gssdlc1 %[dest], 0x0f(%[dst_ptr]) \n\t"
"gssdrc1 %[dest], 0x08(%[dst_ptr]) \n\t"
"daddiu %[src_ptr], %[src_ptr], 0x0c \n\t"
"daddiu %[dst_ptr], %[dst_ptr], 0x10 \n\t"
"daddi %[width], %[width], -0x04 \n\t"
"bnez %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [dest] "=&f"(dest)
: [src_ptr] "r"(src_raw), [dst_ptr] "r"(dst_argb), [mask0] "f"(mask0),
[mask1] "f"(mask1), [mask2] "f"(mask2), [width] "r"(width)
: "memory");
}
void RAWToRGB24Row_MMI(const uint8_t* src_raw, uint8_t* dst_rgb24, int width) {
uint64_t src0, src1;
uint64_t ftmp[4];
uint64_t mask0 = 0xc6;
uint64_t mask1 = 0x6c;
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_raw]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_raw]) \n\t"
"gslwrc1 %[src1], 0x08(%[src_raw]) \n\t"
"gslwlc1 %[src1], 0x0b(%[src_raw]) \n\t"
"punpcklbh %[ftmp0], %[src0], %[zero] \n\t"
"pshufh %[ftmp0], %[ftmp0], %[mask0] \n\t"
"punpckhbh %[ftmp1], %[src0], %[zero] \n\t"
"punpcklbh %[src1], %[src1], %[zero] \n\t"
"pextrh %[ftmp2], %[ftmp0], %[three] \n\t"
"pextrh %[ftmp3], %[ftmp1], %[one] \n\t"
"pinsrh_3 %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
"pextrh %[ftmp3], %[ftmp1], %[two] \n\t"
"pinsrh_1 %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
"pshufh %[src1], %[src1], %[mask1] \n\t"
"pextrh %[ftmp2], %[src1], %[zero] \n\t"
"pinsrh_2 %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
"pinsrh_0 %[src1], %[src1], %[ftmp3] \n\t"
"packushb %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
"packushb %[src1], %[src1], %[zero] \n\t"
"gssdrc1 %[ftmp0], 0x00(%[dst_rgb24]) \n\t"
"gssdlc1 %[ftmp0], 0x07(%[dst_rgb24]) \n\t"
"gsswrc1 %[src1], 0x08(%[dst_rgb24]) \n\t"
"gsswlc1 %[src1], 0x0b(%[dst_rgb24]) \n\t"
"daddiu %[src_raw], %[src_raw], 0x0c \n\t"
"daddiu %[dst_rgb24], %[dst_rgb24], 0x0c \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [ftmp0] "=&f"(ftmp[0]),
[ftmp1] "=&f"(ftmp[1]), [ftmp2] "=&f"(ftmp[2]), [ftmp3] "=&f"(ftmp[3])
: [src_raw] "r"(src_raw), [dst_rgb24] "r"(dst_rgb24), [width] "r"(width),
[mask0] "f"(mask0), [mask1] "f"(mask1), [zero] "f"(0x00),
[one] "f"(0x01), [two] "f"(0x02), [three] "f"(0x03)
: "memory");
}
void RGB565ToARGBRow_MMI(const uint8_t* src_rgb565,
uint8_t* dst_argb,
int width) {
uint64_t ftmp[5];
uint64_t c0 = 0x001f001f001f001f;
uint64_t c1 = 0x00ff00ff00ff00ff;
uint64_t c2 = 0x0007000700070007;
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb565]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb565]) \n\t"
"psrlh %[src1], %[src0], %[eight] \n\t"
"and %[b], %[src0], %[c0] \n\t"
"and %[src0], %[src0], %[c1] \n\t"
"psrlh %[src0], %[src0], %[five] \n\t"
"and %[g], %[src1], %[c2] \n\t"
"psllh %[g], %[g], %[three] \n\t"
"or %[g], %[src0], %[g] \n\t"
"psrlh %[r], %[src1], %[three] \n\t"
"psllh %[src0], %[b], %[three] \n\t"
"psrlh %[src1], %[b], %[two] \n\t"
"or %[b], %[src0], %[src1] \n\t"
"psllh %[src0], %[g], %[two] \n\t"
"psrlh %[src1], %[g], %[four] \n\t"
"or %[g], %[src0], %[src1] \n\t"
"psllh %[src0], %[r], %[three] \n\t"
"psrlh %[src1], %[r], %[two] \n\t"
"or %[r], %[src0], %[src1] \n\t"
"packushb %[b], %[b], %[r] \n\t"
"packushb %[g], %[g], %[c1] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklhw %[r], %[src0], %[src1] \n\t"
"gssdrc1 %[r], 0x00(%[dst_argb]) \n\t"
"gssdlc1 %[r], 0x07(%[dst_argb]) \n\t"
"punpckhhw %[r], %[src0], %[src1] \n\t"
"gssdrc1 %[r], 0x08(%[dst_argb]) \n\t"
"gssdlc1 %[r], 0x0f(%[dst_argb]) \n\t"
"daddiu %[src_rgb565], %[src_rgb565], 0x08 \n\t"
"daddiu %[dst_argb], %[dst_argb], 0x10 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(ftmp[0]), [src1] "=&f"(ftmp[1]), [b] "=&f"(ftmp[2]),
[g] "=&f"(ftmp[3]), [r] "=&f"(ftmp[4])
: [src_rgb565] "r"(src_rgb565), [dst_argb] "r"(dst_argb),
[width] "r"(width), [c0] "f"(c0), [c1] "f"(c1), [c2] "f"(c2),
[eight] "f"(0x08), [five] "f"(0x05), [three] "f"(0x03), [two] "f"(0x02),
[four] "f"(0x04)
: "memory");
}
void ARGB1555ToARGBRow_MMI(const uint8_t* src_argb1555,
uint8_t* dst_argb,
int width) {
uint64_t ftmp[6];
uint64_t c0 = 0x001f001f001f001f;
uint64_t c1 = 0x00ff00ff00ff00ff;
uint64_t c2 = 0x0003000300030003;
uint64_t c3 = 0x007c007c007c007c;
uint64_t c4 = 0x0001000100010001;
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb1555]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb1555]) \n\t"
"psrlh %[src1], %[src0], %[eight] \n\t"
"and %[b], %[src0], %[c0] \n\t"
"and %[src0], %[src0], %[c1] \n\t"
"psrlh %[src0], %[src0], %[five] \n\t"
"and %[g], %[src1], %[c2] \n\t"
"psllh %[g], %[g], %[three] \n\t"
"or %[g], %[src0], %[g] \n\t"
"and %[r], %[src1], %[c3] \n\t"
"psrlh %[r], %[r], %[two] \n\t"
"psrlh %[a], %[src1], %[seven] \n\t"
"psllh %[src0], %[b], %[three] \n\t"
"psrlh %[src1], %[b], %[two] \n\t"
"or %[b], %[src0], %[src1] \n\t"
"psllh %[src0], %[g], %[three] \n\t"
"psrlh %[src1], %[g], %[two] \n\t"
"or %[g], %[src0], %[src1] \n\t"
"psllh %[src0], %[r], %[three] \n\t"
"psrlh %[src1], %[r], %[two] \n\t"
"or %[r], %[src0], %[src1] \n\t"
"xor %[a], %[a], %[c1] \n\t"
"paddb %[a], %[a], %[c4] \n\t"
"packushb %[b], %[b], %[r] \n\t"
"packushb %[g], %[g], %[a] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklhw %[r], %[src0], %[src1] \n\t"
"gssdrc1 %[r], 0x00(%[dst_argb]) \n\t"
"gssdlc1 %[r], 0x07(%[dst_argb]) \n\t"
"punpckhhw %[r], %[src0], %[src1] \n\t"
"gssdrc1 %[r], 0x08(%[dst_argb]) \n\t"
"gssdlc1 %[r], 0x0f(%[dst_argb]) \n\t"
"daddiu %[src_argb1555], %[src_argb1555], 0x08 \n\t"
"daddiu %[dst_argb], %[dst_argb], 0x10 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(ftmp[0]), [src1] "=&f"(ftmp[1]), [b] "=&f"(ftmp[2]),
[g] "=&f"(ftmp[3]), [r] "=&f"(ftmp[4]), [a] "=&f"(ftmp[5])
: [src_argb1555] "r"(src_argb1555), [dst_argb] "r"(dst_argb),
[width] "r"(width), [c0] "f"(c0), [c1] "f"(c1), [c2] "f"(c2),
[c3] "f"(c3), [c4] "f"(c4), [eight] "f"(0x08), [five] "f"(0x05),
[three] "f"(0x03), [two] "f"(0x02), [seven] "f"(0x07)
: "memory");
}
void ARGB4444ToARGBRow_MMI(const uint8_t* src_argb4444,
uint8_t* dst_argb,
int width) {
uint64_t ftmp[6];
uint64_t c0 = 0x000f000f000f000f;
uint64_t c1 = 0x00ff00ff00ff00ff;
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb4444]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb4444]) \n\t"
"psrlh %[src1], %[src0], %[eight] \n\t"
"and %[b], %[src0], %[c0] \n\t"
"and %[src0], %[src0], %[c1] \n\t"
"psrlh %[g], %[src0], %[four] \n\t"
"and %[r], %[src1], %[c0] \n\t"
"psrlh %[a], %[src1], %[four] \n\t"
"psllh %[src0], %[b], %[four] \n\t"
"or %[b], %[src0], %[b] \n\t"
"psllh %[src0], %[g], %[four] \n\t"
"or %[g], %[src0], %[g] \n\t"
"psllh %[src0], %[r], %[four] \n\t"
"or %[r], %[src0], %[r] \n\t"
"psllh %[src0], %[a], %[four] \n\t"
"or %[a], %[src0], %[a] \n\t"
"packushb %[b], %[b], %[r] \n\t"
"packushb %[g], %[g], %[a] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklhw %[r], %[src0], %[src1] \n\t"
"gssdrc1 %[r], 0x00(%[dst_argb]) \n\t"
"gssdlc1 %[r], 0x07(%[dst_argb]) \n\t"
"punpckhhw %[r], %[src0], %[src1] \n\t"
"gssdrc1 %[r], 0x08(%[dst_argb]) \n\t"
"gssdlc1 %[r], 0x0f(%[dst_argb]) \n\t"
"daddiu %[src_argb4444], %[src_argb4444], 0x08 \n\t"
"daddiu %[dst_argb], %[dst_argb], 0x10 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(ftmp[0]), [src1] "=&f"(ftmp[1]), [b] "=&f"(ftmp[2]),
[g] "=&f"(ftmp[3]), [r] "=&f"(ftmp[4]), [a] "=&f"(ftmp[5])
: [src_argb4444] "r"(src_argb4444), [dst_argb] "r"(dst_argb),
[width] "r"(width), [c0] "f"(c0), [c1] "f"(c1), [eight] "f"(0x08),
[four] "f"(0x04)
: "memory");
}
void ARGBToRGB24Row_MMI(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
uint64_t src;
__asm__ volatile(
"1: \n\t"
"gslwlc1 %[src], 0x03(%[src_ptr]) \n\t"
"gslwrc1 %[src], 0x00(%[src_ptr]) \n\t"
"gsswlc1 %[src], 0x03(%[dst_ptr]) \n\t"
"gsswrc1 %[src], 0x00(%[dst_ptr]) \n\t"
"gslwlc1 %[src], 0x07(%[src_ptr]) \n\t"
"gslwrc1 %[src], 0x04(%[src_ptr]) \n\t"
"gsswlc1 %[src], 0x06(%[dst_ptr]) \n\t"
"gsswrc1 %[src], 0x03(%[dst_ptr]) \n\t"
"gslwlc1 %[src], 0x0b(%[src_ptr]) \n\t"
"gslwrc1 %[src], 0x08(%[src_ptr]) \n\t"
"gsswlc1 %[src], 0x09(%[dst_ptr]) \n\t"
"gsswrc1 %[src], 0x06(%[dst_ptr]) \n\t"
"gslwlc1 %[src], 0x0f(%[src_ptr]) \n\t"
"gslwrc1 %[src], 0x0c(%[src_ptr]) \n\t"
"gsswlc1 %[src], 0x0c(%[dst_ptr]) \n\t"
"gsswrc1 %[src], 0x09(%[dst_ptr]) \n\t"
"daddiu %[src_ptr], %[src_ptr], 0x10 \n\t"
"daddiu %[dst_ptr], %[dst_ptr], 0x0c \n\t"
"daddi %[width], %[width], -0x04 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src)
: [src_ptr] "r"(src_argb), [dst_ptr] "r"(dst_rgb), [width] "r"(width)
: "memory");
}
void ARGBToRAWRow_MMI(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
uint64_t src0, src1;
uint64_t ftmp[3];
uint64_t mask0 = 0xc6;
uint64_t mask1 = 0x18;
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_argb]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_argb]) \n\t"
"punpcklbh %[ftmp0], %[src0], %[zero] \n\t"
"pshufh %[ftmp0], %[ftmp0], %[mask0] \n\t"
"punpckhbh %[ftmp1], %[src0], %[zero] \n\t"
"punpcklbh %[ftmp2], %[src1], %[zero] \n\t"
"punpckhbh %[src1], %[src1], %[zero] \n\t"
"pextrh %[src0], %[ftmp1], %[two] \n\t"
"pinsrh_3 %[ftmp0], %[ftmp0], %[src0] \n\t"
"pshufh %[ftmp1], %[ftmp1], %[one] \n\t"
"pextrh %[src0], %[ftmp2], %[two] \n\t"
"pinsrh_2 %[ftmp1], %[ftmp1], %[src0] \n\t"
"pextrh %[src0], %[ftmp2], %[one] \n\t"
"pinsrh_3 %[ftmp1], %[ftmp1], %[src0] \n\t"
"pextrh %[src0], %[ftmp2], %[zero] \n\t"
"pshufh %[src1], %[src1], %[mask1] \n\t"
"pinsrh_0 %[src1], %[src1], %[src0] \n\t"
"packushb %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
"packushb %[src1], %[src1], %[zero] \n\t"
"gssdrc1 %[ftmp0], 0x00(%[dst_rgb]) \n\t"
"gssdlc1 %[ftmp0], 0x07(%[dst_rgb]) \n\t"
"gsswrc1 %[src1], 0x08(%[dst_rgb]) \n\t"
"gsswlc1 %[src1], 0x0b(%[dst_rgb]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x10 \n\t"
"daddiu %[dst_rgb], %[dst_rgb], 0x0c \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [ftmp0] "=&f"(ftmp[0]),
[ftmp1] "=&f"(ftmp[1]), [ftmp2] "=&f"(ftmp[2])
: [src_argb] "r"(src_argb), [dst_rgb] "r"(dst_rgb), [width] "r"(width),
[mask0] "f"(mask0), [mask1] "f"(mask1), [zero] "f"(0x00),
[one] "f"(0x01), [two] "f"(0x02)
: "memory");
}
void ARGBToRGB565Row_MMI(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
uint64_t src0, src1;
uint64_t ftmp[3];
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_argb]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_argb]) \n\t"
"punpcklbh %[b], %[src0], %[src1] \n\t"
"punpckhbh %[g], %[src0], %[src1] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklbh %[b], %[src0], %[zero] \n\t"
"punpckhbh %[g], %[src0], %[zero] \n\t"
"punpcklbh %[r], %[src1], %[zero] \n\t"
"psrlh %[b], %[b], %[three] \n\t"
"psrlh %[g], %[g], %[two] \n\t"
"psrlh %[r], %[r], %[three] \n\t"
"psllh %[g], %[g], %[five] \n\t"
"psllh %[r], %[r], %[eleven] \n\t"
"or %[b], %[b], %[g] \n\t"
"or %[b], %[b], %[r] \n\t"
"gssdrc1 %[b], 0x00(%[dst_rgb]) \n\t"
"gssdlc1 %[b], 0x07(%[dst_rgb]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x10 \n\t"
"daddiu %[dst_rgb], %[dst_rgb], 0x08 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [b] "=&f"(ftmp[0]),
[g] "=&f"(ftmp[1]), [r] "=&f"(ftmp[2])
: [src_argb] "r"(src_argb), [dst_rgb] "r"(dst_rgb), [width] "r"(width),
[zero] "f"(0x00), [two] "f"(0x02), [three] "f"(0x03), [five] "f"(0x05),
[eleven] "f"(0x0b)
: "memory");
}
// dither4 is a row of 4 values from 4x4 dither matrix.
// The 4x4 matrix contains values to increase RGB. When converting to
// fewer bits (565) this provides an ordered dither.
// The order in the 4x4 matrix in first byte is upper left.
// The 4 values are passed as an int, then referenced as an array, so
// endian will not affect order of the original matrix. But the dither4
// will containing the first pixel in the lower byte for little endian
// or the upper byte for big endian.
void ARGBToRGB565DitherRow_MMI(const uint8_t* src_argb,
uint8_t* dst_rgb,
const uint32_t dither4,
int width) {
uint64_t src0, src1;
uint64_t ftmp[3];
uint64_t c0 = 0x00ff00ff00ff00ff;
__asm__ volatile(
"punpcklbh %[dither], %[dither], %[zero] \n\t"
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_argb]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_argb]) \n\t"
"punpcklbh %[b], %[src0], %[src1] \n\t"
"punpckhbh %[g], %[src0], %[src1] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklbh %[b], %[src0], %[zero] \n\t"
"punpckhbh %[g], %[src0], %[zero] \n\t"
"punpcklbh %[r], %[src1], %[zero] \n\t"
"paddh %[b], %[b], %[dither] \n\t"
"paddh %[g], %[g], %[dither] \n\t"
"paddh %[r], %[r], %[dither] \n\t"
"pcmpgth %[src0], %[b], %[c0] \n\t"
"or %[src0], %[src0], %[b] \n\t"
"and %[b], %[src0], %[c0] \n\t"
"pcmpgth %[src0], %[g], %[c0] \n\t"
"or %[src0], %[src0], %[g] \n\t"
"and %[g], %[src0], %[c0] \n\t"
"pcmpgth %[src0], %[r], %[c0] \n\t"
"or %[src0], %[src0], %[r] \n\t"
"and %[r], %[src0], %[c0] \n\t"
"psrlh %[b], %[b], %[three] \n\t"
"psrlh %[g], %[g], %[two] \n\t"
"psrlh %[r], %[r], %[three] \n\t"
"psllh %[g], %[g], %[five] \n\t"
"psllh %[r], %[r], %[eleven] \n\t"
"or %[b], %[b], %[g] \n\t"
"or %[b], %[b], %[r] \n\t"
"gssdrc1 %[b], 0x00(%[dst_rgb]) \n\t"
"gssdlc1 %[b], 0x07(%[dst_rgb]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x10 \n\t"
"daddiu %[dst_rgb], %[dst_rgb], 0x08 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [b] "=&f"(ftmp[0]),
[g] "=&f"(ftmp[1]), [r] "=&f"(ftmp[2])
: [src_argb] "r"(src_argb), [dst_rgb] "r"(dst_rgb), [width] "r"(width),
[dither] "f"(dither4), [c0] "f"(c0), [zero] "f"(0x00), [two] "f"(0x02),
[three] "f"(0x03), [five] "f"(0x05), [eleven] "f"(0x0b)
: "memory");
}
void ARGBToARGB1555Row_MMI(const uint8_t* src_argb,
uint8_t* dst_rgb,
int width) {
uint64_t src0, src1;
uint64_t ftmp[4];
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_argb]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_argb]) \n\t"
"punpcklbh %[b], %[src0], %[src1] \n\t"
"punpckhbh %[g], %[src0], %[src1] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklbh %[b], %[src0], %[zero] \n\t"
"punpckhbh %[g], %[src0], %[zero] \n\t"
"punpcklbh %[r], %[src1], %[zero] \n\t"
"punpckhbh %[a], %[src1], %[zero] \n\t"
"psrlh %[b], %[b], %[three] \n\t"
"psrlh %[g], %[g], %[three] \n\t"
"psrlh %[r], %[r], %[three] \n\t"
"psrlh %[a], %[a], %[seven] \n\t"
"psllh %[g], %[g], %[five] \n\t"
"psllh %[r], %[r], %[ten] \n\t"
"psllh %[a], %[a], %[fifteen] \n\t"
"or %[b], %[b], %[g] \n\t"
"or %[b], %[b], %[r] \n\t"
"or %[b], %[b], %[a] \n\t"
"gssdrc1 %[b], 0x00(%[dst_rgb]) \n\t"
"gssdlc1 %[b], 0x07(%[dst_rgb]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x10 \n\t"
"daddiu %[dst_rgb], %[dst_rgb], 0x08 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [b] "=&f"(ftmp[0]),
[g] "=&f"(ftmp[1]), [r] "=&f"(ftmp[2]), [a] "=&f"(ftmp[3])
: [src_argb] "r"(src_argb), [dst_rgb] "r"(dst_rgb), [width] "r"(width),
[zero] "f"(0x00), [three] "f"(0x03), [five] "f"(0x05),
[seven] "f"(0x07), [ten] "f"(0x0a), [fifteen] "f"(0x0f)
: "memory");
}
void ARGBToARGB4444Row_MMI(const uint8_t* src_argb,
uint8_t* dst_rgb,
int width) {
uint64_t src0, src1;
uint64_t ftmp[4];
__asm__ volatile(
"1: \n\t"
"gsldrc1 %[src0], 0x00(%[src_argb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_argb]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_argb]) \n\t"
"punpcklbh %[b], %[src0], %[src1] \n\t"
"punpckhbh %[g], %[src0], %[src1] \n\t"
"punpcklbh %[src0], %[b], %[g] \n\t"
"punpckhbh %[src1], %[b], %[g] \n\t"
"punpcklbh %[b], %[src0], %[zero] \n\t"
"punpckhbh %[g], %[src0], %[zero] \n\t"
"punpcklbh %[r], %[src1], %[zero] \n\t"
"punpckhbh %[a], %[src1], %[zero] \n\t"
"psrlh %[b], %[b], %[four] \n\t"
"psrlh %[g], %[g], %[four] \n\t"
"psrlh %[r], %[r], %[four] \n\t"
"psrlh %[a], %[a], %[four] \n\t"
"psllh %[g], %[g], %[four] \n\t"
"psllh %[r], %[r], %[eight] \n\t"
"psllh %[a], %[a], %[twelve] \n\t"
"or %[b], %[b], %[g] \n\t"
"or %[b], %[b], %[r] \n\t"
"or %[b], %[b], %[a] \n\t"
"gssdrc1 %[b], 0x00(%[dst_rgb]) \n\t"
"gssdlc1 %[b], 0x07(%[dst_rgb]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x10 \n\t"
"daddiu %[dst_rgb], %[dst_rgb], 0x08 \n\t"
"daddiu %[width], %[width], -0x04 \n\t"
"bgtz %[width], 1b \n\t"
: [src0] "=&f"(src0), [src1] "=&f"(src1), [b] "=&f"(ftmp[0]),
[g] "=&f"(ftmp[1]), [r] "=&f"(ftmp[2]), [a] "=&f"(ftmp[3])
: [src_argb] "r"(src_argb), [dst_rgb] "r"(dst_rgb), [width] "r"(width),
[zero] "f"(0x00), [four] "f"(0x04), [eight] "f"(0x08),
[twelve] "f"(0x0c)
: "memory");
}
void ARGBToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest0, dest1, dest2, dest3;
const uint64_t value = 0x1080;
const uint64_t mask = 0x0001004200810019;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x00(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest0], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[dest0], %[src] \n\t"
"psrlw %[dest0], %[dest0], %[eight] \n\t"
"gsldlc1 %[src], 0x0f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x08(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[dest1], %[src] \n\t"
"psrlw %[dest1], %[dest1], %[eight] \n\t"
"gsldlc1 %[src], 0x17(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x10(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest2], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[dest2], %[src] \n\t"
"psrlw %[dest2], %[dest2], %[eight] \n\t"
"gsldlc1 %[src], 0x1f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x18(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest3], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[dest3], %[src] \n\t"
"psrlw %[dest3], %[dest3], %[eight] \n\t"
"packsswh %[src_lo], %[dest0], %[dest1] \n\t"
"packsswh %[src_hi], %[dest2], %[dest3] \n\t"
"packushb %[dest0], %[src_lo], %[src_hi] \n\t"
"gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t"
"gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x20 \n\t"
"daddiu %[dst_y], %[dst_y], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo),
[dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2),
[dest3] "=&f"(dest3)
: [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width),
[mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08),
[zero] "f"(0x00)
: "memory");
}
void ARGBToUVRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[13];
uint64_t tmp[1];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0013002500380002;
const uint64_t mask_v = 0x00020038002f0009;
__asm__ volatile(
"dli %[tmp0], 0x0001000100010001 \n\t"
"dmtc1 %[tmp0], %[ftmp12] \n\t"
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest0_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest0_u], %[dest0_u], %[value] \n\t"
"pinsrh_3 %[dest0_v], %[src0], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest0_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest0_u], %[src_lo] \n\t"
"psubw %[dest0_u], %[src0], %[src1] \n\t"
"psraw %[dest0_u], %[dest0_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest0_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest0_v], %[src_hi] \n\t"
"psubw %[dest0_v], %[src1], %[src0] \n\t"
"psraw %[dest0_v], %[dest0_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest1_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest1_u], %[dest1_u], %[value] \n\t"
"pinsrh_3 %[dest1_v], %[src0], %[value] \n\t"
"pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t"
"pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest1_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest1_u], %[src_lo] \n\t"
"psubw %[dest1_u], %[src0], %[src1] \n\t"
"psraw %[dest1_u], %[dest1_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest1_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest1_v], %[src_hi] \n\t"
"psubw %[dest1_v], %[src1], %[src0] \n\t"
"psraw %[dest1_v], %[dest1_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest2_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest2_u], %[dest2_u], %[value] \n\t"
"pinsrh_3 %[dest2_v], %[src0], %[value] \n\t"
"pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t"
"pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest2_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest2_u], %[src_lo] \n\t"
"psubw %[dest2_u], %[src0], %[src1] \n\t"
"psraw %[dest2_u], %[dest2_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest2_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest2_v], %[src_hi] \n\t"
"psubw %[dest2_v], %[src1], %[src0] \n\t"
"psraw %[dest2_v], %[dest2_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest3_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest3_u], %[dest3_u], %[value] \n\t"
"pinsrh_3 %[dest3_v], %[src0], %[value] \n\t"
"pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t"
"pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest3_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest3_u], %[src_lo] \n\t"
"psubw %[dest3_u], %[src0], %[src1] \n\t"
"psraw %[dest3_u], %[dest3_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest3_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest3_v], %[src_hi] \n\t"
"psubw %[dest3_v], %[src1], %[src0] \n\t"
"psraw %[dest3_v], %[dest3_v], %[eight] \n\t"
"packsswh %[src0], %[dest0_u], %[dest1_u] \n\t"
"packsswh %[src1], %[dest2_u], %[dest3_u] \n\t"
"packushb %[dest0_u], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_u], 0x07(%[dst_u]) \n\t"
"gssdrc1 %[dest0_u], 0x00(%[dst_u]) \n\t"
"packsswh %[src0], %[dest0_v], %[dest1_v] \n\t"
"packsswh %[src1], %[dest2_v], %[dest3_v] \n\t"
"packushb %[dest0_v], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t"
"gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t"
"daddiu %[src_rgb], %[src_rgb], 0x40 \n\t"
"daddiu %[dst_u], %[dst_u], 0x08 \n\t"
"daddiu %[dst_v], %[dst_v], 0x08 \n\t"
"daddi %[width], %[width], -0x10 \n\t"
"bgtz %[width], 1b \n\t"
: [src_rgb1] "=&r"(src_rgb1), [src0] "=&f"(ftmp[0]),
[src1] "=&f"(ftmp[1]), [src_lo] "=&f"(ftmp[2]), [src_hi] "=&f"(ftmp[3]),
[dest0_u] "=&f"(ftmp[4]), [dest0_v] "=&f"(ftmp[5]),
[dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]),
[dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]),
[dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]),
[ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
: [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb),
[dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width),
[mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value),
[zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01),
[sixteen] "f"(0x10)
: "memory");
}
void BGRAToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest0, dest1, dest2, dest3;
const uint64_t value = 0x1080;
const uint64_t mask = 0x0019008100420001;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x00(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest0], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[dest0], %[src] \n\t"
"psrlw %[dest0], %[dest0], %[eight] \n\t"
"gsldlc1 %[src], 0x0f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x08(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[dest1], %[src] \n\t"
"psrlw %[dest1], %[dest1], %[eight] \n\t"
"gsldlc1 %[src], 0x17(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x10(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest2], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[dest2], %[src] \n\t"
"psrlw %[dest2], %[dest2], %[eight] \n\t"
"gsldlc1 %[src], 0x1f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x18(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest3], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[dest3], %[src] \n\t"
"psrlw %[dest3], %[dest3], %[eight] \n\t"
"packsswh %[src_lo], %[dest0], %[dest1] \n\t"
"packsswh %[src_hi], %[dest2], %[dest3] \n\t"
"packushb %[dest0], %[src_lo], %[src_hi] \n\t"
"gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t"
"gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x20 \n\t"
"daddiu %[dst_y], %[dst_y], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo),
[dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2),
[dest3] "=&f"(dest3)
: [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width),
[mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08),
[zero] "f"(0x00)
: "memory");
}
void BGRAToUVRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[13];
uint64_t tmp[1];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0002003800250013;
const uint64_t mask_v = 0x0009002f00380002;
__asm__ volatile(
"dli %[tmp0], 0x0001000100010001 \n\t"
"dmtc1 %[tmp0], %[ftmp12] \n\t"
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[dest0_u], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest0_u], %[dest0_u], %[value] \n\t"
"pinsrh_0 %[dest0_v], %[src0], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_0 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest0_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest0_u], %[src_lo] \n\t"
"psubw %[dest0_u], %[src1], %[src0] \n\t"
"psraw %[dest0_u], %[dest0_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest0_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest0_v], %[src_hi] \n\t"
"psubw %[dest0_v], %[src0], %[src1] \n\t"
"psraw %[dest0_v], %[dest0_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[dest1_u], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest1_u], %[dest1_u], %[value] \n\t"
"pinsrh_0 %[dest1_v], %[src0], %[value] \n\t"
"pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t"
"pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_0 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest1_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest1_u], %[src_lo] \n\t"
"psubw %[dest1_u], %[src1], %[src0] \n\t"
"psraw %[dest1_u], %[dest1_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest1_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest1_v], %[src_hi] \n\t"
"psubw %[dest1_v], %[src0], %[src1] \n\t"
"psraw %[dest1_v], %[dest1_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[dest2_u], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest2_u], %[dest2_u], %[value] \n\t"
"pinsrh_0 %[dest2_v], %[src0], %[value] \n\t"
"pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t"
"pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_0 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest2_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest2_u], %[src_lo] \n\t"
"psubw %[dest2_u], %[src1], %[src0] \n\t"
"psraw %[dest2_u], %[dest2_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest2_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest2_v], %[src_hi] \n\t"
"psubw %[dest2_v], %[src0], %[src1] \n\t"
"psraw %[dest2_v], %[dest2_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[dest3_u], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest3_u], %[dest3_u], %[value] \n\t"
"pinsrh_0 %[dest3_v], %[src0], %[value] \n\t"
"pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t"
"pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsrl %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_0 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest3_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest3_u], %[src_lo] \n\t"
"psubw %[dest3_u], %[src1], %[src0] \n\t"
"psraw %[dest3_u], %[dest3_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest3_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest3_v], %[src_hi] \n\t"
"psubw %[dest3_v], %[src0], %[src1] \n\t"
"psraw %[dest3_v], %[dest3_v], %[eight] \n\t"
"packsswh %[src0], %[dest0_u], %[dest1_u] \n\t"
"packsswh %[src1], %[dest2_u], %[dest3_u] \n\t"
"packushb %[dest0_u], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_u], 0x07(%[dst_u]) \n\t"
"gssdrc1 %[dest0_u], 0x00(%[dst_u]) \n\t"
"packsswh %[src0], %[dest0_v], %[dest1_v] \n\t"
"packsswh %[src1], %[dest2_v], %[dest3_v] \n\t"
"packushb %[dest0_v], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t"
"gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t"
"daddiu %[src_rgb], %[src_rgb], 0x40 \n\t"
"daddiu %[dst_u], %[dst_u], 0x08 \n\t"
"daddiu %[dst_v], %[dst_v], 0x08 \n\t"
"daddi %[width], %[width], -0x10 \n\t"
"bgtz %[width], 1b \n\t"
: [src_rgb1] "=&r"(src_rgb1), [src0] "=&f"(ftmp[0]),
[src1] "=&f"(ftmp[1]), [src_lo] "=&f"(ftmp[2]), [src_hi] "=&f"(ftmp[3]),
[dest0_u] "=&f"(ftmp[4]), [dest0_v] "=&f"(ftmp[5]),
[dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]),
[dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]),
[dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]),
[ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
: [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb),
[dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width),
[mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value),
[zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01),
[sixteen] "f"(0x10)
: "memory");
}
void ABGRToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest0, dest1, dest2, dest3;
const uint64_t value = 0x1080;
const uint64_t mask = 0x0001001900810042;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x00(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest0], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[dest0], %[src] \n\t"
"psrlw %[dest0], %[dest0], %[eight] \n\t"
"gsldlc1 %[src], 0x0f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x08(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[dest1], %[src] \n\t"
"psrlw %[dest1], %[dest1], %[eight] \n\t"
"gsldlc1 %[src], 0x17(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x10(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest2], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[dest2], %[src] \n\t"
"psrlw %[dest2], %[dest2], %[eight] \n\t"
"gsldlc1 %[src], 0x1f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x18(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest3], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[dest3], %[src] \n\t"
"psrlw %[dest3], %[dest3], %[eight] \n\t"
"packsswh %[src_lo], %[dest0], %[dest1] \n\t"
"packsswh %[src_hi], %[dest2], %[dest3] \n\t"
"packushb %[dest0], %[src_lo], %[src_hi] \n\t"
"gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t"
"gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x20 \n\t"
"daddiu %[dst_y], %[dst_y], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo),
[dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2),
[dest3] "=&f"(dest3)
: [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width),
[mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08),
[zero] "f"(0x00)
: "memory");
}
void ABGRToUVRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[13];
uint64_t tmp[1];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0002003800250013;
const uint64_t mask_v = 0x0009002F00380002;
__asm__ volatile(
"dli %[tmp0], 0x0001000100010001 \n\t"
"dmtc1 %[tmp0], %[ftmp12] \n\t"
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest0_u], %[src0], %[value] \n\t"
"dsll %[dest0_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest0_v], %[dest0_v], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest0_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest0_u], %[src_lo] \n\t"
"psubw %[dest0_u], %[src1], %[src0] \n\t"
"psraw %[dest0_u], %[dest0_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest0_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest0_v], %[src_hi] \n\t"
"psubw %[dest0_v], %[src0], %[src1] \n\t"
"psraw %[dest0_v], %[dest0_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest1_u], %[src0], %[value] \n\t"
"dsll %[dest1_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest1_v], %[dest1_v], %[value] \n\t"
"pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t"
"pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest1_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest1_u], %[src_lo] \n\t"
"psubw %[dest1_u], %[src1], %[src0] \n\t"
"psraw %[dest1_u], %[dest1_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest1_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest1_v], %[src_hi] \n\t"
"psubw %[dest1_v], %[src0], %[src1] \n\t"
"psraw %[dest1_v], %[dest1_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest2_u], %[src0], %[value] \n\t"
"dsll %[dest2_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest2_v], %[dest2_v], %[value] \n\t"
"pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t"
"pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest2_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest2_u], %[src_lo] \n\t"
"psubw %[dest2_u], %[src1], %[src0] \n\t"
"psraw %[dest2_u], %[dest2_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest2_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest2_v], %[src_hi] \n\t"
"psubw %[dest2_v], %[src0], %[src1] \n\t"
"psraw %[dest2_v], %[dest2_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest3_u], %[src0], %[value] \n\t"
"dsll %[dest3_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest3_v], %[dest3_v], %[value] \n\t"
"pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t"
"pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest3_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest3_u], %[src_lo] \n\t"
"psubw %[dest3_u], %[src1], %[src0] \n\t"
"psraw %[dest3_u], %[dest3_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest3_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest3_v], %[src_hi] \n\t"
"psubw %[dest3_v], %[src0], %[src1] \n\t"
"psraw %[dest3_v], %[dest3_v], %[eight] \n\t"
"packsswh %[src0], %[dest0_u], %[dest1_u] \n\t"
"packsswh %[src1], %[dest2_u], %[dest3_u] \n\t"
"packushb %[dest0_u], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_u], 0x07(%[dst_u]) \n\t"
"gssdrc1 %[dest0_u], 0x00(%[dst_u]) \n\t"
"packsswh %[src0], %[dest0_v], %[dest1_v] \n\t"
"packsswh %[src1], %[dest2_v], %[dest3_v] \n\t"
"packushb %[dest0_v], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t"
"gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t"
"daddiu %[src_rgb], %[src_rgb], 0x40 \n\t"
"daddiu %[dst_u], %[dst_u], 0x08 \n\t"
"daddiu %[dst_v], %[dst_v], 0x08 \n\t"
"daddi %[width], %[width], -0x10 \n\t"
"bgtz %[width], 1b \n\t"
: [src_rgb1] "=&r"(src_rgb1), [src0] "=&f"(ftmp[0]),
[src1] "=&f"(ftmp[1]), [src_lo] "=&f"(ftmp[2]), [src_hi] "=&f"(ftmp[3]),
[dest0_u] "=&f"(ftmp[4]), [dest0_v] "=&f"(ftmp[5]),
[dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]),
[dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]),
[dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]),
[ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
: [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb),
[dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width),
[mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value),
[zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01),
[sixteen] "f"(0x10)
: "memory");
}
void RGBAToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest0, dest1, dest2, dest3;
const uint64_t value = 0x1080;
const uint64_t mask = 0x0042008100190001;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x00(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest0], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[dest0], %[src] \n\t"
"psrlw %[dest0], %[dest0], %[eight] \n\t"
"gsldlc1 %[src], 0x0f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x08(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[dest1], %[src] \n\t"
"psrlw %[dest1], %[dest1], %[eight] \n\t"
"gsldlc1 %[src], 0x17(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x10(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest2], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[dest2], %[src] \n\t"
"psrlw %[dest2], %[dest2], %[eight] \n\t"
"gsldlc1 %[src], 0x1f(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x18(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest3], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[dest3], %[src] \n\t"
"psrlw %[dest3], %[dest3], %[eight] \n\t"
"packsswh %[src_lo], %[dest0], %[dest1] \n\t"
"packsswh %[src_hi], %[dest2], %[dest3] \n\t"
"packushb %[dest0], %[src_lo], %[src_hi] \n\t"
"gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t"
"gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x20 \n\t"
"daddiu %[dst_y], %[dst_y], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo),
[dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2),
[dest3] "=&f"(dest3)
: [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width),
[mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08),
[zero] "f"(0x00)
: "memory");
}
void RGBAToUVRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[13];
uint64_t tmp[1];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0013002500380002;
const uint64_t mask_v = 0x00020038002f0009;
__asm__ volatile(
"dli %[tmp0], 0x0001000100010001 \n\t"
"dmtc1 %[tmp0], %[ftmp12] \n\t"
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[dest0_u], %[src0], %[value] \n\t"
"dsrl %[dest0_v], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest0_v], %[dest0_v], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[src_lo], %[src0], %[value] \n\t"
"dsrl %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest0_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest0_u], %[src_lo] \n\t"
"psubw %[dest0_u], %[src0], %[src1] \n\t"
"psraw %[dest0_u], %[dest0_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest0_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest0_v], %[src_hi] \n\t"
"psubw %[dest0_v], %[src1], %[src0] \n\t"
"psraw %[dest0_v], %[dest0_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[dest1_u], %[src0], %[value] \n\t"
"dsrl %[dest1_v], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest1_v], %[dest1_v], %[value] \n\t"
"pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t"
"pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[src_lo], %[src0], %[value] \n\t"
"dsrl %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest1_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest1_u], %[src_lo] \n\t"
"psubw %[dest1_u], %[src0], %[src1] \n\t"
"psraw %[dest1_u], %[dest1_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest1_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest1_v], %[src_hi] \n\t"
"psubw %[dest1_v], %[src1], %[src0] \n\t"
"psraw %[dest1_v], %[dest1_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[dest2_u], %[src0], %[value] \n\t"
"dsrl %[dest2_v], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest2_v], %[dest2_v], %[value] \n\t"
"pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t"
"pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[src_lo], %[src0], %[value] \n\t"
"dsrl %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest2_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest2_u], %[src_lo] \n\t"
"psubw %[dest2_u], %[src0], %[src1] \n\t"
"psraw %[dest2_u], %[dest2_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest2_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest2_v], %[src_hi] \n\t"
"psubw %[dest2_v], %[src1], %[src0] \n\t"
"psraw %[dest2_v], %[dest2_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[dest3_u], %[src0], %[value] \n\t"
"dsrl %[dest3_v], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[dest3_v], %[dest3_v], %[value] \n\t"
"pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t"
"pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_0 %[src_lo], %[src0], %[value] \n\t"
"dsrl %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest3_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest3_u], %[src_lo] \n\t"
"psubw %[dest3_u], %[src0], %[src1] \n\t"
"psraw %[dest3_u], %[dest3_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest3_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest3_v], %[src_hi] \n\t"
"psubw %[dest3_v], %[src1], %[src0] \n\t"
"psraw %[dest3_v], %[dest3_v], %[eight] \n\t"
"packsswh %[src0], %[dest0_u], %[dest1_u] \n\t"
"packsswh %[src1], %[dest2_u], %[dest3_u] \n\t"
"packushb %[dest0_u], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_u], 0x07(%[dst_u]) \n\t"
"gssdrc1 %[dest0_u], 0x00(%[dst_u]) \n\t"
"packsswh %[src0], %[dest0_v], %[dest1_v] \n\t"
"packsswh %[src1], %[dest2_v], %[dest3_v] \n\t"
"packushb %[dest0_v], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t"
"gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t"
"daddiu %[src_rgb], %[src_rgb], 0x40 \n\t"
"daddiu %[dst_u], %[dst_u], 0x08 \n\t"
"daddiu %[dst_v], %[dst_v], 0x08 \n\t"
"daddi %[width], %[width], -0x10 \n\t"
"bgtz %[width], 1b \n\t"
: [src_rgb1] "=&r"(src_rgb1), [src0] "=&f"(ftmp[0]),
[src1] "=&f"(ftmp[1]), [src_lo] "=&f"(ftmp[2]), [src_hi] "=&f"(ftmp[3]),
[dest0_u] "=&f"(ftmp[4]), [dest0_v] "=&f"(ftmp[5]),
[dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]),
[dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]),
[dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]),
[ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
: [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb),
[dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width),
[mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value),
[zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01),
[sixteen] "f"(0x10)
: "memory");
}
void RGB24ToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest0, dest1, dest2, dest3;
const uint64_t value = 0x1080;
const uint64_t mask = 0x0001004200810019;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x00(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest0], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[dest0], %[src] \n\t"
"psrlw %[dest0], %[dest0], %[eight] \n\t"
"gsldlc1 %[src], 0x0d(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x06(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[dest1], %[src] \n\t"
"psrlw %[dest1], %[dest1], %[eight] \n\t"
"gsldlc1 %[src], 0x13(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x0c(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest2], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[dest2], %[src] \n\t"
"psrlw %[dest2], %[dest2], %[eight] \n\t"
"gsldlc1 %[src], 0x19(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x12(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest3], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[dest3], %[src] \n\t"
"psrlw %[dest3], %[dest3], %[eight] \n\t"
"packsswh %[src_lo], %[dest0], %[dest1] \n\t"
"packsswh %[src_hi], %[dest2], %[dest3] \n\t"
"packushb %[dest0], %[src_lo], %[src_hi] \n\t"
"gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t"
"gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x18 \n\t"
"daddiu %[dst_y], %[dst_y], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo),
[dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2),
[dest3] "=&f"(dest3)
: [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width),
[mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08),
[zero] "f"(0x00)
: "memory");
}
void RGB24ToUVRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[13];
uint64_t tmp[1];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0013002500380002;
const uint64_t mask_v = 0x00020038002f0009;
__asm__ volatile(
"dli %[tmp0], 0x0001000100010001 \n\t"
"dmtc1 %[tmp0], %[ftmp12] \n\t"
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest0_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest0_u], %[dest0_u], %[value] \n\t"
"pinsrh_3 %[dest0_v], %[src0], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x06(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0d(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x06(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0d(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest0_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest0_u], %[src_lo] \n\t"
"psubw %[dest0_u], %[src0], %[src1] \n\t"
"psraw %[dest0_u], %[dest0_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest0_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest0_v], %[src_hi] \n\t"
"psubw %[dest0_v], %[src1], %[src0] \n\t"
"psraw %[dest0_v], %[dest0_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x0c(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x13(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x0c(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x13(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest1_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest1_u], %[dest1_u], %[value] \n\t"
"pinsrh_3 %[dest1_v], %[src0], %[value] \n\t"
"pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t"
"pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x12(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x19(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x12(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x19(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest1_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest1_u], %[src_lo] \n\t"
"psubw %[dest1_u], %[src0], %[src1] \n\t"
"psraw %[dest1_u], %[dest1_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest1_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest1_v], %[src_hi] \n\t"
"psubw %[dest1_v], %[src1], %[src0] \n\t"
"psraw %[dest1_v], %[dest1_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest2_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest2_u], %[dest2_u], %[value] \n\t"
"pinsrh_3 %[dest2_v], %[src0], %[value] \n\t"
"pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t"
"pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x1e(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x25(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x1e(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x25(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest2_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest2_u], %[src_lo] \n\t"
"psubw %[dest2_u], %[src0], %[src1] \n\t"
"psraw %[dest2_u], %[dest2_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest2_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest2_v], %[src_hi] \n\t"
"psubw %[dest2_v], %[src1], %[src0] \n\t"
"psraw %[dest2_v], %[dest2_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x24(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x2b(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x24(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x2b(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[dest3_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest3_u], %[dest3_u], %[value] \n\t"
"pinsrh_3 %[dest3_v], %[src0], %[value] \n\t"
"pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t"
"pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x2a(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x31(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x2a(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x31(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest3_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest3_u], %[src_lo] \n\t"
"psubw %[dest3_u], %[src0], %[src1] \n\t"
"psraw %[dest3_u], %[dest3_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest3_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest3_v], %[src_hi] \n\t"
"psubw %[dest3_v], %[src1], %[src0] \n\t"
"psraw %[dest3_v], %[dest3_v], %[eight] \n\t"
"packsswh %[src0], %[dest0_u], %[dest1_u] \n\t"
"packsswh %[src1], %[dest2_u], %[dest3_u] \n\t"
"packushb %[dest0_u], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_u], 0x07(%[dst_u]) \n\t"
"gssdrc1 %[dest0_u], 0x00(%[dst_u]) \n\t"
"packsswh %[src0], %[dest0_v], %[dest1_v] \n\t"
"packsswh %[src1], %[dest2_v], %[dest3_v] \n\t"
"packushb %[dest0_v], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t"
"gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t"
"daddiu %[src_rgb], %[src_rgb], 0x30 \n\t"
"daddiu %[dst_u], %[dst_u], 0x08 \n\t"
"daddiu %[dst_v], %[dst_v], 0x08 \n\t"
"daddi %[width], %[width], -0x10 \n\t"
"bgtz %[width], 1b \n\t"
: [src_rgb1] "=&r"(src_rgb1), [src0] "=&f"(ftmp[0]),
[src1] "=&f"(ftmp[1]), [src_lo] "=&f"(ftmp[2]), [src_hi] "=&f"(ftmp[3]),
[dest0_u] "=&f"(ftmp[4]), [dest0_v] "=&f"(ftmp[5]),
[dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]),
[dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]),
[dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]),
[ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
: [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb),
[dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width),
[mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value),
[zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01),
[sixteen] "f"(0x10)
: "memory");
}
void RAWToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest0, dest1, dest2, dest3;
const uint64_t value = 0x1080;
const uint64_t mask = 0x0001001900810042;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x00(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest0], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[dest0], %[src] \n\t"
"psrlw %[dest0], %[dest0], %[eight] \n\t"
"gsldlc1 %[src], 0x0d(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x06(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[dest1], %[src] \n\t"
"psrlw %[dest1], %[dest1], %[eight] \n\t"
"gsldlc1 %[src], 0x13(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x0c(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest2], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[dest2], %[src] \n\t"
"psrlw %[dest2], %[dest2], %[eight] \n\t"
"gsldlc1 %[src], 0x19(%[src_argb]) \n\t"
"gsldrc1 %[src], 0x12(%[src_argb]) \n\t"
"punpcklbh %[src_lo], %[src], %[zero] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask] \n\t"
"dsll %[src], %[src], %[eight] \n\t"
"punpckhbh %[src_hi], %[src], %[zero] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask] \n\t"
"punpcklwd %[src], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[dest3], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[dest3], %[src] \n\t"
"psrlw %[dest3], %[dest3], %[eight] \n\t"
"packsswh %[src_lo], %[dest0], %[dest1] \n\t"
"packsswh %[src_hi], %[dest2], %[dest3] \n\t"
"packushb %[dest0], %[src_lo], %[src_hi] \n\t"
"gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t"
"gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t"
"daddiu %[src_argb], %[src_argb], 0x18 \n\t"
"daddiu %[dst_y], %[dst_y], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo),
[dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2),
[dest3] "=&f"(dest3)
: [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width),
[mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08),
[zero] "f"(0x00)
: "memory");
}
void RAWToUVRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[13];
uint64_t tmp[1];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0002003800250013;
const uint64_t mask_v = 0x0009002f00380002;
__asm__ volatile(
"dli %[tmp0], 0x0001000100010001 \n\t"
"dmtc1 %[tmp0], %[ftmp12] \n\t"
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest0_u], %[src0], %[value] \n\t"
"dsll %[dest0_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest0_v], %[dest0_v], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x06(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0d(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x06(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0d(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest0_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest0_u], %[src_lo] \n\t"
"psubw %[dest0_u], %[src1], %[src0] \n\t"
"psraw %[dest0_u], %[dest0_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest0_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest0_v], %[src_hi] \n\t"
"psubw %[dest0_v], %[src0], %[src1] \n\t"
"psraw %[dest0_v], %[dest0_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x0c(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x13(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x0c(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x13(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest1_u], %[src0], %[value] \n\t"
"dsll %[dest1_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest1_v], %[dest1_v], %[value] \n\t"
"pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t"
"pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x12(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x19(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x12(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x19(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest1_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest1_u], %[src_lo] \n\t"
"psubw %[dest1_u], %[src1], %[src0] \n\t"
"psraw %[dest1_u], %[dest1_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest1_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest1_v], %[src_hi] \n\t"
"psubw %[dest1_v], %[src0], %[src1] \n\t"
"psraw %[dest1_v], %[dest1_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest2_u], %[src0], %[value] \n\t"
"dsll %[dest2_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest2_v], %[dest2_v], %[value] \n\t"
"pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t"
"pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x1e(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x25(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x1e(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x25(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest2_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest2_u], %[src_lo] \n\t"
"psubw %[dest2_u], %[src1], %[src0] \n\t"
"psraw %[dest2_u], %[dest2_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest2_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest2_v], %[src_hi] \n\t"
"psubw %[dest2_v], %[src0], %[src1] \n\t"
"psraw %[dest2_v], %[dest2_v], %[eight] \n\t"
"gsldrc1 %[src0], 0x24(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x2b(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x24(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x2b(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[dest3_u], %[src0], %[value] \n\t"
"dsll %[dest3_v], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest3_v], %[dest3_v], %[value] \n\t"
"pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t"
"pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x2a(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x31(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x2a(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x31(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"dsll %[src0], %[src0], %[eight] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src_hi] \n\t"
"punpcklbh %[src_lo], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_lo] \n\t"
"dsll %[src1], %[src1], %[eight] \n\t"
"punpckhbh %[src_hi], %[src1], %[zero] \n\t"
"paddh %[src0], %[src0], %[src_hi] \n\t"
"paddh %[src0], %[src0], %[ftmp12] \n\t"
"psrlh %[src0], %[src0], %[one] \n\t"
"pinsrh_3 %[src_lo], %[src0], %[value] \n\t"
"dsll %[src_hi], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"
"punpcklwd %[src0], %[dest3_u], %[src_lo] \n\t"
"punpckhwd %[src1], %[dest3_u], %[src_lo] \n\t"
"psubw %[dest3_u], %[src1], %[src0] \n\t"
"psraw %[dest3_u], %[dest3_u], %[eight] \n\t"
"punpcklwd %[src0], %[dest3_v], %[src_hi] \n\t"
"punpckhwd %[src1], %[dest3_v], %[src_hi] \n\t"
"psubw %[dest3_v], %[src0], %[src1] \n\t"
"psraw %[dest3_v], %[dest3_v], %[eight] \n\t"
"packsswh %[src0], %[dest0_u], %[dest1_u] \n\t"
"packsswh %[src1], %[dest2_u], %[dest3_u] \n\t"
"packushb %[dest0_u], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_u], 0x07(%[dst_u]) \n\t"
"gssdrc1 %[dest0_u], 0x00(%[dst_u]) \n\t"
"packsswh %[src0], %[dest0_v], %[dest1_v] \n\t"
"packsswh %[src1], %[dest2_v], %[dest3_v] \n\t"
"packushb %[dest0_v], %[src0], %[src1] \n\t"
"gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t"
"gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t"
"daddiu %[src_rgb], %[src_rgb], 0x30 \n\t"
"daddiu %[dst_u], %[dst_u], 0x08 \n\t"
"daddiu %[dst_v], %[dst_v], 0x08 \n\t"
"daddi %[width], %[width], -0x10 \n\t"
"bgtz %[width], 1b \n\t"
: [src_rgb1] "=&r"(src_rgb1), [src0] "=&f"(ftmp[0]),
[src1] "=&f"(ftmp[1]), [src_lo] "=&f"(ftmp[2]), [src_hi] "=&f"(ftmp[3]),
[dest0_u] "=&f"(ftmp[4]), [dest0_v] "=&f"(ftmp[5]),
[dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]),
[dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]),
[dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]),
[ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
: [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb),
[dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width),
[mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value),
[zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01),
[sixteen] "f"(0x10)
: "memory");
}
void ARGBToYJRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) {
uint64_t src, src_hi, src_lo;
uint64_t dest, dest0, dest1, dest2, dest3;
uint64_t tmp0, tmp1;
const uint64_t shift = 0x08;
const uint64_t value = 0x80;
const uint64_t mask0 = 0x0;
const uint64_t mask1 = 0x0001004D0096001DULL;
__asm__ volatile(
"1: \n\t"
"gsldlc1 %[src], 0x07(%[src_ptr]) \n\t"
"gsldrc1 %[src], 0x00(%[src_ptr]) \n\t"
"punpcklbh %[src_lo], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask1] \n\t"
"punpckhbh %[src_hi], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask1] \n\t"
"punpcklwd %[tmp0], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[tmp1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest0], %[tmp0], %[tmp1] \n\t"
"psrlw %[dest0], %[dest0], %[shift] \n\t"
"gsldlc1 %[src], 0x0f(%[src_ptr]) \n\t"
"gsldrc1 %[src], 0x08(%[src_ptr]) \n\t"
"punpcklbh %[src_lo], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask1] \n\t"
"punpckhbh %[src_hi], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask1] \n\t"
"punpcklwd %[tmp0], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[tmp1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest1], %[tmp0], %[tmp1] \n\t"
"psrlw %[dest1], %[dest1], %[shift] \n\t"
"gsldlc1 %[src], 0x17(%[src_ptr]) \n\t"
"gsldrc1 %[src], 0x10(%[src_ptr]) \n\t"
"punpcklbh %[src_lo], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask1] \n\t"
"punpckhbh %[src_hi], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask1] \n\t"
"punpcklwd %[tmp0], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[tmp1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest2], %[tmp0], %[tmp1] \n\t"
"psrlw %[dest2], %[dest2], %[shift] \n\t"
"gsldlc1 %[src], 0x1f(%[src_ptr]) \n\t"
"gsldrc1 %[src], 0x18(%[src_ptr]) \n\t"
"punpcklbh %[src_lo], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask1] \n\t"
"punpckhbh %[src_hi], %[src], %[mask0] \n\t"
"pinsrh_3 %[src_hi], %[src_hi], %[value] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask1] \n\t"
"punpcklwd %[tmp0], %[src_lo], %[src_hi] \n\t"
"punpckhwd %[tmp1], %[src_lo], %[src_hi] \n\t"
"paddw %[dest3], %[tmp0], %[tmp1] \n\t"
"psrlw %[dest3], %[dest3], %[shift] \n\t"
"packsswh %[tmp0], %[dest0], %[dest1] \n\t"
"packsswh %[tmp1], %[dest2], %[dest3] \n\t"
"packushb %[dest], %[tmp0], %[tmp1] \n\t"
"gssdlc1 %[dest], 0x07(%[dst_ptr]) \n\t"
"gssdrc1 %[dest], 0x00(%[dst_ptr]) \n\t"
"daddiu %[src_ptr], %[src_ptr], 0x20 \n\t"
"daddiu %[dst_ptr], %[dst_ptr], 0x08 \n\t"
"daddi %[width], %[width], -0x08 \n\t"
"bnez %[width], 1b \n\t"
: [src] "=&f"(src), [dest] "=&f"(dest), [src_hi] "=&f"(src_hi),
[src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1),
[dest2] "=&f"(dest2), [dest3] "=&f"(dest3), [tmp0] "=&f"(tmp0),
[tmp1] "=&f"(tmp1)
: [src_ptr] "r"(src_argb), [dst_ptr] "r"(dst_y), [mask0] "f"(mask0),
[mask1] "f"(mask1), [shift] "f"(shift), [value] "f"(value),
[width] "r"(width)
: "memory");
}
void ARGBToUVJRow_MMI(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
uint64_t src_rgb1;
uint64_t ftmp[12];
const uint64_t value = 0x4040;
const uint64_t mask_u = 0x0015002a003f0002;
const uint64_t mask_v = 0x0002003f0035000a;
__asm__ volatile(
"1: \n\t"
"daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t"
"gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"punpcklbh %[src0], %[src1], %[zero] \n\t"
"punpckhbh %[src1], %[src1], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src0] \n\t"
"paddh %[src1], %[src_hi], %[src1] \n\t"
"pavgh %[src0], %[src0], %[src1] \n\t"
"dsll %[dest0_u], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[dest0_u], %[dest0_u], %[value] \n\t"
"pinsrh_3 %[dest0_v], %[src0], %[value] \n\t"
"pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t"
"pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t"
"gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t"
"gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t"
"gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t"
"gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t"
"punpcklbh %[src_lo], %[src0], %[zero] \n\t"
"punpckhbh %[src_hi], %[src0], %[zero] \n\t"
"punpcklbh %[src0], %[src1], %[zero] \n\t"
"punpckhbh %[src1], %[src1], %[zero] \n\t"
"paddh %[src0], %[src_lo], %[src0] \n\t"
"paddh %[src1], %[src_hi], %[src1] \n\t"
"pavgh %[src0], %[src0], %[src1] \n\t"
"dsll %[src_lo], %[src0], %[sixteen] \n\t"
"pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t"
"pinsrh_3 %[src_hi], %[src0], %[value] \n\t"
"pmaddhw %[src_lo], %[src_lo], %[mask_u] \n\t"
"pmaddhw %[src_hi], %[src_hi], %[mask_v] \n\t"