Commit 5552052c authored by Laurent Aimar's avatar Laurent Aimar

* pixel.*:

"I have completed additonal SAD implementations (8x16, 16x8 and 16x16)
 using Sparc VIS.  Overall speedup is roughly 90% from straight C.  I'm
 doing development and testing on a Sun Fire V220, with 2 * 1.5ghz
 UltraSPARC-III CPUs.

 I've hand-unrolled each of the loops.  Sun's assembler does not appear
 to have macro functionality built-in and I didn't want to establish an
 external dependancy on m4.  Please let me know if you run into any
 trouble with the patch."

 Patch by Phil Jensen.


git-svn-id: svn://svn.videolan.org/x264/trunk@279 df754926-b1dd-0310-bc7b-ec298dee348c
parent d2715116
......@@ -438,7 +438,10 @@ void x264_pixel_init( int cpu, x264_pixel_function_t *pixf )
}
#endif
#ifdef ARCH_UltraSparc
pixf->sad[PIXEL_8x8] = x264_pixel_sad_8x8_vis;
pixf->sad[PIXEL_8x8] = x264_pixel_sad_8x8_vis;
pixf->sad[PIXEL_8x16] = x264_pixel_sad_8x16_vis;
pixf->sad[PIXEL_16x8] = x264_pixel_sad_16x8_vis;
pixf->sad[PIXEL_16x16] = x264_pixel_sad_16x16_vis;
#endif
}
......@@ -24,7 +24,6 @@
! VIS optimized SAD for UltraSPARC
.text
.align 4
.global x264_pixel_sad_8x8_vis
x264_pixel_sad_8x8_vis:
save %sp, -120, %sp
......@@ -148,3 +147,941 @@ x264_pixel_sad_8x8_vis:
ret
restore
.global x264_pixel_sad_8x16_vis
x264_pixel_sad_8x16_vis:
save %sp, -120, %sp
fzero %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
std %f12, [%fp-24]
ld [%fp-20], %i0
ret
restore
.global x264_pixel_sad_16x8_vis
x264_pixel_sad_16x8_vis:
save %sp, -120, %sp
fzero %f12 ! zero out the accumulator used for pdist
sub %i1, 8, %i1 ! reduce stride by 8, since we are moving forward 8 each block
sub %i3, 8, %i3 ! same here, reduce stride by 8
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
std %f12, [%fp-24]
ld [%fp-20], %i0
ret
restore
.global x264_pixel_sad_16x16_vis
x264_pixel_sad_16x16_vis:
save %sp, -120, %sp
fzero %f12 ! zero out the accumulator used for pdist
sub %i1, 8, %i1 ! reduce stride by 8, since we are moving forward 8 each block
sub %i3, 8, %i3 ! same here, reduce stride by 8
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, 8, %i0
add %i2, 8, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10
add %i0, %i1, %i0
add %i2, %i3, %i2
pdist %f4, %f10, %f12
alignaddr %i0, %g0, %l0
ldd [%l0], %f0
ldd [%l0+8], %f2
faligndata %f0, %f2, %f4
alignaddr %i2, %g0, %l2
ldd [%l2], %f6
ldd [%l2+8], %f8
faligndata %f6, %f8, %f10