diff --git a/configure.ac b/configure.ac index 2136dea3..007bf4f0 100644 --- a/configure.ac +++ b/configure.ac @@ -365,6 +365,29 @@ if test x$ax_cv_have_var_attribute_vector_size = x"yes"; then fi fi +# we also need to be able to mix vector and scalar arithmetic +if test x$have_vector_shuffle = x"yes"; then + AC_MSG_CHECKING([for C++ vector arithmetic]) + AC_LANG_PUSH([C++]) + AC_TRY_COMPILE([ + typedef float v4f __attribute__((vector_size(4 * sizeof(float)))); + ],[ + v4f f = {1, 2, 3, 4}; f *= 12.0; + ],[ + AC_MSG_RESULT([yes]) + have_vector_arith=yes + ], [ + AC_MSG_RESULT([no]) + have_vector_arith=no + ]) + AC_LANG_POP([C++]) + + if test x$have_vector_arith = x"yes"; then + AC_DEFINE_UNQUOTED(HAVE_VECTOR_ARITH, 1, + [define if your C++ can mix vector and scalar arithmetic]) + fi +fi + # Checks for library functions. AC_FUNC_MEMCMP AC_FUNC_MMAP diff --git a/libvips/conversion/composite.cpp b/libvips/conversion/composite.cpp index 4e9f6c00..22c11a87 100644 --- a/libvips/conversion/composite.cpp +++ b/libvips/conversion/composite.cpp @@ -489,7 +489,7 @@ vips_composite_blend_mul( VipsBlendMode mode, /* We have a vector path with gcc's vector attr. */ -#ifdef HAVE_VECTOR_SHUFFLE +#ifdef HAVE_VECTOR_ARITH /* A vector of four floats. */ 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; } -#endif /*HAVE_VECTOR_SHUFFLE*/ +#endif /*HAVE_VECTOR_ARITH*/ /* 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]; } -#ifdef HAVE_VECTOR_SHUFFLE +#ifdef HAVE_VECTOR_ARITH static void vips_combine_pixels_3float( VipsComposite *composite, VipsPel *q, VipsPel **p ) @@ -743,7 +743,7 @@ vips_combine_pixels_3float( VipsComposite *composite, *((v4f *) tq) = R; tq[3] = B[3]; } -#endif /*HAVE_VECTOR_SHUFFLE*/ +#endif /*HAVE_VECTOR_ARITH*/ static int vips_composite_gen( VipsRegion *output_region, @@ -773,12 +773,12 @@ vips_composite_gen( VipsRegion *output_region, for( x = 0; x < r->width; x++ ) { switch( input_regions[0]->im->BandFmt ) { case VIPS_FORMAT_FLOAT: -#ifdef HAVE_VECTOR_SHUFFLE +#ifdef HAVE_VECTOR_ARITH if( composite->bands == 3 ) vips_combine_pixels_3float( composite, q, p ); else -#endif /*HAVE_VECTOR_SHUFFLE*/ +#endif /*HAVE_VECTOR_ARITH*/ vips_combine_pixels( composite, q, p ); break;