[Pixman] [PATCH 2/5] vmx: adjust macros when loading vectors on ppc64le
Oded Gabbay
oded.gabbay at gmail.com
Thu Jun 25 04:41:37 PDT 2015
On Thu, Jun 25, 2015 at 2:05 PM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> On Tue, 16 Jun 2015 18:27:59 +0300
> Oded Gabbay <oded.gabbay at gmail.com> wrote:
>
>> From: Fernando Seiti Furusato <ferseiti at linux.vnet.ibm.com>
>>
>> Replaced usage of vec_lvsl to direct unaligned assignment
>> operation (=). That is because, according to Power ABI Specification,
>> the usage of lvsl is deprecated on ppc64le.
>>
>> Changed COMPUTE_SHIFT_{MASK,MASKS,MASKC} macro usage to no-op for powerpc
>> little endian since unaligned access is supported on ppc64le.
>>
>> Signed-off-by: Fernando Seiti Furusato <ferseiti at linux.vnet.ibm.com>
>> ---
>> pixman/pixman-vmx.c | 54 ++++++++++++++++++++++++++++++++++++++---------------
>> 1 file changed, 39 insertions(+), 15 deletions(-)
>>
>> diff --git a/pixman/pixman-vmx.c b/pixman/pixman-vmx.c
>> index 23537f6..7e5eca7 100644
>> --- a/pixman/pixman-vmx.c
>> +++ b/pixman/pixman-vmx.c
>> @@ -136,6 +136,7 @@ over (vector unsigned int src,
>> over (pix_multiply (src, mask), \
>> pix_multiply (srca, mask), dest)
>>
>> +#ifndef _LITTLE_ENDIAN
>>
>> #define COMPUTE_SHIFT_MASK(source) \
>> source ## _mask = vec_lvsl (0, source);
>> @@ -151,23 +152,46 @@ over (vector unsigned int src,
>> * Note: tmp3 and tmp4 must remain untouched!
>> */
>>
>> -#define LOAD_VECTORS(dest, source) \
>> - tmp1 = (typeof(tmp1))vec_ld (0, source); \
>> - tmp2 = (typeof(tmp2))vec_ld (15, source); \
>> - v ## source = (typeof(v ## source)) \
>> - vec_perm (tmp1, tmp2, source ## _mask); \
>> +#define LOAD_VECTORS(dest, source) \
>> + tmp1 = (typeof(tmp1))vec_ld (0, source); \
>> + tmp2 = (typeof(tmp2))vec_ld (15, source); \
>> + v ## source = (typeof(v ## source)) \
>> + vec_perm (tmp1, tmp2, source ## _mask); \
>> v ## dest = (typeof(v ## dest))vec_ld (0, dest);
>>
>> -#define LOAD_VECTORSC(dest, source, mask) \
>> - tmp1 = (typeof(tmp1))vec_ld (0, source); \
>> - tmp2 = (typeof(tmp2))vec_ld (15, source); \
>> - v ## source = (typeof(v ## source)) \
>> - vec_perm (tmp1, tmp2, source ## _mask); \
>> - tmp1 = (typeof(tmp1))vec_ld (0, mask); \
>> - v ## dest = (typeof(v ## dest))vec_ld (0, dest); \
>> - tmp2 = (typeof(tmp2))vec_ld (15, mask); \
>> - v ## mask = (typeof(v ## mask)) \
>> - vec_perm (tmp1, tmp2, mask ## _mask);
>> +#define LOAD_VECTORSC(dest, source, mask) \
>> + tmp1 = (typeof(tmp1))vec_ld (0, source); \
>> + tmp2 = (typeof(tmp2))vec_ld (15, source); \
>> + v ## source = (typeof(v ## source)) \
>> + vec_perm (tmp1, tmp2, source ## _mask); \
>> + tmp1 = (typeof(tmp1))vec_ld (0, mask); \
>> + v ## dest = (typeof(v ## dest))vec_ld (0, dest); \
>> + tmp2 = (typeof(tmp2))vec_ld (15, mask); \
>> + v ## mask = (typeof(v ## mask)) \
>> + vec_perm (tmp1, tmp2, mask ## _mask);
>
> Hi Oded,
>
> are all the above changes just about breaking whitespace? At least I
> can't spot the difference between the old and the new version. You are
> converting nicely aligned tabs into unaligned spaces.
>
> I'd suggest to not touch the whitespace.
Understood, I'll modify it.
>
> Looks like you also modified Fernando's original patch, yet your name
> is nowhere to be seen. It's common courtesy to note what you changed.
>
I think I only took part of his patch, and that part I did *not*
modify, but I will double check it, and if I indeed modified
something, I will comment about it.
btw, I wrote a comment about it in the cover letter.
>> +#else
>> +
>> +/* Now the COMPUTE_SHIFT_{MASK, MASKS, MASKC} below are just no-op.
>> + * They are defined that way because little endian altivec can do unaligned
>> + * reads natively and have no need for constructing the permutation pattern
>> + * variables.
>> + */
>> +#define COMPUTE_SHIFT_MASK(source)
>> +
>> +#define COMPUTE_SHIFT_MASKS(dest, source)
>> +
>> +#define COMPUTE_SHIFT_MASKC(dest, source, mask)
>> +
>> +# define LOAD_VECTORS(dest, source) \
>> + v ## source = *((typeof(v ## source)*)source); \
>> + v ## dest = *((typeof(v ## dest)*)dest);
>> +
>> +# define LOAD_VECTORSC(dest, source, mask) \
>> + v ## source = *((typeof(v ## source)*)source); \
>> + v ## dest = *((typeof(v ## dest)*)dest); \
>> + v ## mask = *((typeof(v ## mask)*)mask);
>> +
>> +#endif /* _LITTLE_ENDIAN */
>>
>> #define LOAD_VECTORSM(dest, source, mask) \
>> LOAD_VECTORSC (dest, source, mask) \
>
> The above were the comments that finally made me not just push this
> series.
Not sure I understood this sentence. Could you please elaborate ?
>
> You're also missing a space before an opening paren (except for macro
> parameter lists), but the old code is missing them too, so no big deal I
> think.
Will fix that.
>
> My other comments for the series are:
>
> I think you updated your outstanding pull request after the reminder
> about WORDS_BIGENDIAN? Would have been nice to mention that, I almost
> didn't look at it because I was expecting a new request with the new
> change.
Yeah, I thought about doing the while sequence again, but decided just
changing the define name was not worth it. In any case, I will send a
new series now so that will also include the WORDS_BIGENDIAN thing
>
> Presumably ajax's R-b stands with the changes. At least the changes
> look as asked to me.
>
> If I understood right, you also addressed Siarhei's concerns about
> performance by changing to the simple #ifdef pattern which leaves the
> existing code path the same, right?
Correct, that produces the most efficient/optimized code.
>
> When you re-send someone else's patch that, it is a good convention to
> add your own Signed-off-by.
Correct, I forget to do it.
>
> You use lots of #ifndef with both branches populated. It's usually less
> effort for the reader to understand positives than negatives, so using
> #ifdef with the branches swapped might read better.
Agreed and I will change it now.
>
>
> Thanks,
> pq
More information about the Pixman
mailing list