[Pixman] [PATCH 2/6] mmx: compile on MIPS for Loongson MMI optimizations
Søren Sandmann
sandmann at cs.au.dk
Tue Feb 28 17:57:11 PST 2012
Matt Turner <mattst88 at gmail.com> writes:
> +/* vectors are stored in 64-bit floating-point registers */
> +typedef double __m64;
> [...]
> @@ -114,11 +118,14 @@ _mm_shuffle_pi16 (__m64 __A, int8_t const __N)
> * uint64_t and __m64 values, then define USE_CVT_INTRINSICS.
> * If __m64 and uint64_t values can just be cast to each other directly,
> * then define USE_M64_CASTS.
> + * If __m64 is a double datatype, then define USE_M64_DOUBLE.
> */
> #ifdef _MSC_VER
> # define M64_MEMBER m64_u64
> #elif defined(__ICC)
> # define USE_CVT_INTRINSICS
> +#elif defined(USE_LOONGSON_MMI)
> +# define USE_M64_DOUBLE
> #elif defined(__GNUC__)
> # define USE_M64_CASTS
> #elif defined(__SUNPRO_C)
> @@ -136,7 +143,7 @@ _mm_shuffle_pi16 (__m64 __A, int8_t const __N)
> # endif
> #endif
>
> -#if defined(USE_M64_CASTS) || defined(USE_CVT_INTRINSICS)
> +#if defined(USE_M64_CASTS) || defined(USE_CVT_INTRINSICS) || defined(USE_M64_DOUBLE)
> typedef uint64_t mmxdatafield;
> #else
> typedef __m64 mmxdatafield;
> @@ -188,6 +195,8 @@ static const mmx_data_t c =
> # define MC(x) to_m64 (c.mmx_ ## x)
> #elif defined(USE_M64_CASTS)
> # define MC(x) ((__m64)c.mmx_ ## x)
> +#elif defined(USE_M64_DOUBLE)
> +# define MC(x) (*(__m64 *)&c.mmx_ ## x)
> #else
> # define MC(x) c.mmx_ ## x
> #endif
As far as I can tell, in the above mmxdatafield is defined to be a
uint64_t, and MC is defined to cast from uint64_t to __m64, which is a
double. Is there any reason to not just define mmxdatafield as double
and then drop the casting?
> @@ -347,13 +360,26 @@ static __inline__ uint32_t ldl_u(uint32_t *p)
> static force_inline __m64
> load (const uint32_t *v)
> {
> +#ifdef USE_LOONGSON_MMI
> + __m64 ret;
> + asm("lwc1 %0, %1\n\t"
> + : "=f" (ret)
> + : "m" (*v)
> + );
> + return ret;
Please put a space before "(". There are several instances of this, in
this and the other patches, and also a lot of existing cases in
pixman-mmx.c that weren't introduced by this series. Since this series
changes all the ldq_u() calls in the first patch, we might as well get
all of it cleaned up.
> +#else
> return _mm_cvtsi32_si64 (*v);
> +#endif
> }
>
> static force_inline __m64
> load8888 (const uint32_t *v)
> {
> +#ifdef USE_LOONGSON_MMI
> + return _mm_unpacklo_pi8_f (*(__m32 *)v, _mm_setzero_si64 ());
> +#else
> return _mm_unpacklo_pi8 (load (v), _mm_setzero_si64 ());
> +#endif
> }
Above you defined what load() does on Loongson, but then you don't use
it here? It doesn't look like load() is used elsewhere, though I could
have overlooked some.
Soren
More information about the Pixman
mailing list