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