SIMD support for performing downsampling using MIPS DSPr2 instructions
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@995 632fc199-4ca6-4c93-a231-07263d6284db
This commit is contained in:
@@ -465,6 +465,15 @@ EXTERN(void) jsimd_h2v1_downsample_sse2
|
|||||||
JDIMENSION v_samp_factor, JDIMENSION width_blocks,
|
JDIMENSION v_samp_factor, JDIMENSION width_blocks,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY output_data));
|
JSAMPARRAY input_data, JSAMPARRAY output_data));
|
||||||
|
|
||||||
|
EXTERN(void) jsimd_h2v2_downsample_mips_dspr2
|
||||||
|
JPP((JDIMENSION image_width, int max_v_samp_factor,
|
||||||
|
JDIMENSION v_samp_factor, JDIMENSION width_blocks,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY output_data));
|
||||||
|
EXTERN(void) jsimd_h2v1_downsample_mips_dspr2
|
||||||
|
JPP((JDIMENSION image_width, int max_v_samp_factor,
|
||||||
|
JDIMENSION v_samp_factor, JDIMENSION width_blocks,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY output_data));
|
||||||
|
|
||||||
/* SIMD Upsample */
|
/* SIMD Upsample */
|
||||||
EXTERN(void) jsimd_h2v2_upsample_mmx
|
EXTERN(void) jsimd_h2v2_upsample_mmx
|
||||||
JPP((int max_v_samp_factor, JDIMENSION output_width,
|
JPP((int max_v_samp_factor, JDIMENSION output_width,
|
||||||
|
|||||||
@@ -213,12 +213,32 @@ jsimd_ycc_rgb_convert (j_decompress_ptr cinfo,
|
|||||||
GLOBAL(int)
|
GLOBAL(int)
|
||||||
jsimd_can_h2v2_downsample (void)
|
jsimd_can_h2v2_downsample (void)
|
||||||
{
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (simd_support & JSIMD_MIPS_DSPR2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLOBAL(int)
|
GLOBAL(int)
|
||||||
jsimd_can_h2v1_downsample (void)
|
jsimd_can_h2v1_downsample (void)
|
||||||
{
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (simd_support & JSIMD_MIPS_DSPR2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,12 +246,20 @@ GLOBAL(void)
|
|||||||
jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
||||||
{
|
{
|
||||||
|
if (simd_support & JSIMD_MIPS_DSPR2)
|
||||||
|
jsimd_h2v2_downsample_mips_dspr2(cinfo->image_width,
|
||||||
|
cinfo->max_v_samp_factor, compptr->v_samp_factor,
|
||||||
|
compptr->width_in_blocks, input_data, output_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
||||||
{
|
{
|
||||||
|
if (simd_support & JSIMD_MIPS_DSPR2)
|
||||||
|
jsimd_h2v1_downsample_mips_dspr2(cinfo->image_width,
|
||||||
|
cinfo->max_v_samp_factor, compptr->v_samp_factor,
|
||||||
|
compptr->width_in_blocks, input_data, output_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLOBAL(int)
|
GLOBAL(int)
|
||||||
|
|||||||
@@ -487,3 +487,210 @@ LEAF_MIPS_DSPR2(jsimd_h2v1_fancy_upsample_mips_dspr2)
|
|||||||
END(jsimd_h2v1_fancy_upsample_mips_dspr2)
|
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)
|
||||||
|
/*****************************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user