swap instruction generation

Ian Lance Taylor iant@google.com
Wed Sep 21 13:27:00 GMT 2011


naga raj <gnuuser.raj@gmail.com> writes:

>    I am using Gcc-4.6.0 and I have used bswap RTL pattern for both SI
> and HI modes to generate swapb & swaph instructions respectively.
>
>   (define_insn "bswapsi2"
>   [(set (match_operand:SI 0 "register_operand" "=r")
>         (bswap:SI (match_operand:SI 1 "register_operand" "r")))]
>   ""
>   "swapb %0, %1"
> )
>
> (define_insn "bswaphi2"
>   [(set (match_operand:HI           0 "register_operand" "=r")
>         (bswap:HI (match_operand:HI 1 "register_operand"  "r")))]
>   ""
>   "swaph %0, %1"
> )
>
>
>
> I have written a sample example to generate these instructions..
> int swapb(int n)
> {
>   return ((((n) & 0xff000000) >> 24)
>             | (((n) & 0x00ff0000) >>  8)
>             | (((n) & 0x0000ff00) <<  8)
>             | (((n) & 0x000000ff) << 24));
>
> }
> short int swaph(short int n)
> {
> return  ((((n) & 0xff00) >>  8)
>             | (((n) & 0xff) <<  8));
> }
> int main()
> {
>   volatile int a=0x12345678;
>    volatile short int b=0x1234;
>   a=swapb(a);
>   b=swaph(b);
>  return 0;
> }
>
> with this example "swapb" instruction has generated but I am unable to
> generate "swaph"(HI mode of bswap RTL pattern) instruction
>
> I have tried all possibilities that I know.
> Am I missing something or this approach is wrong.
> Please guide me to generate swaph instruction.

I'm surprised that you even get swapb when using a volatile variable.  I
would remove the volatile.  Just make them global variables or function
arguments or something.

Also you should make b an unsigned short, so that gcc doesn't have to
worry about sign extending the result when the expression is implicitly
calculated in type int.

Good luck.

Ian



More information about the Gcc-help mailing list