Index: simd/jsimd_mips_dspr2.S |
diff --git a/simd/jsimd_mips_dspr2.S b/simd/jsimd_mips_dspr2.S |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0eed1ce2ea657df4814b3f19a71fc15c790436c8 |
--- /dev/null |
+++ b/simd/jsimd_mips_dspr2.S |
@@ -0,0 +1,4487 @@ |
+/* |
+ * MIPS DSPr2 optimizations for libjpeg-turbo |
+ * |
+ * Copyright (C) 2013-2014, MIPS Technologies, Inc., California. |
+ * All rights reserved. |
+ * Authors: Teodora Novkovic (teodora.novkovic@imgtec.com) |
+ * Darko Laus (darko.laus@imgtec.com) |
+ * Copyright (C) 2015, D. R. Commander. All Rights Reserved. |
+ * This software is provided 'as-is', without any express or implied |
+ * warranty. In no event will the authors be held liable for any damages |
+ * arising from the use of this software. |
+ * |
+ * Permission is granted to anyone to use this software for any purpose, |
+ * including commercial applications, and to alter it and redistribute it |
+ * freely, subject to the following restrictions: |
+ * |
+ * 1. The origin of this software must not be misrepresented; you must not |
+ * claim that you wrote the original software. If you use this software |
+ * in a product, an acknowledgment in the product documentation would be |
+ * appreciated but is not required. |
+ * 2. Altered source versions must be plainly marked as such, and must not be |
+ * misrepresented as being the original software. |
+ * 3. This notice may not be removed or altered from any source distribution. |
+ */ |
+ |
+#include "jsimd_mips_dspr2_asm.h" |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_c_null_convert_mips_dspr2) |
+/* |
+ * a0 - cinfo->image_width |
+ * a1 - input_buf |
+ * a2 - output_buf |
+ * a3 - output_row |
+ * 16(sp) - num_rows |
+ * 20(sp) - cinfo->num_components |
+ * |
+ * Null conversion for compression |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 8, s0, s1 |
+ |
+ lw t9, 24(sp) // t9 = num_rows |
+ lw s0, 28(sp) // s0 = cinfo->num_components |
+ andi t0, a0, 3 // t0 = cinfo->image_width & 3 |
+ beqz t0, 4f // no residual |
+ nop |
+0: |
+ addiu t9, t9, -1 |
+ bltz t9, 7f |
+ li t1, 0 |
+1: |
+ sll t3, t1, 2 |
+ lwx t5, t3(a2) // t5 = outptr = output_buf[ci] |
+ lw t2, 0(a1) // t2 = inptr = *input_buf |
+ sll t4, a3, 2 |
+ lwx t5, t4(t5) // t5 = outptr = output_buf[ci][output_row] |
+ addu t2, t2, t1 |
+ addu s1, t5, a0 |
+ addu t6, t5, t0 |
+2: |
+ lbu t3, 0(t2) |
+ addiu t5, t5, 1 |
+ sb t3, -1(t5) |
+ bne t6, t5, 2b |
+ addu t2, t2, s0 |
+3: |
+ lbu t3, 0(t2) |
+ addu t4, t2, s0 |
+ addu t7, t4, s0 |
+ addu t8, t7, s0 |
+ addu t2, t8, s0 |
+ lbu t4, 0(t4) |
+ lbu t7, 0(t7) |
+ lbu t8, 0(t8) |
+ addiu t5, t5, 4 |
+ sb t3, -4(t5) |
+ sb t4, -3(t5) |
+ sb t7, -2(t5) |
+ bne s1, t5, 3b |
+ sb t8, -1(t5) |
+ addiu t1, t1, 1 |
+ bne t1, s0, 1b |
+ nop |
+ addiu a1, a1, 4 |
+ bgez t9, 0b |
+ addiu a3, a3, 1 |
+ b 7f |
+ nop |
+4: |
+ addiu t9, t9, -1 |
+ bltz t9, 7f |
+ li t1, 0 |
+5: |
+ sll t3, t1, 2 |
+ lwx t5, t3(a2) // t5 = outptr = output_buf[ci] |
+ lw t2, 0(a1) // t2 = inptr = *input_buf |
+ sll t4, a3, 2 |
+ lwx t5, t4(t5) // t5 = outptr = output_buf[ci][output_row] |
+ addu t2, t2, t1 |
+ addu s1, t5, a0 |
+ addu t6, t5, t0 |
+6: |
+ lbu t3, 0(t2) |
+ addu t4, t2, s0 |
+ addu t7, t4, s0 |
+ addu t8, t7, s0 |
+ addu t2, t8, s0 |
+ lbu t4, 0(t4) |
+ lbu t7, 0(t7) |
+ lbu t8, 0(t8) |
+ addiu t5, t5, 4 |
+ sb t3, -4(t5) |
+ sb t4, -3(t5) |
+ sb t7, -2(t5) |
+ bne s1, t5, 6b |
+ sb t8, -1(t5) |
+ addiu t1, t1, 1 |
+ bne t1, s0, 5b |
+ nop |
+ addiu a1, a1, 4 |
+ bgez t9, 4b |
+ addiu a3, a3, 1 |
+7: |
+ RESTORE_REGS_FROM_STACK 8, s0, s1 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_c_null_convert_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+/* |
+ * jsimd_extrgb_ycc_convert_mips_dspr2 |
+ * jsimd_extbgr_ycc_convert_mips_dspr2 |
+ * jsimd_extrgbx_ycc_convert_mips_dspr2 |
+ * jsimd_extbgrx_ycc_convert_mips_dspr2 |
+ * jsimd_extxbgr_ycc_convert_mips_dspr2 |
+ * jsimd_extxrgb_ycc_convert_mips_dspr2 |
+ * |
+ * Colorspace conversion RGB -> YCbCr |
+ */ |
+ |
+.macro GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 colorid, pixel_size, r_offs, g_offs, b_offs |
+ |
+.macro DO_RGB_TO_YCC r, \ |
+ g, \ |
+ b, \ |
+ inptr |
+ lbu \r, \r_offs(\inptr) |
+ lbu \g, \g_offs(\inptr) |
+ lbu \b, \b_offs(\inptr) |
+ addiu \inptr, \pixel_size |
+.endm |
+ |
+LEAF_MIPS_DSPR2(jsimd_\colorid\()_ycc_convert_mips_dspr2) |
+/* |
+ * a0 - cinfo->image_width |
+ * a1 - input_buf |
+ * a2 - output_buf |
+ * a3 - output_row |
+ * 16(sp) - num_rows |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ lw t7, 48(sp) // t7 = num_rows |
+ li s0, 0x4c8b // FIX(0.29900) |
+ li s1, 0x9646 // FIX(0.58700) |
+ li s2, 0x1d2f // FIX(0.11400) |
+ li s3, 0xffffd4cd // -FIX(0.16874) |
+ li s4, 0xffffab33 // -FIX(0.33126) |
+ li s5, 0x8000 // FIX(0.50000) |
+ li s6, 0xffff94d1 // -FIX(0.41869) |
+ li s7, 0xffffeb2f // -FIX(0.08131) |
+ li t8, 0x807fff // CBCR_OFFSET + ONE_HALF-1 |
+ |
+0: |
+ addiu t7, -1 // --num_rows |
+ lw t6, 0(a1) // t6 = input_buf[0] |
+ lw t0, 0(a2) |
+ lw t1, 4(a2) |
+ lw t2, 8(a2) |
+ sll t3, a3, 2 |
+ lwx t0, t3(t0) // t0 = output_buf[0][output_row] |
+ lwx t1, t3(t1) // t1 = output_buf[1][output_row] |
+ lwx t2, t3(t2) // t2 = output_buf[2][output_row] |
+ |
+ addu t9, t2, a0 // t9 = end address |
+ addiu a3, 1 |
+ |
+1: |
+ DO_RGB_TO_YCC t3, t4, t5, t6 |
+ |
+ mtlo s5, $ac0 |
+ mtlo t8, $ac1 |
+ mtlo t8, $ac2 |
+ maddu $ac0, s2, t5 |
+ maddu $ac1, s5, t5 |
+ maddu $ac2, s5, t3 |
+ maddu $ac0, s0, t3 |
+ maddu $ac1, s3, t3 |
+ maddu $ac2, s6, t4 |
+ maddu $ac0, s1, t4 |
+ maddu $ac1, s4, t4 |
+ maddu $ac2, s7, t5 |
+ extr.w t3, $ac0, 16 |
+ extr.w t4, $ac1, 16 |
+ extr.w t5, $ac2, 16 |
+ sb t3, 0(t0) |
+ sb t4, 0(t1) |
+ sb t5, 0(t2) |
+ addiu t0, 1 |
+ addiu t2, 1 |
+ bne t2, t9, 1b |
+ addiu t1, 1 |
+ bgtz t7, 0b |
+ addiu a1, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+END(jsimd_\colorid\()_ycc_convert_mips_dspr2) |
+ |
+.purgem DO_RGB_TO_YCC |
+ |
+.endm |
+ |
+/*------------------------------------------id -- pix R G B */ |
+GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 extrgb, 3, 0, 1, 2 |
+GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 extbgr, 3, 2, 1, 0 |
+GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 extrgbx, 4, 0, 1, 2 |
+GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 extbgrx, 4, 2, 1, 0 |
+GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 extxbgr, 4, 3, 2, 1 |
+GENERATE_JSIMD_RGB_YCC_CONVERT_MIPS_DSPR2 extxrgb, 4, 1, 2, 3 |
+ |
+/*****************************************************************************/ |
+/* |
+ * jsimd_ycc_extrgb_convert_mips_dspr2 |
+ * jsimd_ycc_extbgr_convert_mips_dspr2 |
+ * jsimd_ycc_extrgbx_convert_mips_dspr2 |
+ * jsimd_ycc_extbgrx_convert_mips_dspr2 |
+ * jsimd_ycc_extxbgr_convert_mips_dspr2 |
+ * jsimd_ycc_extxrgb_convert_mips_dspr2 |
+ * |
+ * Colorspace conversion YCbCr -> RGB |
+ */ |
+ |
+.macro GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 colorid, pixel_size, r_offs, g_offs, b_offs, a_offs |
+ |
+.macro STORE_YCC_TO_RGB scratch0 \ |
+ scratch1 \ |
+ scratch2 \ |
+ outptr |
+ sb \scratch0, \r_offs(\outptr) |
+ sb \scratch1, \g_offs(\outptr) |
+ sb \scratch2, \b_offs(\outptr) |
+.if (\pixel_size == 4) |
+ li t0, 0xFF |
+ sb t0, \a_offs(\outptr) |
+.endif |
+ addiu \outptr, \pixel_size |
+.endm |
+ |
+LEAF_MIPS_DSPR2(jsimd_ycc_\colorid\()_convert_mips_dspr2) |
+/* |
+ * a0 - cinfo->image_width |
+ * a1 - input_buf |
+ * a2 - input_row |
+ * a3 - output_buf |
+ * 16(sp) - num_rows |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ lw s1, 48(sp) |
+ li t3, 0x8000 |
+ li t4, 0x166e9 // FIX(1.40200) |
+ li t5, 0x1c5a2 // FIX(1.77200) |
+ li t6, 0xffff492e // -FIX(0.71414) |
+ li t7, 0xffffa7e6 // -FIX(0.34414) |
+ repl.ph t8, 128 |
+ |
+0: |
+ lw s0, 0(a3) |
+ lw t0, 0(a1) |
+ lw t1, 4(a1) |
+ lw t2, 8(a1) |
+ sll s5, a2, 2 |
+ addiu s1, -1 |
+ lwx s2, s5(t0) |
+ lwx s3, s5(t1) |
+ lwx s4, s5(t2) |
+ addu t9, s2, a0 |
+ addiu a2, 1 |
+ |
+1: |
+ lbu s7, 0(s4) // cr |
+ lbu s6, 0(s3) // cb |
+ lbu s5, 0(s2) // y |
+ addiu s2, 1 |
+ addiu s4, 1 |
+ addiu s7, -128 |
+ addiu s6, -128 |
+ mul t2, t7, s6 |
+ mul t0, t6, s7 // Crgtab[cr] |
+ sll s7, 15 |
+ mulq_rs.w t1, t4, s7 // Crrtab[cr] |
+ sll s6, 15 |
+ addu t2, t3 // Cbgtab[cb] |
+ addu t2, t0 |
+ |
+ mulq_rs.w t0, t5, s6 // Cbbtab[cb] |
+ sra t2, 16 |
+ addu t1, s5 |
+ addu t2, s5 // add y |
+ ins t2, t1, 16, 16 |
+ subu.ph t2, t2, t8 |
+ addu t0, s5 |
+ shll_s.ph t2, t2, 8 |
+ subu t0, 128 |
+ shra.ph t2, t2, 8 |
+ shll_s.w t0, t0, 24 |
+ addu.ph t2, t2, t8 // clip & store |
+ sra t0, t0, 24 |
+ sra t1, t2, 16 |
+ addiu t0, 128 |
+ |
+ STORE_YCC_TO_RGB t1, t2, t0, s0 |
+ |
+ bne s2, t9, 1b |
+ addiu s3, 1 |
+ bgtz s1, 0b |
+ addiu a3, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+END(jsimd_ycc_\colorid\()_convert_mips_dspr2) |
+ |
+.purgem STORE_YCC_TO_RGB |
+ |
+.endm |
+ |
+/*------------------------------------------id -- pix R G B A */ |
+GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 extrgb, 3, 0, 1, 2, 3 |
+GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 extbgr, 3, 2, 1, 0, 3 |
+GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 extrgbx, 4, 0, 1, 2, 3 |
+GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 extbgrx, 4, 2, 1, 0, 3 |
+GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 extxbgr, 4, 3, 2, 1, 0 |
+GENERATE_JSIMD_YCC_RGB_CONVERT_MIPS_DSPR2 extxrgb, 4, 1, 2, 3, 0 |
+ |
+/*****************************************************************************/ |
+/* |
+ * jsimd_extrgb_gray_convert_mips_dspr2 |
+ * jsimd_extbgr_gray_convert_mips_dspr2 |
+ * jsimd_extrgbx_gray_convert_mips_dspr2 |
+ * jsimd_extbgrx_gray_convert_mips_dspr2 |
+ * jsimd_extxbgr_gray_convert_mips_dspr2 |
+ * jsimd_extxrgb_gray_convert_mips_dspr2 |
+ * |
+ * Colorspace conversion RGB -> GRAY |
+ */ |
+ |
+.macro GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 colorid, pixel_size, r_offs, g_offs, b_offs |
+ |
+.macro DO_RGB_TO_GRAY r, \ |
+ g, \ |
+ b, \ |
+ inptr |
+ lbu \r, \r_offs(\inptr) |
+ lbu \g, \g_offs(\inptr) |
+ lbu \b, \b_offs(\inptr) |
+ addiu \inptr, \pixel_size |
+.endm |
+ |
+LEAF_MIPS_DSPR2(jsimd_\colorid\()_gray_convert_mips_dspr2) |
+/* |
+ * a0 - cinfo->image_width |
+ * a1 - input_buf |
+ * a2 - output_buf |
+ * a3 - output_row |
+ * 16(sp) - num_rows |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ li s0, 0x4c8b // s0 = FIX(0.29900) |
+ li s1, 0x9646 // s1 = FIX(0.58700) |
+ li s2, 0x1d2f // s2 = FIX(0.11400) |
+ li s7, 0x8000 // s7 = FIX(0.50000) |
+ lw s6, 48(sp) |
+ andi t7, a0, 3 |
+ |
+0: |
+ addiu s6, -1 // s6 = num_rows |
+ lw t0, 0(a1) |
+ lw t1, 0(a2) |
+ sll t3, a3, 2 |
+ lwx t1, t3(t1) |
+ addiu a3, 1 |
+ addu t9, t1, a0 |
+ subu t8, t9, t7 |
+ beq t1, t8, 2f |
+ nop |
+ |
+1: |
+ DO_RGB_TO_GRAY t3, t4, t5, t0 |
+ DO_RGB_TO_GRAY s3, s4, s5, t0 |
+ |
+ mtlo s7, $ac0 |
+ maddu $ac0, s2, t5 |
+ maddu $ac0, s1, t4 |
+ maddu $ac0, s0, t3 |
+ mtlo s7, $ac1 |
+ maddu $ac1, s2, s5 |
+ maddu $ac1, s1, s4 |
+ maddu $ac1, s0, s3 |
+ extr.w t6, $ac0, 16 |
+ |
+ DO_RGB_TO_GRAY t3, t4, t5, t0 |
+ DO_RGB_TO_GRAY s3, s4, s5, t0 |
+ |
+ mtlo s7, $ac0 |
+ maddu $ac0, s2, t5 |
+ maddu $ac0, s1, t4 |
+ extr.w t2, $ac1, 16 |
+ maddu $ac0, s0, t3 |
+ mtlo s7, $ac1 |
+ maddu $ac1, s2, s5 |
+ maddu $ac1, s1, s4 |
+ maddu $ac1, s0, s3 |
+ extr.w t5, $ac0, 16 |
+ sb t6, 0(t1) |
+ sb t2, 1(t1) |
+ extr.w t3, $ac1, 16 |
+ addiu t1, 4 |
+ sb t5, -2(t1) |
+ sb t3, -1(t1) |
+ bne t1, t8, 1b |
+ nop |
+ |
+2: |
+ beqz t7, 4f |
+ nop |
+ |
+3: |
+ DO_RGB_TO_GRAY t3, t4, t5, t0 |
+ |
+ mtlo s7, $ac0 |
+ maddu $ac0, s2, t5 |
+ maddu $ac0, s1, t4 |
+ maddu $ac0, s0, t3 |
+ extr.w t6, $ac0, 16 |
+ sb t6, 0(t1) |
+ addiu t1, 1 |
+ bne t1, t9, 3b |
+ nop |
+ |
+4: |
+ bgtz s6, 0b |
+ addiu a1, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+END(jsimd_\colorid\()_gray_convert_mips_dspr2) |
+ |
+.purgem DO_RGB_TO_GRAY |
+ |
+.endm |
+ |
+/*------------------------------------------id -- pix R G B */ |
+GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 extrgb, 3, 0, 1, 2 |
+GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 extbgr, 3, 2, 1, 0 |
+GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 extrgbx, 4, 0, 1, 2 |
+GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 extbgrx, 4, 2, 1, 0 |
+GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 extxbgr, 4, 3, 2, 1 |
+GENERATE_JSIMD_RGB_GRAY_CONVERT_MIPS_DSPR2 extxrgb, 4, 1, 2, 3 |
+/*****************************************************************************/ |
+/* |
+ * jsimd_h2v2_merged_upsample_mips_dspr2 |
+ * jsimd_h2v2_extrgb_merged_upsample_mips_dspr2 |
+ * jsimd_h2v2_extrgbx_merged_upsample_mips_dspr2 |
+ * jsimd_h2v2_extbgr_merged_upsample_mips_dspr2 |
+ * jsimd_h2v2_extbgrx_merged_upsample_mips_dspr2 |
+ * jsimd_h2v2_extxbgr_merged_upsample_mips_dspr2 |
+ * jsimd_h2v2_extxrgb_merged_upsample_mips_dspr2 |
+ * |
+ * Merged h2v2 upsample routines |
+ */ |
+.macro GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 colorid, \ |
+ pixel_size, \ |
+ r1_offs, \ |
+ g1_offs, \ |
+ b1_offs, \ |
+ a1_offs, \ |
+ r2_offs, \ |
+ g2_offs, \ |
+ b2_offs, \ |
+ a2_offs |
+ |
+.macro STORE_H2V2_2_PIXELS scratch0 \ |
+ scratch1 \ |
+ scratch2 \ |
+ scratch3 \ |
+ scratch4 \ |
+ scratch5 \ |
+ outptr |
+ sb \scratch0, \r1_offs(\outptr) |
+ sb \scratch1, \g1_offs(\outptr) |
+ sb \scratch2, \b1_offs(\outptr) |
+ sb \scratch3, \r2_offs(\outptr) |
+ sb \scratch4, \g2_offs(\outptr) |
+ sb \scratch5, \b2_offs(\outptr) |
+.if (\pixel_size == 8) |
+ li \scratch0, 0xFF |
+ sb \scratch0, \a1_offs(\outptr) |
+ sb \scratch0, \a2_offs(\outptr) |
+.endif |
+ addiu \outptr, \pixel_size |
+.endm |
+ |
+.macro STORE_H2V2_1_PIXEL scratch0 \ |
+ scratch1 \ |
+ scratch2 \ |
+ outptr |
+ sb \scratch0, \r1_offs(\outptr) |
+ sb \scratch1, \g1_offs(\outptr) |
+ sb \scratch2, \b1_offs(\outptr) |
+ |
+.if (\pixel_size == 8) |
+ li t0, 0xFF |
+ sb t0, \a1_offs(\outptr) |
+.endif |
+.endm |
+ |
+LEAF_MIPS_DSPR2(jsimd_h2v2_\colorid\()_merged_upsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->output_width |
+ * a1 - input_buf |
+ * a2 - in_row_group_ctr |
+ * a3 - output_buf |
+ * 16(sp) - cinfo->sample_range_limit |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, ra |
+ |
+ lw t9, 56(sp) // cinfo->sample_range_limit |
+ lw v0, 0(a1) |
+ lw v1, 4(a1) |
+ lw t0, 8(a1) |
+ sll t1, a2, 3 |
+ addiu t2, t1, 4 |
+ sll t3, a2, 2 |
+ lw t4, 0(a3) // t4 = output_buf[0] |
+ lwx t1, t1(v0) // t1 = input_buf[0][in_row_group_ctr*2] |
+ lwx t2, t2(v0) // t2 = input_buf[0][in_row_group_ctr*2 + 1] |
+ lwx t5, t3(v1) // t5 = input_buf[1][in_row_group_ctr] |
+ lwx t6, t3(t0) // t6 = input_buf[2][in_row_group_ctr] |
+ lw t7, 4(a3) // t7 = output_buf[1] |
+ li s1, 0xe6ea |
+ addiu t8, s1, 0x7fff // t8 = 0x166e9 [FIX(1.40200)] |
+ addiu s0, t8, 0x5eb9 // s0 = 0x1c5a2 [FIX(1.77200)] |
+ addiu s1, zero, 0xa7e6 // s4 = 0xffffa7e6 [-FIX(0.34414)] |
+ xori s2, s1, 0xeec8 // s3 = 0xffff492e [-FIX(0.71414)] |
+ srl t3, a0, 1 |
+ blez t3, 2f |
+ addu t0, t5, t3 // t0 = end address |
+ 1: |
+ lbu t3, 0(t5) |
+ lbu s3, 0(t6) |
+ addiu t5, t5, 1 |
+ addiu t3, t3, -128 // (cb - 128) |
+ addiu s3, s3, -128 // (cr - 128) |
+ mult $ac1, s1, t3 |
+ madd $ac1, s2, s3 |
+ sll s3, s3, 15 |
+ sll t3, t3, 15 |
+ mulq_rs.w s4, t8, s3 // s4 = (C1 * cr + ONE_HALF)>> SCALEBITS |
+ extr_r.w s5, $ac1, 16 |
+ mulq_rs.w s6, s0, t3 // s6 = (C2 * cb + ONE_HALF)>> SCALEBITS |
+ lbu v0, 0(t1) |
+ addiu t6, t6, 1 |
+ addiu t1, t1, 2 |
+ addu t3, v0, s4 // y+cred |
+ addu s3, v0, s5 // y+cgreen |
+ addu v1, v0, s6 // y+cblue |
+ addu t3, t9, t3 // y+cred |
+ addu s3, t9, s3 // y+cgreen |
+ addu v1, t9, v1 // y+cblue |
+ lbu AT, 0(t3) |
+ lbu s7, 0(s3) |
+ lbu ra, 0(v1) |
+ lbu v0, -1(t1) |
+ addu t3, v0, s4 // y+cred |
+ addu s3, v0, s5 // y+cgreen |
+ addu v1, v0, s6 // y+cblue |
+ addu t3, t9, t3 // y+cred |
+ addu s3, t9, s3 // y+cgreen |
+ addu v1, t9, v1 // y+cblue |
+ lbu t3, 0(t3) |
+ lbu s3, 0(s3) |
+ lbu v1, 0(v1) |
+ lbu v0, 0(t2) |
+ |
+ STORE_H2V2_2_PIXELS AT, s7, ra, t3, s3, v1, t4 |
+ |
+ addu t3, v0, s4 // y+cred |
+ addu s3, v0, s5 // y+cgreen |
+ addu v1, v0, s6 // y+cblue |
+ addu t3, t9, t3 // y+cred |
+ addu s3, t9, s3 // y+cgreen |
+ addu v1, t9, v1 // y+cblue |
+ lbu AT, 0(t3) |
+ lbu s7, 0(s3) |
+ lbu ra, 0(v1) |
+ lbu v0, 1(t2) |
+ addiu t2, t2, 2 |
+ addu t3, v0, s4 // y+cred |
+ addu s3, v0, s5 // y+cgreen |
+ addu v1, v0, s6 // y+cblue |
+ addu t3, t9, t3 // y+cred |
+ addu s3, t9, s3 // y+cgreen |
+ addu v1, t9, v1 // y+cblue |
+ lbu t3, 0(t3) |
+ lbu s3, 0(s3) |
+ lbu v1, 0(v1) |
+ |
+ STORE_H2V2_2_PIXELS AT, s7, ra, t3, s3, v1, t7 |
+ |
+ bne t0, t5, 1b |
+ nop |
+2: |
+ andi t0, a0, 1 |
+ beqz t0, 4f |
+ lbu t3, 0(t5) |
+ lbu s3, 0(t6) |
+ addiu t3, t3, -128 // (cb - 128) |
+ addiu s3, s3, -128 // (cr - 128) |
+ mult $ac1, s1, t3 |
+ madd $ac1, s2, s3 |
+ sll s3, s3, 15 |
+ sll t3, t3, 15 |
+ lbu v0, 0(t1) |
+ extr_r.w s5, $ac1, 16 |
+ mulq_rs.w s4, t8, s3 // s4 = (C1 * cr + ONE_HALF)>> SCALEBITS |
+ mulq_rs.w s6, s0, t3 // s6 = (C2 * cb + ONE_HALF)>> SCALEBITS |
+ addu t3, v0, s4 // y+cred |
+ addu s3, v0, s5 // y+cgreen |
+ addu v1, v0, s6 // y+cblue |
+ addu t3, t9, t3 // y+cred |
+ addu s3, t9, s3 // y+cgreen |
+ addu v1, t9, v1 // y+cblue |
+ lbu t3, 0(t3) |
+ lbu s3, 0(s3) |
+ lbu v1, 0(v1) |
+ lbu v0, 0(t2) |
+ |
+ STORE_H2V2_1_PIXEL t3, s3, v1, t4 |
+ |
+ addu t3, v0, s4 // y+cred |
+ addu s3, v0, s5 // y+cgreen |
+ addu v1, v0, s6 // y+cblue |
+ addu t3, t9, t3 // y+cred |
+ addu s3, t9, s3 // y+cgreen |
+ addu v1, t9, v1 // y+cblue |
+ lbu t3, 0(t3) |
+ lbu s3, 0(s3) |
+ lbu v1, 0(v1) |
+ |
+ STORE_H2V2_1_PIXEL t3, s3, v1, t7 |
+4: |
+ RESTORE_REGS_FROM_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, ra |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_h2v2_\colorid\()_merged_upsample_mips_dspr2) |
+ |
+.purgem STORE_H2V2_1_PIXEL |
+.purgem STORE_H2V2_2_PIXELS |
+.endm |
+ |
+/*-----------------------------------------id -- pix R1 G1 B1 A1 R2 G2 B2 A2 */ |
+GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 extrgb, 6, 0, 1, 2, 6, 3, 4, 5, 6 |
+GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 extbgr, 6, 2, 1, 0, 3, 5, 4, 3, 6 |
+GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 extrgbx, 8, 0, 1, 2, 3, 4, 5, 6, 7 |
+GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 extbgrx, 8, 2, 1, 0, 3, 6, 5, 4, 7 |
+GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 extxbgr, 8, 3, 2, 1, 0, 7, 6, 5, 4 |
+GENERATE_H2V2_MERGED_UPSAMPLE_MIPS_DSPR2 extxrgb, 8, 1, 2, 3, 0, 5, 6, 7, 4 |
+/*****************************************************************************/ |
+/* |
+ * jsimd_h2v1_merged_upsample_mips_dspr2 |
+ * jsimd_h2v1_extrgb_merged_upsample_mips_dspr2 |
+ * jsimd_h2v1_extrgbx_merged_upsample_mips_dspr2 |
+ * jsimd_h2v1_extbgr_merged_upsample_mips_dspr2 |
+ * jsimd_h2v1_extbgrx_merged_upsample_mips_dspr2 |
+ * jsimd_h2v1_extxbgr_merged_upsample_mips_dspr2 |
+ * jsimd_h2v1_extxrgb_merged_upsample_mips_dspr2 |
+ * |
+ * Merged h2v1 upsample routines |
+ */ |
+ |
+.macro GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 colorid, \ |
+ pixel_size, \ |
+ r1_offs, \ |
+ g1_offs, \ |
+ b1_offs, \ |
+ a1_offs, \ |
+ r2_offs, \ |
+ g2_offs, \ |
+ b2_offs, \ |
+ a2_offs |
+ |
+.macro STORE_H2V1_2_PIXELS scratch0 \ |
+ scratch1 \ |
+ scratch2 \ |
+ scratch3 \ |
+ scratch4 \ |
+ scratch5 \ |
+ outptr |
+ sb \scratch0, \r1_offs(\outptr) |
+ sb \scratch1, \g1_offs(\outptr) |
+ sb \scratch2, \b1_offs(\outptr) |
+ sb \scratch3, \r2_offs(\outptr) |
+ sb \scratch4, \g2_offs(\outptr) |
+ sb \scratch5, \b2_offs(\outptr) |
+.if (\pixel_size == 8) |
+ li t0, 0xFF |
+ sb t0, \a1_offs(\outptr) |
+ sb t0, \a2_offs(\outptr) |
+.endif |
+ addiu \outptr, \pixel_size |
+.endm |
+ |
+.macro STORE_H2V1_1_PIXEL scratch0 \ |
+ scratch1 \ |
+ scratch2 \ |
+ outptr |
+ sb \scratch0, \r1_offs(\outptr) |
+ sb \scratch1, \g1_offs(\outptr) |
+ sb \scratch2, \b1_offs(\outptr) |
+.if (\pixel_size == 8) |
+ li t0, 0xFF |
+ sb t0, \a1_offs(\outptr) |
+.endif |
+.endm |
+ |
+LEAF_MIPS_DSPR2(jsimd_h2v1_\colorid\()_merged_upsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->output_width |
+ * a1 - input_buf |
+ * a2 - in_row_group_ctr |
+ * a3 - output_buf |
+ * 16(sp) - range_limit |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, ra |
+ |
+ li t0, 0xe6ea |
+ lw t1, 0(a1) // t1 = input_buf[0] |
+ lw t2, 4(a1) // t2 = input_buf[1] |
+ lw t3, 8(a1) // t3 = input_buf[2] |
+ lw t8, 56(sp) // t8 = range_limit |
+ addiu s1, t0, 0x7fff // s1 = 0x166e9 [FIX(1.40200)] |
+ addiu s2, s1, 0x5eb9 // s2 = 0x1c5a2 [FIX(1.77200)] |
+ addiu s0, t0, 0x9916 // s0 = 0x8000 |
+ addiu s4, zero, 0xa7e6 // s4 = 0xffffa7e6 [-FIX(0.34414)] |
+ xori s3, s4, 0xeec8 // s3 = 0xffff492e [-FIX(0.71414)] |
+ srl t0, a0, 1 |
+ sll t4, a2, 2 |
+ lwx s5, t4(t1) // s5 = inptr0 |
+ lwx s6, t4(t2) // s6 = inptr1 |
+ lwx s7, t4(t3) // s7 = inptr2 |
+ lw t7, 0(a3) // t7 = outptr |
+ blez t0, 2f |
+ addu t9, s6, t0 // t9 = end address |
+1: |
+ lbu t2, 0(s6) // t2 = cb |
+ lbu t0, 0(s7) // t0 = cr |
+ lbu t1, 0(s5) // t1 = y |
+ addiu t2, t2, -128 // t2 = cb - 128 |
+ addiu t0, t0, -128 // t0 = cr - 128 |
+ mult $ac1, s4, t2 |
+ madd $ac1, s3, t0 |
+ sll t0, t0, 15 |
+ sll t2, t2, 15 |
+ mulq_rs.w t0, s1, t0 // t0 = (C1*cr + ONE_HALF)>> SCALEBITS |
+ extr_r.w t5, $ac1, 16 |
+ mulq_rs.w t6, s2, t2 // t6 = (C2*cb + ONE_HALF)>> SCALEBITS |
+ addiu s7, s7, 1 |
+ addiu s6, s6, 1 |
+ addu t2, t1, t0 // t2 = y + cred |
+ addu t3, t1, t5 // t3 = y + cgreen |
+ addu t4, t1, t6 // t4 = y + cblue |
+ addu t2, t8, t2 |
+ addu t3, t8, t3 |
+ addu t4, t8, t4 |
+ lbu t1, 1(s5) |
+ lbu v0, 0(t2) |
+ lbu v1, 0(t3) |
+ lbu ra, 0(t4) |
+ addu t2, t1, t0 |
+ addu t3, t1, t5 |
+ addu t4, t1, t6 |
+ addu t2, t8, t2 |
+ addu t3, t8, t3 |
+ addu t4, t8, t4 |
+ lbu t2, 0(t2) |
+ lbu t3, 0(t3) |
+ lbu t4, 0(t4) |
+ |
+ STORE_H2V1_2_PIXELS v0, v1, ra, t2, t3, t4, t7 |
+ |
+ bne t9, s6, 1b |
+ addiu s5, s5, 2 |
+2: |
+ andi t0, a0, 1 |
+ beqz t0, 4f |
+ nop |
+3: |
+ lbu t2, 0(s6) |
+ lbu t0, 0(s7) |
+ lbu t1, 0(s5) |
+ addiu t2, t2, -128 //(cb - 128) |
+ addiu t0, t0, -128 //(cr - 128) |
+ mul t3, s4, t2 |
+ mul t4, s3, t0 |
+ sll t0, t0, 15 |
+ sll t2, t2, 15 |
+ mulq_rs.w t0, s1, t0 // (C1*cr + ONE_HALF)>> SCALEBITS |
+ mulq_rs.w t6, s2, t2 // (C2*cb + ONE_HALF)>> SCALEBITS |
+ addu t3, t3, s0 |
+ addu t3, t4, t3 |
+ sra t5, t3, 16 // (C4*cb + ONE_HALF + C3*cr)>> SCALEBITS |
+ addu t2, t1, t0 // y + cred |
+ addu t3, t1, t5 // y + cgreen |
+ addu t4, t1, t6 // y + cblue |
+ addu t2, t8, t2 |
+ addu t3, t8, t3 |
+ addu t4, t8, t4 |
+ lbu t2, 0(t2) |
+ lbu t3, 0(t3) |
+ lbu t4, 0(t4) |
+ |
+ STORE_H2V1_1_PIXEL t2, t3, t4, t7 |
+4: |
+ RESTORE_REGS_FROM_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, ra |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_h2v1_\colorid\()_merged_upsample_mips_dspr2) |
+ |
+.purgem STORE_H2V1_1_PIXEL |
+.purgem STORE_H2V1_2_PIXELS |
+.endm |
+ |
+/*-----------------------------------------id -- pix R1 G1 B1 A1 R2 G2 B2 A2 */ |
+GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 extrgb, 6, 0, 1, 2, 6, 3, 4, 5, 6 |
+GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 extbgr, 6, 2, 1, 0, 3, 5, 4, 3, 6 |
+GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 extrgbx, 8, 0, 1, 2, 3, 4, 5, 6, 7 |
+GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 extbgrx, 8, 2, 1, 0, 3, 6, 5, 4, 7 |
+GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 extxbgr, 8, 3, 2, 1, 0, 7, 6, 5, 4 |
+GENERATE_H2V1_MERGED_UPSAMPLE_MIPS_DSPR2 extxrgb, 8, 1, 2, 3, 0, 5, 6, 7, 4 |
+/*****************************************************************************/ |
+/* |
+ * jsimd_h2v2_fancy_upsample_mips_dspr2 |
+ * |
+ * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. |
+ */ |
+LEAF_MIPS_DSPR2(jsimd_h2v2_fancy_upsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->max_v_samp_factor |
+ * a1 - downsampled_width |
+ * a2 - input_data |
+ * a3 - output_data_ptr |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 24, s0, s1, s2, s3, s4, s5 |
+ |
+ li s4, 0 |
+ lw s2, 0(a3) // s2 = *output_data_ptr |
+0: |
+ li t9, 2 |
+ lw s1, -4(a2) // s1 = inptr1 |
+ |
+1: |
+ lw s0, 0(a2) // s0 = inptr0 |
+ lwx s3, s4(s2) |
+ addiu s5, a1, -2 // s5 = downsampled_width - 2 |
+ srl t4, s5, 1 |
+ sll t4, t4, 1 |
+ lbu t0, 0(s0) |
+ lbu t1, 1(s0) |
+ lbu t2, 0(s1) |
+ lbu t3, 1(s1) |
+ addiu s0, 2 |
+ addiu s1, 2 |
+ addu t8, s0, t4 // t8 = end address |
+ andi s5, s5, 1 // s5 = residual |
+ sll t4, t0, 1 |
+ sll t6, t1, 1 |
+ addu t0, t0, t4 // t0 = (*inptr0++) * 3 |
+ addu t1, t1, t6 // t1 = (*inptr0++) * 3 |
+ addu t7, t0, t2 // t7 = thiscolsum |
+ addu t6, t1, t3 // t5 = nextcolsum |
+ sll t0, t7, 2 // t0 = thiscolsum * 4 |
+ subu t1, t0, t7 // t1 = thiscolsum * 3 |
+ shra_r.w t0, t0, 4 |
+ addiu t1, 7 |
+ addu t1, t1, t6 |
+ srl t1, t1, 4 |
+ sb t0, 0(s3) |
+ sb t1, 1(s3) |
+ beq t8, s0, 22f // skip to final iteration if width == 3 |
+ addiu s3, 2 |
+2: |
+ lh t0, 0(s0) // t0 = A3|A2 |
+ lh t2, 0(s1) // t2 = B3|B2 |
+ addiu s0, 2 |
+ addiu s1, 2 |
+ preceu.ph.qbr t0, t0 // t0 = 0|A3|0|A2 |
+ preceu.ph.qbr t2, t2 // t2 = 0|B3|0|B2 |
+ shll.ph t1, t0, 1 |
+ sll t3, t6, 1 |
+ addu.ph t0, t1, t0 // t0 = A3*3|A2*3 |
+ addu t3, t3, t6 // t3 = this * 3 |
+ addu.ph t0, t0, t2 // t0 = next2|next1 |
+ addu t1, t3, t7 |
+ andi t7, t0, 0xFFFF // t7 = next1 |
+ sll t2, t7, 1 |
+ addu t2, t7, t2 // t2 = next1*3 |
+ addu t4, t2, t6 |
+ srl t6, t0, 16 // t6 = next2 |
+ shra_r.w t1, t1, 4 // t1 = (this*3 + last + 8) >> 4 |
+ addu t0, t3, t7 |
+ addiu t0, 7 |
+ srl t0, t0, 4 // t0 = (this*3 + next1 + 7) >> 4 |
+ shra_r.w t4, t4, 4 // t3 = (next1*3 + this + 8) >> 4 |
+ addu t2, t2, t6 |
+ addiu t2, 7 |
+ srl t2, t2, 4 // t2 = (next1*3 + next2 + 7) >> 4 |
+ sb t1, 0(s3) |
+ sb t0, 1(s3) |
+ sb t4, 2(s3) |
+ sb t2, 3(s3) |
+ bne t8, s0, 2b |
+ addiu s3, 4 |
+22: |
+ beqz s5, 4f |
+ addu t8, s0, s5 |
+3: |
+ lbu t0, 0(s0) |
+ lbu t2, 0(s1) |
+ addiu s0, 1 |
+ addiu s1, 1 |
+ sll t3, t6, 1 |
+ sll t1, t0, 1 |
+ addu t1, t0, t1 // t1 = inptr0 * 3 |
+ addu t3, t3, t6 // t3 = thiscolsum * 3 |
+ addu t5, t1, t2 |
+ addu t1, t3, t7 |
+ shra_r.w t1, t1, 4 |
+ addu t0, t3, t5 |
+ addiu t0, 7 |
+ srl t0, t0, 4 |
+ sb t1, 0(s3) |
+ sb t0, 1(s3) |
+ addiu s3, 2 |
+ move t7, t6 |
+ bne t8, s0, 3b |
+ move t6, t5 |
+4: |
+ sll t0, t6, 2 // t0 = thiscolsum * 4 |
+ subu t1, t0, t6 // t1 = thiscolsum * 3 |
+ addu t1, t1, t7 |
+ addiu s4, 4 |
+ shra_r.w t1, t1, 4 |
+ addiu t0, 7 |
+ srl t0, t0, 4 |
+ sb t1, 0(s3) |
+ sb t0, 1(s3) |
+ addiu t9, -1 |
+ addiu s3, 2 |
+ bnez t9, 1b |
+ lw s1, 4(a2) |
+ srl t0, s4, 2 |
+ subu t0, a0, t0 |
+ bgtz t0, 0b |
+ addiu a2, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 24, s0, s1, s2, s3, s4, s5 |
+ |
+ j ra |
+ nop |
+END(jsimd_h2v2_fancy_upsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_h2v1_fancy_upsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->max_v_samp_factor |
+ * a1 - downsampled_width |
+ * a2 - input_data |
+ * a3 - output_data_ptr |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 16, s0, s1, s2, s3 |
+ |
+ .set at |
+ |
+ beqz a0, 3f |
+ sll t0, a0, 2 |
+ lw s1, 0(a3) |
+ li s3, 0x10001 |
+ addu s0, s1, t0 |
+0: |
+ addiu t8, a1, -2 |
+ srl t9, t8, 2 |
+ lw t7, 0(a2) |
+ lw s2, 0(s1) |
+ lbu t0, 0(t7) |
+ lbu t1, 1(t7) // t1 = inptr[1] |
+ sll t2, t0, 1 |
+ addu t2, t2, t0 // t2 = invalue*3 |
+ addu t2, t2, t1 |
+ shra_r.w t2, t2, 2 |
+ sb t0, 0(s2) |
+ sb t2, 1(s2) |
+ beqz t9, 11f |
+ addiu s2, 2 |
+1: |
+ ulw t0, 0(t7) // t0 = |P3|P2|P1|P0| |
+ ulw t1, 1(t7) |
+ ulh t2, 4(t7) // t2 = |0|0|P5|P4| |
+ preceu.ph.qbl t3, t0 // t3 = |0|P3|0|P2| |
+ preceu.ph.qbr t0, t0 // t0 = |0|P1|0|P0| |
+ preceu.ph.qbr t2, t2 // t2 = |0|P5|0|P4| |
+ preceu.ph.qbl t4, t1 // t4 = |0|P4|0|P3| |
+ preceu.ph.qbr t1, t1 // t1 = |0|P2|0|P1| |
+ shll.ph t5, t4, 1 |
+ shll.ph t6, t1, 1 |
+ addu.ph t5, t5, t4 // t5 = |P4*3|P3*3| |
+ addu.ph t6, t6, t1 // t6 = |P2*3|P1*3| |
+ addu.ph t4, t3, s3 |
+ addu.ph t0, t0, s3 |
+ addu.ph t4, t4, t5 |
+ addu.ph t0, t0, t6 |
+ shrl.ph t4, t4, 2 // t4 = |0|P3|0|P2| |
+ shrl.ph t0, t0, 2 // t0 = |0|P1|0|P0| |
+ addu.ph t2, t2, t5 |
+ addu.ph t3, t3, t6 |
+ shra_r.ph t2, t2, 2 // t2 = |0|P5|0|P4| |
+ shra_r.ph t3, t3, 2 // t3 = |0|P3|0|P2| |
+ shll.ph t2, t2, 8 |
+ shll.ph t3, t3, 8 |
+ or t2, t4, t2 |
+ or t3, t3, t0 |
+ addiu t9, -1 |
+ usw t3, 0(s2) |
+ usw t2, 4(s2) |
+ addiu s2, 8 |
+ bgtz t9, 1b |
+ addiu t7, 4 |
+11: |
+ andi t8, 3 |
+ beqz t8, 22f |
+ addiu t7, 1 |
+ |
+2: |
+ lbu t0, 0(t7) |
+ addiu t7, 1 |
+ sll t1, t0, 1 |
+ addu t2, t0, t1 // t2 = invalue |
+ lbu t3, -2(t7) |
+ lbu t4, 0(t7) |
+ addiu t3, 1 |
+ addiu t4, 2 |
+ addu t3, t3, t2 |
+ addu t4, t4, t2 |
+ srl t3, 2 |
+ srl t4, 2 |
+ sb t3, 0(s2) |
+ sb t4, 1(s2) |
+ addiu t8, -1 |
+ bgtz t8, 2b |
+ addiu s2, 2 |
+ |
+22: |
+ lbu t0, 0(t7) |
+ lbu t2, -1(t7) |
+ sll t1, t0, 1 |
+ addu t1, t1, t0 // t1 = invalue * 3 |
+ addu t1, t1, t2 |
+ addiu t1, 1 |
+ srl t1, t1, 2 |
+ sb t1, 0(s2) |
+ sb t0, 1(s2) |
+ addiu s1, 4 |
+ bne s1, s0, 0b |
+ addiu a2, 4 |
+3: |
+ RESTORE_REGS_FROM_STACK 16, s0, s1, s2, s3 |
+ |
+ j ra |
+ nop |
+END(jsimd_h2v1_fancy_upsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_h2v1_downsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->image_width |
+ * a1 - cinfo->max_v_samp_factor |
+ * a2 - compptr->v_samp_factor |
+ * a3 - compptr->width_in_blocks |
+ * 16(sp) - input_data |
+ * 20(sp) - output_data |
+ */ |
+ .set at |
+ |
+ SAVE_REGS_ON_STACK 24, s0, s1, s2, s3, s4 |
+ |
+ beqz a2, 7f |
+ lw s1, 44(sp) // s1 = output_data |
+ lw s0, 40(sp) // s0 = input_data |
+ srl s2, a0, 2 |
+ andi t9, a0, 2 |
+ srl t7, t9, 1 |
+ addu s2, t7, s2 |
+ sll t0, a3, 3 // t0 = width_in_blocks*DCT |
+ srl t7, t0, 1 |
+ subu s2, t7, s2 |
+0: |
+ andi t6, a0, 1 // t6 = temp_index |
+ addiu t6, -1 |
+ lw t4, 0(s1) // t4 = outptr |
+ lw t5, 0(s0) // t5 = inptr0 |
+ li s3, 0 // s3 = bias |
+ srl t7, a0, 1 // t7 = image_width1 |
+ srl s4, t7, 2 |
+ andi t8, t7, 3 |
+1: |
+ ulhu t0, 0(t5) |
+ ulhu t1, 2(t5) |
+ ulhu t2, 4(t5) |
+ ulhu t3, 6(t5) |
+ raddu.w.qb t0, t0 |
+ raddu.w.qb t1, t1 |
+ raddu.w.qb t2, t2 |
+ raddu.w.qb t3, t3 |
+ shra.ph t0, t0, 1 |
+ shra_r.ph t1, t1, 1 |
+ shra.ph t2, t2, 1 |
+ shra_r.ph t3, t3, 1 |
+ sb t0, 0(t4) |
+ sb t1, 1(t4) |
+ sb t2, 2(t4) |
+ sb t3, 3(t4) |
+ addiu s4, -1 |
+ addiu t4, 4 |
+ bgtz s4, 1b |
+ addiu t5, 8 |
+ beqz t8, 3f |
+ addu s4, t4, t8 |
+2: |
+ ulhu t0, 0(t5) |
+ raddu.w.qb t0, t0 |
+ addqh.w t0, t0, s3 |
+ xori s3, s3, 1 |
+ sb t0, 0(t4) |
+ addiu t4, 1 |
+ bne t4, s4, 2b |
+ addiu t5, 2 |
+3: |
+ lbux t1, t6(t5) |
+ sll t1, 1 |
+ addqh.w t2, t1, s3 // t2 = pixval1 |
+ xori s3, s3, 1 |
+ addqh.w t3, t1, s3 // t3 = pixval2 |
+ blez s2, 5f |
+ append t3, t2, 8 |
+ addu t5, t4, s2 // t5 = loop_end2 |
+4: |
+ ush t3, 0(t4) |
+ addiu s2, -1 |
+ bgtz s2, 4b |
+ addiu t4, 2 |
+5: |
+ beqz t9, 6f |
+ nop |
+ sb t2, 0(t4) |
+6: |
+ addiu s1, 4 |
+ addiu a2, -1 |
+ bnez a2, 0b |
+ addiu s0, 4 |
+7: |
+ RESTORE_REGS_FROM_STACK 24, s0, s1, s2, s3, s4 |
+ |
+ j ra |
+ nop |
+END(jsimd_h2v1_downsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_h2v2_downsample_mips_dspr2) |
+ |
+/* |
+ * a0 - cinfo->image_width |
+ * a1 - cinfo->max_v_samp_factor |
+ * a2 - compptr->v_samp_factor |
+ * a3 - compptr->width_in_blocks |
+ * 16(sp) - input_data |
+ * 20(sp) - output_data |
+ */ |
+ .set at |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ beqz a2, 8f |
+ lw s1, 52(sp) // s1 = output_data |
+ lw s0, 48(sp) // s0 = input_data |
+ |
+ andi t6, a0, 1 // t6 = temp_index |
+ addiu t6, -1 |
+ srl t7, a0, 1 // t7 = image_width1 |
+ srl s4, t7, 2 |
+ andi t8, t7, 3 |
+ andi t9, a0, 2 |
+ srl s2, a0, 2 |
+ srl t7, t9, 1 |
+ addu s2, t7, s2 |
+ sll t0, a3, 3 // s2 = width_in_blocks*DCT |
+ srl t7, t0, 1 |
+ subu s2, t7, s2 |
+0: |
+ lw t4, 0(s1) // t4 = outptr |
+ lw t5, 0(s0) // t5 = inptr0 |
+ lw s7, 4(s0) // s7 = inptr1 |
+ li s6, 1 // s6 = bias |
+2: |
+ ulw t0, 0(t5) // t0 = |P3|P2|P1|P0| |
+ ulw t1, 0(s7) // t1 = |Q3|Q2|Q1|Q0| |
+ ulw t2, 4(t5) |
+ ulw t3, 4(s7) |
+ precrq.ph.w t7, t0, t1 // t2 = |P3|P2|Q3|Q2| |
+ ins t0, t1, 16, 16 // t0 = |Q1|Q0|P1|P0| |
+ raddu.w.qb t1, t7 |
+ raddu.w.qb t0, t0 |
+ shra_r.w t1, t1, 2 |
+ addiu t0, 1 |
+ srl t0, 2 |
+ precrq.ph.w t7, t2, t3 |
+ ins t2, t3, 16, 16 |
+ raddu.w.qb t7, t7 |
+ raddu.w.qb t2, t2 |
+ shra_r.w t7, t7, 2 |
+ addiu t2, 1 |
+ srl t2, 2 |
+ sb t0, 0(t4) |
+ sb t1, 1(t4) |
+ sb t2, 2(t4) |
+ sb t7, 3(t4) |
+ addiu t4, 4 |
+ addiu t5, 8 |
+ addiu s4, s4, -1 |
+ bgtz s4, 2b |
+ addiu s7, 8 |
+ beqz t8, 4f |
+ addu t8, t4, t8 |
+3: |
+ ulhu t0, 0(t5) |
+ ulhu t1, 0(s7) |
+ ins t0, t1, 16, 16 |
+ raddu.w.qb t0, t0 |
+ addu t0, t0, s6 |
+ srl t0, 2 |
+ xori s6, s6, 3 |
+ sb t0, 0(t4) |
+ addiu t5, 2 |
+ addiu t4, 1 |
+ bne t8, t4, 3b |
+ addiu s7, 2 |
+4: |
+ lbux t1, t6(t5) |
+ sll t1, 1 |
+ lbux t0, t6(s7) |
+ sll t0, 1 |
+ addu t1, t1, t0 |
+ addu t3, t1, s6 |
+ srl t0, t3, 2 // t2 = pixval1 |
+ xori s6, s6, 3 |
+ addu t2, t1, s6 |
+ srl t1, t2, 2 // t3 = pixval2 |
+ blez s2, 6f |
+ append t1, t0, 8 |
+5: |
+ ush t1, 0(t4) |
+ addiu s2, -1 |
+ bgtz s2, 5b |
+ addiu t4, 2 |
+6: |
+ beqz t9, 7f |
+ nop |
+ sb t0, 0(t4) |
+7: |
+ addiu s1, 4 |
+ addiu a2, -1 |
+ bnez a2, 0b |
+ addiu s0, 8 |
+8: |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+END(jsimd_h2v2_downsample_mips_dspr2) |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_h2v2_smooth_downsample_mips_dspr2) |
+/* |
+ * a0 - input_data |
+ * a1 - output_data |
+ * a2 - compptr->v_samp_factor |
+ * a3 - cinfo->max_v_samp_factor |
+ * 16(sp) - cinfo->smoothing_factor |
+ * 20(sp) - compptr->width_in_blocks |
+ * 24(sp) - cinfo->image_width |
+ */ |
+ |
+ .set at |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ lw s7, 52(sp) // compptr->width_in_blocks |
+ lw s0, 56(sp) // cinfo->image_width |
+ lw s6, 48(sp) // cinfo->smoothing_factor |
+ sll s7, 3 // output_cols = width_in_blocks * DCTSIZE |
+ sll v0, s7, 1 |
+ subu v0, v0, s0 |
+ blez v0, 2f |
+ move v1, zero |
+ addiu t0, a3, 2 // t0 = cinfo->max_v_samp_factor + 2 |
+0: |
+ addiu t1, a0, -4 |
+ sll t2, v1, 2 |
+ lwx t1, t2(t1) |
+ move t3, v0 |
+ addu t1, t1, s0 |
+ lbu t2, -1(t1) |
+1: |
+ addiu t3, t3, -1 |
+ sb t2, 0(t1) |
+ bgtz t3, 1b |
+ addiu t1, t1, 1 |
+ addiu v1, v1, 1 |
+ bne v1, t0, 0b |
+ nop |
+2: |
+ li v0, 80 |
+ mul v0, s6, v0 |
+ li v1, 16384 |
+ move t4, zero |
+ move t5, zero |
+ subu t6, v1, v0 // t6 = 16384 - tmp_smoot_f * 80 |
+ sll t7, s6, 4 // t7 = tmp_smoot_f * 16 |
+3: |
+/* Special case for first column: pretend column -1 is same as column 0 */ |
+ sll v0, t4, 2 |
+ lwx t8, v0(a1) // outptr = output_data[outrow] |
+ sll v1, t5, 2 |
+ addiu t9, v1, 4 |
+ addiu s0, v1, -4 |
+ addiu s1, v1, 8 |
+ lwx s2, v1(a0) // inptr0 = input_data[inrow] |
+ lwx t9, t9(a0) // inptr1 = input_data[inrow+1] |
+ lwx s0, s0(a0) // above_ptr = input_data[inrow-1] |
+ lwx s1, s1(a0) // below_ptr = input_data[inrow+2] |
+ lh v0, 0(s2) |
+ lh v1, 0(t9) |
+ lh t0, 0(s0) |
+ lh t1, 0(s1) |
+ ins v0, v1, 16, 16 |
+ ins t0, t1, 16, 16 |
+ raddu.w.qb t2, v0 |
+ raddu.w.qb s3, t0 |
+ lbu v0, 0(s2) |
+ lbu v1, 2(s2) |
+ lbu t0, 0(t9) |
+ lbu t1, 2(t9) |
+ addu v0, v0, v1 |
+ mult $ac1,t2, t6 |
+ addu t0, t0, t1 |
+ lbu t2, 2(s0) |
+ addu t0, t0, v0 |
+ lbu t3, 2(s1) |
+ addu s3, t0, s3 |
+ lbu v0, 0(s0) |
+ lbu t0, 0(s1) |
+ sll s3, s3, 1 |
+ addu v0, v0, t2 |
+ addu t0, t0, t3 |
+ addu t0, t0, v0 |
+ addu s3, t0, s3 |
+ madd $ac1,s3, t7 |
+ extr_r.w v0, $ac1, 16 |
+ addiu t8, t8, 1 |
+ addiu s2, s2, 2 |
+ addiu t9, t9, 2 |
+ addiu s0, s0, 2 |
+ addiu s1, s1, 2 |
+ sb v0, -1(t8) |
+ addiu s4, s7, -2 |
+ and s4, s4, 3 |
+ addu s5, s4, t8 //end adress |
+4: |
+ lh v0, 0(s2) |
+ lh v1, 0(t9) |
+ lh t0, 0(s0) |
+ lh t1, 0(s1) |
+ ins v0, v1, 16, 16 |
+ ins t0, t1, 16, 16 |
+ raddu.w.qb t2, v0 |
+ raddu.w.qb s3, t0 |
+ lbu v0, -1(s2) |
+ lbu v1, 2(s2) |
+ lbu t0, -1(t9) |
+ lbu t1, 2(t9) |
+ addu v0, v0, v1 |
+ mult $ac1, t2, t6 |
+ addu t0, t0, t1 |
+ lbu t2, 2(s0) |
+ addu t0, t0, v0 |
+ lbu t3, 2(s1) |
+ addu s3, t0, s3 |
+ lbu v0, -1(s0) |
+ lbu t0, -1(s1) |
+ sll s3, s3, 1 |
+ addu v0, v0, t2 |
+ addu t0, t0, t3 |
+ addu t0, t0, v0 |
+ addu s3, t0, s3 |
+ madd $ac1, s3, t7 |
+ extr_r.w t2, $ac1, 16 |
+ addiu t8, t8, 1 |
+ addiu s2, s2, 2 |
+ addiu t9, t9, 2 |
+ addiu s0, s0, 2 |
+ sb t2, -1(t8) |
+ bne s5, t8, 4b |
+ addiu s1, s1, 2 |
+ addiu s5, s7, -2 |
+ subu s5, s5, s4 |
+ addu s5, s5, t8 //end adress |
+5: |
+ lh v0, 0(s2) |
+ lh v1, 0(t9) |
+ lh t0, 0(s0) |
+ lh t1, 0(s1) |
+ ins v0, v1, 16, 16 |
+ ins t0, t1, 16, 16 |
+ raddu.w.qb t2, v0 |
+ raddu.w.qb s3, t0 |
+ lbu v0, -1(s2) |
+ lbu v1, 2(s2) |
+ lbu t0, -1(t9) |
+ lbu t1, 2(t9) |
+ addu v0, v0, v1 |
+ mult $ac1, t2, t6 |
+ addu t0, t0, t1 |
+ lbu t2, 2(s0) |
+ addu t0, t0, v0 |
+ lbu t3, 2(s1) |
+ addu s3, t0, s3 |
+ lbu v0, -1(s0) |
+ lbu t0, -1(s1) |
+ sll s3, s3, 1 |
+ addu v0, v0, t2 |
+ addu t0, t0, t3 |
+ lh v1, 2(t9) |
+ addu t0, t0, v0 |
+ lh v0, 2(s2) |
+ addu s3, t0, s3 |
+ lh t0, 2(s0) |
+ lh t1, 2(s1) |
+ madd $ac1, s3, t7 |
+ extr_r.w t2, $ac1, 16 |
+ ins t0, t1, 16, 16 |
+ ins v0, v1, 16, 16 |
+ raddu.w.qb s3, t0 |
+ lbu v1, 4(s2) |
+ lbu t0, 1(t9) |
+ lbu t1, 4(t9) |
+ sb t2, 0(t8) |
+ raddu.w.qb t3, v0 |
+ lbu v0, 1(s2) |
+ addu t0, t0, t1 |
+ mult $ac1, t3, t6 |
+ addu v0, v0, v1 |
+ lbu t2, 4(s0) |
+ addu t0, t0, v0 |
+ lbu v0, 1(s0) |
+ addu s3, t0, s3 |
+ lbu t0, 1(s1) |
+ lbu t3, 4(s1) |
+ addu v0, v0, t2 |
+ sll s3, s3, 1 |
+ addu t0, t0, t3 |
+ lh v1, 4(t9) |
+ addu t0, t0, v0 |
+ lh v0, 4(s2) |
+ addu s3, t0, s3 |
+ lh t0, 4(s0) |
+ lh t1, 4(s1) |
+ madd $ac1, s3, t7 |
+ extr_r.w t2, $ac1, 16 |
+ ins t0, t1, 16, 16 |
+ ins v0, v1, 16, 16 |
+ raddu.w.qb s3, t0 |
+ lbu v1, 6(s2) |
+ lbu t0, 3(t9) |
+ lbu t1, 6(t9) |
+ sb t2, 1(t8) |
+ raddu.w.qb t3, v0 |
+ lbu v0, 3(s2) |
+ addu t0, t0,t1 |
+ mult $ac1, t3, t6 |
+ addu v0, v0, v1 |
+ lbu t2, 6(s0) |
+ addu t0, t0, v0 |
+ lbu v0, 3(s0) |
+ addu s3, t0, s3 |
+ lbu t0, 3(s1) |
+ lbu t3, 6(s1) |
+ addu v0, v0, t2 |
+ sll s3, s3, 1 |
+ addu t0, t0, t3 |
+ lh v1, 6(t9) |
+ addu t0, t0, v0 |
+ lh v0, 6(s2) |
+ addu s3, t0, s3 |
+ lh t0, 6(s0) |
+ lh t1, 6(s1) |
+ madd $ac1, s3, t7 |
+ extr_r.w t3, $ac1, 16 |
+ ins t0, t1, 16, 16 |
+ ins v0, v1, 16, 16 |
+ raddu.w.qb s3, t0 |
+ lbu v1, 8(s2) |
+ lbu t0, 5(t9) |
+ lbu t1, 8(t9) |
+ sb t3, 2(t8) |
+ raddu.w.qb t2, v0 |
+ lbu v0, 5(s2) |
+ addu t0, t0, t1 |
+ mult $ac1, t2, t6 |
+ addu v0, v0, v1 |
+ lbu t2, 8(s0) |
+ addu t0, t0, v0 |
+ lbu v0, 5(s0) |
+ addu s3, t0, s3 |
+ lbu t0, 5(s1) |
+ lbu t3, 8(s1) |
+ addu v0, v0, t2 |
+ sll s3, s3, 1 |
+ addu t0, t0, t3 |
+ addiu t8, t8, 4 |
+ addu t0, t0, v0 |
+ addiu s2, s2, 8 |
+ addu s3, t0, s3 |
+ addiu t9, t9, 8 |
+ madd $ac1, s3, t7 |
+ extr_r.w t1, $ac1, 16 |
+ addiu s0, s0, 8 |
+ addiu s1, s1, 8 |
+ bne s5, t8, 5b |
+ sb t1, -1(t8) |
+/* Special case for last column */ |
+ lh v0, 0(s2) |
+ lh v1, 0(t9) |
+ lh t0, 0(s0) |
+ lh t1, 0(s1) |
+ ins v0, v1, 16, 16 |
+ ins t0, t1, 16, 16 |
+ raddu.w.qb t2, v0 |
+ raddu.w.qb s3, t0 |
+ lbu v0, -1(s2) |
+ lbu v1, 1(s2) |
+ lbu t0, -1(t9) |
+ lbu t1, 1(t9) |
+ addu v0, v0, v1 |
+ mult $ac1, t2, t6 |
+ addu t0, t0, t1 |
+ lbu t2, 1(s0) |
+ addu t0, t0, v0 |
+ lbu t3, 1(s1) |
+ addu s3, t0, s3 |
+ lbu v0, -1(s0) |
+ lbu t0, -1(s1) |
+ sll s3, s3, 1 |
+ addu v0, v0, t2 |
+ addu t0, t0, t3 |
+ addu t0, t0, v0 |
+ addu s3, t0, s3 |
+ madd $ac1, s3, t7 |
+ extr_r.w t0, $ac1, 16 |
+ addiu t5, t5, 2 |
+ sb t0, 0(t8) |
+ addiu t4, t4, 1 |
+ bne t4, a2, 3b |
+ addiu t5, t5, 2 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_h2v2_smooth_downsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_int_upsample_mips_dspr2) |
+/* |
+ * a0 - upsample->h_expand[compptr->component_index] |
+ * a1 - upsample->v_expand[compptr->component_index] |
+ * a2 - input_data |
+ * a3 - output_data_ptr |
+ * 16(sp) - cinfo->output_width |
+ * 20(sp) - cinfo->max_v_samp_factor |
+ */ |
+ .set at |
+ |
+ SAVE_REGS_ON_STACK 16, s0, s1, s2, s3 |
+ |
+ lw s0, 0(a3) // s0 = output_data |
+ lw s1, 32(sp) // s1 = cinfo->output_width |
+ lw s2, 36(sp) // s2 = cinfo->max_v_samp_factor |
+ li t6, 0 // t6 = inrow |
+ beqz s2, 10f |
+ li s3, 0 // s3 = outrow |
+0: |
+ addu t0, a2, t6 |
+ addu t7, s0, s3 |
+ lw t3, 0(t0) // t3 = inptr |
+ lw t8, 0(t7) // t8 = outptr |
+ beqz s1, 4f |
+ addu t5, t8, s1 // t5 = outend |
+1: |
+ lb t2, 0(t3) // t2 = invalue = *inptr++ |
+ addiu t3, 1 |
+ beqz a0, 3f |
+ move t0, a0 // t0 = h_expand |
+2: |
+ sb t2, 0(t8) |
+ addiu t0, -1 |
+ bgtz t0, 2b |
+ addiu t8, 1 |
+3: |
+ bgt t5, t8, 1b |
+ nop |
+4: |
+ addiu t9, a1, -1 // t9 = v_expand - 1 |
+ blez t9, 9f |
+ nop |
+5: |
+ lw t3, 0(s0) |
+ lw t4, 4(s0) |
+ subu t0, s1, 0xF |
+ blez t0, 7f |
+ addu t5, t3, s1 // t5 = end address |
+ andi t7, s1, 0xF // t7 = residual |
+ subu t8, t5, t7 |
+6: |
+ ulw t0, 0(t3) |
+ ulw t1, 4(t3) |
+ ulw t2, 8(t3) |
+ usw t0, 0(t4) |
+ ulw t0, 12(t3) |
+ usw t1, 4(t4) |
+ usw t2, 8(t4) |
+ usw t0, 12(t4) |
+ addiu t3, 16 |
+ bne t3, t8, 6b |
+ addiu t4, 16 |
+ beqz t7, 8f |
+ nop |
+7: |
+ lbu t0, 0(t3) |
+ sb t0, 0(t4) |
+ addiu t3, 1 |
+ bne t3, t5, 7b |
+ addiu t4, 1 |
+8: |
+ addiu t9, -1 |
+ bgtz t9, 5b |
+ addiu s0, 8 |
+9: |
+ addu s3, s3, a1 |
+ bne s3, s2, 0b |
+ addiu t6, 1 |
+10: |
+ RESTORE_REGS_FROM_STACK 16, s0, s1, s2, s3 |
+ |
+ j ra |
+ nop |
+END(jsimd_int_upsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_h2v1_upsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->max_v_samp_factor |
+ * a1 - cinfo->output_width |
+ * a2 - input_data |
+ * a3 - output_data_ptr |
+ */ |
+ lw t7, 0(a3) // t7 = output_data |
+ andi t8, a1, 0xf // t8 = residual |
+ sll t0, a0, 2 |
+ blez a0, 4f |
+ addu t9, t7, t0 // t9 = output_data end address |
+0: |
+ lw t5, 0(t7) // t5 = outptr |
+ lw t6, 0(a2) // t6 = inptr |
+ addu t3, t5, a1 // t3 = outptr + output_width (end address) |
+ subu t3, t8 // t3 = end address - residual |
+ beq t5, t3, 2f |
+ move t4, t8 |
+1: |
+ ulw t0, 0(t6) // t0 = |P3|P2|P1|P0| |
+ ulw t2, 4(t6) // t2 = |P7|P6|P5|P4| |
+ srl t1, t0, 16 // t1 = |X|X|P3|P2| |
+ ins t0, t0, 16, 16 // t0 = |P1|P0|P1|P0| |
+ ins t1, t1, 16, 16 // t1 = |P3|P2|P3|P2| |
+ ins t0, t0, 8, 16 // t0 = |P1|P1|P0|P0| |
+ ins t1, t1, 8, 16 // t1 = |P3|P3|P2|P2| |
+ usw t0, 0(t5) |
+ usw t1, 4(t5) |
+ srl t0, t2, 16 // t0 = |X|X|P7|P6| |
+ ins t2, t2, 16, 16 // t2 = |P5|P4|P5|P4| |
+ ins t0, t0, 16, 16 // t0 = |P7|P6|P7|P6| |
+ ins t2, t2, 8, 16 // t2 = |P5|P5|P4|P4| |
+ ins t0, t0, 8, 16 // t0 = |P7|P7|P6|P6| |
+ usw t2, 8(t5) |
+ usw t0, 12(t5) |
+ addiu t5, 16 |
+ bne t5, t3, 1b |
+ addiu t6, 8 |
+ beqz t8, 3f |
+ move t4, t8 |
+2: |
+ lbu t1, 0(t6) |
+ sb t1, 0(t5) |
+ sb t1, 1(t5) |
+ addiu t4, -2 |
+ addiu t6, 1 |
+ bgtz t4, 2b |
+ addiu t5, 2 |
+3: |
+ addiu t7, 4 |
+ bne t9, t7, 0b |
+ addiu a2, 4 |
+4: |
+ j ra |
+ nop |
+END(jsimd_h2v1_upsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_h2v2_upsample_mips_dspr2) |
+/* |
+ * a0 - cinfo->max_v_samp_factor |
+ * a1 - cinfo->output_width |
+ * a2 - input_data |
+ * a3 - output_data_ptr |
+ */ |
+ lw t7, 0(a3) |
+ blez a0, 7f |
+ andi t9, a1, 0xf // t9 = residual |
+0: |
+ lw t6, 0(a2) // t6 = inptr |
+ lw t5, 0(t7) // t5 = outptr |
+ addu t8, t5, a1 // t8 = outptr end address |
+ subu t8, t9 // t8 = end address - residual |
+ beq t5, t8, 2f |
+ move t4, t9 |
+1: |
+ ulw t0, 0(t6) |
+ srl t1, t0, 16 |
+ ins t0, t0, 16, 16 |
+ ins t0, t0, 8, 16 |
+ ins t1, t1, 16, 16 |
+ ins t1, t1, 8, 16 |
+ ulw t2, 4(t6) |
+ usw t0, 0(t5) |
+ usw t1, 4(t5) |
+ srl t3, t2, 16 |
+ ins t2, t2, 16, 16 |
+ ins t2, t2, 8, 16 |
+ ins t3, t3, 16, 16 |
+ ins t3, t3, 8, 16 |
+ usw t2, 8(t5) |
+ usw t3, 12(t5) |
+ addiu t5, 16 |
+ bne t5, t8, 1b |
+ addiu t6, 8 |
+ beqz t9, 3f |
+ move t4, t9 |
+2: |
+ lbu t0, 0(t6) |
+ sb t0, 0(t5) |
+ sb t0, 1(t5) |
+ addiu t4, -2 |
+ addiu t6, 1 |
+ bgtz t4, 2b |
+ addiu t5, 2 |
+3: |
+ lw t6, 0(t7) // t6 = outptr[0] |
+ lw t5, 4(t7) // t5 = outptr[1] |
+ addu t4, t6, a1 // t4 = new end address |
+ beq a1, t9, 5f |
+ subu t8, t4, t9 |
+4: |
+ ulw t0, 0(t6) |
+ ulw t1, 4(t6) |
+ ulw t2, 8(t6) |
+ usw t0, 0(t5) |
+ ulw t0, 12(t6) |
+ usw t1, 4(t5) |
+ usw t2, 8(t5) |
+ usw t0, 12(t5) |
+ addiu t6, 16 |
+ bne t6, t8, 4b |
+ addiu t5, 16 |
+ beqz t9, 6f |
+ nop |
+5: |
+ lbu t0, 0(t6) |
+ sb t0, 0(t5) |
+ addiu t6, 1 |
+ bne t6, t4, 5b |
+ addiu t5, 1 |
+6: |
+ addiu t7, 8 |
+ addiu a0, -2 |
+ bgtz a0, 0b |
+ addiu a2, 4 |
+7: |
+ j ra |
+ nop |
+END(jsimd_h2v2_upsample_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_islow_mips_dspr2) |
+/* |
+ * a0 - coef_block |
+ * a1 - compptr->dcttable |
+ * a2 - output |
+ * a3 - range_limit |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ addiu sp, sp, -256 |
+ move v0, sp |
+ addiu v1, zero, 8 // v1 = DCTSIZE = 8 |
+1: |
+ lh s4, 32(a0) // s4 = inptr[16] |
+ lh s5, 64(a0) // s5 = inptr[32] |
+ lh s6, 96(a0) // s6 = inptr[48] |
+ lh t1, 112(a0) // t1 = inptr[56] |
+ lh t7, 16(a0) // t7 = inptr[8] |
+ lh t5, 80(a0) // t5 = inptr[40] |
+ lh t3, 48(a0) // t3 = inptr[24] |
+ or s4, s4, t1 |
+ or s4, s4, t3 |
+ or s4, s4, t5 |
+ or s4, s4, t7 |
+ or s4, s4, s5 |
+ or s4, s4, s6 |
+ bnez s4, 2f |
+ addiu v1, v1, -1 |
+ lh s5, 0(a1) // quantptr[DCTSIZE*0] |
+ lh s6, 0(a0) // inptr[DCTSIZE*0] |
+ mul s5, s5, s6 // DEQUANTIZE(inptr[0], quantptr[0]) |
+ sll s5, s5, 2 |
+ sw s5, 0(v0) |
+ sw s5, 32(v0) |
+ sw s5, 64(v0) |
+ sw s5, 96(v0) |
+ sw s5, 128(v0) |
+ sw s5, 160(v0) |
+ sw s5, 192(v0) |
+ b 3f |
+ sw s5, 224(v0) |
+2: |
+ lh t0, 112(a1) |
+ lh t2, 48(a1) |
+ lh t4, 80(a1) |
+ lh t6, 16(a1) |
+ mul t0, t0, t1 // DEQUANTIZE(inptr[DCTSIZE*7],quant[DCTSIZE*7]) |
+ mul t1, t2, t3 // DEQUANTIZE(inptr[DCTSIZE*3],quant[DCTSIZE*3]) |
+ mul t2, t4, t5 // DEQUANTIZE(inptr[DCTSIZE*5],quant[DCTSIZE*5]) |
+ mul t3, t6, t7 // DEQUANTIZE(inptr[DCTSIZE*1],quant[DCTSIZE*1]) |
+ lh t4, 32(a1) |
+ lh t5, 32(a0) |
+ lh t6, 96(a1) |
+ lh t7, 96(a0) |
+ addu s0, t0, t1 // z3 = tmp0 + tmp2 |
+ addu s1, t1, t2 // z2 = tmp1 + tmp2 |
+ addu s2, t2, t3 // z4 = tmp1 + tmp3 |
+ addu s3, s0, s2 // z3 + z4 |
+ addiu t9, zero, 9633 // FIX_1_175875602 |
+ mul s3, s3, t9 // z5 = MULTIPLY(z3 + z4, FIX_1_175875602) |
+ addu t8, t0, t3 // z1 = tmp0 + tmp3 |
+ addiu t9, zero, 2446 // FIX_0_298631336 |
+ mul t0, t0, t9 // tmp0 = MULTIPLY(tmp0, FIX_0_298631336) |
+ addiu t9, zero, 16819 // FIX_2_053119869 |
+ mul t2, t2, t9 // tmp1 = MULTIPLY(tmp1, FIX_2_053119869) |
+ addiu t9, zero, 25172 // FIX_3_072711026 |
+ mul t1, t1, t9 // tmp2 = MULTIPLY(tmp2, FIX_3_072711026) |
+ addiu t9, zero, 12299 // FIX_1_501321110 |
+ mul t3, t3, t9 // tmp3 = MULTIPLY(tmp3, FIX_1_501321110) |
+ addiu t9, zero, 16069 // FIX_1_961570560 |
+ mul s0, s0, t9 // -z3 = MULTIPLY(z3, FIX_1_961570560) |
+ addiu t9, zero, 3196 // FIX_0_390180644 |
+ mul s2, s2, t9 // -z4 = MULTIPLY(z4, FIX_0_390180644) |
+ addiu t9, zero, 7373 // FIX_0_899976223 |
+ mul t8, t8, t9 // -z1 = MULTIPLY(z1, FIX_0_899976223) |
+ addiu t9, zero, 20995 // FIX_2_562915447 |
+ mul s1, s1, t9 // -z2 = MULTIPLY(z2, FIX_2_562915447) |
+ subu s0, s3, s0 // z3 += z5 |
+ addu t0, t0, s0 // tmp0 += z3 |
+ addu t1, t1, s0 // tmp2 += z3 |
+ subu s2, s3, s2 // z4 += z5 |
+ addu t2, t2, s2 // tmp1 += z4 |
+ addu t3, t3, s2 // tmp3 += z4 |
+ subu t0, t0, t8 // tmp0 += z1 |
+ subu t1, t1, s1 // tmp2 += z2 |
+ subu t2, t2, s1 // tmp1 += z2 |
+ subu t3, t3, t8 // tmp3 += z1 |
+ mul s0, t4, t5 // DEQUANTIZE(inptr[DCTSIZE*2],quant[DCTSIZE*2]) |
+ addiu t9, zero, 6270 // FIX_0_765366865 |
+ mul s1, t6, t7 // DEQUANTIZE(inptr[DCTSIZE*6],quant[DCTSIZE*6]) |
+ lh t4, 0(a1) |
+ lh t5, 0(a0) |
+ lh t6, 64(a1) |
+ lh t7, 64(a0) |
+ mul s2, t9, s0 // MULTIPLY(z2, FIX_0_765366865) |
+ mul t5, t4, t5 // DEQUANTIZE(inptr[DCTSIZE*0],quant[DCTSIZE*0]) |
+ mul t6, t6, t7 // DEQUANTIZE(inptr[DCTSIZE*4],quant[DCTSIZE*4]) |
+ addiu t9, zero, 4433 // FIX_0_541196100 |
+ addu s3, s0, s1 // z2 + z3 |
+ mul s3, s3, t9 // z1 = MULTIPLY(z2 + z3, FIX_0_541196100) |
+ addiu t9, zero, 15137 // FIX_1_847759065 |
+ mul t8, s1, t9 // MULTIPLY(z3, FIX_1_847759065) |
+ addu t4, t5, t6 |
+ subu t5, t5, t6 |
+ sll t4, t4, 13 // tmp0 = (z2 + z3) << CONST_BITS |
+ sll t5, t5, 13 // tmp1 = (z2 - z3) << CONST_BITS |
+ addu t7, s3, s2 // tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865) |
+ subu t6, s3, t8 // tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065) |
+ addu s0, t4, t7 |
+ subu s1, t4, t7 |
+ addu s2, t5, t6 |
+ subu s3, t5, t6 |
+ addu t4, s0, t3 |
+ subu s0, s0, t3 |
+ addu t3, s2, t1 |
+ subu s2, s2, t1 |
+ addu t1, s3, t2 |
+ subu s3, s3, t2 |
+ addu t2, s1, t0 |
+ subu s1, s1, t0 |
+ shra_r.w t4, t4, 11 |
+ shra_r.w t3, t3, 11 |
+ shra_r.w t1, t1, 11 |
+ shra_r.w t2, t2, 11 |
+ shra_r.w s1, s1, 11 |
+ shra_r.w s3, s3, 11 |
+ shra_r.w s2, s2, 11 |
+ shra_r.w s0, s0, 11 |
+ sw t4, 0(v0) |
+ sw t3, 32(v0) |
+ sw t1, 64(v0) |
+ sw t2, 96(v0) |
+ sw s1, 128(v0) |
+ sw s3, 160(v0) |
+ sw s2, 192(v0) |
+ sw s0, 224(v0) |
+3: |
+ addiu a1, a1, 2 |
+ addiu a0, a0, 2 |
+ bgtz v1, 1b |
+ addiu v0, v0, 4 |
+ move v0, sp |
+ addiu v1, zero, 8 |
+4: |
+ lw t0, 8(v0) // z2 = (JLONG) wsptr[2] |
+ lw t1, 24(v0) // z3 = (JLONG) wsptr[6] |
+ lw t2, 0(v0) // (JLONG) wsptr[0] |
+ lw t3, 16(v0) // (JLONG) wsptr[4] |
+ lw s4, 4(v0) // (JLONG) wsptr[1] |
+ lw s5, 12(v0) // (JLONG) wsptr[3] |
+ lw s6, 20(v0) // (JLONG) wsptr[5] |
+ lw s7, 28(v0) // (JLONG) wsptr[7] |
+ or s4, s4, t0 |
+ or s4, s4, t1 |
+ or s4, s4, t3 |
+ or s4, s4, s7 |
+ or s4, s4, s5 |
+ or s4, s4, s6 |
+ bnez s4, 5f |
+ addiu v1, v1, -1 |
+ shra_r.w s5, t2, 5 |
+ andi s5, s5, 0x3ff |
+ lbux s5, s5(a3) |
+ lw s1, 0(a2) |
+ replv.qb s5, s5 |
+ usw s5, 0(s1) |
+ usw s5, 4(s1) |
+ b 6f |
+ nop |
+5: |
+ addu t4, t0, t1 // z2 + z3 |
+ addiu t8, zero, 4433 // FIX_0_541196100 |
+ mul t5, t4, t8 // z1 = MULTIPLY(z2 + z3, FIX_0_541196100) |
+ addiu t8, zero, 15137 // FIX_1_847759065 |
+ mul t1, t1, t8 // MULTIPLY(z3, FIX_1_847759065) |
+ addiu t8, zero, 6270 // FIX_0_765366865 |
+ mul t0, t0, t8 // MULTIPLY(z2, FIX_0_765366865) |
+ addu t4, t2, t3 // (JLONG) wsptr[0] + (JLONG) wsptr[4] |
+ subu t2, t2, t3 // (JLONG) wsptr[0] - (JLONG) wsptr[4] |
+ sll t4, t4, 13 // tmp0 = ((wsptr[0] + wsptr[4]) << CONST_BITS |
+ sll t2, t2, 13 // tmp1 = ((wsptr[0] - wsptr[4]) << CONST_BITS |
+ subu t1, t5, t1 // tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065) |
+ subu t3, t2, t1 // tmp12 = tmp1 - tmp2 |
+ addu t2, t2, t1 // tmp11 = tmp1 + tmp2 |
+ addu t5, t5, t0 // tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865) |
+ subu t1, t4, t5 // tmp13 = tmp0 - tmp3 |
+ addu t0, t4, t5 // tmp10 = tmp0 + tmp3 |
+ lw t4, 28(v0) // tmp0 = (JLONG) wsptr[7] |
+ lw t6, 12(v0) // tmp2 = (JLONG) wsptr[3] |
+ lw t5, 20(v0) // tmp1 = (JLONG) wsptr[5] |
+ lw t7, 4(v0) // tmp3 = (JLONG) wsptr[1] |
+ addu s0, t4, t6 // z3 = tmp0 + tmp2 |
+ addiu t8, zero, 9633 // FIX_1_175875602 |
+ addu s1, t5, t7 // z4 = tmp1 + tmp3 |
+ addu s2, s0, s1 // z3 + z4 |
+ mul s2, s2, t8 // z5 = MULTIPLY(z3 + z4, FIX_1_175875602) |
+ addu s3, t4, t7 // z1 = tmp0 + tmp3 |
+ addu t9, t5, t6 // z2 = tmp1 + tmp2 |
+ addiu t8, zero, 16069 // FIX_1_961570560 |
+ mul s0, s0, t8 // -z3 = MULTIPLY(z3, FIX_1_961570560) |
+ addiu t8, zero, 3196 // FIX_0_390180644 |
+ mul s1, s1, t8 // -z4 = MULTIPLY(z4, FIX_0_390180644) |
+ addiu t8, zero, 2446 // FIX_0_298631336 |
+ mul t4, t4, t8 // tmp0 = MULTIPLY(tmp0, FIX_0_298631336) |
+ addiu t8, zero, 7373 // FIX_0_899976223 |
+ mul s3, s3, t8 // -z1 = MULTIPLY(z1, FIX_0_899976223) |
+ addiu t8, zero, 16819 // FIX_2_053119869 |
+ mul t5, t5, t8 // tmp1 = MULTIPLY(tmp1, FIX_2_053119869) |
+ addiu t8, zero, 20995 // FIX_2_562915447 |
+ mul t9, t9, t8 // -z2 = MULTIPLY(z2, FIX_2_562915447) |
+ addiu t8, zero, 25172 // FIX_3_072711026 |
+ mul t6, t6, t8 // tmp2 = MULTIPLY(tmp2, FIX_3_072711026) |
+ addiu t8, zero, 12299 // FIX_1_501321110 |
+ mul t7, t7, t8 // tmp3 = MULTIPLY(tmp3, FIX_1_501321110) |
+ subu s0, s2, s0 // z3 += z5 |
+ subu s1, s2, s1 // z4 += z5 |
+ addu t4, t4, s0 |
+ subu t4, t4, s3 // tmp0 |
+ addu t5, t5, s1 |
+ subu t5, t5, t9 // tmp1 |
+ addu t6, t6, s0 |
+ subu t6, t6, t9 // tmp2 |
+ addu t7, t7, s1 |
+ subu t7, t7, s3 // tmp3 |
+ addu s0, t0, t7 |
+ subu t0, t0, t7 |
+ addu t7, t2, t6 |
+ subu t2, t2, t6 |
+ addu t6, t3, t5 |
+ subu t3, t3, t5 |
+ addu t5, t1, t4 |
+ subu t1, t1, t4 |
+ shra_r.w s0, s0, 18 |
+ shra_r.w t7, t7, 18 |
+ shra_r.w t6, t6, 18 |
+ shra_r.w t5, t5, 18 |
+ shra_r.w t1, t1, 18 |
+ shra_r.w t3, t3, 18 |
+ shra_r.w t2, t2, 18 |
+ shra_r.w t0, t0, 18 |
+ andi s0, s0, 0x3ff |
+ andi t7, t7, 0x3ff |
+ andi t6, t6, 0x3ff |
+ andi t5, t5, 0x3ff |
+ andi t1, t1, 0x3ff |
+ andi t3, t3, 0x3ff |
+ andi t2, t2, 0x3ff |
+ andi t0, t0, 0x3ff |
+ lw s1, 0(a2) |
+ lbux s0, s0(a3) |
+ lbux t7, t7(a3) |
+ lbux t6, t6(a3) |
+ lbux t5, t5(a3) |
+ lbux t1, t1(a3) |
+ lbux t3, t3(a3) |
+ lbux t2, t2(a3) |
+ lbux t0, t0(a3) |
+ sb s0, 0(s1) |
+ sb t7, 1(s1) |
+ sb t6, 2(s1) |
+ sb t5, 3(s1) |
+ sb t1, 4(s1) |
+ sb t3, 5(s1) |
+ sb t2, 6(s1) |
+ sb t0, 7(s1) |
+6: |
+ addiu v0, v0, 32 |
+ bgtz v1, 4b |
+ addiu a2, a2, 4 |
+ addiu sp, sp, 256 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_idct_islow_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_ifast_cols_mips_dspr2) |
+/* |
+ * a0 - inptr |
+ * a1 - quantptr |
+ * a2 - wsptr |
+ * a3 - mips_idct_ifast_coefs |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ addiu t9, a0, 16 // end address |
+ or AT, a3, zero |
+ |
+0: |
+ lw s0, 0(a1) // quantptr[DCTSIZE*0] |
+ lw t0, 0(a0) // inptr[DCTSIZE*0] |
+ lw t1, 16(a0) // inptr[DCTSIZE*1] |
+ muleq_s.w.phl v0, t0, s0 // tmp0 ... |
+ lw t2, 32(a0) // inptr[DCTSIZE*2] |
+ lw t3, 48(a0) // inptr[DCTSIZE*3] |
+ lw t4, 64(a0) // inptr[DCTSIZE*4] |
+ lw t5, 80(a0) // inptr[DCTSIZE*5] |
+ muleq_s.w.phr t0, t0, s0 // ... tmp0 ... |
+ lw t6, 96(a0) // inptr[DCTSIZE*6] |
+ lw t7, 112(a0) // inptr[DCTSIZE*7] |
+ or s4, t1, t2 |
+ or s5, t3, t4 |
+ bnez s4, 1f |
+ ins t0, v0, 16, 16 // ... tmp0 |
+ bnez s5, 1f |
+ or s6, t5, t6 |
+ or s6, s6, t7 |
+ bnez s6, 1f |
+ sw t0, 0(a2) // wsptr[DCTSIZE*0] |
+ sw t0, 16(a2) // wsptr[DCTSIZE*1] |
+ sw t0, 32(a2) // wsptr[DCTSIZE*2] |
+ sw t0, 48(a2) // wsptr[DCTSIZE*3] |
+ sw t0, 64(a2) // wsptr[DCTSIZE*4] |
+ sw t0, 80(a2) // wsptr[DCTSIZE*5] |
+ sw t0, 96(a2) // wsptr[DCTSIZE*6] |
+ sw t0, 112(a2) // wsptr[DCTSIZE*7] |
+ addiu a0, a0, 4 |
+ b 2f |
+ addiu a1, a1, 4 |
+ |
+1: |
+ lw s1, 32(a1) // quantptr[DCTSIZE*2] |
+ lw s2, 64(a1) // quantptr[DCTSIZE*4] |
+ muleq_s.w.phl v0, t2, s1 // tmp1 ... |
+ muleq_s.w.phr t2, t2, s1 // ... tmp1 ... |
+ lw s0, 16(a1) // quantptr[DCTSIZE*1] |
+ lw s1, 48(a1) // quantptr[DCTSIZE*3] |
+ lw s3, 96(a1) // quantptr[DCTSIZE*6] |
+ muleq_s.w.phl v1, t4, s2 // tmp2 ... |
+ muleq_s.w.phr t4, t4, s2 // ... tmp2 ... |
+ lw s2, 80(a1) // quantptr[DCTSIZE*5] |
+ lw t8, 4(AT) // FIX(1.414213562) |
+ ins t2, v0, 16, 16 // ... tmp1 |
+ muleq_s.w.phl v0, t6, s3 // tmp3 ... |
+ muleq_s.w.phr t6, t6, s3 // ... tmp3 ... |
+ ins t4, v1, 16, 16 // ... tmp2 |
+ addq.ph s4, t0, t4 // tmp10 |
+ subq.ph s5, t0, t4 // tmp11 |
+ ins t6, v0, 16, 16 // ... tmp3 |
+ subq.ph s6, t2, t6 // tmp12 ... |
+ addq.ph s7, t2, t6 // tmp13 |
+ mulq_s.ph s6, s6, t8 // ... tmp12 ... |
+ addq.ph t0, s4, s7 // tmp0 |
+ subq.ph t6, s4, s7 // tmp3 |
+ muleq_s.w.phl v0, t1, s0 // tmp4 ... |
+ muleq_s.w.phr t1, t1, s0 // ... tmp4 ... |
+ shll_s.ph s6, s6, 1 // x2 |
+ lw s3, 112(a1) // quantptr[DCTSIZE*7] |
+ subq.ph s6, s6, s7 // ... tmp12 |
+ muleq_s.w.phl v1, t7, s3 // tmp7 ... |
+ muleq_s.w.phr t7, t7, s3 // ... tmp7 ... |
+ ins t1, v0, 16, 16 // ... tmp4 |
+ addq.ph t2, s5, s6 // tmp1 |
+ subq.ph t4, s5, s6 // tmp2 |
+ muleq_s.w.phl v0, t5, s2 // tmp6 ... |
+ muleq_s.w.phr t5, t5, s2 // ... tmp6 ... |
+ ins t7, v1, 16, 16 // ... tmp7 |
+ addq.ph s5, t1, t7 // z11 |
+ subq.ph s6, t1, t7 // z12 |
+ muleq_s.w.phl v1, t3, s1 // tmp5 ... |
+ muleq_s.w.phr t3, t3, s1 // ... tmp5 ... |
+ ins t5, v0, 16, 16 // ... tmp6 |
+ ins t3, v1, 16, 16 // ... tmp5 |
+ addq.ph s7, t5, t3 // z13 |
+ subq.ph v0, t5, t3 // z10 |
+ addq.ph t7, s5, s7 // tmp7 |
+ subq.ph s5, s5, s7 // tmp11 ... |
+ addq.ph v1, v0, s6 // z5 ... |
+ mulq_s.ph s5, s5, t8 // ... tmp11 |
+ lw t8, 8(AT) // FIX(1.847759065) |
+ lw s4, 0(AT) // FIX(1.082392200) |
+ addq.ph s0, t0, t7 |
+ subq.ph s1, t0, t7 |
+ mulq_s.ph v1, v1, t8 // ... z5 |
+ shll_s.ph s5, s5, 1 // x2 |
+ lw t8, 12(AT) // FIX(-2.613125930) |
+ sw s0, 0(a2) // wsptr[DCTSIZE*0] |
+ shll_s.ph v0, v0, 1 // x4 |
+ mulq_s.ph v0, v0, t8 // tmp12 ... |
+ mulq_s.ph s4, s6, s4 // tmp10 ... |
+ shll_s.ph v1, v1, 1 // x2 |
+ addiu a0, a0, 4 |
+ addiu a1, a1, 4 |
+ sw s1, 112(a2) // wsptr[DCTSIZE*7] |
+ shll_s.ph s6, v0, 1 // x4 |
+ shll_s.ph s4, s4, 1 // x2 |
+ addq.ph s6, s6, v1 // ... tmp12 |
+ subq.ph t5, s6, t7 // tmp6 |
+ subq.ph s4, s4, v1 // ... tmp10 |
+ subq.ph t3, s5, t5 // tmp5 |
+ addq.ph s2, t2, t5 |
+ addq.ph t1, s4, t3 // tmp4 |
+ subq.ph s3, t2, t5 |
+ sw s2, 16(a2) // wsptr[DCTSIZE*1] |
+ sw s3, 96(a2) // wsptr[DCTSIZE*6] |
+ addq.ph v0, t4, t3 |
+ subq.ph v1, t4, t3 |
+ sw v0, 32(a2) // wsptr[DCTSIZE*2] |
+ sw v1, 80(a2) // wsptr[DCTSIZE*5] |
+ addq.ph v0, t6, t1 |
+ subq.ph v1, t6, t1 |
+ sw v0, 64(a2) // wsptr[DCTSIZE*4] |
+ sw v1, 48(a2) // wsptr[DCTSIZE*3] |
+ |
+2: |
+ bne a0, t9, 0b |
+ addiu a2, a2, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_idct_ifast_cols_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_ifast_rows_mips_dspr2) |
+/* |
+ * a0 - wsptr |
+ * a1 - output_buf |
+ * a2 - output_col |
+ * a3 - mips_idct_ifast_coefs |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, s8, a3 |
+ |
+ addiu t9, a0, 128 // end address |
+ lui s8, 0x8080 |
+ ori s8, s8, 0x8080 |
+ |
+0: |
+ lw AT, 36(sp) // restore $a3 (mips_idct_ifast_coefs) |
+ lw t0, 0(a0) // wsptr[DCTSIZE*0+0/1] b a |
+ lw s0, 16(a0) // wsptr[DCTSIZE*1+0/1] B A |
+ lw t2, 4(a0) // wsptr[DCTSIZE*0+2/3] d c |
+ lw s2, 20(a0) // wsptr[DCTSIZE*1+2/3] D C |
+ lw t4, 8(a0) // wsptr[DCTSIZE*0+4/5] f e |
+ lw s4, 24(a0) // wsptr[DCTSIZE*1+4/5] F E |
+ lw t6, 12(a0) // wsptr[DCTSIZE*0+6/7] h g |
+ lw s6, 28(a0) // wsptr[DCTSIZE*1+6/7] H G |
+ precrq.ph.w t1, s0, t0 // B b |
+ ins t0, s0, 16, 16 // A a |
+ bnez t1, 1f |
+ or s0, t2, s2 |
+ bnez s0, 1f |
+ or s0, t4, s4 |
+ bnez s0, 1f |
+ or s0, t6, s6 |
+ bnez s0, 1f |
+ shll_s.ph s0, t0, 2 // A a |
+ lw a3, 0(a1) |
+ lw AT, 4(a1) |
+ precrq.ph.w t0, s0, s0 // A A |
+ ins s0, s0, 16, 16 // a a |
+ addu a3, a3, a2 |
+ addu AT, AT, a2 |
+ precrq.qb.ph t0, t0, t0 // A A A A |
+ precrq.qb.ph s0, s0, s0 // a a a a |
+ addu.qb s0, s0, s8 |
+ addu.qb t0, t0, s8 |
+ sw s0, 0(a3) |
+ sw s0, 4(a3) |
+ sw t0, 0(AT) |
+ sw t0, 4(AT) |
+ addiu a0, a0, 32 |
+ bne a0, t9, 0b |
+ addiu a1, a1, 8 |
+ b 2f |
+ nop |
+ |
+1: |
+ precrq.ph.w t3, s2, t2 |
+ ins t2, s2, 16, 16 |
+ precrq.ph.w t5, s4, t4 |
+ ins t4, s4, 16, 16 |
+ precrq.ph.w t7, s6, t6 |
+ ins t6, s6, 16, 16 |
+ lw t8, 4(AT) // FIX(1.414213562) |
+ addq.ph s4, t0, t4 // tmp10 |
+ subq.ph s5, t0, t4 // tmp11 |
+ subq.ph s6, t2, t6 // tmp12 ... |
+ addq.ph s7, t2, t6 // tmp13 |
+ mulq_s.ph s6, s6, t8 // ... tmp12 ... |
+ addq.ph t0, s4, s7 // tmp0 |
+ subq.ph t6, s4, s7 // tmp3 |
+ shll_s.ph s6, s6, 1 // x2 |
+ subq.ph s6, s6, s7 // ... tmp12 |
+ addq.ph t2, s5, s6 // tmp1 |
+ subq.ph t4, s5, s6 // tmp2 |
+ addq.ph s5, t1, t7 // z11 |
+ subq.ph s6, t1, t7 // z12 |
+ addq.ph s7, t5, t3 // z13 |
+ subq.ph v0, t5, t3 // z10 |
+ addq.ph t7, s5, s7 // tmp7 |
+ subq.ph s5, s5, s7 // tmp11 ... |
+ addq.ph v1, v0, s6 // z5 ... |
+ mulq_s.ph s5, s5, t8 // ... tmp11 |
+ lw t8, 8(AT) // FIX(1.847759065) |
+ lw s4, 0(AT) // FIX(1.082392200) |
+ addq.ph s0, t0, t7 // tmp0 + tmp7 |
+ subq.ph s7, t0, t7 // tmp0 - tmp7 |
+ mulq_s.ph v1, v1, t8 // ... z5 |
+ lw a3, 0(a1) |
+ lw t8, 12(AT) // FIX(-2.613125930) |
+ shll_s.ph s5, s5, 1 // x2 |
+ addu a3, a3, a2 |
+ shll_s.ph v0, v0, 1 // x4 |
+ mulq_s.ph v0, v0, t8 // tmp12 ... |
+ mulq_s.ph s4, s6, s4 // tmp10 ... |
+ shll_s.ph v1, v1, 1 // x2 |
+ addiu a0, a0, 32 |
+ addiu a1, a1, 8 |
+ shll_s.ph s6, v0, 1 // x4 |
+ shll_s.ph s4, s4, 1 // x2 |
+ addq.ph s6, s6, v1 // ... tmp12 |
+ shll_s.ph s0, s0, 2 |
+ subq.ph t5, s6, t7 // tmp6 |
+ subq.ph s4, s4, v1 // ... tmp10 |
+ subq.ph t3, s5, t5 // tmp5 |
+ shll_s.ph s7, s7, 2 |
+ addq.ph t1, s4, t3 // tmp4 |
+ addq.ph s1, t2, t5 // tmp1 + tmp6 |
+ subq.ph s6, t2, t5 // tmp1 - tmp6 |
+ addq.ph s2, t4, t3 // tmp2 + tmp5 |
+ subq.ph s5, t4, t3 // tmp2 - tmp5 |
+ addq.ph s4, t6, t1 // tmp3 + tmp4 |
+ subq.ph s3, t6, t1 // tmp3 - tmp4 |
+ shll_s.ph s1, s1, 2 |
+ shll_s.ph s2, s2, 2 |
+ shll_s.ph s3, s3, 2 |
+ shll_s.ph s4, s4, 2 |
+ shll_s.ph s5, s5, 2 |
+ shll_s.ph s6, s6, 2 |
+ precrq.ph.w t0, s1, s0 // B A |
+ ins s0, s1, 16, 16 // b a |
+ precrq.ph.w t2, s3, s2 // D C |
+ ins s2, s3, 16, 16 // d c |
+ precrq.ph.w t4, s5, s4 // F E |
+ ins s4, s5, 16, 16 // f e |
+ precrq.ph.w t6, s7, s6 // H G |
+ ins s6, s7, 16, 16 // h g |
+ precrq.qb.ph t0, t2, t0 // D C B A |
+ precrq.qb.ph s0, s2, s0 // d c b a |
+ precrq.qb.ph t4, t6, t4 // H G F E |
+ precrq.qb.ph s4, s6, s4 // h g f e |
+ addu.qb s0, s0, s8 |
+ addu.qb s4, s4, s8 |
+ sw s0, 0(a3) // outptr[0/1/2/3] d c b a |
+ sw s4, 4(a3) // outptr[4/5/6/7] h g f e |
+ lw a3, -4(a1) |
+ addu.qb t0, t0, s8 |
+ addu a3, a3, a2 |
+ addu.qb t4, t4, s8 |
+ sw t0, 0(a3) // outptr[0/1/2/3] D C B A |
+ bne a0, t9, 0b |
+ sw t4, 4(a3) // outptr[4/5/6/7] H G F E |
+ |
+2: |
+ |
+ RESTORE_REGS_FROM_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, s8, a3 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_idct_ifast_rows_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_fdct_islow_mips_dspr2) |
+/* |
+ * a0 - data |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, s8 |
+ |
+ lui t0, 6437 |
+ ori t0, 2260 |
+ lui t1, 9633 |
+ ori t1, 11363 |
+ lui t2, 0xd39e |
+ ori t2, 0xe6dc |
+ lui t3, 0xf72d |
+ ori t3, 9633 |
+ lui t4, 2261 |
+ ori t4, 9633 |
+ lui t5, 0xd39e |
+ ori t5, 6437 |
+ lui t6, 9633 |
+ ori t6, 0xd39d |
+ lui t7, 0xe6dc |
+ ori t7, 2260 |
+ lui t8, 4433 |
+ ori t8, 10703 |
+ lui t9, 0xd630 |
+ ori t9, 4433 |
+ li s8, 8 |
+ move a1, a0 |
+1: |
+ lw s0, 0(a1) // tmp0 = 1|0 |
+ lw s1, 4(a1) // tmp1 = 3|2 |
+ lw s2, 8(a1) // tmp2 = 5|4 |
+ lw s3, 12(a1) // tmp3 = 7|6 |
+ packrl.ph s1, s1, s1 // tmp1 = 2|3 |
+ packrl.ph s3, s3, s3 // tmp3 = 6|7 |
+ subq.ph s7, s1, s2 // tmp7 = 2-5|3-4 = t5|t4 |
+ subq.ph s5, s0, s3 // tmp5 = 1-6|0-7 = t6|t7 |
+ mult $0, $0 // ac0 = 0 |
+ dpa.w.ph $ac0, s7, t0 // ac0 += t5* 6437 + t4* 2260 |
+ dpa.w.ph $ac0, s5, t1 // ac0 += t6* 9633 + t7* 11363 |
+ mult $ac1, $0, $0 // ac1 = 0 |
+ dpa.w.ph $ac1, s7, t2 // ac1 += t5*-11362 + t4* -6436 |
+ dpa.w.ph $ac1, s5, t3 // ac1 += t6* -2259 + t7* 9633 |
+ mult $ac2, $0, $0 // ac2 = 0 |
+ dpa.w.ph $ac2, s7, t4 // ac2 += t5* 2261 + t4* 9633 |
+ dpa.w.ph $ac2, s5, t5 // ac2 += t6*-11362 + t7* 6437 |
+ mult $ac3, $0, $0 // ac3 = 0 |
+ dpa.w.ph $ac3, s7, t6 // ac3 += t5* 9633 + t4*-11363 |
+ dpa.w.ph $ac3, s5, t7 // ac3 += t6* -6436 + t7* 2260 |
+ addq.ph s6, s1, s2 // tmp6 = 2+5|3+4 = t2|t3 |
+ addq.ph s4, s0, s3 // tmp4 = 1+6|0+7 = t1|t0 |
+ extr_r.w s0, $ac0, 11 // tmp0 = (ac0 + 1024) >> 11 |
+ extr_r.w s1, $ac1, 11 // tmp1 = (ac1 + 1024) >> 11 |
+ extr_r.w s2, $ac2, 11 // tmp2 = (ac2 + 1024) >> 11 |
+ extr_r.w s3, $ac3, 11 // tmp3 = (ac3 + 1024) >> 11 |
+ addq.ph s5, s4, s6 // tmp5 = t1+t2|t0+t3 = t11|t10 |
+ subq.ph s7, s4, s6 // tmp7 = t1-t2|t0-t3 = t12|t13 |
+ sh s0, 2(a1) |
+ sh s1, 6(a1) |
+ sh s2, 10(a1) |
+ sh s3, 14(a1) |
+ mult $0, $0 // ac0 = 0 |
+ dpa.w.ph $ac0, s7, t8 // ac0 += t12* 4433 + t13* 10703 |
+ mult $ac1, $0, $0 // ac1 = 0 |
+ dpa.w.ph $ac1, s7, t9 // ac1 += t12*-10704 + t13* 4433 |
+ sra s4, s5, 16 // tmp4 = t11 |
+ addiu a1, a1, 16 |
+ addiu s8, s8, -1 |
+ extr_r.w s0, $ac0, 11 // tmp0 = (ac0 + 1024) >> 11 |
+ extr_r.w s1, $ac1, 11 // tmp1 = (ac1 + 1024) >> 11 |
+ addu s2, s5, s4 // tmp2 = t10 + t11 |
+ subu s3, s5, s4 // tmp3 = t10 - t11 |
+ sll s2, s2, 2 // tmp2 = (t10 + t11) << 2 |
+ sll s3, s3, 2 // tmp3 = (t10 - t11) << 2 |
+ sh s2, -16(a1) |
+ sh s3, -8(a1) |
+ sh s0, -12(a1) |
+ bgtz s8, 1b |
+ sh s1, -4(a1) |
+ li t0, 2260 |
+ li t1, 11363 |
+ li t2, 9633 |
+ li t3, 6436 |
+ li t4, 6437 |
+ li t5, 2261 |
+ li t6, 11362 |
+ li t7, 2259 |
+ li t8, 4433 |
+ li t9, 10703 |
+ li a1, 10704 |
+ li s8, 8 |
+ |
+2: |
+ lh a2, 0(a0) // 0 |
+ lh a3, 16(a0) // 8 |
+ lh v0, 32(a0) // 16 |
+ lh v1, 48(a0) // 24 |
+ lh s4, 64(a0) // 32 |
+ lh s5, 80(a0) // 40 |
+ lh s6, 96(a0) // 48 |
+ lh s7, 112(a0) // 56 |
+ addu s2, v0, s5 // tmp2 = 16 + 40 |
+ subu s5, v0, s5 // tmp5 = 16 - 40 |
+ addu s3, v1, s4 // tmp3 = 24 + 32 |
+ subu s4, v1, s4 // tmp4 = 24 - 32 |
+ addu s0, a2, s7 // tmp0 = 0 + 56 |
+ subu s7, a2, s7 // tmp7 = 0 - 56 |
+ addu s1, a3, s6 // tmp1 = 8 + 48 |
+ subu s6, a3, s6 // tmp6 = 8 - 48 |
+ addu a2, s0, s3 // tmp10 = tmp0 + tmp3 |
+ subu v1, s0, s3 // tmp13 = tmp0 - tmp3 |
+ addu a3, s1, s2 // tmp11 = tmp1 + tmp2 |
+ subu v0, s1, s2 // tmp12 = tmp1 - tmp2 |
+ mult s7, t1 // ac0 = tmp7 * c1 |
+ madd s4, t0 // ac0 += tmp4 * c0 |
+ madd s5, t4 // ac0 += tmp5 * c4 |
+ madd s6, t2 // ac0 += tmp6 * c2 |
+ mult $ac1, s7, t2 // ac1 = tmp7 * c2 |
+ msub $ac1, s4, t3 // ac1 -= tmp4 * c3 |
+ msub $ac1, s5, t6 // ac1 -= tmp5 * c6 |
+ msub $ac1, s6, t7 // ac1 -= tmp6 * c7 |
+ mult $ac2, s7, t4 // ac2 = tmp7 * c4 |
+ madd $ac2, s4, t2 // ac2 += tmp4 * c2 |
+ madd $ac2, s5, t5 // ac2 += tmp5 * c5 |
+ msub $ac2, s6, t6 // ac2 -= tmp6 * c6 |
+ mult $ac3, s7, t0 // ac3 = tmp7 * c0 |
+ msub $ac3, s4, t1 // ac3 -= tmp4 * c1 |
+ madd $ac3, s5, t2 // ac3 += tmp5 * c2 |
+ msub $ac3, s6, t3 // ac3 -= tmp6 * c3 |
+ extr_r.w s0, $ac0, 15 // tmp0 = (ac0 + 16384) >> 15 |
+ extr_r.w s1, $ac1, 15 // tmp1 = (ac1 + 16384) >> 15 |
+ extr_r.w s2, $ac2, 15 // tmp2 = (ac2 + 16384) >> 15 |
+ extr_r.w s3, $ac3, 15 // tmp3 = (ac3 + 16384) >> 15 |
+ addiu s8, s8, -1 |
+ addu s4, a2, a3 // tmp4 = tmp10 + tmp11 |
+ subu s5, a2, a3 // tmp5 = tmp10 - tmp11 |
+ sh s0, 16(a0) |
+ sh s1, 48(a0) |
+ sh s2, 80(a0) |
+ sh s3, 112(a0) |
+ mult v0, t8 // ac0 = tmp12 * c8 |
+ madd v1, t9 // ac0 += tmp13 * c9 |
+ mult $ac1, v1, t8 // ac1 = tmp13 * c8 |
+ msub $ac1, v0, a1 // ac1 -= tmp12 * c10 |
+ addiu a0, a0, 2 |
+ extr_r.w s6, $ac0, 15 // tmp6 = (ac0 + 16384) >> 15 |
+ extr_r.w s7, $ac1, 15 // tmp7 = (ac1 + 16384) >> 15 |
+ shra_r.w s4, s4, 2 // tmp4 = (tmp4 + 2) >> 2 |
+ shra_r.w s5, s5, 2 // tmp5 = (tmp5 + 2) >> 2 |
+ sh s4, -2(a0) |
+ sh s5, 62(a0) |
+ sh s6, 30(a0) |
+ bgtz s8, 2b |
+ sh s7, 94(a0) |
+ |
+ RESTORE_REGS_FROM_STACK 40, s0, s1, s2, s3, s4, s5, s6, s7, s8 |
+ |
+ jr ra |
+ nop |
+ |
+END(jsimd_fdct_islow_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_fdct_ifast_mips_dspr2) |
+/* |
+ * a0 - data |
+ */ |
+ .set at |
+ SAVE_REGS_ON_STACK 8, s0, s1 |
+ li a1, 0x014e014e // FIX_1_306562965 (334 << 16)|(334 & 0xffff) |
+ li a2, 0x008b008b // FIX_0_541196100 (139 << 16)|(139 & 0xffff) |
+ li a3, 0x00620062 // FIX_0_382683433 (98 << 16) |(98 & 0xffff) |
+ li s1, 0x00b500b5 // FIX_0_707106781 (181 << 16)|(181 & 0xffff) |
+ |
+ move v0, a0 |
+ addiu v1, v0, 128 // end address |
+ |
+0: |
+ lw t0, 0(v0) // tmp0 = 1|0 |
+ lw t1, 4(v0) // tmp1 = 3|2 |
+ lw t2, 8(v0) // tmp2 = 5|4 |
+ lw t3, 12(v0) // tmp3 = 7|6 |
+ packrl.ph t1, t1, t1 // tmp1 = 2|3 |
+ packrl.ph t3, t3, t3 // tmp3 = 6|7 |
+ subq.ph t7, t1, t2 // tmp7 = 2-5|3-4 = t5|t4 |
+ subq.ph t5, t0, t3 // tmp5 = 1-6|0-7 = t6|t7 |
+ addq.ph t6, t1, t2 // tmp6 = 2+5|3+4 = t2|t3 |
+ addq.ph t4, t0, t3 // tmp4 = 1+6|0+7 = t1|t0 |
+ addq.ph t8, t4, t6 // tmp5 = t1+t2|t0+t3 = t11|t10 |
+ subq.ph t9, t4, t6 // tmp7 = t1-t2|t0-t3 = t12|t13 |
+ sra t4, t8, 16 // tmp4 = t11 |
+ mult $0, $0 // ac0 = 0 |
+ dpa.w.ph $ac0, t9, s1 |
+ mult $ac1, $0, $0 // ac1 = 0 |
+ dpa.w.ph $ac1, t7, a3 // ac1 += t4*98 + t5*98 |
+ dpsx.w.ph $ac1, t5, a3 // ac1 += t6*98 + t7*98 |
+ mult $ac2, $0, $0 // ac2 = 0 |
+ dpa.w.ph $ac2, t7, a2 // ac2 += t4*139 + t5*139 |
+ mult $ac3, $0, $0 // ac3 = 0 |
+ dpa.w.ph $ac3, t5, a1 // ac3 += t6*334 + t7*334 |
+ precrq.ph.w t0, t5, t7 // t0 = t5|t6 |
+ addq.ph t2, t8, t4 // tmp2 = t10 + t11 |
+ subq.ph t3, t8, t4 // tmp3 = t10 - t11 |
+ extr.w t4, $ac0, 8 |
+ mult $0, $0 // ac0 = 0 |
+ dpa.w.ph $ac0, t0, s1 // ac0 += t5*181 + t6*181 |
+ extr.w t0, $ac1, 8 // t0 = z5 |
+ extr.w t1, $ac2, 8 // t1 = MULTIPLY(tmp10, 139) |
+ extr.w t7, $ac3, 8 // t2 = MULTIPLY(tmp12, 334) |
+ extr.w t8, $ac0, 8 // t8 = z3 = MULTIPLY(tmp11, 181) |
+ add t6, t1, t0 // t6 = z2 |
+ add t7, t7, t0 // t7 = z4 |
+ subq.ph t0, t5, t8 // t0 = z13 = tmp7 - z3 |
+ addq.ph t8, t5, t8 // t9 = z11 = tmp7 + z3 |
+ addq.ph t1, t0, t6 // t1 = z13 + z2 |
+ subq.ph t6, t0, t6 // t6 = z13 - z2 |
+ addq.ph t0, t8, t7 // t0 = z11 + z4 |
+ subq.ph t7, t8, t7 // t7 = z11 - z4 |
+ addq.ph t5, t4, t9 |
+ subq.ph t4, t9, t4 |
+ sh t2, 0(v0) |
+ sh t5, 4(v0) |
+ sh t3, 8(v0) |
+ sh t4, 12(v0) |
+ sh t1, 10(v0) |
+ sh t6, 6(v0) |
+ sh t0, 2(v0) |
+ sh t7, 14(v0) |
+ addiu v0, 16 |
+ bne v1, v0, 0b |
+ nop |
+ move v0, a0 |
+ addiu v1, v0, 16 |
+ |
+1: |
+ lh t0, 0(v0) // 0 |
+ lh t1, 16(v0) // 8 |
+ lh t2, 32(v0) // 16 |
+ lh t3, 48(v0) // 24 |
+ lh t4, 64(v0) // 32 |
+ lh t5, 80(v0) // 40 |
+ lh t6, 96(v0) // 48 |
+ lh t7, 112(v0) // 56 |
+ add t8, t0, t7 // t8 = tmp0 |
+ sub t7, t0, t7 // t7 = tmp7 |
+ add t0, t1, t6 // t0 = tmp1 |
+ sub t1, t1, t6 // t1 = tmp6 |
+ add t6, t2, t5 // t6 = tmp2 |
+ sub t5, t2, t5 // t5 = tmp5 |
+ add t2, t3, t4 // t2 = tmp3 |
+ sub t3, t3, t4 // t3 = tmp4 |
+ add t4, t8, t2 // t4 = tmp10 = tmp0 + tmp3 |
+ sub t8, t8, t2 // t8 = tmp13 = tmp0 - tmp3 |
+ sub s0, t0, t6 // s0 = tmp12 = tmp1 - tmp2 |
+ ins t8, s0, 16, 16 // t8 = tmp12|tmp13 |
+ add t2, t0, t6 // t2 = tmp11 = tmp1 + tmp2 |
+ mult $0, $0 // ac0 = 0 |
+ dpa.w.ph $ac0, t8, s1 // ac0 += t12*181 + t13*181 |
+ add s0, t4, t2 // t8 = tmp10+tmp11 |
+ sub t4, t4, t2 // t4 = tmp10-tmp11 |
+ sh s0, 0(v0) |
+ sh t4, 64(v0) |
+ extr.w t2, $ac0, 8 // z1 = MULTIPLY(tmp12+tmp13,FIX_0_707106781) |
+ addq.ph t4, t8, t2 // t9 = tmp13 + z1 |
+ subq.ph t8, t8, t2 // t2 = tmp13 - z1 |
+ sh t4, 32(v0) |
+ sh t8, 96(v0) |
+ add t3, t3, t5 // t3 = tmp10 = tmp4 + tmp5 |
+ add t0, t5, t1 // t0 = tmp11 = tmp5 + tmp6 |
+ add t1, t1, t7 // t1 = tmp12 = tmp6 + tmp7 |
+ andi t4, a1, 0xffff |
+ mul s0, t1, t4 |
+ sra s0, s0, 8 // s0 = z4 = MULTIPLY(tmp12, FIX_1_306562965) |
+ ins t1, t3, 16, 16 // t1 = tmp10|tmp12 |
+ mult $0, $0 // ac0 = 0 |
+ mulsa.w.ph $ac0, t1, a3 // ac0 += t10*98 - t12*98 |
+ extr.w t8, $ac0, 8 // z5 = MULTIPLY(tmp10-tmp12,FIX_0_382683433) |
+ add t2, t7, t8 // t2 = tmp7 + z5 |
+ sub t7, t7, t8 // t7 = tmp7 - z5 |
+ andi t4, a2, 0xffff |
+ mul t8, t3, t4 |
+ sra t8, t8, 8 // t8 = z2 = MULTIPLY(tmp10, FIX_0_541196100) |
+ andi t4, s1, 0xffff |
+ mul t6, t0, t4 |
+ sra t6, t6, 8 // t6 = z3 = MULTIPLY(tmp11, FIX_0_707106781) |
+ add t0, t6, t8 // t0 = z3 + z2 |
+ sub t1, t6, t8 // t1 = z3 - z2 |
+ add t3, t6, s0 // t3 = z3 + z4 |
+ sub t4, t6, s0 // t4 = z3 - z4 |
+ sub t5, t2, t1 // t5 = dataptr[5] |
+ sub t6, t7, t0 // t6 = dataptr[3] |
+ add t3, t2, t3 // t3 = dataptr[1] |
+ add t4, t7, t4 // t4 = dataptr[7] |
+ sh t5, 80(v0) |
+ sh t6, 48(v0) |
+ sh t3, 16(v0) |
+ sh t4, 112(v0) |
+ addiu v0, 2 |
+ bne v0, v1, 1b |
+ nop |
+ |
+ RESTORE_REGS_FROM_STACK 8, s0, s1 |
+ |
+ j ra |
+ nop |
+END(jsimd_fdct_ifast_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_quantize_mips_dspr2) |
+/* |
+ * a0 - coef_block |
+ * a1 - divisors |
+ * a2 - workspace |
+ */ |
+ |
+ .set at |
+ |
+ SAVE_REGS_ON_STACK 16, s0, s1, s2 |
+ |
+ addiu v0, a2, 124 // v0 = workspace_end |
+ lh t0, 0(a2) |
+ lh t1, 0(a1) |
+ lh t2, 128(a1) |
+ sra t3, t0, 15 |
+ sll t3, t3, 1 |
+ addiu t3, t3, 1 |
+ mul t0, t0, t3 |
+ lh t4, 384(a1) |
+ lh t5, 130(a1) |
+ lh t6, 2(a2) |
+ lh t7, 2(a1) |
+ lh t8, 386(a1) |
+ |
+1: |
+ andi t1, 0xffff |
+ add t9, t0, t2 |
+ andi t9, 0xffff |
+ mul v1, t9, t1 |
+ sra s0, t6, 15 |
+ sll s0, s0, 1 |
+ addiu s0, s0, 1 |
+ addiu t9, t4, 16 |
+ srav v1, v1, t9 |
+ mul v1, v1, t3 |
+ mul t6, t6, s0 |
+ andi t7, 0xffff |
+ addiu a2, a2, 4 |
+ addiu a1, a1, 4 |
+ add s1, t6, t5 |
+ andi s1, 0xffff |
+ sh v1, 0(a0) |
+ |
+ mul s2, s1, t7 |
+ addiu s1, t8, 16 |
+ srav s2, s2, s1 |
+ mul s2,s2, s0 |
+ lh t0, 0(a2) |
+ lh t1, 0(a1) |
+ sra t3, t0, 15 |
+ sll t3, t3, 1 |
+ addiu t3, t3, 1 |
+ mul t0, t0, t3 |
+ lh t2, 128(a1) |
+ lh t4, 384(a1) |
+ lh t5, 130(a1) |
+ lh t8, 386(a1) |
+ lh t6, 2(a2) |
+ lh t7, 2(a1) |
+ sh s2, 2(a0) |
+ lh t0, 0(a2) |
+ sra t3, t0, 15 |
+ sll t3, t3, 1 |
+ addiu t3, t3, 1 |
+ mul t0, t0,t3 |
+ bne a2, v0, 1b |
+ addiu a0, a0, 4 |
+ |
+ andi t1, 0xffff |
+ add t9, t0, t2 |
+ andi t9, 0xffff |
+ mul v1, t9, t1 |
+ sra s0, t6, 15 |
+ sll s0, s0, 1 |
+ addiu s0, s0, 1 |
+ addiu t9, t4, 16 |
+ srav v1, v1, t9 |
+ mul v1, v1, t3 |
+ mul t6, t6, s0 |
+ andi t7, 0xffff |
+ sh v1, 0(a0) |
+ add s1, t6, t5 |
+ andi s1, 0xffff |
+ mul s2, s1, t7 |
+ addiu s1, t8, 16 |
+ addiu a2, a2, 4 |
+ addiu a1, a1, 4 |
+ srav s2, s2, s1 |
+ mul s2, s2, s0 |
+ sh s2, 2(a0) |
+ |
+ RESTORE_REGS_FROM_STACK 16, s0, s1, s2 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_quantize_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_quantize_float_mips_dspr2) |
+/* |
+ * a0 - coef_block |
+ * a1 - divisors |
+ * a2 - workspace |
+ */ |
+ |
+ .set at |
+ |
+ li t1, 0x46800100 //integer representation 16384.5 |
+ mtc1 t1, f0 |
+ li t0, 63 |
+0: |
+ lwc1 f2, 0(a2) |
+ lwc1 f10, 0(a1) |
+ lwc1 f4, 4(a2) |
+ lwc1 f12, 4(a1) |
+ lwc1 f6, 8(a2) |
+ lwc1 f14, 8(a1) |
+ lwc1 f8, 12(a2) |
+ lwc1 f16, 12(a1) |
+ madd.s f2, f0, f2, f10 |
+ madd.s f4, f0, f4, f12 |
+ madd.s f6, f0, f6, f14 |
+ madd.s f8, f0, f8, f16 |
+ lwc1 f10, 16(a1) |
+ lwc1 f12, 20(a1) |
+ trunc.w.s f2, f2 |
+ trunc.w.s f4, f4 |
+ trunc.w.s f6, f6 |
+ trunc.w.s f8, f8 |
+ lwc1 f14, 24(a1) |
+ lwc1 f16, 28(a1) |
+ mfc1 t1, f2 |
+ mfc1 t2, f4 |
+ mfc1 t3, f6 |
+ mfc1 t4, f8 |
+ lwc1 f2, 16(a2) |
+ lwc1 f4, 20(a2) |
+ lwc1 f6, 24(a2) |
+ lwc1 f8, 28(a2) |
+ madd.s f2, f0, f2, f10 |
+ madd.s f4, f0, f4, f12 |
+ madd.s f6, f0, f6, f14 |
+ madd.s f8, f0, f8, f16 |
+ addiu t1, t1, -16384 |
+ addiu t2, t2, -16384 |
+ addiu t3, t3, -16384 |
+ addiu t4, t4, -16384 |
+ trunc.w.s f2, f2 |
+ trunc.w.s f4, f4 |
+ trunc.w.s f6, f6 |
+ trunc.w.s f8, f8 |
+ sh t1, 0(a0) |
+ sh t2, 2(a0) |
+ sh t3, 4(a0) |
+ sh t4, 6(a0) |
+ mfc1 t1, f2 |
+ mfc1 t2, f4 |
+ mfc1 t3, f6 |
+ mfc1 t4, f8 |
+ addiu t0, t0, -8 |
+ addiu a2, a2, 32 |
+ addiu a1, a1, 32 |
+ addiu t1, t1, -16384 |
+ addiu t2, t2, -16384 |
+ addiu t3, t3, -16384 |
+ addiu t4, t4, -16384 |
+ sh t1, 8(a0) |
+ sh t2, 10(a0) |
+ sh t3, 12(a0) |
+ sh t4, 14(a0) |
+ bgez t0, 0b |
+ addiu a0, a0, 16 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_quantize_float_mips_dspr2) |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_2x2_mips_dspr2) |
+/* |
+ * a0 - compptr->dct_table |
+ * a1 - coef_block |
+ * a2 - output_buf |
+ * a3 - output_col |
+ */ |
+ .set at |
+ |
+ SAVE_REGS_ON_STACK 24, s0, s1, s2, s3, s4, s5 |
+ |
+ addiu sp, sp, -40 |
+ move v0, sp |
+ addiu s2, zero, 29692 |
+ addiu s3, zero, -10426 |
+ addiu s4, zero, 6967 |
+ addiu s5, zero, -5906 |
+ lh t0, 0(a1) // t0 = inptr[DCTSIZE*0] |
+ lh t5, 0(a0) // t5 = quantptr[DCTSIZE*0] |
+ lh t1, 48(a1) // t1 = inptr[DCTSIZE*3] |
+ lh t6, 48(a0) // t6 = quantptr[DCTSIZE*3] |
+ mul t4, t5, t0 |
+ lh t0, 16(a1) // t0 = inptr[DCTSIZE*1] |
+ lh t5, 16(a0) // t5 = quantptr[DCTSIZE*1] |
+ mul t6, t6, t1 |
+ mul t5, t5, t0 |
+ lh t2, 80(a1) // t2 = inptr[DCTSIZE*5] |
+ lh t7, 80(a0) // t7 = quantptr[DCTSIZE*5] |
+ lh t3, 112(a1) // t3 = inptr[DCTSIZE*7] |
+ lh t8, 112(a0) // t8 = quantptr[DCTSIZE*7] |
+ mul t7, t7, t2 |
+ mult zero, zero |
+ mul t8, t8, t3 |
+ li s0, 0x73FCD746 // s0 = (29692 << 16) | (-10426 & 0xffff) |
+ li s1, 0x1B37E8EE // s1 = (6967 << 16) | (-5906 & 0xffff) |
+ ins t6, t5, 16, 16 // t6 = t5|t6 |
+ sll t4, t4, 15 |
+ dpa.w.ph $ac0, t6, s0 |
+ lh t1, 2(a1) |
+ lh t6, 2(a0) |
+ ins t8, t7, 16, 16 // t8 = t7|t8 |
+ dpa.w.ph $ac0, t8, s1 |
+ mflo t0, $ac0 |
+ mul t5, t6, t1 |
+ lh t1, 18(a1) |
+ lh t6, 18(a0) |
+ lh t2, 50(a1) |
+ lh t7, 50(a0) |
+ mul t6, t6, t1 |
+ subu t8, t4, t0 |
+ mul t7, t7, t2 |
+ addu t0, t4, t0 |
+ shra_r.w t0, t0, 13 |
+ lh t1, 82(a1) |
+ lh t2, 82(a0) |
+ lh t3, 114(a1) |
+ lh t4, 114(a0) |
+ shra_r.w t8, t8, 13 |
+ mul t1, t1, t2 |
+ mul t3, t3, t4 |
+ sw t0, 0(v0) |
+ sw t8, 20(v0) |
+ sll t4, t5, 15 |
+ ins t7, t6, 16, 16 |
+ mult zero, zero |
+ dpa.w.ph $ac0, t7, s0 |
+ ins t3, t1, 16, 16 |
+ lh t1, 6(a1) |
+ lh t6, 6(a0) |
+ dpa.w.ph $ac0, t3, s1 |
+ mflo t0, $ac0 |
+ mul t5, t6, t1 |
+ lh t1, 22(a1) |
+ lh t6, 22(a0) |
+ lh t2, 54(a1) |
+ lh t7, 54(a0) |
+ mul t6, t6, t1 |
+ subu t8, t4, t0 |
+ mul t7, t7, t2 |
+ addu t0, t4, t0 |
+ shra_r.w t0, t0, 13 |
+ lh t1, 86(a1) |
+ lh t2, 86(a0) |
+ lh t3, 118(a1) |
+ lh t4, 118(a0) |
+ shra_r.w t8, t8, 13 |
+ mul t1, t1, t2 |
+ mul t3, t3, t4 |
+ sw t0, 4(v0) |
+ sw t8, 24(v0) |
+ sll t4, t5, 15 |
+ ins t7, t6, 16, 16 |
+ mult zero, zero |
+ dpa.w.ph $ac0, t7, s0 |
+ ins t3, t1, 16, 16 |
+ lh t1, 10(a1) |
+ lh t6, 10(a0) |
+ dpa.w.ph $ac0, t3, s1 |
+ mflo t0, $ac0 |
+ mul t5, t6, t1 |
+ lh t1, 26(a1) |
+ lh t6, 26(a0) |
+ lh t2, 58(a1) |
+ lh t7, 58(a0) |
+ mul t6, t6, t1 |
+ subu t8, t4, t0 |
+ mul t7, t7, t2 |
+ addu t0, t4, t0 |
+ shra_r.w t0, t0, 13 |
+ lh t1, 90(a1) |
+ lh t2, 90(a0) |
+ lh t3, 122(a1) |
+ lh t4, 122(a0) |
+ shra_r.w t8, t8, 13 |
+ mul t1, t1, t2 |
+ mul t3, t3, t4 |
+ sw t0, 8(v0) |
+ sw t8, 28(v0) |
+ sll t4, t5, 15 |
+ ins t7, t6, 16, 16 |
+ mult zero, zero |
+ dpa.w.ph $ac0, t7, s0 |
+ ins t3, t1, 16, 16 |
+ lh t1, 14(a1) |
+ lh t6, 14(a0) |
+ dpa.w.ph $ac0, t3, s1 |
+ mflo t0, $ac0 |
+ mul t5, t6, t1 |
+ lh t1, 30(a1) |
+ lh t6, 30(a0) |
+ lh t2, 62(a1) |
+ lh t7, 62(a0) |
+ mul t6, t6, t1 |
+ subu t8, t4, t0 |
+ mul t7, t7, t2 |
+ addu t0, t4, t0 |
+ shra_r.w t0, t0, 13 |
+ lh t1, 94(a1) |
+ lh t2, 94(a0) |
+ lh t3, 126(a1) |
+ lh t4, 126(a0) |
+ shra_r.w t8, t8, 13 |
+ mul t1, t1, t2 |
+ mul t3, t3, t4 |
+ sw t0, 12(v0) |
+ sw t8, 32(v0) |
+ sll t4, t5, 15 |
+ ins t7, t6, 16, 16 |
+ mult zero, zero |
+ dpa.w.ph $ac0, t7, s0 |
+ ins t3, t1, 16, 16 |
+ dpa.w.ph $ac0, t3, s1 |
+ mflo t0, $ac0 |
+ lw t9, 0(a2) |
+ lw t3, 0(v0) |
+ lw t7, 4(v0) |
+ lw t1, 8(v0) |
+ addu t9, t9, a3 |
+ sll t3, t3, 15 |
+ subu t8, t4, t0 |
+ addu t0, t4, t0 |
+ shra_r.w t0, t0, 13 |
+ shra_r.w t8, t8, 13 |
+ sw t0, 16(v0) |
+ sw t8, 36(v0) |
+ lw t5, 12(v0) |
+ lw t6, 16(v0) |
+ mult t7, s2 |
+ madd t1, s3 |
+ madd t5, s4 |
+ madd t6, s5 |
+ lw t5, 24(v0) |
+ lw t7, 28(v0) |
+ mflo t0, $ac0 |
+ lw t8, 32(v0) |
+ lw t2, 36(v0) |
+ mult $ac1, t5, s2 |
+ madd $ac1, t7, s3 |
+ madd $ac1, t8, s4 |
+ madd $ac1, t2, s5 |
+ addu t1, t3, t0 |
+ subu t6, t3, t0 |
+ shra_r.w t1, t1, 20 |
+ shra_r.w t6, t6, 20 |
+ mflo t4, $ac1 |
+ shll_s.w t1, t1, 24 |
+ shll_s.w t6, t6, 24 |
+ sra t1, t1, 24 |
+ sra t6, t6, 24 |
+ addiu t1, t1, 128 |
+ addiu t6, t6, 128 |
+ lw t0, 20(v0) |
+ sb t1, 0(t9) |
+ sb t6, 1(t9) |
+ sll t0, t0, 15 |
+ lw t9, 4(a2) |
+ addu t1, t0, t4 |
+ subu t6, t0, t4 |
+ addu t9, t9, a3 |
+ shra_r.w t1, t1, 20 |
+ shra_r.w t6, t6, 20 |
+ shll_s.w t1, t1, 24 |
+ shll_s.w t6, t6, 24 |
+ sra t1, t1, 24 |
+ sra t6, t6, 24 |
+ addiu t1, t1, 128 |
+ addiu t6, t6, 128 |
+ sb t1, 0(t9) |
+ sb t6, 1(t9) |
+ addiu sp, sp, 40 |
+ |
+ RESTORE_REGS_FROM_STACK 24, s0, s1, s2, s3, s4, s5 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_idct_2x2_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_4x4_mips_dspr2) |
+/* |
+ * a0 - compptr->dct_table |
+ * a1 - coef_block |
+ * a2 - output_buf |
+ * a3 - output_col |
+ * 16(sp) - workspace[DCTSIZE*4]; // buffers data between passes |
+ */ |
+ |
+ .set at |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ lw v1, 48(sp) |
+ move t0, a1 |
+ move t1, v1 |
+ li t9, 4 |
+ li s0, 0x2e75f93e |
+ li s1, 0x21f9ba79 |
+ li s2, 0xecc2efb0 |
+ li s3, 0x52031ccd |
+ |
+0: |
+ lh s6, 32(t0) // inptr[DCTSIZE*2] |
+ lh t6, 32(a0) // quantptr[DCTSIZE*2] |
+ lh s7, 96(t0) // inptr[DCTSIZE*6] |
+ lh t7, 96(a0) // quantptr[DCTSIZE*6] |
+ mul t6, s6, t6 // z2 = (inptr[DCTSIZE*2] * quantptr[DCTSIZE*2]) |
+ lh s4, 0(t0) // inptr[DCTSIZE*0] |
+ mul t7, s7, t7 // z3 = (inptr[DCTSIZE*6] * quantptr[DCTSIZE*6]) |
+ lh s5, 0(a0) // quantptr[0] |
+ li s6, 15137 |
+ li s7, 6270 |
+ mul t2, s4, s5 // tmp0 = (inptr[0] * quantptr[0]) |
+ mul t6, s6, t6 // z2 = (inptr[DCTSIZE*2] * quantptr[DCTSIZE*2]) |
+ lh t5, 112(t0) // inptr[DCTSIZE*7] |
+ mul t7, s7, t7 // z3 = (inptr[DCTSIZE*6] * quantptr[DCTSIZE*6]) |
+ lh s4, 112(a0) // quantptr[DCTSIZE*7] |
+ lh v0, 80(t0) // inptr[DCTSIZE*5] |
+ lh s5, 80(a0) // quantptr[DCTSIZE*5] |
+ lh s6, 48(a0) // quantptr[DCTSIZE*3] |
+ sll t2, t2, 14 // tmp0 <<= (CONST_BITS+1) |
+ lh s7, 16(a0) // quantptr[DCTSIZE*1] |
+ lh t8, 16(t0) // inptr[DCTSIZE*1] |
+ subu t6, t6, t7 // tmp2 = MULTIPLY(z2, t5) - MULTIPLY(z3, t6) |
+ lh t7, 48(t0) // inptr[DCTSIZE*3] |
+ mul t5, s4, t5 // z1 = (inptr[DCTSIZE*7] * quantptr[DCTSIZE*7]) |
+ mul v0, s5, v0 // z2 = (inptr[DCTSIZE*5] * quantptr[DCTSIZE*5]) |
+ mul t7, s6, t7 // z3 = (inptr[DCTSIZE*3] * quantptr[DCTSIZE*3]) |
+ mul t8, s7, t8 // z4 = (inptr[DCTSIZE*1] * quantptr[DCTSIZE*1]) |
+ addu t3, t2, t6 // tmp10 = tmp0 + z2 |
+ subu t4, t2, t6 // tmp10 = tmp0 - z2 |
+ mult $ac0, zero, zero |
+ mult $ac1, zero, zero |
+ ins t5, v0, 16, 16 |
+ ins t7, t8, 16, 16 |
+ addiu t9, t9, -1 |
+ dpa.w.ph $ac0, t5, s0 |
+ dpa.w.ph $ac0, t7, s1 |
+ dpa.w.ph $ac1, t5, s2 |
+ dpa.w.ph $ac1, t7, s3 |
+ mflo s4, $ac0 |
+ mflo s5, $ac1 |
+ addiu a0, a0, 2 |
+ addiu t1, t1, 4 |
+ addiu t0, t0, 2 |
+ addu t6, t4, s4 |
+ subu t5, t4, s4 |
+ addu s6, t3, s5 |
+ subu s7, t3, s5 |
+ shra_r.w t6, t6, 12 // DESCALE(tmp12 + temp1, 12) |
+ shra_r.w t5, t5, 12 // DESCALE(tmp12 - temp1, 12) |
+ shra_r.w s6, s6, 12 // DESCALE(tmp10 + temp2, 12) |
+ shra_r.w s7, s7, 12 // DESCALE(tmp10 - temp2, 12) |
+ sw t6, 28(t1) |
+ sw t5, 60(t1) |
+ sw s6, -4(t1) |
+ bgtz t9, 0b |
+ sw s7, 92(t1) |
+ // second loop three pass |
+ li t9, 3 |
+1: |
+ lh s6, 34(t0) // inptr[DCTSIZE*2] |
+ lh t6, 34(a0) // quantptr[DCTSIZE*2] |
+ lh s7, 98(t0) // inptr[DCTSIZE*6] |
+ lh t7, 98(a0) // quantptr[DCTSIZE*6] |
+ mul t6, s6, t6 // z2 = (inptr[DCTSIZE*2] * quantptr[DCTSIZE*2]) |
+ lh s4, 2(t0) // inptr[DCTSIZE*0] |
+ mul t7, s7, t7 // z3 = (inptr[DCTSIZE*6] * quantptr[DCTSIZE*6]) |
+ lh s5, 2(a0) // quantptr[DCTSIZE*0] |
+ li s6, 15137 |
+ li s7, 6270 |
+ mul t2, s4, s5 // tmp0 = (inptr[0] * quantptr[0]) |
+ mul v0, s6, t6 // z2 = (inptr[DCTSIZE*2] * quantptr[DCTSIZE*2]) |
+ lh t5, 114(t0) // inptr[DCTSIZE*7] |
+ mul t7, s7, t7 // z3 = (inptr[DCTSIZE*6] * quantptr[DCTSIZE*6]) |
+ lh s4, 114(a0) // quantptr[DCTSIZE*7] |
+ lh s5, 82(a0) // quantptr[DCTSIZE*5] |
+ lh t6, 82(t0) // inptr[DCTSIZE*5] |
+ sll t2, t2, 14 // tmp0 <<= (CONST_BITS+1) |
+ lh s6, 50(a0) // quantptr[DCTSIZE*3] |
+ lh t8, 18(t0) // inptr[DCTSIZE*1] |
+ subu v0, v0, t7 // tmp2 = MULTIPLY(z2, t5) - MULTIPLY(z3, t6) |
+ lh t7, 50(t0) // inptr[DCTSIZE*3] |
+ lh s7, 18(a0) // quantptr[DCTSIZE*1] |
+ mul t5, s4, t5 // z1 = (inptr[DCTSIZE*7] * quantptr[DCTSIZE*7]) |
+ mul t6, s5, t6 // z2 = (inptr[DCTSIZE*5] * quantptr[DCTSIZE*5]) |
+ mul t7, s6, t7 // z3 = (inptr[DCTSIZE*3] * quantptr[DCTSIZE*3]) |
+ mul t8, s7, t8 // z4 = (inptr[DCTSIZE*1] * quantptr[DCTSIZE*1]) |
+ addu t3, t2, v0 // tmp10 = tmp0 + z2 |
+ subu t4, t2, v0 // tmp10 = tmp0 - z2 |
+ mult $ac0, zero, zero |
+ mult $ac1, zero, zero |
+ ins t5, t6, 16, 16 |
+ ins t7, t8, 16, 16 |
+ dpa.w.ph $ac0, t5, s0 |
+ dpa.w.ph $ac0, t7, s1 |
+ dpa.w.ph $ac1, t5, s2 |
+ dpa.w.ph $ac1, t7, s3 |
+ mflo t5, $ac0 |
+ mflo t6, $ac1 |
+ addiu t9, t9, -1 |
+ addiu t0, t0, 2 |
+ addiu a0, a0, 2 |
+ addiu t1, t1, 4 |
+ addu s5, t4, t5 |
+ subu s4, t4, t5 |
+ addu s6, t3, t6 |
+ subu s7, t3, t6 |
+ shra_r.w s5, s5, 12 // DESCALE(tmp12 + temp1, 12) |
+ shra_r.w s4, s4, 12 // DESCALE(tmp12 - temp1, 12) |
+ shra_r.w s6, s6, 12 // DESCALE(tmp10 + temp2, 12) |
+ shra_r.w s7, s7, 12 // DESCALE(tmp10 - temp2, 12) |
+ sw s5, 32(t1) |
+ sw s4, 64(t1) |
+ sw s6, 0(t1) |
+ bgtz t9, 1b |
+ sw s7, 96(t1) |
+ move t1, v1 |
+ li s4, 15137 |
+ lw s6, 8(t1) // wsptr[2] |
+ li s5, 6270 |
+ lw s7, 24(t1) // wsptr[6] |
+ mul s4, s4, s6 // MULTIPLY((JLONG) wsptr[2], FIX_1_847759065) |
+ lw t2, 0(t1) // wsptr[0] |
+ mul s5, s5, s7 // MULTIPLY((JLONG) wsptr[6], - FIX_0_765366865) |
+ lh t5, 28(t1) // wsptr[7] |
+ lh t6, 20(t1) // wsptr[5] |
+ lh t7, 12(t1) // wsptr[3] |
+ lh t8, 4(t1) // wsptr[1] |
+ ins t5, t6, 16, 16 |
+ ins t7, t8, 16, 16 |
+ mult $ac0, zero, zero |
+ dpa.w.ph $ac0, t5, s0 |
+ dpa.w.ph $ac0, t7, s1 |
+ mult $ac1, zero, zero |
+ dpa.w.ph $ac1, t5, s2 |
+ dpa.w.ph $ac1, t7, s3 |
+ sll t2, t2, 14 // tmp0 = ((JLONG) wsptr[0]) << (CONST_BITS+1) |
+ mflo s6, $ac0 |
+ // MULTIPLY(wsptr[2], FIX_1_847759065 + MULTIPLY(wsptr[6], -FIX_0_765366865) |
+ subu s4, s4, s5 |
+ addu t3, t2, s4 // tmp10 = tmp0 + z2 |
+ mflo s7, $ac1 |
+ subu t4, t2, s4 // tmp10 = tmp0 - z2 |
+ addu t7, t4, s6 |
+ subu t8, t4, s6 |
+ addu t5, t3, s7 |
+ subu t6, t3, s7 |
+ shra_r.w t5, t5, 19 // DESCALE(tmp10 + temp2, 19) |
+ shra_r.w t6, t6, 19 // DESCALE(tmp10 - temp2, 19) |
+ shra_r.w t7, t7, 19 // DESCALE(tmp12 + temp1, 19) |
+ shra_r.w t8, t8, 19 // DESCALE(tmp12 - temp1, 19) |
+ sll s4, t9, 2 |
+ lw v0, 0(a2) // output_buf[ctr] |
+ shll_s.w t5, t5, 24 |
+ shll_s.w t6, t6, 24 |
+ shll_s.w t7, t7, 24 |
+ shll_s.w t8, t8, 24 |
+ sra t5, t5, 24 |
+ sra t6, t6, 24 |
+ sra t7, t7, 24 |
+ sra t8, t8, 24 |
+ addu v0, v0, a3 // outptr = output_buf[ctr] + output_col |
+ addiu t5, t5, 128 |
+ addiu t6, t6, 128 |
+ addiu t7, t7, 128 |
+ addiu t8, t8, 128 |
+ sb t5, 0(v0) |
+ sb t7, 1(v0) |
+ sb t8, 2(v0) |
+ sb t6, 3(v0) |
+ // 2 |
+ li s4, 15137 |
+ lw s6, 40(t1) // wsptr[2] |
+ li s5, 6270 |
+ lw s7, 56(t1) // wsptr[6] |
+ mul s4, s4, s6 // MULTIPLY((JLONG) wsptr[2], FIX_1_847759065) |
+ lw t2, 32(t1) // wsptr[0] |
+ mul s5, s5, s7 // MULTIPLY((JLONG) wsptr[6], - FIX_0_765366865) |
+ lh t5, 60(t1) // wsptr[7] |
+ lh t6, 52(t1) // wsptr[5] |
+ lh t7, 44(t1) // wsptr[3] |
+ lh t8, 36(t1) // wsptr[1] |
+ ins t5, t6, 16, 16 |
+ ins t7, t8, 16, 16 |
+ mult $ac0, zero, zero |
+ dpa.w.ph $ac0, t5, s0 |
+ dpa.w.ph $ac0, t7, s1 |
+ mult $ac1, zero, zero |
+ dpa.w.ph $ac1, t5, s2 |
+ dpa.w.ph $ac1, t7, s3 |
+ sll t2, t2, 14 // tmp0 = ((JLONG) wsptr[0]) << (CONST_BITS+1) |
+ mflo s6, $ac0 |
+ // MULTIPLY(wsptr[2], FIX_1_847759065 + MULTIPLY(wsptr[6], -FIX_0_765366865) |
+ subu s4, s4, s5 |
+ addu t3, t2, s4 // tmp10 = tmp0 + z2 |
+ mflo s7, $ac1 |
+ subu t4, t2, s4 // tmp10 = tmp0 - z2 |
+ addu t7, t4, s6 |
+ subu t8, t4, s6 |
+ addu t5, t3, s7 |
+ subu t6, t3, s7 |
+ shra_r.w t5, t5, 19 // DESCALE(tmp10 + temp2, CONST_BITS-PASS1_BITS+1) |
+ shra_r.w t6, t6, 19 // DESCALE(tmp10 - temp2, CONST_BITS-PASS1_BITS+1) |
+ shra_r.w t7, t7, 19 // DESCALE(tmp12 + temp1, CONST_BITS-PASS1_BITS+1) |
+ shra_r.w t8, t8, 19 // DESCALE(tmp12 - temp1, CONST_BITS-PASS1_BITS+1) |
+ sll s4, t9, 2 |
+ lw v0, 4(a2) // output_buf[ctr] |
+ shll_s.w t5, t5, 24 |
+ shll_s.w t6, t6, 24 |
+ shll_s.w t7, t7, 24 |
+ shll_s.w t8, t8, 24 |
+ sra t5, t5, 24 |
+ sra t6, t6, 24 |
+ sra t7, t7, 24 |
+ sra t8, t8, 24 |
+ addu v0, v0, a3 // outptr = output_buf[ctr] + output_col |
+ addiu t5, t5, 128 |
+ addiu t6, t6, 128 |
+ addiu t7, t7, 128 |
+ addiu t8, t8, 128 |
+ sb t5, 0(v0) |
+ sb t7, 1(v0) |
+ sb t8, 2(v0) |
+ sb t6, 3(v0) |
+ // 3 |
+ li s4, 15137 |
+ lw s6, 72(t1) // wsptr[2] |
+ li s5, 6270 |
+ lw s7, 88(t1) // wsptr[6] |
+ mul s4, s4, s6 // MULTIPLY((JLONG) wsptr[2], FIX_1_847759065) |
+ lw t2, 64(t1) // wsptr[0] |
+ mul s5, s5, s7 // MULTIPLY((JLONG) wsptr[6], - FIX_0_765366865) |
+ lh t5, 92(t1) // wsptr[7] |
+ lh t6, 84(t1) // wsptr[5] |
+ lh t7, 76(t1) // wsptr[3] |
+ lh t8, 68(t1) // wsptr[1] |
+ ins t5, t6, 16, 16 |
+ ins t7, t8, 16, 16 |
+ mult $ac0, zero, zero |
+ dpa.w.ph $ac0, t5, s0 |
+ dpa.w.ph $ac0, t7, s1 |
+ mult $ac1, zero, zero |
+ dpa.w.ph $ac1, t5, s2 |
+ dpa.w.ph $ac1, t7, s3 |
+ sll t2, t2, 14 // tmp0 = ((JLONG) wsptr[0]) << (CONST_BITS+1) |
+ mflo s6, $ac0 |
+ // MULTIPLY(wsptr[2], FIX_1_847759065 + MULTIPLY(wsptr[6], -FIX_0_765366865) |
+ subu s4, s4, s5 |
+ addu t3, t2, s4 // tmp10 = tmp0 + z2 |
+ mflo s7, $ac1 |
+ subu t4, t2, s4 // tmp10 = tmp0 - z2 |
+ addu t7, t4, s6 |
+ subu t8, t4, s6 |
+ addu t5, t3, s7 |
+ subu t6, t3, s7 |
+ shra_r.w t5, t5, 19 // DESCALE(tmp10 + temp2, 19) |
+ shra_r.w t6, t6, 19 // DESCALE(tmp10 - temp2, 19) |
+ shra_r.w t7, t7, 19 // DESCALE(tmp12 + temp1, 19) |
+ shra_r.w t8, t8, 19 // DESCALE(tmp12 - temp1, 19) |
+ sll s4, t9, 2 |
+ lw v0, 8(a2) // output_buf[ctr] |
+ shll_s.w t5, t5, 24 |
+ shll_s.w t6, t6, 24 |
+ shll_s.w t7, t7, 24 |
+ shll_s.w t8, t8, 24 |
+ sra t5, t5, 24 |
+ sra t6, t6, 24 |
+ sra t7, t7, 24 |
+ sra t8, t8, 24 |
+ addu v0, v0, a3 // outptr = output_buf[ctr] + output_col |
+ addiu t5, t5, 128 |
+ addiu t6, t6, 128 |
+ addiu t7, t7, 128 |
+ addiu t8, t8, 128 |
+ sb t5, 0(v0) |
+ sb t7, 1(v0) |
+ sb t8, 2(v0) |
+ sb t6, 3(v0) |
+ li s4, 15137 |
+ lw s6, 104(t1) // wsptr[2] |
+ li s5, 6270 |
+ lw s7, 120(t1) // wsptr[6] |
+ mul s4, s4, s6 // MULTIPLY((JLONG) wsptr[2], FIX_1_847759065) |
+ lw t2, 96(t1) // wsptr[0] |
+ mul s5, s5, s7 // MULTIPLY((JLONG) wsptr[6], -FIX_0_765366865) |
+ lh t5, 124(t1) // wsptr[7] |
+ lh t6, 116(t1) // wsptr[5] |
+ lh t7, 108(t1) // wsptr[3] |
+ lh t8, 100(t1) // wsptr[1] |
+ ins t5, t6, 16, 16 |
+ ins t7, t8, 16, 16 |
+ mult $ac0, zero, zero |
+ dpa.w.ph $ac0, t5, s0 |
+ dpa.w.ph $ac0, t7, s1 |
+ mult $ac1, zero, zero |
+ dpa.w.ph $ac1, t5, s2 |
+ dpa.w.ph $ac1, t7, s3 |
+ sll t2, t2, 14 // tmp0 = ((JLONG) wsptr[0]) << (CONST_BITS+1) |
+ mflo s6, $ac0 |
+ // MULTIPLY(wsptr[2], FIX_1_847759065 + MULTIPLY(wsptr[6], -FIX_0_765366865) |
+ subu s4, s4, s5 |
+ addu t3, t2, s4 // tmp10 = tmp0 + z2; |
+ mflo s7, $ac1 |
+ subu t4, t2, s4 // tmp10 = tmp0 - z2; |
+ addu t7, t4, s6 |
+ subu t8, t4, s6 |
+ addu t5, t3, s7 |
+ subu t6, t3, s7 |
+ shra_r.w t5, t5, 19 // DESCALE(tmp10 + temp2, 19) |
+ shra_r.w t6, t6, 19 // DESCALE(tmp10 - temp2, 19) |
+ shra_r.w t7, t7, 19 // DESCALE(tmp12 + temp1, 19) |
+ shra_r.w t8, t8, 19 // DESCALE(tmp12 - temp1, 19) |
+ sll s4, t9, 2 |
+ lw v0, 12(a2) // output_buf[ctr] |
+ shll_s.w t5, t5, 24 |
+ shll_s.w t6, t6, 24 |
+ shll_s.w t7, t7, 24 |
+ shll_s.w t8, t8, 24 |
+ sra t5, t5, 24 |
+ sra t6, t6, 24 |
+ sra t7, t7, 24 |
+ sra t8, t8, 24 |
+ addu v0, v0, a3 // outptr = output_buf[ctr] + output_col |
+ addiu t5, t5, 128 |
+ addiu t6, t6, 128 |
+ addiu t7, t7, 128 |
+ addiu t8, t8, 128 |
+ sb t5, 0(v0) |
+ sb t7, 1(v0) |
+ sb t8, 2(v0) |
+ sb t6, 3(v0) |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+END(jsimd_idct_4x4_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_6x6_mips_dspr2) |
+/* |
+ * a0 - compptr->dct_table |
+ * a1 - coef_block |
+ * a2 - output_buf |
+ * a3 - output_col |
+ */ |
+ .set at |
+ |
+ SAVE_REGS_ON_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ addiu sp, sp, -144 |
+ move v0, sp |
+ addiu v1, v0, 24 |
+ addiu t9, zero, 5793 |
+ addiu s0, zero, 10033 |
+ addiu s1, zero, 2998 |
+ |
+1: |
+ lh s2, 0(a0) // q0 = quantptr[ 0] |
+ lh s3, 32(a0) // q1 = quantptr[16] |
+ lh s4, 64(a0) // q2 = quantptr[32] |
+ lh t2, 64(a1) // tmp2 = inptr[32] |
+ lh t1, 32(a1) // tmp1 = inptr[16] |
+ lh t0, 0(a1) // tmp0 = inptr[ 0] |
+ mul t2, t2, s4 // tmp2 = tmp2 * q2 |
+ mul t1, t1, s3 // tmp1 = tmp1 * q1 |
+ mul t0, t0, s2 // tmp0 = tmp0 * q0 |
+ lh t6, 16(a1) // z1 = inptr[ 8] |
+ lh t8, 80(a1) // z3 = inptr[40] |
+ lh t7, 48(a1) // z2 = inptr[24] |
+ lh s2, 16(a0) // q0 = quantptr[ 8] |
+ lh s4, 80(a0) // q2 = quantptr[40] |
+ lh s3, 48(a0) // q1 = quantptr[24] |
+ mul t2, t2, t9 // tmp2 = tmp2 * 5793 |
+ mul t1, t1, s0 // tmp1 = tmp1 * 10033 |
+ sll t0, t0, 13 // tmp0 = tmp0 << 13 |
+ mul t6, t6, s2 // z1 = z1 * q0 |
+ mul t8, t8, s4 // z3 = z3 * q2 |
+ mul t7, t7, s3 // z2 = z2 * q1 |
+ addu t3, t0, t2 // tmp10 = tmp0 + tmp2 |
+ sll t2, t2, 1 // tmp2 = tmp2 << 2 |
+ subu t4, t0, t2 // tmp11 = tmp0 - tmp2; |
+ subu t5, t3, t1 // tmp12 = tmp10 - tmp1 |
+ addu t3, t3, t1 // tmp10 = tmp10 + tmp1 |
+ addu t1, t6, t8 // tmp1 = z1 + z3 |
+ mul t1, t1, s1 // tmp1 = tmp1 * 2998 |
+ shra_r.w t4, t4, 11 // tmp11 = (tmp11 + 1024) >> 11 |
+ subu t2, t6, t8 // tmp2 = z1 - z3 |
+ subu t2, t2, t7 // tmp2 = tmp2 - z2 |
+ sll t2, t2, 2 // tmp2 = tmp2 << 2 |
+ addu t0, t6, t7 // tmp0 = z1 + z2 |
+ sll t0, t0, 13 // tmp0 = tmp0 << 13 |
+ subu s2, t8, t7 // q0 = z3 - z2 |
+ sll s2, s2, 13 // q0 = q0 << 13 |
+ addu t0, t0, t1 // tmp0 = tmp0 + tmp1 |
+ addu t1, s2, t1 // tmp1 = q0 + tmp1 |
+ addu s2, t4, t2 // q0 = tmp11 + tmp2 |
+ subu s3, t4, t2 // q1 = tmp11 - tmp2 |
+ addu t6, t3, t0 // z1 = tmp10 + tmp0 |
+ subu t7, t3, t0 // z2 = tmp10 - tmp0 |
+ addu t4, t5, t1 // tmp11 = tmp12 + tmp1 |
+ subu t5, t5, t1 // tmp12 = tmp12 - tmp1 |
+ shra_r.w t6, t6, 11 // z1 = (z1 + 1024) >> 11 |
+ shra_r.w t7, t7, 11 // z2 = (z2 + 1024) >> 11 |
+ shra_r.w t4, t4, 11 // tmp11 = (tmp11 + 1024) >> 11 |
+ shra_r.w t5, t5, 11 // tmp12 = (tmp12 + 1024) >> 11 |
+ sw s2, 24(v0) |
+ sw s3, 96(v0) |
+ sw t6, 0(v0) |
+ sw t7, 120(v0) |
+ sw t4, 48(v0) |
+ sw t5, 72(v0) |
+ addiu v0, v0, 4 |
+ addiu a1, a1, 2 |
+ bne v0, v1, 1b |
+ addiu a0, a0, 2 |
+ |
+ /* Pass 2: process 6 rows from work array, store into output array. */ |
+ move v0, sp |
+ addiu v1, v0, 144 |
+ |
+2: |
+ lw t0, 0(v0) |
+ lw t2, 16(v0) |
+ lw s5, 0(a2) |
+ addiu t0, t0, 16 |
+ sll t0, t0, 13 |
+ mul t3, t2, t9 |
+ lw t6, 4(v0) |
+ lw t8, 20(v0) |
+ lw t7, 12(v0) |
+ addu s5, s5, a3 |
+ addu s6, t6, t8 |
+ mul s6, s6, s1 |
+ addu t1, t0, t3 |
+ subu t4, t0, t3 |
+ subu t4, t4, t3 |
+ lw t3, 8(v0) |
+ mul t0, t3, s0 |
+ addu s7, t6, t7 |
+ sll s7, s7, 13 |
+ addu s7, s6, s7 |
+ subu t2, t8, t7 |
+ sll t2, t2, 13 |
+ addu t2, s6, t2 |
+ subu s6, t6, t7 |
+ subu s6, s6, t8 |
+ sll s6, s6, 13 |
+ addu t3, t1, t0 |
+ subu t5, t1, t0 |
+ addu t6, t3, s7 |
+ subu t3, t3, s7 |
+ addu t7, t4, s6 |
+ subu t4, t4, s6 |
+ addu t8, t5, t2 |
+ subu t5, t5, t2 |
+ shll_s.w t6, t6, 6 |
+ shll_s.w t3, t3, 6 |
+ shll_s.w t7, t7, 6 |
+ shll_s.w t4, t4, 6 |
+ shll_s.w t8, t8, 6 |
+ shll_s.w t5, t5, 6 |
+ sra t6, t6, 24 |
+ addiu t6, t6, 128 |
+ sra t3, t3, 24 |
+ addiu t3, t3, 128 |
+ sb t6, 0(s5) |
+ sra t7, t7, 24 |
+ addiu t7, t7, 128 |
+ sb t3, 5(s5) |
+ sra t4, t4, 24 |
+ addiu t4, t4, 128 |
+ sb t7, 1(s5) |
+ sra t8, t8, 24 |
+ addiu t8, t8, 128 |
+ sb t4, 4(s5) |
+ addiu v0, v0, 24 |
+ sra t5, t5, 24 |
+ addiu t5, t5, 128 |
+ sb t8, 2(s5) |
+ addiu a2, a2, 4 |
+ bne v0, v1, 2b |
+ sb t5, 3(s5) |
+ |
+ addiu sp, sp, 144 |
+ |
+ RESTORE_REGS_FROM_STACK 32, s0, s1, s2, s3, s4, s5, s6, s7 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_idct_6x6_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_12x12_pass1_mips_dspr2) |
+/* |
+ * a0 - compptr->dct_table |
+ * a1 - coef_block |
+ * a2 - workspace |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 16, s0, s1, s2, s3 |
+ |
+ li a3, 8 |
+ |
+1: |
+ // odd part |
+ lh t0, 48(a1) |
+ lh t1, 48(a0) |
+ lh t2, 16(a1) |
+ lh t3, 16(a0) |
+ lh t4, 80(a1) |
+ lh t5, 80(a0) |
+ lh t6, 112(a1) |
+ lh t7, 112(a0) |
+ mul t0, t0, t1 // z2 |
+ mul t1, t2, t3 // z1 |
+ mul t2, t4, t5 // z3 |
+ mul t3, t6, t7 // z4 |
+ li t4, 10703 // FIX(1.306562965) |
+ li t5, 4433 // FIX_0_541196100 |
+ li t6, 7053 // FIX(0.860918669) |
+ mul t4, t0,t4 // tmp11 |
+ mul t5, t0,t5 // -tmp14 |
+ addu t7, t1,t2 // tmp10 |
+ addu t8, t7,t3 // tmp10 + z4 |
+ mul t6, t6, t8 // tmp15 |
+ li t8, 2139 // FIX(0.261052384) |
+ mul t8, t7, t8 // MULTIPLY(tmp10, FIX(0.261052384)) |
+ li t7, 2295 // FIX(0.280143716) |
+ mul t7, t1, t7 // MULTIPLY(z1, FIX(0.280143716)) |
+ addu t9, t2, t3 // z3 + z4 |
+ li s0, 8565 // FIX(1.045510580) |
+ mul t9, t9, s0 // -tmp13 |
+ li s0, 12112 // FIX(1.478575242) |
+ mul s0, t2, s0 // MULTIPLY(z3, FIX(1.478575242) |
+ li s1, 12998 // FIX(1.586706681) |
+ mul s1, t3, s1 // MULTIPLY(z4, FIX(1.586706681)) |
+ li s2, 5540 // FIX(0.676326758) |
+ mul s2, t1, s2 // MULTIPLY(z1, FIX(0.676326758)) |
+ li s3, 16244 // FIX(1.982889723) |
+ mul s3, t3, s3 // MULTIPLY(z4, FIX(1.982889723)) |
+ subu t1, t1, t3 // z1-=z4 |
+ subu t0, t0, t2 // z2-=z3 |
+ addu t2, t0, t1 // z1+z2 |
+ li t3, 4433 // FIX_0_541196100 |
+ mul t2, t2, t3 // z3 |
+ li t3, 6270 // FIX_0_765366865 |
+ mul t1, t1, t3 // MULTIPLY(z1, FIX_0_765366865) |
+ li t3, 15137 // FIX_0_765366865 |
+ mul t0, t0, t3 // MULTIPLY(z2, FIX_1_847759065) |
+ addu t8, t6, t8 // tmp12 |
+ addu t3, t8, t4 // tmp12 + tmp11 |
+ addu t3, t3, t7 // tmp10 |
+ subu t8, t8, t9 // tmp12 + tmp13 |
+ addu s0, t5, s0 |
+ subu t8, t8, s0 // tmp12 |
+ subu t9, t6, t9 |
+ subu s1, s1, t4 |
+ addu t9, t9, s1 // tmp13 |
+ subu t6, t6, t5 |
+ subu t6, t6, s2 |
+ subu t6, t6, s3 // tmp15 |
+ // even part start |
+ lh t4, 64(a1) |
+ lh t5, 64(a0) |
+ lh t7, 32(a1) |
+ lh s0, 32(a0) |
+ lh s1, 0(a1) |
+ lh s2, 0(a0) |
+ lh s3, 96(a1) |
+ lh v0, 96(a0) |
+ mul t4, t4, t5 // DEQUANTIZE(inptr[DCTSIZE*4],quantptr[DCTSIZE*4]) |
+ mul t5, t7, s0 // DEQUANTIZE(inptr[DCTSIZE*2],quantptr[DCTSIZE*2]) |
+ mul t7, s1, s2 // DEQUANTIZE(inptr[DCTSIZE*0],quantptr[DCTSIZE*0]) |
+ mul s0, s3, v0 // DEQUANTIZE(inptr[DCTSIZE*6],quantptr[DCTSIZE*6]) |
+ // odd part end |
+ addu t1, t2, t1 // tmp11 |
+ subu t0, t2, t0 // tmp14 |
+ // update counter and pointers |
+ addiu a3, a3, -1 |
+ addiu a0, a0, 2 |
+ addiu a1, a1, 2 |
+ // even part rest |
+ li s1, 10033 |
+ li s2, 11190 |
+ mul t4, t4, s1 // z4 |
+ mul s1, t5, s2 // z4 |
+ sll t5, t5, 13 // z1 |
+ sll t7, t7, 13 |
+ addiu t7, t7, 1024 // z3 |
+ sll s0, s0, 13 // z2 |
+ addu s2, t7, t4 // tmp10 |
+ subu t4, t7, t4 // tmp11 |
+ subu s3, t5, s0 // tmp12 |
+ addu t2, t7, s3 // tmp21 |
+ subu s3, t7, s3 // tmp24 |
+ addu t7, s1, s0 // tmp12 |
+ addu v0, s2, t7 // tmp20 |
+ subu s2, s2, t7 // tmp25 |
+ subu s1, s1, t5 // z4 - z1 |
+ subu s1, s1, s0 // tmp12 |
+ addu s0, t4, s1 // tmp22 |
+ subu t4, t4, s1 // tmp23 |
+ // final output stage |
+ addu t5, v0, t3 |
+ subu v0, v0, t3 |
+ addu t3, t2, t1 |
+ subu t2, t2, t1 |
+ addu t1, s0, t8 |
+ subu s0, s0, t8 |
+ addu t8, t4, t9 |
+ subu t4, t4, t9 |
+ addu t9, s3, t0 |
+ subu s3, s3, t0 |
+ addu t0, s2, t6 |
+ subu s2, s2, t6 |
+ sra t5, t5, 11 |
+ sra t3, t3, 11 |
+ sra t1, t1, 11 |
+ sra t8, t8, 11 |
+ sra t9, t9, 11 |
+ sra t0, t0, 11 |
+ sra s2, s2, 11 |
+ sra s3, s3, 11 |
+ sra t4, t4, 11 |
+ sra s0, s0, 11 |
+ sra t2, t2, 11 |
+ sra v0, v0, 11 |
+ sw t5, 0(a2) |
+ sw t3, 32(a2) |
+ sw t1, 64(a2) |
+ sw t8, 96(a2) |
+ sw t9, 128(a2) |
+ sw t0, 160(a2) |
+ sw s2, 192(a2) |
+ sw s3, 224(a2) |
+ sw t4, 256(a2) |
+ sw s0, 288(a2) |
+ sw t2, 320(a2) |
+ sw v0, 352(a2) |
+ bgtz a3, 1b |
+ addiu a2, a2, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 16, s0, s1, s2, s3 |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_idct_12x12_pass1_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_idct_12x12_pass2_mips_dspr2) |
+/* |
+ * a0 - workspace |
+ * a1 - output |
+ */ |
+ |
+ SAVE_REGS_ON_STACK 16, s0, s1, s2, s3 |
+ |
+ li a3, 12 |
+ |
+1: |
+ // Odd part |
+ lw t0, 12(a0) |
+ lw t1, 4(a0) |
+ lw t2, 20(a0) |
+ lw t3, 28(a0) |
+ li t4, 10703 // FIX(1.306562965) |
+ li t5, 4433 // FIX_0_541196100 |
+ mul t4, t0, t4 // tmp11 |
+ mul t5, t0, t5 // -tmp14 |
+ addu t6, t1, t2 // tmp10 |
+ li t7, 2139 // FIX(0.261052384) |
+ mul t7, t6, t7 // MULTIPLY(tmp10, FIX(0.261052384)) |
+ addu t6, t6, t3 // tmp10 + z4 |
+ li t8, 7053 // FIX(0.860918669) |
+ mul t6, t6, t8 // tmp15 |
+ li t8, 2295 // FIX(0.280143716) |
+ mul t8, t1, t8 // MULTIPLY(z1, FIX(0.280143716)) |
+ addu t9, t2, t3 // z3 + z4 |
+ li s0, 8565 // FIX(1.045510580) |
+ mul t9, t9, s0 // -tmp13 |
+ li s0, 12112 // FIX(1.478575242) |
+ mul s0, t2, s0 // MULTIPLY(z3, FIX(1.478575242)) |
+ li s1, 12998 // FIX(1.586706681) |
+ mul s1, t3, s1 // MULTIPLY(z4, FIX(1.586706681)) |
+ li s2, 5540 // FIX(0.676326758) |
+ mul s2, t1, s2 // MULTIPLY(z1, FIX(0.676326758)) |
+ li s3, 16244 // FIX(1.982889723) |
+ mul s3, t3, s3 // MULTIPLY(z4, FIX(1.982889723)) |
+ subu t1, t1, t3 // z1 -= z4 |
+ subu t0, t0, t2 // z2 -= z3 |
+ addu t2, t1, t0 // z1 + z2 |
+ li t3, 4433 // FIX_0_541196100 |
+ mul t2, t2, t3 // z3 |
+ li t3, 6270 // FIX_0_765366865 |
+ mul t1, t1, t3 // MULTIPLY(z1, FIX_0_765366865) |
+ li t3, 15137 // FIX_1_847759065 |
+ mul t0, t0, t3 // MULTIPLY(z2, FIX_1_847759065) |
+ addu t3, t6, t7 // tmp12 |
+ addu t7, t3, t4 |
+ addu t7, t7, t8 // tmp10 |
+ subu t3, t3, t9 |
+ subu t3, t3, t5 |
+ subu t3, t3, s0 // tmp12 |
+ subu t9, t6, t9 |
+ subu t9, t9, t4 |
+ addu t9, t9, s1 // tmp13 |
+ subu t6, t6, t5 |
+ subu t6, t6, s2 |
+ subu t6, t6, s3 // tmp15 |
+ addu t1, t2, t1 // tmp11 |
+ subu t0, t2, t0 // tmp14 |
+ // even part |
+ lw t2, 16(a0) // z4 |
+ lw t4, 8(a0) // z1 |
+ lw t5, 0(a0) // z3 |
+ lw t8, 24(a0) // z2 |
+ li s0, 10033 // FIX(1.224744871) |
+ li s1, 11190 // FIX(1.366025404) |
+ mul t2, t2, s0 // z4 |
+ mul s0, t4, s1 // z4 |
+ addiu t5, t5, 0x10 |
+ sll t5, t5, 13 // z3 |
+ sll t4, t4, 13 // z1 |
+ sll t8, t8, 13 // z2 |
+ subu s1, t4, t8 // tmp12 |
+ addu s2, t5, t2 // tmp10 |
+ subu t2, t5, t2 // tmp11 |
+ addu s3, t5, s1 // tmp21 |
+ subu s1, t5, s1 // tmp24 |
+ addu t5, s0, t8 // tmp12 |
+ addu v0, s2, t5 // tmp20 |
+ subu t5, s2, t5 // tmp25 |
+ subu t4, s0, t4 |
+ subu t4, t4, t8 // tmp12 |
+ addu t8, t2, t4 // tmp22 |
+ subu t2, t2, t4 // tmp23 |
+ // increment counter and pointers |
+ addiu a3, a3, -1 |
+ addiu a0, a0, 32 |
+ // Final stage |
+ addu t4, v0, t7 |
+ subu v0, v0, t7 |
+ addu t7, s3, t1 |
+ subu s3, s3, t1 |
+ addu t1, t8, t3 |
+ subu t8, t8, t3 |
+ addu t3, t2, t9 |
+ subu t2, t2, t9 |
+ addu t9, s1, t0 |
+ subu s1, s1, t0 |
+ addu t0, t5, t6 |
+ subu t5, t5, t6 |
+ sll t4, t4, 4 |
+ sll t7, t7, 4 |
+ sll t1, t1, 4 |
+ sll t3, t3, 4 |
+ sll t9, t9, 4 |
+ sll t0, t0, 4 |
+ sll t5, t5, 4 |
+ sll s1, s1, 4 |
+ sll t2, t2, 4 |
+ sll t8, t8, 4 |
+ sll s3, s3, 4 |
+ sll v0, v0, 4 |
+ shll_s.w t4, t4, 2 |
+ shll_s.w t7, t7, 2 |
+ shll_s.w t1, t1, 2 |
+ shll_s.w t3, t3, 2 |
+ shll_s.w t9, t9, 2 |
+ shll_s.w t0, t0, 2 |
+ shll_s.w t5, t5, 2 |
+ shll_s.w s1, s1, 2 |
+ shll_s.w t2, t2, 2 |
+ shll_s.w t8, t8, 2 |
+ shll_s.w s3, s3, 2 |
+ shll_s.w v0, v0, 2 |
+ srl t4, t4, 24 |
+ srl t7, t7, 24 |
+ srl t1, t1, 24 |
+ srl t3, t3, 24 |
+ srl t9, t9, 24 |
+ srl t0, t0, 24 |
+ srl t5, t5, 24 |
+ srl s1, s1, 24 |
+ srl t2, t2, 24 |
+ srl t8, t8, 24 |
+ srl s3, s3, 24 |
+ srl v0, v0, 24 |
+ lw t6, 0(a1) |
+ addiu t4, t4, 0x80 |
+ addiu t7, t7, 0x80 |
+ addiu t1, t1, 0x80 |
+ addiu t3, t3, 0x80 |
+ addiu t9, t9, 0x80 |
+ addiu t0, t0, 0x80 |
+ addiu t5, t5, 0x80 |
+ addiu s1, s1, 0x80 |
+ addiu t2, t2, 0x80 |
+ addiu t8, t8, 0x80 |
+ addiu s3, s3, 0x80 |
+ addiu v0, v0, 0x80 |
+ sb t4, 0(t6) |
+ sb t7, 1(t6) |
+ sb t1, 2(t6) |
+ sb t3, 3(t6) |
+ sb t9, 4(t6) |
+ sb t0, 5(t6) |
+ sb t5, 6(t6) |
+ sb s1, 7(t6) |
+ sb t2, 8(t6) |
+ sb t8, 9(t6) |
+ sb s3, 10(t6) |
+ sb v0, 11(t6) |
+ bgtz a3, 1b |
+ addiu a1, a1, 4 |
+ |
+ RESTORE_REGS_FROM_STACK 16, s0, s1, s2, s3 |
+ |
+ jr ra |
+ nop |
+ |
+END(jsimd_idct_12x12_pass2_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_convsamp_mips_dspr2) |
+/* |
+ * a0 - sample_data |
+ * a1 - start_col |
+ * a2 - workspace |
+ */ |
+ |
+ lw t0, 0(a0) |
+ li t7, 0xff80ff80 |
+ addu t0, t0, a1 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ lw t0, 4(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 0(a2) |
+ usw t4, 4(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 8(a2) |
+ usw t6, 12(a2) |
+ |
+ lw t0, 8(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 16(a2) |
+ usw t4, 20(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 24(a2) |
+ usw t6, 28(a2) |
+ |
+ lw t0, 12(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 32(a2) |
+ usw t4, 36(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 40(a2) |
+ usw t6, 44(a2) |
+ |
+ lw t0, 16(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 48(a2) |
+ usw t4, 52(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 56(a2) |
+ usw t6, 60(a2) |
+ |
+ lw t0, 20(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 64(a2) |
+ usw t4, 68(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 72(a2) |
+ usw t6, 76(a2) |
+ |
+ lw t0, 24(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 80(a2) |
+ usw t4, 84(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 88(a2) |
+ usw t6, 92(a2) |
+ |
+ lw t0, 28(a0) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu t0, t0, a1 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ ulw t1, 0(t0) |
+ ulw t2, 4(t0) |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 96(a2) |
+ usw t4, 100(a2) |
+ preceu.ph.qbr t3, t1 |
+ preceu.ph.qbl t4, t1 |
+ usw t5, 104(a2) |
+ usw t6, 108(a2) |
+ preceu.ph.qbr t5, t2 |
+ preceu.ph.qbl t6, t2 |
+ addu.ph t3, t3, t7 |
+ addu.ph t4, t4, t7 |
+ addu.ph t5, t5, t7 |
+ addu.ph t6, t6, t7 |
+ usw t3, 112(a2) |
+ usw t4, 116(a2) |
+ usw t5, 120(a2) |
+ usw t6, 124(a2) |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_convsamp_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+LEAF_MIPS_DSPR2(jsimd_convsamp_float_mips_dspr2) |
+/* |
+ * a0 - sample_data |
+ * a1 - start_col |
+ * a2 - workspace |
+ */ |
+ |
+ .set at |
+ |
+ lw t0, 0(a0) |
+ addu t0, t0, a1 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 4(a0) |
+ swc1 f2, 0(a2) |
+ swc1 f4, 4(a2) |
+ swc1 f6, 8(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 12(a2) |
+ swc1 f10, 16(a2) |
+ swc1 f12, 20(a2) |
+ swc1 f14, 24(a2) |
+ swc1 f16, 28(a2) |
+ //elemr 1 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 8(a0) |
+ swc1 f2, 32(a2) |
+ swc1 f4, 36(a2) |
+ swc1 f6, 40(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 44(a2) |
+ swc1 f10, 48(a2) |
+ swc1 f12, 52(a2) |
+ swc1 f14, 56(a2) |
+ swc1 f16, 60(a2) |
+ //elemr 2 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 12(a0) |
+ swc1 f2, 64(a2) |
+ swc1 f4, 68(a2) |
+ swc1 f6, 72(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 76(a2) |
+ swc1 f10, 80(a2) |
+ swc1 f12, 84(a2) |
+ swc1 f14, 88(a2) |
+ swc1 f16, 92(a2) |
+ //elemr 3 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 16(a0) |
+ swc1 f2, 96(a2) |
+ swc1 f4, 100(a2) |
+ swc1 f6, 104(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 108(a2) |
+ swc1 f10, 112(a2) |
+ swc1 f12, 116(a2) |
+ swc1 f14, 120(a2) |
+ swc1 f16, 124(a2) |
+ //elemr 4 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 20(a0) |
+ swc1 f2, 128(a2) |
+ swc1 f4, 132(a2) |
+ swc1 f6, 136(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 140(a2) |
+ swc1 f10, 144(a2) |
+ swc1 f12, 148(a2) |
+ swc1 f14, 152(a2) |
+ swc1 f16, 156(a2) |
+ //elemr 5 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 24(a0) |
+ swc1 f2, 160(a2) |
+ swc1 f4, 164(a2) |
+ swc1 f6, 168(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 172(a2) |
+ swc1 f10, 176(a2) |
+ swc1 f12, 180(a2) |
+ swc1 f14, 184(a2) |
+ swc1 f16, 188(a2) |
+ //elemr 6 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ lw t0, 28(a0) |
+ swc1 f2, 192(a2) |
+ swc1 f4, 196(a2) |
+ swc1 f6, 200(a2) |
+ addu t0, t0, a1 |
+ swc1 f8, 204(a2) |
+ swc1 f10, 208(a2) |
+ swc1 f12, 212(a2) |
+ swc1 f14, 216(a2) |
+ swc1 f16, 220(a2) |
+ //elemr 7 |
+ lbu t1, 0(t0) |
+ lbu t2, 1(t0) |
+ lbu t3, 2(t0) |
+ lbu t4, 3(t0) |
+ lbu t5, 4(t0) |
+ lbu t6, 5(t0) |
+ lbu t7, 6(t0) |
+ lbu t8, 7(t0) |
+ addiu t1, t1, -128 |
+ addiu t2, t2, -128 |
+ addiu t3, t3, -128 |
+ addiu t4, t4, -128 |
+ addiu t5, t5, -128 |
+ addiu t6, t6, -128 |
+ addiu t7, t7, -128 |
+ addiu t8, t8, -128 |
+ mtc1 t1, f2 |
+ mtc1 t2, f4 |
+ mtc1 t3, f6 |
+ mtc1 t4, f8 |
+ mtc1 t5, f10 |
+ mtc1 t6, f12 |
+ mtc1 t7, f14 |
+ mtc1 t8, f16 |
+ cvt.s.w f2, f2 |
+ cvt.s.w f4, f4 |
+ cvt.s.w f6, f6 |
+ cvt.s.w f8, f8 |
+ cvt.s.w f10, f10 |
+ cvt.s.w f12, f12 |
+ cvt.s.w f14, f14 |
+ cvt.s.w f16, f16 |
+ swc1 f2, 224(a2) |
+ swc1 f4, 228(a2) |
+ swc1 f6, 232(a2) |
+ swc1 f8, 236(a2) |
+ swc1 f10, 240(a2) |
+ swc1 f12, 244(a2) |
+ swc1 f14, 248(a2) |
+ swc1 f16, 252(a2) |
+ |
+ j ra |
+ nop |
+ |
+END(jsimd_convsamp_float_mips_dspr2) |
+ |
+/*****************************************************************************/ |
+ |