1632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut/*
2632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut * Copyright 2014 The Android Open Source Project
3632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut *
4632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut * Use of this source code is governed by a BSD-style license that can be
5632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut * found in the LICENSE file.
6632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut */
7632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
8632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#include "SkBlitRow.h"
9632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#include "SkBlitMask.h"
10632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#include "SkColorPriv.h"
11632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#include "SkDither.h"
12632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#include "SkMathPriv.h"
13632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
14632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32_D565_Blend_mips_dsp(uint16_t* SK_RESTRICT dst,
15632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                    const SkPMColor* SK_RESTRICT src, int count,
16632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                    U8CPU alpha, int /*x*/, int /*y*/) {
17632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t t0, t1, t2, t3, t4, t5, t6;
18632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t s0, s1, s2, s4, s5, s6;
19632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
20632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    alpha += 1;
21632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count >= 2) {
22632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        __asm__ volatile (
23632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut           ".set             push                          \n\t"
24632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut           ".set             noreorder                     \n\t"
25632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[s4],    %[alpha], 8         \n\t"
26632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[s4],    %[s4],    %[alpha]  \n\t"
27632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "repl.ph         %[s5],    0x1f                \n\t"
28632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "repl.ph         %[s6],    0x3f                \n\t"
29632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "1:                                                \n\t"
30632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "lw              %[s2],    0(%[src])           \n\t"
31632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "lw              %[s1],    4(%[src])           \n\t"
32632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "lwr             %[s0],    0(%[dst])           \n\t"
33632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "lwl             %[s0],    3(%[dst])           \n\t"
34632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t1],    %[s0],    %[s5]     \n\t"
35632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shra.ph         %[t0],    %[s0],    5         \n\t"
36632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t2],    %[t0],    %[s6]     \n\t"
376336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
38632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.ph         %[t3],    %[s0],    11        \n\t"
39632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
40632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shra.ph         %[t0],    %[s0],    11        \n\t"
41632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t3],    %[t0],    %[s5]     \n\t"
42632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
43632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "precrq.ph.w     %[t0],    %[s1],    %[s2]     \n\t"
44632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.qb         %[t5],    %[t0],    3         \n\t"
45632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t4],    %[t5],    %[s5]     \n\t"
46632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ins             %[s2],    %[s1],    16, 16    \n\t"
47632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "preceu.ph.qbra  %[t0],    %[s2]               \n\t"
48632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.qb         %[t6],    %[t0],    3         \n\t"
496336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
50632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.ph         %[t5],    %[s2],    10        \n\t"
51632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
52632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shra.ph         %[t0],    %[s2],    10        \n\t"
53632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t5],    %[t0],    %[s6]     \n\t"
54632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
55632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subu.qb         %[t4],    %[t4],    %[t1]     \n\t"
56632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subu.qb         %[t5],    %[t5],    %[t2]     \n\t"
57632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subu.qb         %[t6],    %[t6],    %[t3]     \n\t"
58632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "muleu_s.ph.qbr  %[t4],    %[s4],    %[t4]     \n\t"
59632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "muleu_s.ph.qbr  %[t5],    %[s4],    %[t5]     \n\t"
60632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "muleu_s.ph.qbr  %[t6],    %[s4],    %[t6]     \n\t"
61632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[count], %[count], -2        \n\t"
62632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[src],   %[src],   8         \n\t"
63632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shra.ph         %[t4],    %[t4],    8         \n\t"
64632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shra.ph         %[t5],    %[t5],    8         \n\t"
65632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shra.ph         %[t6],    %[t6],    8         \n\t"
66632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addu.qb         %[t4],    %[t4],    %[t1]     \n\t"
67632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addu.qb         %[t5],    %[t5],    %[t2]     \n\t"
68632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addu.qb         %[t6],    %[t6],    %[t3]     \n\t"
69632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[s0],    %[t4],    0xffff    \n\t"
70632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t0],    %[t5],    0xffff    \n\t"
71632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t0],    %[t0],    0x5       \n\t"
72632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[s0],    %[s0],    %[t0]     \n\t"
73632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t0],    %[t6],    0xb       \n\t"
74632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t0],    %[t0],    %[s0]     \n\t"
75632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sh              %[t0],    0(%[dst])           \n\t"
76632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[s1],    %[t4],    16        \n\t"
77632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t0],    %[t5],    16        \n\t"
78632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t5],    %[t0],    5         \n\t"
79632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t0],    %[t5],    %[s1]     \n\t"
80632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[s0],    %[t6],    16        \n\t"
81632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[s2],    %[s0],    0xb       \n\t"
82632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[s1],    %[s2],    %[t0]     \n\t"
83632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sh              %[s1],    2(%[dst])           \n\t"
84632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "bge             %[count], 2,        1b        \n\t"
85632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            " addiu          %[dst],   %[dst],   4         \n\t"
86632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            ".set            pop                           \n\t"
87632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            : [t0]"=&r"(t0), [t1]"=&r"(t1), [t2]"=&r"(t2), [t3]"=&r"(t3),
88632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [t4]"=&r"(t4), [t5]"=&r"(t5), [t6]"=&r"(t6), [s0]"=&r"(s0),
89632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [s1]"=&r"(s1), [s2]"=&r"(s2), [s4]"=&r"(s4), [s5]"=&r"(s5),
90632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [s6]"=&r"(s6), [count]"+r"(count), [dst]"+r"(dst),
91632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [src]"+r"(src)
92632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            : [alpha]"r"(alpha)
93632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            : "memory", "hi", "lo"
94632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        );
95632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
96632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
97632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count == 1) {
98632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColor c = *src++;
99632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColorAssert(c);
100632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkASSERT(SkGetPackedA32(c) == 255);
101632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        uint16_t d = *dst;
102632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        *dst++ = SkPackRGB16(SkAlphaBlend(SkPacked32ToR16(c), SkGetPackedR16(d), alpha),
103632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                             SkAlphaBlend(SkPacked32ToG16(c), SkGetPackedG16(d), alpha),
104632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                             SkAlphaBlend(SkPacked32ToB16(c), SkGetPackedB16(d), alpha));
105632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
106632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
107632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
108632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32A_D565_Opaque_Dither_mips_dsp(uint16_t* __restrict__ dst,
109632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                             const SkPMColor* __restrict__ src,
110632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                             int count, U8CPU alpha, int x, int y) {
111632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
112632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  0,   0(%[src])     \n\t"
113632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  1,   0(%[dst])     \n\t"
114632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  0,   32(%[src])    \n\t"
115632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  1,   32(%[dst])    \n\t"
116632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        :
117632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [src]"r"(src), [dst]"r"(dst)
118632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory"
119632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
120632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
121632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register int32_t t0, t1, t2, t3, t4, t5, t6;
122632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register int32_t t7, t8, t9, s0, s1, s2, s3;
123632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    const uint16_t dither_scan = gDitherMatrix_3Bit_16[(y) & 3];
124632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
125632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count >= 2) {
126632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        __asm__ volatile (
127632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            ".set            push                                \n\t"
128632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            ".set            noreorder                           \n\t"
129632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "li              %[s1],    0x01010101                \n\t"
130632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "li              %[s2],    -2017                     \n\t"
131632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "1:                                                      \n\t"
132632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "bnez            %[s3],    4f                        \n\t"
133632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            " li             %[s3],    2                         \n\t"
134632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "pref            0,        64(%[src])                \n\t"
135632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "pref            1,        64(%[dst])                \n\t"
136632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "4:                                                      \n\t"
137632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[s3],    %[s3],    -1              \n\t"
138632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "lw              %[t1],    0(%[src])                 \n\t"
139632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t3],    %[x],     0x3             \n\t"
140632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[x],     %[x],     1               \n\t"
141632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t4],    %[t3],    2               \n\t"
142632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srav            %[t5],    %[dither_scan], %[t4]     \n\t"
143632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t3],    %[t5],    0xf             \n\t"
144632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "lw              %[t2],    4(%[src])                 \n\t"
145632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t4],    %[x],     0x3             \n\t"
146632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t5],    %[t4],    2               \n\t"
147632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srav            %[t6],    %[dither_scan], %[t5]     \n\t"
148632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[x],     %[x],     1               \n\t"
149632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ins             %[t3],    %[t6],    8,    4         \n\t"
150632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t4],    %[t1],    24              \n\t"
151632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[t0],    %[t4],    1               \n\t"
152632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t4],    %[t2],    24              \n\t"
153632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[t5],    %[t4],    1               \n\t"
154632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ins             %[t0],    %[t5],    16,   16        \n\t"
155632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "muleu_s.ph.qbr  %[t4],    %[t3],    %[t0]           \n\t"
156632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "preceu.ph.qbla  %[t3],    %[t4]                     \n\t"
157632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t4],    %[t1],    0xff            \n\t"
158632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ins             %[t4],    %[t2],    16,   8         \n\t"
159632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.qb         %[t5],    %[t4],    5               \n\t"
160632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subu.qb         %[t6],    %[t3],    %[t5]           \n\t"
161632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addq.ph         %[t5],    %[t6],    %[t4]           \n\t"
162632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ext             %[t4],    %[t1],    8,    8         \n\t"
163632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t6],    %[t2],    8               \n\t"
164632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ins             %[t4],    %[t6],    16,   8         \n\t"
165632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.qb         %[t6],    %[t4],    6               \n\t"
166632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.qb         %[t7],    %[t3],    1               \n\t"
167632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subu.qb         %[t8],    %[t7],    %[t6]           \n\t"
168632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addq.ph         %[t6],    %[t8],    %[t4]           \n\t"
169632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ext             %[t4],    %[t1],    16,   8         \n\t"
170632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t7],    %[t2],    16              \n\t"
171632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "ins             %[t4],    %[t7],    16,   8         \n\t"
172632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shrl.qb         %[t7],    %[t4],    5               \n\t"
173632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subu.qb         %[t8],    %[t3],    %[t7]           \n\t"
174632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addq.ph         %[t7],    %[t8],    %[t4]           \n\t"
175632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "shll.ph         %[t4],    %[t7],    2               \n\t"
176632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t9],    %[t4],    0xffff          \n\t"
177632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[s0],    %[t4],    16              \n\t"
178632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t3],    %[t6],    0xffff          \n\t"
179632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t4],    %[t6],    16              \n\t"
180632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t6],    %[t5],    0xffff          \n\t"
181632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t7],    %[t5],    16              \n\t"
182632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "subq.ph         %[t5],    %[s1],    %[t0]           \n\t"
183632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t0],    %[t5],    3               \n\t"
184632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "beqz            %[t1],    3f                        \n\t"
185632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            " lhu            %[t5],    0(%[dst])                 \n\t"
186632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t1],    %[t6],    13              \n\t"
187632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t8],    %[t9],    %[t1]           \n\t"
188632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t1],    %[t3],    24              \n\t"
189632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t9],    %[t1],    %[t8]           \n\t"
190632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t3],    %[t5],    0x7e0           \n\t"
191632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t6],    %[t3],    0x10            \n\t"
192632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t8],    %[s2],    %[t5]           \n\t"
193632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t5],    %[t6],    %[t8]           \n\t"
194632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t6],    %[t0],    0xff            \n\t"
195632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "mul             %[t1],    %[t6],    %[t5]           \n\t"
196632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addu            %[t5],    %[t1],    %[t9]           \n\t"
197632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t6],    %[t5],    5               \n\t"
198632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t5],    %[s2],    %[t6]           \n\t"
199632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t8],    %[t6],    16              \n\t"
200632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t6],    %[t8],    0x7e0           \n\t"
201632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t1],    %[t5],    %[t6]           \n\t"
202632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sh              %[t1],    0(%[dst])                 \n\t"
203632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "3:                                                      \n\t"
204632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "beqz            %[t2],    2f                        \n\t"
205632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            " lhu            %[t5],    2(%[dst])                 \n\t"
206632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t1],    %[t7],    13              \n\t"
207632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t8],    %[s0],    %[t1]           \n\t"
208632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t1],    %[t4],    24              \n\t"
209632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t9],    %[t1],    %[t8]           \n\t"
210632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t3],    %[t5],    0x7e0           \n\t"
211632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sll             %[t6],    %[t3],    0x10            \n\t"
212632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t8],    %[s2],    %[t5]           \n\t"
213632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t5],    %[t6],    %[t8]           \n\t"
214632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t6],    %[t0],    16              \n\t"
215632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "mul             %[t1],    %[t6],    %[t5]           \n\t"
216632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addu            %[t5],    %[t1],    %[t9]           \n\t"
217632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t6],    %[t5],    5               \n\t"
218632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "and             %[t5],    %[s2],    %[t6]           \n\t"
219632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "srl             %[t8],    %[t6],    16              \n\t"
220632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "andi            %[t6],    %[t8],    0x7e0           \n\t"
221632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "or              %[t1],    %[t5],    %[t6]           \n\t"
222632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "sh              %[t1],    2(%[dst])                 \n\t"
223632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "2:                                                      \n\t"
224632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[count], %[count], -2              \n\t"
225632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[src],   %[src],   8               \n\t"
226632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "addiu           %[t1],    %[count], -1              \n\t"
227632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            "bgtz            %[t1],    1b                        \n\t"
228632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            " addiu          %[dst],  %[dst],    4               \n\t"
229632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            ".set            pop                                 \n\t"
230632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            : [src]"+r"(src), [count]"+r"(count), [dst]"+r"(dst), [x]"+r"(x),
231632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [t0]"=&r"(t0), [t1]"=&r"(t1), [t2]"=&r"(t2), [t3]"=&r"(t3),
232632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [t4]"=&r"(t4), [t5]"=&r"(t5), [t6]"=&r"(t6), [t7]"=&r"(t7),
233632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [t8]"=&r"(t8),  [t9]"=&r"(t9), [s0]"=&r"(s0), [s1]"=&r"(s1),
234632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut              [s2]"=&r"(s2), [s3]"=&r"(s3)
235632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            : [dither_scan]"r"(dither_scan)
236632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            : "memory", "hi", "lo"
237632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        );
238632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
239632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
240632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count == 1) {
241632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColor c = *src++;
242632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColorAssert(c);
243632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        if (c) {
244632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned a = SkGetPackedA32(c);
245632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            int d = SkAlphaMul(DITHER_VALUE(x), SkAlpha255To256(a));
246632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
247632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned sr = SkGetPackedR32(c);
248632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned sg = SkGetPackedG32(c);
249632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned sb = SkGetPackedB32(c);
250632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            sr = SkDITHER_R32_FOR_565(sr, d);
251632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            sg = SkDITHER_G32_FOR_565(sg, d);
252632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            sb = SkDITHER_B32_FOR_565(sb, d);
253632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
254632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            uint32_t src_expanded = (sg << 24) | (sr << 13) | (sb << 2);
255632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            uint32_t dst_expanded = SkExpand_rgb_16(*dst);
256632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            dst_expanded = dst_expanded * (SkAlpha255To256(255 - a) >> 3);
257632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            // now src and dst expanded are in g:11 r:10 x:1 b:10
258632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            *dst = SkCompact_rgb_16((src_expanded + dst_expanded) >> 5);
259632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        }
260632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        dst += 1;
261632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        DITHER_INC_X(x);
262632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
263632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
264632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
265632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32_D565_Opaque_Dither_mips_dsp(uint16_t* __restrict__ dst,
266632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                            const SkPMColor* __restrict__ src,
267632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                            int count, U8CPU alpha, int x, int y) {
268632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    uint16_t dither_scan = gDitherMatrix_3Bit_16[(y) & 3];
269632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t t0, t1, t2, t3, t4, t5;
270632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t t6, t7, t8, t9, s0;
271632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    int dither[4];
272632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    int i;
273632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
274632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    for (i = 0; i < 4; i++, x++) {
275632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        dither[i] = (dither_scan >> ((x & 3) << 2)) & 0xF;
276632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
277632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
278632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
279632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            push                          \n\t"
280632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            noreorder                     \n\t"
281632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[s0],    1                   \n\t"
282632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "2:                                                \n\t"
283632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "beqz            %[count], 1f                  \n\t"
284632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                          \n\t"
285632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[t0],    %[count], -1        \n\t"
286632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "beqz            %[t0],    1f                  \n\t"
287632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                          \n\t"
288632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "beqz            %[s0],    3f                  \n\t"
289632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                          \n\t"
290632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t0],    0(%[dither])        \n\t"
291632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t1],    4(%[dither])        \n\t"
292632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[s0],    0                   \n\t"
293632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               4f                            \n\t"
294632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                          \n\t"
295632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "3:                                                \n\t"
296632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t0],    8(%[dither])        \n\t"
297632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t1],    12(%[dither])       \n\t"
298632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[s0],    1                   \n\t"
299632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "4:                                                \n\t"
300632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t2],    %[t0],    16        \n\t"
301632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[t1],    %[t2],    %[t1]     \n\t"
302632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t0],    0(%[src])           \n\t"
303632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t2],    4(%[src])           \n\t"
304632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.ph.w     %[t3],    %[t0],    %[t2]     \n\t"
305632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t9],    %[t3]               \n\t"
3066336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
307632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "append          %[t0],    %[t2],    16        \n\t"
308632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t4],    %[t0]               \n\t"
309632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t5],    %[t0]               \n\t"
310632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
311632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t6],    %[t0],    16        \n\t"
312632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t7],    %[t2],    16        \n\t"
313632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.ph.w     %[t8],    %[t6],    %[t7]     \n\t"
314632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t4],    %[t8]               \n\t"
315632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t5],    %[t8]               \n\t"
316632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
317632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t0],    %[t4],    %[t1]     \n\t"
318632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t2],    %[t4],    5         \n\t"
319632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t3],    %[t0],    %[t2]     \n\t"
320632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t6],    %[t3],    3         \n\t"
321632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t0],    %[t9],    %[t1]     \n\t"
322632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t2],    %[t9],    5         \n\t"
323632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t3],    %[t0],    %[t2]     \n\t"
324632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t7],    %[t3],    3         \n\t"
325632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t0],    %[t1],    1         \n\t"
326632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t2],    %[t5],    6         \n\t"
327632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t3],    %[t5],    %[t0]     \n\t"
328632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t4],    %[t3],    %[t2]     \n\t"
329632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t8],    %[t4],    2         \n\t"
330632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.ph.w     %[t0],    %[t6],    %[t7]     \n\t"
3316336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
332632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "append          %[t6],    %[t7],    16        \n\t"
333632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
334632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t6],    %[t6],    16        \n\t"
335632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t2],    %[t7],    16        \n\t"
336632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.ph.w     %[t6],    %[t6],    %[t2]     \n\t"
337632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
338632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sra             %[t4],    %[t8],    16        \n\t"
339632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "andi            %[t5],    %[t8],    0xFF      \n\t"
340632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t7],    %[t4],    5         \n\t"
341632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sra             %[t8],    %[t0],    5         \n\t"
342632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[t9],    %[t7],    %[t8]     \n\t"
343632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[t3],    %[t9],    %[t0]     \n\t"
344632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "andi            %[t4],    %[t3],    0xFFFF    \n\t"
345632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t7],    %[t5],    5         \n\t"
346632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sra             %[t8],    %[t6],    5         \n\t"
347632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[t9],    %[t7],    %[t8]     \n\t"
348632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[t3],    %[t9],    %[t6]     \n\t"
349632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[t7],    %[t3],    0xFFFF    \n\t"
350632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh              %[t4],    0(%[dst])           \n\t"
351632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh              %[t7],    2(%[dst])           \n\t"
352632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[count], %[count], -2        \n\t"
353632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[src],   %[src],   8         \n\t"
354632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               2b                            \n\t"
355632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " addiu          %[dst],   %[dst],   4         \n\t"
356632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "1:                                                \n\t"
357632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            pop                           \n\t"
358632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [dst]"+r"(dst), [src]"+r"(src), [count]"+r"(count),
359632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [x]"+r"(x), [t0]"=&r"(t0), [t1]"=&r"(t1), [t2]"=&r"(t2),
360632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t3]"=&r"(t3), [t4]"=&r"(t4), [t5]"=&r"(t5), [t6]"=&r"(t6),
361632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t7]"=&r"(t7), [t8]"=&r"(t8), [t9]"=&r"(t9), [s0]"=&r"(s0)
362632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [dither] "r" (dither)
363632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory"
364632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
365632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
366632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count == 1) {
367632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColor c = *src++;
368632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColorAssert(c); // only if DEBUG is turned on
369632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkASSERT(SkGetPackedA32(c) == 255);
370632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        unsigned dither = DITHER_VALUE(x);
371632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        *dst++ = SkDitherRGB32To565(c, dither);
372632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
373632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
374632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
375632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32_D565_Blend_Dither_mips_dsp(uint16_t* dst,
376632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                           const SkPMColor* src,
377632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                           int count, U8CPU alpha, int x, int y) {
378632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register int32_t t0, t1, t2, t3, t4, t5, t6;
379632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register int32_t s0, s1, s2, s3;
380632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register int x1 = 0;
381632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t sc_mul;
382632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t sc_add;
383632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef ENABLE_DITHER_MATRIX_4X4
384632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    const uint8_t* dither_scan = gDitherMatrix_3Bit_4X4[(y) & 3];
385632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else // ENABLE_DITHER_MATRIX_4X4
386632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    const uint16_t dither_scan = gDitherMatrix_3Bit_16[(y) & 3];
387632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif // ENABLE_DITHER_MATRIX_4X4
388632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    int dither[4];
389632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
390632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    for (int i = 0; i < 4; i++) {
391632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        dither[i] = (dither_scan >> ((x & 3) << 2)) & 0xF;
392632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        x += 1;
393632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
394632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    alpha += 1;
395632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
396632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            push                              \n\t"
397632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            noreorder                         \n\t"
398632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[t0],     0x100                  \n\t"
399632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu            %[t0],     %[t0],     %[alpha]    \n\t"
400632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.ph        %[sc_mul], %[alpha]               \n\t"
401632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "beqz            %[alpha],  1f                     \n\t"
402632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                              \n\t"
403632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.qb        %[sc_add], %[t0]                  \n\t"
404632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               2f                                \n\t"
405632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                              \n\t"
406632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "1:                                                    \n\t"
407632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.qb        %[sc_add], %[alpha]               \n\t"
408632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "2:                                                    \n\t"
409632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[t2],     %[count],  -1          \n\t"
410632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "blez            %[t2],     3f                     \n\t"
411632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                              \n\t"
412632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[s0],     0(%[src])              \n\t"
413632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[s1],     4(%[src])              \n\t"
414632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "bnez            %[x1],     4f                     \n\t"
415632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                              \n\t"
416632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t0],     0(%[dither])           \n\t"
417632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t1],     4(%[dither])           \n\t"
418632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[x1],     1                      \n\t"
419632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               5f                                \n\t"
420632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                              \n\t"
421632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "4:                                                    \n\t"
422632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t0],     8(%[dither])           \n\t"
423632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t1],     12(%[dither])          \n\t"
424632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[x1],     0                      \n\t"
425632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "5:                                                    \n\t"
426632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t3],     %[t0],     7           \n\t"
427632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t4],     %[t1],     7           \n\t"
4286336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
429632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "append          %[t0],     %[t1],     16          \n\t"
430632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
431632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t0],     %[t0],     8           \n\t"
432632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t2],     %[t1],     8           \n\t"
433632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t0],     %[t0],     %[t2]       \n\t"
434632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
435632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t1],     %[t3],     %[t4]       \n\t"
436632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t5],     %[s0],     8           \n\t"
437632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t6],     %[s1],     8           \n\t"
438632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t4],     %[t5],     %[t6]       \n\t"
439632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t6],     %[s0],     %[s1]       \n\t"
440632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t5],     %[t4]                  \n\t"
441632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t4],     %[t4]                  \n\t"
442632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t6],     %[t6]                  \n\t"
443632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lh              %[t2],     0(%[dst])              \n\t"
444632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lh              %[s1],     2(%[dst])              \n\t"
4456336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
446632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "append          %[t2],     %[s1],     16          \n\t"
447632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
448632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[s1],     %[s1],     16          \n\t"
449632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "packrl.ph       %[t2],     %[t2],     %[s1]       \n\t"
450632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
451632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[s1],     %[t2],     11          \n\t"
452632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[s1],     %[s1],     0x1F001F    \n\t"
453632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[s2],     %[t2],     5           \n\t"
454632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[s2],     %[s2],     0x3F003F    \n\t"
455632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[s3],     %[t2],     0x1F001F    \n\t"
456632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t3],     %[t4],     5           \n\t"
457632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t4],     %[t4],     %[t0]       \n\t"
458632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t4],     %[t4],     %[t3]       \n\t"
459632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t4],     %[t4],     3           \n\t"
460632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t3],     %[t5],     5           \n\t"
461632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t5],     %[t5],     %[t0]       \n\t"
462632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t5],     %[t5],     %[t3]       \n\t"
463632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t5],     %[t5],     3           \n\t"
464632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t3],     %[t6],     6           \n\t"
465632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t6],     %[t6],     %[t1]       \n\t"
466632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t6],     %[t6],     %[t3]       \n\t"
467632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t6],     %[t6],     2           \n\t"
468632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "cmpu.lt.qb      %[t4],     %[s1]                  \n\t"
469632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pick.qb         %[s0],     %[sc_add], $0          \n\t"
470632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[s0],     %[s0],     %[s1]       \n\t"
471632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t4],     %[t4],     %[s1]       \n\t"
472632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t0],     %[t4],     %[sc_mul]   \n\t"
473632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t1],     %[t4],     %[sc_mul]   \n\t"
474632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t4],     %[t0],     %[t1]       \n\t"
475632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t4],     %[t4],     %[s0]       \n\t"
476632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "cmpu.lt.qb      %[t5],     %[s3]                  \n\t"
477632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pick.qb         %[s0],     %[sc_add], $0          \n\t"
478632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[s0],     %[s0],     %[s3]       \n\t"
479632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t5],     %[t5],     %[s3]       \n\t"
480632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t0],     %[t5],     %[sc_mul]   \n\t"
481632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t1],     %[t5],     %[sc_mul]   \n\t"
482632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t5],     %[t0],     %[t1]       \n\t"
483632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t5],     %[t5],     %[s0]       \n\t"
484632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "cmpu.lt.qb      %[t6],     %[s2]                  \n\t"
485632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pick.qb         %[s0],     %[sc_add], $0          \n\t"
486632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[s0],     %[s0],     %[s2]       \n\t"
487632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu.qb         %[t6],     %[t6],     %[s2]       \n\t"
488632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t0],     %[t6],     %[sc_mul]   \n\t"
489632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t1],     %[t6],     %[sc_mul]   \n\t"
490632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t6],     %[t0],     %[t1]       \n\t"
491632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu.qb         %[t6],     %[t6],     %[s0]       \n\t"
492632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shll.ph         %[s1],     %[t4],     11          \n\t"
493632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shll.ph         %[t0],     %[t6],     5           \n\t"
494632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[s0],     %[s1],     %[t0]       \n\t"
495632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[s1],     %[s0],     %[t5]       \n\t"
496632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "srl             %[t2],     %[s1],     16          \n\t"
497632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[t3],     %[s1],     0xFFFF      \n\t"
498632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh              %[t2],     0(%[dst])              \n\t"
499632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh              %[t3],     2(%[dst])              \n\t"
500632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[src],    %[src],    8           \n\t"
501632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addi            %[count],  %[count],  -2          \n\t"
502632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               2b                                \n\t"
503632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " addu           %[dst],    %[dst],    4           \n\t"
504632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "3:                                                    \n\t"
505632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            pop                               \n\t"
506632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [src]"+r"(src), [dst]"+r"(dst), [count]"+r"(count),
507632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [x1]"+r"(x1), [sc_mul]"=&r"(sc_mul), [sc_add]"=&r"(sc_add),
508632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t0]"=&r"(t0), [t1]"=&r"(t1), [t2]"=&r"(t2), [t3]"=&r"(t3),
509632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t4]"=&r"(t4), [t5]"=&r"(t5), [t6]"=&r"(t6), [s0]"=&r"(s0),
510632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [s1]"=&r"(s1), [s2]"=&r"(s2), [s3]"=&r"(s3)
511632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [dither]"r"(dither), [alpha]"r"(alpha)
512632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory", "hi", "lo"
513632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
514632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
515632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if(count == 1) {
516632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColor c = *src++;
517632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColorAssert(c);
518632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkASSERT(SkGetPackedA32(c) == 255);
519632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        DITHER_565_SCAN(y);
520632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        int dither = DITHER_VALUE(x);
521632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        int sr = SkGetPackedR32(c);
522632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        int sg = SkGetPackedG32(c);
523632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        int sb = SkGetPackedB32(c);
524632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        sr = SkDITHER_R32To565(sr, dither);
525632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        sg = SkDITHER_G32To565(sg, dither);
526632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        sb = SkDITHER_B32To565(sb, dither);
527632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
528632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        uint16_t d = *dst;
529632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        *dst++ = SkPackRGB16(SkAlphaBlend(sr, SkGetPackedR16(d), alpha),
530632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                             SkAlphaBlend(sg, SkGetPackedG16(d), alpha),
531632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                             SkAlphaBlend(sb, SkGetPackedB16(d), alpha));
532632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        DITHER_INC_X(x);
533632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
534632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
535632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
536632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32A_D565_Opaque_mips_dsp(uint16_t* __restrict__ dst,
537632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                      const SkPMColor* __restrict__ src,
538632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                      int count, U8CPU alpha, int x, int y) {
539632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
540632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
541632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  0,  0(%[src])     \n\t"
542632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  1,  0(%[dst])     \n\t"
543632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  0,  32(%[src])    \n\t"
544632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref  1,  32(%[dst])    \n\t"
545632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        :
546632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [src]"r"(src), [dst]"r"(dst)
547632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory"
548632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
549632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
550632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8;
551632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t t16;
552632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t add_x10 = 0x100010;
553632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t add_x20 = 0x200020;
554632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t sa = 0xff00ff;
555632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
556632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
557632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set           push                            \n\t"
558632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set           noreorder                       \n\t"
559632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "blez           %[count], 1f                    \n\t"
560632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                           \n\t"
561632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "2:                                                 \n\t"
562632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "beqz           %[count], 1f                    \n\t"
563632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                           \n\t"
564632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu          %[t0],    %[count], -1          \n\t"
565632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "beqz           %[t0],    1f                    \n\t"
566632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                           \n\t"
567632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "bnez           %[t16],   3f                    \n\t"
568632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                           \n\t"
569632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li             %[t16],   2                     \n\t"
570632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref           0,        64(%[src])            \n\t"
571632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "pref           1,        64(%[dst])            \n\t"
572632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "3:                                                 \n\t"
573632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu          %[t16],   %[t16],   -1          \n\t"
574632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw             %[t0],    0(%[src])             \n\t"
575632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw             %[t1],    4(%[src])             \n\t"
576632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.ph.w    %[t2],    %[t0],    %[t1]       \n\t"
577632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra %[t8],    %[t2]                 \n\t"
5786336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
579632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "append         %[t0],    %[t1],    16          \n\t"
580632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
581632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll            %[t0],    %[t0],    16          \n\t"
582632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll            %[t6],    %[t1],    16          \n\t"
583632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.ph.w    %[t0],    %[t0],    %[t6]       \n\t"
584632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
585632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra %[t3],    %[t0]                 \n\t"
586632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla %[t4],    %[t0]                 \n\t"
587632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla %[t0],    %[t2]                 \n\t"
588632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subq.ph        %[t1],    %[sa],    %[t0]       \n\t"
589632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sra            %[t2],    %[t1],    8           \n\t"
590632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or             %[t5],    %[t2],    %[t1]       \n\t"
591632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.ph       %[t2],    %[t5]                 \n\t"
592632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lh             %[t0],    0(%[dst])             \n\t"
593632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lh             %[t1],    2(%[dst])             \n\t"
594632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and            %[t1],    %[t1],    0xffff      \n\t"
5956336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut#ifdef SK_MIPS_HAS_DSPR2
596632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "append         %[t0],    %[t1],    16          \n\t"
597632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#else
598632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll            %[t5],    %[t0],    16          \n\t"
599632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or             %[t0],    %[t5],    %[t1]       \n\t"
600632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#endif
601632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and            %[t1],    %[t0],    0x1f001f    \n\t"
602632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t6],    %[t0],    11          \n\t"
603632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and            %[t6],    %[t6],    0x1f001f    \n\t"
604632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and            %[t7],    %[t0],    0x7e007e0   \n\t"
605632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t5],    %[t7],    5           \n\t"
606632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl %[t0],    %[t2],    %[t6]       \n\t"
607632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t0],    %[add_x10]  \n\t"
608632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t6],    %[t7],    5           \n\t"
609632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t6],    %[t7],    %[t6]       \n\t"
610632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t0],    %[t6],    5           \n\t"
611632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t0],    %[t3]       \n\t"
612632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t6],    %[t7],    3           \n\t"
613632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl %[t0],    %[t2],    %[t1]       \n\t"
614632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t0],    %[add_x10]  \n\t"
615632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t0],    %[t7],    5           \n\t"
616632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t7],    %[t0]       \n\t"
617632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t0],    %[t7],    5           \n\t"
618632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t0],    %[t8]       \n\t"
619632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t3],    %[t7],    3           \n\t"
620632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl %[t0],    %[t2],    %[t5]       \n\t"
621632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t0],    %[add_x20]  \n\t"
622632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t0],    %[t7],    6           \n\t"
623632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t8],    %[t7],    %[t0]       \n\t"
624632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t0],    %[t8],    6           \n\t"
625632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph        %[t7],    %[t0],    %[t4]       \n\t"
626632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph        %[t8],    %[t7],    2           \n\t"
627632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shll.ph        %[t0],    %[t8],    5           \n\t"
628632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shll.ph        %[t1],    %[t6],    11          \n\t"
629632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or             %[t2],    %[t0],    %[t1]       \n\t"
630632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or             %[t3],    %[t2],    %[t3]       \n\t"
631632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sra            %[t4],    %[t3],    16          \n\t"
632632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh             %[t4],    0(%[dst])             \n\t"
633632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh             %[t3],    2(%[dst])             \n\t"
634632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu          %[count], %[count], -2          \n\t"
635632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu          %[src],   %[src],   8           \n\t"
636632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b              2b                              \n\t"
637632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " addiu         %[dst],   %[dst],   4           \n\t"
638632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "1:                                                 \n\t"
639632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set           pop                             \n\t"
640632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [dst]"+r"(dst), [src]"+r"(src), [count]"+r"(count),
641632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t16]"=&r"(t16), [t0]"=&r"(t0), [t1]"=&r"(t1), [t2]"=&r"(t2),
642632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t3]"=&r"(t3), [t4]"=&r"(t4), [t5]"=&r"(t5), [t6]"=&r"(t6),
643632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t7]"=&r"(t7), [t8]"=&r"(t8)
644632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [add_x10]"r"(add_x10), [add_x20]"r"(add_x20), [sa]"r"(sa)
645632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory", "hi", "lo"
646632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
647632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
648632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count == 1) {
649632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColor c = *src++;
650632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColorAssert(c);
651632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        if (c) {
652632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            *dst = SkSrcOver32To16(c, *dst);
653632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        }
654632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        dst += 1;
655632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
656632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
657632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
658632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32A_D565_Blend_mips_dsp(uint16_t* SK_RESTRICT dst,
659632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                     const SkPMColor* SK_RESTRICT src, int count,
660632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                     U8CPU alpha, int /*x*/, int /*y*/) {
661632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;
662632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register uint32_t  s0, s1, s2, s3;
663632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register unsigned dst_scale = 0;
664632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
665632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
666632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            push                                       \n\t"
667632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            noreorder                                  \n\t"
668632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.qb        %[t0],        %[alpha]                     \n\t"
669632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "repl.ph         %[t6],        0x80                         \n\t"
670632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "repl.ph         %[t7],        0xFF                         \n\t"
671632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "1:                                                             \n\t"
672632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[t8],        %[count],     -1             \n\t"
673632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "blez            %[t8],        2f                           \n\t"
674632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " nop                                                       \n\t"
675632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t8],        0(%[src])                    \n\t"
676632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t9],        4(%[src])                    \n\t"
677632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lh              %[t4],        0(%[dst])                    \n\t"
678632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lh              %[t5],        2(%[dst])                    \n\t"
679632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t5],        %[t5],        16             \n\t"
680632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t2],        %[t8],        8              \n\t"
681632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[t3],        %[t9],        8              \n\t"
682632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t1],        %[t2],        %[t3]          \n\t"
683632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t3],        %[t8],        %[t9]          \n\t"
684632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t8],        %[t3]                        \n\t"
685632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[s3],        %[t0],        %[t8]          \n\t"
686632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t2],        %[t1]                        \n\t"
687632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t1],        %[t1]                        \n\t"
688632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbra  %[t3],        %[t3]                        \n\t"
689632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "packrl.ph       %[t9],        %[t4],        %[t5]          \n\t"
690632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[s0],        %[t9],        11             \n\t"
691632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[s0],        %[s0],        0x1F001F       \n\t"
692632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[s1],        %[t9],        5              \n\t"
693632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[s1],        %[s1],        0x3F003F       \n\t"
694632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[s2],        %[t9],        0x1F001F       \n\t"
695632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[s3],        %[s3],        %[t6]          \n\t"
696632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t5],        %[s3],        8              \n\t"
697632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[t5],        %[t5],        0xFF00FF       \n\t"
698632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[dst_scale], %[s3],        %[t5]          \n\t"
699632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[dst_scale], %[dst_scale], 8              \n\t"
700632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subq_s.ph       %[dst_scale], %[t7],        %[dst_scale]   \n\t"
701632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sll             %[dst_scale], %[dst_scale], 8              \n\t"
702632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[dst_scale], %[dst_scale], %[dst_scale]   \n\t"
703632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t1],        %[t1],        3              \n\t"
704632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t2],        %[t2],        3              \n\t"
705632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shrl.qb         %[t3],        %[t3],        2              \n\t"
706632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t1],        %[t0],        %[t1]          \n\t"
707632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t2],        %[t0],        %[t2]          \n\t"
708632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t3],        %[t0],        %[t3]          \n\t"
709632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t8],        %[dst_scale], %[s0]          \n\t"
710632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t9],        %[dst_scale], %[s2]          \n\t"
711632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbl  %[t4],        %[dst_scale], %[s1]          \n\t"
712632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t1],        %[t1],        %[t8]          \n\t"
713632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t2],        %[t2],        %[t9]          \n\t"
714632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t3],        %[t3],        %[t4]          \n\t"
715632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t8],        %[t1],        %[t6]          \n\t"
716632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t9],        %[t2],        %[t6]          \n\t"
717632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t4],        %[t3],        %[t6]          \n\t"
718632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t1],        %[t8],        8              \n\t"
719632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t1],        %[t1],        %[t8]          \n\t"
720632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t1],        %[t1]                        \n\t"
721632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t2],        %[t9],        8              \n\t"
722632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t2],        %[t2],        %[t9]          \n\t"
723632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t2],        %[t2]                        \n\t"
724632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shra.ph         %[t3],        %[t4],        8              \n\t"
725632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addq.ph         %[t3],        %[t3],        %[t4]          \n\t"
726632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbla  %[t3],        %[t3]                        \n\t"
727632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shll.ph         %[t8],        %[t1],        11             \n\t"
728632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "shll.ph         %[t9],        %[t3],        5              \n\t"
729632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[t8],        %[t8],        %[t9]          \n\t"
730632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "or              %[s0],        %[t8],        %[t2]          \n\t"
731632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "srl             %[t8],        %[s0],        16             \n\t"
732632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "and             %[t9],        %[s0],        0xFFFF         \n\t"
733632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh              %[t8],        0(%[dst])                    \n\t"
734632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sh              %[t9],        2(%[dst])                    \n\t"
735632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[src],       %[src],       8              \n\t"
736632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[count],     %[count],     -2             \n\t"
737632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               1b                                         \n\t"
738632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " addiu          %[dst],       %[dst],       4              \n\t"
739632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "2:                                                             \n\t"
740632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            pop                                        \n\t"
741632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [src]"+r"(src), [dst]"+r"(dst), [count]"+r"(count),
742632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [dst_scale]"+r"(dst_scale), [s0]"=&r"(s0), [s1]"=&r"(s1),
743632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [s2]"=&r"(s2), [s3]"=&r"(s3), [t0]"=&r"(t0), [t1]"=&r"(t1),
744632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t2]"=&r"(t2), [t3]"=&r"(t3), [t4]"=&r"(t4), [t5]"=&r"(t5),
745632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t6]"=&r"(t6), [t7]"=&r"(t7), [t8]"=&r"(t8), [t9]"=&r"(t9)
746632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [alpha]"r"(alpha)
747632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory", "hi", "lo"
748632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
749632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
750632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    if (count == 1) {
751632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColor sc = *src++;
752632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        SkPMColorAssert(sc);
753632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        if (sc) {
754632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            uint16_t dc = *dst;
755632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned dst_scale = 255 - SkMulDiv255Round(SkGetPackedA32(sc), alpha);
756632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned dr = SkMulS16(SkPacked32ToR16(sc), alpha) +
757632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                          SkMulS16(SkGetPackedR16(dc), dst_scale);
758632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned dg = SkMulS16(SkPacked32ToG16(sc), alpha) +
759632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                          SkMulS16(SkGetPackedG16(dc), dst_scale);
760632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            unsigned db = SkMulS16(SkPacked32ToB16(sc), alpha) +
761632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                          SkMulS16(SkGetPackedB16(dc), dst_scale);
762632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut            *dst = SkPackRGB16(SkDiv255Round(dr), SkDiv255Round(dg), SkDiv255Round(db));
763632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        }
764632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        dst += 1;
765632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    }
766632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
767632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
768632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic void S32_Blend_BlitRow32_mips_dsp(SkPMColor* SK_RESTRICT dst,
769632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                         const SkPMColor* SK_RESTRICT src,
770632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut                                         int count, U8CPU alpha) {
771632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    register int32_t t0, t1, t2, t3, t4, t5, t6, t7;
772632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
773632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    __asm__ volatile (
774632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            push                         \n\t"
775632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            noreorder                    \n\t"
776632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "li              %[t2],    0x100              \n\t"
777632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[t0],    %[alpha], 1        \n\t"
778632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "subu            %[t1],    %[t2],    %[t0]    \n\t"
779632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.qb        %[t7],    %[t0]              \n\t"
780632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "replv.qb        %[t6],    %[t1]              \n\t"
781632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "1:                                               \n\t"
782632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "blez            %[count], 2f                 \n\t"
783632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t0],    0(%[src])          \n\t"
784632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "lw              %[t1],    0(%[dst])          \n\t"
785632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbr   %[t2],    %[t0]              \n\t"
786632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbl   %[t3],    %[t0]              \n\t"
787632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbr   %[t4],    %[t1]              \n\t"
788632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "preceu.ph.qbl   %[t5],    %[t1]              \n\t"
789632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t2],    %[t7],    %[t2]    \n\t"
790632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t3],    %[t7],    %[t3]    \n\t"
791632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t4],    %[t6],    %[t4]    \n\t"
792632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "muleu_s.ph.qbr  %[t5],    %[t6],    %[t5]    \n\t"
793632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[src],   %[src],   4        \n\t"
794632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addiu           %[count], %[count], -1       \n\t"
795632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t0],    %[t3],    %[t2]    \n\t"
796632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "precrq.qb.ph    %[t2],    %[t5],    %[t4]    \n\t"
797632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "addu            %[t1],    %[t0],    %[t2]    \n\t"
798632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "sw              %[t1],    0(%[dst])          \n\t"
799632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        "b               1b                           \n\t"
800632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        " addi           %[dst],   %[dst],   4        \n\t"
801632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    "2:                                               \n\t"
802632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        ".set            pop                          \n\t"
803632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [src]"+r"(src), [dst]"+r"(dst), [count]"+r"(count),
804632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t0]"=&r"(t0), [t1]"=&r"(t1), [t2]"=&r"(t2), [t3]"=&r"(t3),
805632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut          [t4]"=&r"(t4), [t5]"=&r"(t5), [t6]"=&r"(t6), [t7]"=&r"(t7)
806632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : [alpha]"r"(alpha)
807632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut        : "memory", "hi", "lo"
808632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    );
809632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
810632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
8116336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesutvoid blitmask_d565_opaque_mips(int width, int height, uint16_t* device,
8126336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut                               unsigned deviceRB, const uint8_t* alpha,
8136336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut                               uint32_t expanded32, unsigned maskRB) {
8146336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    register uint32_t s0, s1, s2, s3;
8156336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut
8166336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    __asm__ volatile (
8176336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        ".set            push                                    \n\t"
8186336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        ".set            noreorder                               \n\t"
8196336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        ".set            noat                                    \n\t"
8206336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "li              $t9,       0x7E0F81F                    \n\t"
8216336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    "1:                                                          \n\t"
8226336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "move            $t8,       %[width]                     \n\t"
8236336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[height], %[height],     -1            \n\t"
8246336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    "2:                                                          \n\t"
8256336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "beqz            $t8,       4f                           \n\t"
8266336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        " addiu          $t0,       $t8,           -4            \n\t"
8276336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "bltz            $t0,       3f                           \n\t"
8286336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        " nop                                                    \n\t"
8296336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           $t8,       $t8,           -4            \n\t"
8306336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lhu             $t0,       0(%[device])                 \n\t"
8316336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lhu             $t1,       2(%[device])                 \n\t"
8326336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lhu             $t2,       4(%[device])                 \n\t"
8336336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lhu             $t3,       6(%[device])                 \n\t"
8346336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lbu             $t4,       0(%[alpha])                  \n\t"
8356336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lbu             $t5,       1(%[alpha])                  \n\t"
8366336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lbu             $t6,       2(%[alpha])                  \n\t"
8376336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lbu             $t7,       3(%[alpha])                  \n\t"
8386336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "replv.ph        $t0,       $t0                          \n\t"
8396336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "replv.ph        $t1,       $t1                          \n\t"
8406336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "replv.ph        $t2,       $t2                          \n\t"
8416336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "replv.ph        $t3,       $t3                          \n\t"
8426336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[s0],     $t4,           1             \n\t"
8436336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[s1],     $t5,           1             \n\t"
8446336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[s2],     $t6,           1             \n\t"
8456336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[s3],     $t7,           1             \n\t"
8466336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             %[s0],     %[s0],         3             \n\t"
8476336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             %[s1],     %[s1],         3             \n\t"
8486336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             %[s2],     %[s2],         3             \n\t"
8496336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             %[s3],     %[s3],         3             \n\t"
8506336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t0,       $t0,           $t9           \n\t"
8516336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t1,       $t1,           $t9           \n\t"
8526336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t2,       $t2,           $t9           \n\t"
8536336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t3,       $t3,           $t9           \n\t"
8546336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "subu            $t4,       %[expanded32], $t0           \n\t"
8556336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "subu            $t5,       %[expanded32], $t1           \n\t"
8566336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "subu            $t6,       %[expanded32], $t2           \n\t"
8576336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "subu            $t7,       %[expanded32], $t3           \n\t"
8586336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "mul             $t4,       $t4,           %[s0]         \n\t"
8596336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "mul             $t5,       $t5,           %[s1]         \n\t"
8606336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "mul             $t6,       $t6,           %[s2]         \n\t"
8616336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "mul             $t7,       $t7,           %[s3]         \n\t"
8626336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[alpha],  %[alpha],      4             \n\t"
8636336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t4,       $t4,           5             \n\t"
8646336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t5,       $t5,           5             \n\t"
8656336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t6,       $t6,           5             \n\t"
8666336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t7,       $t7,           5             \n\t"
8676336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addu            $t4,       $t0,           $t4           \n\t"
8686336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addu            $t5,       $t1,           $t5           \n\t"
8696336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addu            $t6,       $t2,           $t6           \n\t"
8706336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addu            $t7,       $t3,           $t7           \n\t"
8716336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t4,       $t4,           $t9           \n\t"
8726336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t5,       $t5,           $t9           \n\t"
8736336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t6,       $t6,           $t9           \n\t"
8746336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t7,       $t7,           $t9           \n\t"
8756336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t0,       $t4,           16            \n\t"
8766336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t1,       $t5,           16            \n\t"
8776336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t2,       $t6,           16            \n\t"
8786336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t3,       $t7,           16            \n\t"
8796336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "or              %[s0],     $t0,           $t4           \n\t"
8806336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "or              %[s1],     $t1,           $t5           \n\t"
8816336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "or              %[s2],     $t2,           $t6           \n\t"
8826336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "or              %[s3],     $t3,           $t7           \n\t"
8836336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "sh              %[s0],     0(%[device])                 \n\t"
8846336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "sh              %[s1],     2(%[device])                 \n\t"
8856336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "sh              %[s2],     4(%[device])                 \n\t"
8866336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "sh              %[s3],     6(%[device])                 \n\t"
8876336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "b               2b                                      \n\t"
8886336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        " addiu          %[device], %[device],     8             \n\t"
8896336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    "3:                                                          \n\t"
8906336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lhu             $t0,       0(%[device])                 \n\t"
8916336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "lbu             $t1,       0(%[alpha])                  \n\t"
8926336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           $t8,       $t8,           -1            \n\t"
8936336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "replv.ph        $t2,       $t0                          \n\t"
8946336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t2,       $t2,           $t9           \n\t"
8956336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           $t0,       $t1,           1             \n\t"
8966336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t0,       $t0,           3             \n\t"
8976336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "subu            $t3,       %[expanded32], $t2           \n\t"
8986336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "mul             $t3,       $t3,           $t0           \n\t"
8996336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addiu           %[alpha],  %[alpha],      1             \n\t"
9006336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t3,       $t3,           5             \n\t"
9016336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addu            $t3,       $t2,           $t3           \n\t"
9026336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "and             $t3,       $t3,           $t9           \n\t"
9036336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "srl             $t4,       $t3,           16            \n\t"
9046336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "or              %[s0],     $t4,           $t3           \n\t"
9056336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "sh              %[s0],     0(%[device])                 \n\t"
9066336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "bnez            $t8,       3b                           \n\t"
9076336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut         "addiu          %[device], %[device],     2             \n\t"
9086336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    "4:                                                          \n\t"
9096336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "addu            %[device], %[device],     %[deviceRB]   \n\t"
9106336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        "bgtz            %[height], 1b                           \n\t"
9116336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        " addu           %[alpha],  %[alpha],      %[maskRB]     \n\t"
9126336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        ".set            pop                                     \n\t"
9136336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        : [height]"+r"(height), [alpha]"+r"(alpha), [device]"+r"(device),
9146336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut          [deviceRB]"+r"(deviceRB), [maskRB]"+r"(maskRB), [s0]"=&r"(s0),
9156336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut          [s1]"=&r"(s1), [s2]"=&r"(s2), [s3]"=&r"(s3)
9166336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        : [expanded32] "r" (expanded32), [width] "r" (width)
9176336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut        : "memory", "hi", "lo", "t0", "t1", "t2", "t3",
9186336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut          "t4", "t5", "t6", "t7", "t8", "t9"
9196336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut    );
9206336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut}
9216336f7c225f7806f5bbccea90ba6d2c881e8a470djordje.pesut
922632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut///////////////////////////////////////////////////////////////////////////////////////////////////
923632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
924632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutconst SkBlitRow::Proc platform_565_procs_mips_dsp[] = {
925632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    // no dither
926632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    NULL,
927632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32_D565_Blend_mips_dsp,
928632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32A_D565_Opaque_mips_dsp,
929632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32A_D565_Blend_mips_dsp,
930632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
931632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    // dither
932632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32_D565_Opaque_Dither_mips_dsp,
933632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32_D565_Blend_Dither_mips_dsp,
934632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32A_D565_Opaque_Dither_mips_dsp,
935632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    NULL,
936632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut};
937632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
938632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic const SkBlitRow::Proc32 platform_32_procs_mips_dsp[] = {
939632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    NULL,   // S32_Opaque,
940632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    S32_Blend_BlitRow32_mips_dsp,   // S32_Blend,
941632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    NULL,   // S32A_Opaque,
942632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    NULL,   // S32A_Blend,
943632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut};
944632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
945632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) {
946632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    return platform_565_procs_mips_dsp[flags];
947632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
948632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
949632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
950632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    return platform_32_procs_mips_dsp[flags];
951632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
952632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
953632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::ColorRectProc PlatformColorRectProcFactory() {
954632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    return NULL;
955632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
956632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut
957632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::ColorProc SkBlitRow::PlatformColorProc() {
958632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut    return NULL;
959632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}
960