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" 37632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 49632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 306632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 331632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 428632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 445632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 578632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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" 595632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut#ifdef __MIPS_HAVE_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 811632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut/////////////////////////////////////////////////////////////////////////////////////////////////// 812632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 813632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutconst SkBlitRow::Proc platform_565_procs_mips_dsp[] = { 814632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut // no dither 815632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut NULL, 816632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32_D565_Blend_mips_dsp, 817632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32A_D565_Opaque_mips_dsp, 818632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32A_D565_Blend_mips_dsp, 819632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 820632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut // dither 821632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32_D565_Opaque_Dither_mips_dsp, 822632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32_D565_Blend_Dither_mips_dsp, 823632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32A_D565_Opaque_Dither_mips_dsp, 824632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut NULL, 825632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}; 826632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 827632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutstatic const SkBlitRow::Proc32 platform_32_procs_mips_dsp[] = { 828632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut NULL, // S32_Opaque, 829632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut S32_Blend_BlitRow32_mips_dsp, // S32_Blend, 830632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut NULL, // S32A_Opaque, 831632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut NULL, // S32A_Blend, 832632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut}; 833632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 834632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) { 835632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut return platform_565_procs_mips_dsp[flags]; 836632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut} 837632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 838632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) { 839632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut return platform_32_procs_mips_dsp[flags]; 840632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut} 841632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 842632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::ColorRectProc PlatformColorRectProcFactory() { 843632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut return NULL; 844632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut} 845632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut 846632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesutSkBlitRow::ColorProc SkBlitRow::PlatformColorProc() { 847632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut return NULL; 848632a4546b085fea79f40212935e5ac6fa74612a2djordje.pesut} 849