test for vector shuffle

This commit is contained in:
John Cupitt 2017-10-02 09:22:06 +01:00
parent c01aa40ebe
commit 7b9c969e39
2 changed files with 29 additions and 9 deletions

View File

@ -257,9 +257,6 @@ AC_PROG_AWK
AC_PROG_CC AC_PROG_CC
AC_PROG_CC_STDC AC_PROG_CC_STDC
AC_PROG_CXX AC_PROG_CXX
AC_C_CONST
AC_C_RESTRICT
AX_GCC_VAR_ATTRIBUTE(vector_size)
AC_PROG_RANLIB AC_PROG_RANLIB
AC_PROG_INSTALL AC_PROG_INSTALL
AC_PROG_LN_S AC_PROG_LN_S
@ -338,11 +335,34 @@ AC_PROVIDE([AC_LIBTOOL_WIN32_DLL])
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
# Checks for typedefs, structures, and compiler characteristics. # Checks for typedefs, structures, and compiler characteristics.
AC_C_RESTRICT
AX_GCC_VAR_ATTRIBUTE(vector_size)
AC_C_CONST AC_C_CONST
AC_TYPE_MODE_T AC_TYPE_MODE_T
AC_TYPE_OFF_T AC_TYPE_OFF_T
AC_TYPE_SIZE_T AC_TYPE_SIZE_T
# we need to be able to shuffle vectors in C++
if test x$ax_cv_have_var_attribute_vector_size = x"yes"; then
AC_MSG_CHECKING([for vector shuffle])
AC_TRY_COMPILE([
typedef float v4f __attribute__((vector_size(4 * sizeof(float))));
],[
v4f f; f[3] = 99;
],[
AC_MSG_RESULT([yes])
have_vector_shuffle=yes
], [
AC_MSG_RESULT([no])
have_vector_shuffle=no
])
if test x$have_vector_shuffle = x"yes"; then
AC_DEFINE_UNQUOTED(HAVE_VECTOR_SHUFFLE, 1,
[define if your C++ can shuffle vectors])
fi
fi
# Checks for library functions. # Checks for library functions.
AC_FUNC_MEMCMP AC_FUNC_MEMCMP
AC_FUNC_MMAP AC_FUNC_MMAP

View File

@ -489,7 +489,7 @@ vips_composite_blend_mul( VipsBlendMode mode,
/* We have a vector path with gcc's vector attr. /* We have a vector path with gcc's vector attr.
*/ */
#ifdef HAVE_VAR_ATTRIBUTE_VECTOR_SIZE #ifdef HAVE_VECTOR_SHUFFLE
/* A vector of four floats. /* A vector of four floats.
*/ */
typedef float v4f __attribute__((vector_size(4 * sizeof(float)))); typedef float v4f __attribute__((vector_size(4 * sizeof(float))));
@ -677,7 +677,7 @@ vips_composite_blend_mul_3float( VipsBlendMode mode, v4f &B, float *A_memory )
B[3] = aR; B[3] = aR;
} }
#endif /*HAVE_VAR_ATTRIBUTE_VECTOR_SIZE*/ #endif /*HAVE_VECTOR_SHUFFLE*/
/* A is the new pixel coming in, B is the double pixel we are accumulating. /* A is the new pixel coming in, B is the double pixel we are accumulating.
*/ */
@ -720,7 +720,7 @@ static void vips_combine_pixels( VipsComposite *composite,
tq[bands] = B[bands]; tq[bands] = B[bands];
} }
#ifdef HAVE_VAR_ATTRIBUTE_VECTOR_SIZE #ifdef HAVE_VECTOR_SHUFFLE
static void static void
vips_combine_pixels_3float( VipsComposite *composite, vips_combine_pixels_3float( VipsComposite *composite,
VipsPel *q, VipsPel **p ) VipsPel *q, VipsPel **p )
@ -743,7 +743,7 @@ vips_combine_pixels_3float( VipsComposite *composite,
*((v4f *) tq) = R; *((v4f *) tq) = R;
tq[3] = B[3]; tq[3] = B[3];
} }
#endif /*HAVE_VAR_ATTRIBUTE_VECTOR_SIZE*/ #endif /*HAVE_VECTOR_SHUFFLE*/
static int static int
vips_composite_gen( VipsRegion *output_region, vips_composite_gen( VipsRegion *output_region,
@ -773,12 +773,12 @@ vips_composite_gen( VipsRegion *output_region,
for( x = 0; x < r->width; x++ ) { for( x = 0; x < r->width; x++ ) {
switch( input_regions[0]->im->BandFmt ) { switch( input_regions[0]->im->BandFmt ) {
case VIPS_FORMAT_FLOAT: case VIPS_FORMAT_FLOAT:
#ifdef HAVE_VAR_ATTRIBUTE_VECTOR_SIZE #ifdef HAVE_VECTOR_SHUFFLE
if( composite->bands == 3 ) if( composite->bands == 3 )
vips_combine_pixels_3float( composite, vips_combine_pixels_3float( composite,
q, p ); q, p );
else else
#endif /*HAVE_VAR_ATTRIBUTE_VECTOR_SIZE*/ #endif /*HAVE_VECTOR_SHUFFLE*/
vips_combine_pixels<float>( composite, vips_combine_pixels<float>( composite,
q, p ); q, p );
break; break;