11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright (c) 2012 31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * MIPS Technologies, Inc., California. 41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Redistribution and use in source and binary forms, with or without 61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * modification, are permitted provided that the following conditions 71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * are met: 81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 1. Redistributions of source code must retain the above copyright 91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * notice, this list of conditions and the following disclaimer. 101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 2. Redistributions in binary form must reproduce the above copyright 111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * notice, this list of conditions and the following disclaimer in the 121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * documentation and/or other materials provided with the distribution. 131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its 141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * contributors may be used to endorse or promote products derived from 151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * this software without specific prior written permission. 161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND 181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE 211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SUCH DAMAGE. 281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Author: Nemanja Lukic (nlukic@mips.com) 301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifndef PIXMAN_MIPS_DSPR2_ASM_H 331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define PIXMAN_MIPS_DSPR2_ASM_H 341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define zero $0 361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define AT $1 371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define v0 $2 381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define v1 $3 391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define a0 $4 401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define a1 $5 411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define a2 $6 421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define a3 $7 431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t0 $8 441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t1 $9 451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t2 $10 461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t3 $11 471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t4 $12 481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t5 $13 491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t6 $14 501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t7 $15 511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s0 $16 521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s1 $17 531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s2 $18 541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s3 $19 551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s4 $20 561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s5 $21 571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s6 $22 581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s7 $23 591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t8 $24 601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define t9 $25 611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define k0 $26 621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define k1 $27 631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define gp $28 641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define sp $29 651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define fp $30 661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define s8 $30 671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define ra $31 681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * LEAF_MIPS32R2 - declare leaf routine for MIPS32r2 711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define LEAF_MIPS32R2(symbol) \ 731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .globl symbol; \ 741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .align 2; \ 751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .type symbol, @function; \ 761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .ent symbol, 0; \ 771176bdada62cabc6ec4b0308a930e83b679d5d36John Recksymbol: .frame sp, 0, ra; \ 781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .set push; \ 791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .set arch=mips32r2; \ 801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .set noreorder; \ 811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .set noat; 821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * LEAF_MIPS32R2 - declare leaf routine for MIPS DSPr2 851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define LEAF_MIPS_DSPR2(symbol) \ 871176bdada62cabc6ec4b0308a930e83b679d5d36John ReckLEAF_MIPS32R2(symbol) \ 881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .set dspr2; 891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * END - mark end of function 921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define END(function) \ 941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .set pop; \ 951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .end function; \ 961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .size function,.-function 971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Checks if stack offset is big enough for storing/restoring regs_num 1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * number of register to/from stack. Stack offset must be greater than 1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * or equal to the number of bytes needed for storing registers (regs_num*4). 1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Since MIPS ABI allows usage of first 16 bytes of stack frame (this is 1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * preserved for input arguments of the functions, already stored in a0-a3), 1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * stack size can be further optimized by utilizing this space. 1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro CHECK_STACK_OFFSET regs_num, stack_offset 1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.if \stack_offset < \regs_num * 4 - 16 1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.error "Stack offset too small." 1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endif 1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Saves set of registers on stack. Maximum number of registers that 1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * can be saved on stack is limitted to 14 (a0-a3, v0-v1 and s0-s7). 1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Stack offset is number of bytes that are added to stack pointer (sp) 1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * before registers are pushed in order to provide enough space on stack 1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * (offset must be multiple of 4, and must be big enough, as described by 1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * CHECK_STACK_OFFSET macro). This macro is intended to be used in 1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * combination with RESTORE_REGS_FROM_STACK macro. Example: 1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SAVE_REGS_ON_STACK 4, v0, v1, s0, s1 1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1 1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro SAVE_REGS_ON_STACK stack_offset = 0, r1, \ 1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r2 = 0, r3 = 0, r4 = 0, \ 1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r5 = 0, r6 = 0, r7 = 0, \ 1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r8 = 0, r9 = 0, r10 = 0, \ 1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r11 = 0, r12 = 0, r13 = 0, \ 1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r14 = 0 1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if (\stack_offset < 0) || (\stack_offset - (\stack_offset / 4) * 4) 1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .error "Stack offset must be pozitive and multiple of 4." 1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \stack_offset != 0 1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addiu sp, sp, -\stack_offset 1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r1, 0(sp) 1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r2 != 0 1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r2, 4(sp) 1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r3 != 0 1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r3, 8(sp) 1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r4 != 0 1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r4, 12(sp) 1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r5 != 0 1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 5, \stack_offset 1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r5, 16(sp) 1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r6 != 0 1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 6, \stack_offset 1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r6, 20(sp) 1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r7 != 0 1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 7, \stack_offset 1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r7, 24(sp) 1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r8 != 0 1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 8, \stack_offset 1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r8, 28(sp) 1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r9 != 0 1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 9, \stack_offset 1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r9, 32(sp) 1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r10 != 0 1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 10, \stack_offset 1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r10, 36(sp) 1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r11 != 0 1701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 11, \stack_offset 1711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r11, 40(sp) 1721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r12 != 0 1741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 12, \stack_offset 1751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r12, 44(sp) 1761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r13 != 0 1781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 13, \stack_offset 1791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r13, 48(sp) 1801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r14 != 0 1821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 14, \stack_offset 1831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sw \r14, 52(sp) 1841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 1851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 1861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 1881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Restores set of registers from stack. Maximum number of registers that 1891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * can be restored from stack is limitted to 14 (a0-a3, v0-v1 and s0-s7). 1901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Stack offset is number of bytes that are added to stack pointer (sp) 1911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * after registers are restored (offset must be multiple of 4, and must 1921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * be big enough, as described by CHECK_STACK_OFFSET macro). This macro is 1931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * intended to be used in combination with RESTORE_REGS_FROM_STACK macro. 1941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Example: 1951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SAVE_REGS_ON_STACK 4, v0, v1, s0, s1 1961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1 1971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 1981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro RESTORE_REGS_FROM_STACK stack_offset = 0, r1, \ 1991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r2 = 0, r3 = 0, r4 = 0, \ 2001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r5 = 0, r6 = 0, r7 = 0, \ 2011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r8 = 0, r9 = 0, r10 = 0, \ 2021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r11 = 0, r12 = 0, r13 = 0, \ 2031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r14 = 0 2041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if (\stack_offset < 0) || (\stack_offset - (\stack_offset/4)*4) 2051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .error "Stack offset must be pozitive and multiple of 4." 2061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r1, 0(sp) 2081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r2 != 0 2091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r2, 4(sp) 2101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r3 != 0 2121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r3, 8(sp) 2131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r4 != 0 2151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r4, 12(sp) 2161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r5 != 0 2181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 5, \stack_offset 2191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r5, 16(sp) 2201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r6 != 0 2221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 6, \stack_offset 2231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r6, 20(sp) 2241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r7 != 0 2261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 7, \stack_offset 2271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r7, 24(sp) 2281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r8 != 0 2301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 8, \stack_offset 2311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r8, 28(sp) 2321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r9 != 0 2341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 9, \stack_offset 2351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r9, 32(sp) 2361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r10 != 0 2381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 10, \stack_offset 2391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r10, 36(sp) 2401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r11 != 0 2421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 11, \stack_offset 2431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r11, 40(sp) 2441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r12 != 0 2461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 12, \stack_offset 2471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r12, 44(sp) 2481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r13 != 0 2501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 13, \stack_offset 2511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r13, 48(sp) 2521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \r14 != 0 2541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck CHECK_STACK_OFFSET 14, \stack_offset 2551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lw \r14, 52(sp) 2561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .if \stack_offset != 0 2581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addiu sp, sp, \stack_offset 2591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck .endif 2601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 2611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 2631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Conversion of single r5g6b5 pixel (in_565) to single a8r8g8b8 pixel 2641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * returned in (out_8888) register. Requires two temporary registers 2651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * (scratch1 and scratch2). 2661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 2671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro CONVERT_1x0565_TO_1x8888 in_565, \ 2681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out_8888, \ 2691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2 2701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lui \out_8888, 0xff00 2711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sll \scratch1, \in_565, 0x3 2721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch2, \scratch1, 0xff 2731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch1, \in_565, 0x2, 0x3 2741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch1, \scratch2, \scratch1 2751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out_8888, \out_8888, \scratch1 2761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sll \scratch1, \in_565, 0x5 2781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch1, \scratch1, 0xfc00 2791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch2, \in_565, 0x1 2801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch2, \scratch2, 0x300 2811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch2, \scratch1, \scratch2 2821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out_8888, \out_8888, \scratch2 2831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch1, \in_565, 0xf800 2851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch2, \scratch1, 0x5 2861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch2, \scratch2, 0xff00 2871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch1, \scratch1, \scratch2 2881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sll \scratch1, \scratch1, 0x8 2891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out_8888, \out_8888, \scratch1 2901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 2911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 2931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Conversion of two r5g6b5 pixels (in1_565 and in2_565) to two a8r8g8b8 pixels 2941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * returned in (out1_8888 and out2_8888) registers. Requires four scratch 2951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * registers (scratch1 ... scratch4). It also requires maskG and maskB for 2961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * color component extractions. These masks must have following values: 2971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskG, 0x07e007e0 2981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskB, 0x001F001F 2991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 3001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro CONVERT_2x0565_TO_2x8888 in1_565, in2_565, \ 3011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out1_8888, out2_8888, \ 3021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskG, maskB, \ 3031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, scratch4 3041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sll \scratch1, \in1_565, 16 3051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch1, \scratch1, \in2_565 3061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck lui \out2_8888, 0xff00 3071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ori \out2_8888, \out2_8888, 0xff00 3081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shrl.ph \scratch2, \scratch1, 11 3091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch3, \scratch1, \maskG 3101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra.ph \scratch4, \scratch2, 2 3111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shll.ph \scratch2, \scratch2, 3 3121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shll.ph \scratch3, \scratch3, 5 3131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch2, \scratch2, \scratch4 3141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shrl.qb \scratch4, \scratch3, 6 3151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out2_8888, \out2_8888, \scratch2 3161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch3, \scratch3, \scratch4 3171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch1, \scratch1, \maskB 3181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shll.ph \scratch2, \scratch1, 3 3191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra.ph \scratch4, \scratch1, 2 3201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch2, \scratch2, \scratch4 3211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \scratch3, \scratch2, \scratch3 3221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precrq.ph.w \out1_8888, \out2_8888, \scratch3 3231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr_sra.ph.w \out2_8888, \scratch3, 0 3241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 3251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 3271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Conversion of single a8r8g8b8 pixel (in_8888) to single r5g6b5 pixel 3281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * returned in (out_565) register. Requires two temporary registers 3291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * (scratch1 and scratch2). 3301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 3311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro CONVERT_1x8888_TO_1x0565 in_8888, \ 3321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out_565, \ 3331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2 3341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \out_565, \in_8888, 0x3, 0x5 3351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch1, \in_8888, 0x5 3361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch1, \scratch1, 0x07e0 3371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch2, \in_8888, 0x8 3381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch2, \scratch2, 0xf800 3391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out_565, \out_565, \scratch1 3401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out_565, \out_565, \scratch2 3411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 3421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 3441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Conversion of two a8r8g8b8 pixels (in1_8888 and in2_8888) to two r5g6b5 3451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * pixels returned in (out1_565 and out2_565) registers. Requires two temporary 3461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * registers (scratch1 and scratch2). It also requires maskR, maskG and maskB 3471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * for color component extractions. These masks must have following values: 3481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskR, 0xf800f800 3491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskG, 0x07e007e0 3501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskB, 0x001F001F 3511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Value of input register in2_8888 is lost. 3521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 3531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro CONVERT_2x8888_TO_2x0565 in1_8888, in2_8888, \ 3541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out1_565, out2_565, \ 3551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskR, maskG, maskB, \ 3561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2 3571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \scratch1, \in2_8888, \in1_8888 3581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precrq.qb.ph \in2_8888, \in2_8888, \in1_8888 3591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \out1_565, \scratch1, \maskR 3601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shrl.ph \scratch1, \scratch1, 3 3611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shll.ph \in2_8888, \in2_8888, 3 3621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch1, \scratch1, \maskB 3631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out1_565, \out1_565, \scratch1 3641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \in2_8888, \in2_8888, \maskG 3651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck or \out1_565, \out1_565, \in2_8888 3661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \out2_565, \out1_565, 16 3671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 3681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 3701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Multiply pixel (a8) with single pixel (a8r8g8b8). It requires maskLSR needed 3711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * for rounding process. maskLSR must have following value: 3721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 3731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 3741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro MIPS_UN8x4_MUL_UN8 s_8888, \ 3751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m_8, \ 3761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d_8888, \ 3771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 3781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3 3791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck replv.ph \m_8, \m_8 /* 0 | M | 0 | M */ 3801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbl \scratch1, \s_8888, \m_8 /* A*M | R*M */ 3811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbr \scratch2, \s_8888, \m_8 /* G*M | B*M */ 3821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch3, \scratch1, 8 3831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \d_8888, \scratch2, 8 3841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch3, \scratch3, \maskLSR /* 0 |A*M| 0 |R*M */ 3851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \d_8888, \d_8888, \maskLSR /* 0 |G*M| 0 |B*M */ 3861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch1, \scratch1, \scratch3 /* A*M+A*M | R*M+R*M */ 3871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch2, \scratch2, \d_8888 /* G*M+G*M | B*M+B*M */ 3881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch1, \scratch1, 8 3891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch2, \scratch2, 8 3901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \d_8888, \scratch1, \scratch2 3911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 3921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 3941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Multiply two pixels (a8) with two pixels (a8r8g8b8). It requires maskLSR 3951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * needed for rounding process. maskLSR must have following value: 3961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 3971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 3981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro MIPS_2xUN8x4_MUL_2xUN8 s1_8888, \ 3991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s2_8888, \ 4001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m1_8, \ 4011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m2_8, \ 4021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d1_8888, \ 4031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d2_8888, \ 4041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 4051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, \ 4061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch4, scratch5, scratch6 4071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck replv.ph \m1_8, \m1_8 /* 0 | M1 | 0 | M1 */ 4081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck replv.ph \m2_8, \m2_8 /* 0 | M2 | 0 | M2 */ 4091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbl \scratch1, \s1_8888, \m1_8 /* A1*M1 | R1*M1 */ 4101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbr \scratch2, \s1_8888, \m1_8 /* G1*M1 | B1*M1 */ 4111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbl \scratch3, \s2_8888, \m2_8 /* A2*M2 | R2*M2 */ 4121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbr \scratch4, \s2_8888, \m2_8 /* G2*M2 | B2*M2 */ 4131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch5, \scratch1, 8 4141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \d1_8888, \scratch2, 8 4151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch6, \scratch3, 8 4161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \d2_8888, \scratch4, 8 4171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch5, \scratch5, \maskLSR /* 0 |A1*M1| 0 |R1*M1 */ 4181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \d1_8888, \d1_8888, \maskLSR /* 0 |G1*M1| 0 |B1*M1 */ 4191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch6, \scratch6, \maskLSR /* 0 |A2*M2| 0 |R2*M2 */ 4201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \d2_8888, \d2_8888, \maskLSR /* 0 |G2*M2| 0 |B2*M2 */ 4211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch1, \scratch1, \scratch5 4221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch2, \scratch2, \d1_8888 4231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch3, \scratch3, \scratch6 4241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch4, \scratch4, \d2_8888 4251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch1, \scratch1, 8 4261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch2, \scratch2, 8 4271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch3, \scratch3, 8 4281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch4, \scratch4, 8 4291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \d1_8888, \scratch1, \scratch2 4301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \d2_8888, \scratch3, \scratch4 4311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 4321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 4341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Multiply pixel (a8r8g8b8) with single pixel (a8r8g8b8). It requires maskLSR 4351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * needed for rounding process. maskLSR must have following value: 4361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 4371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 4381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro MIPS_UN8x4_MUL_UN8x4 s_8888, \ 4391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m_8888, \ 4401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d_8888, \ 4411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 4421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, scratch4 4431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck preceu.ph.qbl \scratch1, \m_8888 /* 0 | A | 0 | R */ 4441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck preceu.ph.qbr \scratch2, \m_8888 /* 0 | G | 0 | B */ 4451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbl \scratch3, \s_8888, \scratch1 /* A*A | R*R */ 4461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbr \scratch4, \s_8888, \scratch2 /* G*G | B*B */ 4471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch1, \scratch3, 8 4481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch2, \scratch4, 8 4491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch1, \scratch1, \maskLSR /* 0 |A*A| 0 |R*R */ 4501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch2, \scratch2, \maskLSR /* 0 |G*G| 0 |B*B */ 4511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch1, \scratch1, \scratch3 4521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch2, \scratch2, \scratch4 4531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch1, \scratch1, 8 4541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch2, \scratch2, 8 4551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \d_8888, \scratch1, \scratch2 4561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 4571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 4591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Multiply two pixels (a8r8g8b8) with two pixels (a8r8g8b8). It requires 4601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * maskLSR needed for rounding process. maskLSR must have following value: 4611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 4621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 4631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro MIPS_2xUN8x4_MUL_2xUN8x4 s1_8888, \ 4651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s2_8888, \ 4661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m1_8888, \ 4671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m2_8888, \ 4681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d1_8888, \ 4691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d2_8888, \ 4701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 4711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, \ 4721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch4, scratch5, scratch6 4731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck preceu.ph.qbl \scratch1, \m1_8888 /* 0 | A | 0 | R */ 4741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck preceu.ph.qbr \scratch2, \m1_8888 /* 0 | G | 0 | B */ 4751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck preceu.ph.qbl \scratch3, \m2_8888 /* 0 | A | 0 | R */ 4761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck preceu.ph.qbr \scratch4, \m2_8888 /* 0 | G | 0 | B */ 4771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbl \scratch5, \s1_8888, \scratch1 /* A*A | R*R */ 4781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbr \scratch6, \s1_8888, \scratch2 /* G*G | B*B */ 4791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbl \scratch1, \s2_8888, \scratch3 /* A*A | R*R */ 4801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck muleu_s.ph.qbr \scratch2, \s2_8888, \scratch4 /* G*G | B*B */ 4811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch3, \scratch5, 8 4821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch4, \scratch6, 8 4831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \d1_8888, \scratch1, 8 4841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \d2_8888, \scratch2, 8 4851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch3, \scratch3, \maskLSR /* 0 |A*A| 0 |R*R */ 4861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \scratch4, \scratch4, \maskLSR /* 0 |G*G| 0 |B*B */ 4871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \d1_8888, \d1_8888, \maskLSR /* 0 |A*A| 0 |R*R */ 4881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck and \d2_8888, \d2_8888, \maskLSR /* 0 |G*G| 0 |B*B */ 4891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch3, \scratch3, \scratch5 4901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \scratch4, \scratch4, \scratch6 4911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \d1_8888, \d1_8888, \scratch1 4921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addq.ph \d2_8888, \d2_8888, \scratch2 4931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch3, \scratch3, 8 4941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch4, \scratch4, 8 4951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch5, \d1_8888, 8 4961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck shra_r.ph \scratch6, \d2_8888, 8 4971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \d1_8888, \scratch3, \scratch4 4981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \d2_8888, \scratch5, \scratch6 4991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 5001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 5021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OVER operation on single a8r8g8b8 source pixel (s_8888) and single a8r8g8b8 5031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * destination pixel (d_8888) using a8 mask (m_8). It also requires maskLSR 5041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * needed for rounding process. maskLSR must have following value: 5051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 5061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 5071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro OVER_8888_8_8888 s_8888, \ 5081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m_8, \ 5091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d_8888, \ 5101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out_8888, \ 5111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 5121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, scratch4 5131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_UN8x4_MUL_UN8 \s_8888, \m_8, \ 5141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch1, \maskLSR, \ 5151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch2, \scratch3, \scratch4 5161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck not \scratch2, \scratch1 5181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch2, \scratch2, 24 5191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_UN8x4_MUL_UN8 \d_8888, \scratch2, \ 5211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \d_8888, \maskLSR, \ 5221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch3, \scratch4, \out_8888 5231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out_8888, \d_8888, \scratch1 5251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 5261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 5281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OVER operation on two a8r8g8b8 source pixels (s1_8888 and s2_8888) and two 5291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * a8r8g8b8 destination pixels (d1_8888 and d2_8888) using a8 masks (m1_8 and 5301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * m2_8). It also requires maskLSR needed for rounding process. maskLSR must 5311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * have following value: 5321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 5331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 5341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro OVER_2x8888_2x8_2x8888 s1_8888, \ 5351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s2_8888, \ 5361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m1_8, \ 5371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m2_8, \ 5381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d1_8888, \ 5391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d2_8888, \ 5401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out1_8888, \ 5411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out2_8888, \ 5421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 5431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, \ 5441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch4, scratch5, scratch6 5451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_2xUN8x4_MUL_2xUN8 \s1_8888, \s2_8888, \ 5461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \m1_8, \m2_8, \ 5471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch1, \scratch2, \ 5481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \maskLSR, \ 5491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch3, \scratch4, \out1_8888, \ 5501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \out2_8888, \scratch5, \scratch6 5511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck not \scratch3, \scratch1 5531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch3, \scratch3, 24 5541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck not \scratch4, \scratch2 5551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch4, \scratch4, 24 5561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_2xUN8x4_MUL_2xUN8 \d1_8888, \d2_8888, \ 5581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch3, \scratch4, \ 5591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \d1_8888, \d2_8888, \ 5601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \maskLSR, \ 5611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch5, \scratch6, \out1_8888, \ 5621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \out2_8888, \scratch3, \scratch4 5631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out1_8888, \d1_8888, \scratch1 5651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out2_8888, \d2_8888, \scratch2 5661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 5671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 5691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OVER operation on single a8r8g8b8 source pixel (s_8888) and single a8r8g8b8 5701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * destination pixel (d_8888). It also requires maskLSR needed for rounding 5711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * process. maskLSR must have following value: 5721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 5731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 5741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro OVER_8888_8888 s_8888, \ 5751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d_8888, \ 5761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out_8888, \ 5771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 5781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, scratch4 5791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck not \scratch1, \s_8888 5801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch1, \scratch1, 24 5811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_UN8x4_MUL_UN8 \d_8888, \scratch1, \ 5831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \out_8888, \maskLSR, \ 5841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch2, \scratch3, \scratch4 5851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out_8888, \out_8888, \s_8888 5871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 5881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 5901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OVER operation on two a8r8g8b8 source pixels (s1_8888 and s2_8888) and two 5911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * a8r8g8b8 destination pixels (d1_8888 and d2_8888). It also requires maskLSR 5921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * needed for rounding process. maskLSR must have following value: 5931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * li maskLSR, 0x00ff00ff 5941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 5951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro OVER_2x8888_2x8888 s1_8888, \ 5961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s2_8888, \ 5971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d1_8888, \ 5981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d2_8888, \ 5991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out1_8888, \ 6001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out2_8888, \ 6011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 6021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, \ 6031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch4, scratch5, scratch6 6041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck not \scratch1, \s1_8888 6051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch1, \scratch1, 24 6061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck not \scratch2, \s2_8888 6071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srl \scratch2, \scratch2, 24 6081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_2xUN8x4_MUL_2xUN8 \d1_8888, \d2_8888, \ 6091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch1, \scratch2, \ 6101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \out1_8888, \out2_8888, \ 6111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \maskLSR, \ 6121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch3, \scratch4, \scratch5, \ 6131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch6, \d1_8888, \d2_8888 6141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out1_8888, \out1_8888, \s1_8888 6161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out2_8888, \out2_8888, \s2_8888 6171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 6181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro MIPS_UN8x4_MUL_UN8_ADD_UN8x4 s_8888, \ 6201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m_8, \ 6211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d_8888, \ 6221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out_8888, \ 6231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 6241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3 6251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_UN8x4_MUL_UN8 \s_8888, \m_8, \ 6261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \out_8888, \maskLSR, \ 6271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch1, \scratch2, \scratch3 6281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out_8888, \out_8888, \d_8888 6301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 6311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro MIPS_2xUN8x4_MUL_2xUN8_ADD_2xUN8x4 s1_8888, \ 6331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s2_8888, \ 6341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m1_8, \ 6351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck m2_8, \ 6361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d1_8888, \ 6371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck d2_8888, \ 6381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out1_8888, \ 6391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck out2_8888, \ 6401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskLSR, \ 6411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, scratch3, \ 6421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch4, scratch5, scratch6 6431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck MIPS_2xUN8x4_MUL_2xUN8 \s1_8888, \s2_8888, \ 6441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \m1_8, \m2_8, \ 6451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \out1_8888, \out2_8888, \ 6461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \maskLSR, \ 6471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch1, \scratch2, \scratch3, \ 6481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck \scratch4, \scratch5, \scratch6 6491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out1_8888, \out1_8888, \d1_8888 6511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck addu_s.qb \out2_8888, \out2_8888, \d2_8888 6521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 6531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.macro BILINEAR_INTERPOLATE_SINGLE_PIXEL tl, tr, bl, br, \ 6551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck scratch1, scratch2, \ 6561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck alpha, red, green, blue \ 6571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck wt1, wt2, wb1, wb2 6581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch1, \tl, 0xff 6591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \scratch2, \tr, 0xff 6601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \alpha, \bl, 0xff 6611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck andi \red, \br, 0xff 6621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck multu $ac0, \wt1, \scratch1 6641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac0, \wt2, \scratch2 6651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac0, \wb1, \alpha 6661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac0, \wb2, \red 6671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch1, \tl, 8, 8 6691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch2, \tr, 8, 8 6701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \alpha, \bl, 8, 8 6711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \red, \br, 8, 8 6721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck multu $ac1, \wt1, \scratch1 6741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac1, \wt2, \scratch2 6751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac1, \wb1, \alpha 6761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac1, \wb2, \red 6771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch1, \tl, 16, 8 6791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch2, \tr, 16, 8 6801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \alpha, \bl, 16, 8 6811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \red, \br, 16, 8 6821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mflo \blue, $ac0 6841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck multu $ac2, \wt1, \scratch1 6861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac2, \wt2, \scratch2 6871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac2, \wb1, \alpha 6881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac2, \wb2, \red 6891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch1, \tl, 24, 8 6911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \scratch2, \tr, 24, 8 6921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \alpha, \bl, 24, 8 6931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ext \red, \br, 24, 8 6941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mflo \green, $ac1 6961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck multu $ac3, \wt1, \scratch1 6981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac3, \wt2, \scratch2 6991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac3, \wb1, \alpha 7001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maddu $ac3, \wb2, \red 7011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mflo \red, $ac2 7031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mflo \alpha, $ac3 7041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \alpha, \alpha, \red 7061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precr.qb.ph \scratch1, \green, \blue 7071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck precrq.qb.ph \tl, \alpha, \scratch1 7081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck.endm 7091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif //PIXMAN_MIPS_DSPR2_ASM_H 711