[cairo] [patch] Accelerate CAIRO_BITSWAP8 on 64 bit machines

zhigang gong zhigang.gong at gmail.com
Tue May 29 01:18:42 PDT 2012


On Tue, May 29, 2012 at 3:51 PM, Xing, Dongsheng
<dongsheng.xing at intel.com> wrote:
> -----Original Message-----
> From: Chris Wilson
> Sent: Tuesday, May 29, 2012 3:25 PM
> To: Xing, Dongsheng; cairo at cairographics.org
> Subject: Re: [cairo] [patch] Accelerate CAIRO_BITSWAP8 on 64 bit machines
>
>> On Tue, 29 May 2012 02:03:58 +0000, "Xing, Dongsheng" wrote:
>> > Hi, CAIRO_BITSWAP8 costs seven operations on a 32 bit machine, but it
>> > can be done with only four operations on 64 bit machines.
>> > This patch accelerates CAIRO_BITSWAP8 on 64 bit machines.
>>
>> This doesn't apply to master. Care to resend?
>
> OK.
>
> diff --git a/src/cairoint.h b/src/cairoint.h
> index 2c9f2dd..d6201f3 100644
> --- a/src/cairoint.h
> +++ b/src/cairoint.h
> @@ -169,7 +169,11 @@ do {                                       \
>  * Devised by Sean Anderson, July 13, 2001.
>  * Source: http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits
>  */
> +#if (SIZEOF_LONG >= 8)
> +#define CAIRO_BITSWAP8(c) ((((c) * 0x80200802LLU & 0x884422110LLU) * 0x101010101LLU) >> 32)
> +#else
>  #define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16)
> +#endif
>
> I don't know why the patch doesn't apply to "master".
> I guess the reason is my code is not the "master". Because I downloaded the code by
>     git clone git://anongit.freedesktop.org/git/cairo
> I am not sure.
>
>>
>> > diff --git a/src/cairoint.h b/src/cairoint.h index 2c9f2dd..7e62d86
>> > 100644
>> > --- a/src/cairoint.h
>> > +++ b/src/cairoint.h
>> > @@ -169,7 +169,11 @@ do {                                       \
>> >   * Devised by Sean Anderson, July 13, 2001.
>> >   * Source:
>> > http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits
>> >   */
>> > +#if (SIZEOF_VOID_P >= 8)
>>
>> A more appropriate test here would be that "SIZEOF_LONG_LONG >= 8" as that is the condition used in the macro.
>
> I think SIZEOF_LONG >= 8 is better. Because sizeof(long long)==8 on a 32 bit machine. And SIZEOF_LONG is the length of a native processor word.

No, SIZEOF_LONG is not always the native word size of the platform,
for an example :
On 64-bit Windows,  sizeof(int) == sizeof(long) == 4.

I prefer uintptr_t which is defeind in <stdint.h> .

>
> Best regards,
> Dongsheng
>
>>
>> > +#define CAIRO_BITSWAP8(c) ((((c) * 0x80200802LLU & 0x884422110LLU) * 0x101010101LLU) >> 32)
>> > +#else
>> >  #define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) *
>> > 0x8020LU &
>> > 0x88440LU)) * 0x10101LU >> 16)
>> > +#endif
>>
>> --
>> Chris Wilson, Intel Open Source Technology Centre
> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list