load reverse

sravan megan sravan22021987@gmail.com
Thu Aug 8 10:45:00 GMT 2013


Hi David,

  Thanks for the reply.

On Thu, Aug 8, 2013 at 4:04 PM, David Brown <david@westcontrol.com> wrote:
> On 08/08/13 11:19, sravan megan wrote:
>> Hi All,
>>
>>    I am new to GCC. I was working in an Embedded processor with
>> GCC-4.6.4 version.
>>
>>    I need to add load/store reverse instructions to the MD file.
>
> Are you trying to modify gcc itself for your particular target, or are
> just wanting to use these instructions in your own code?  I can't think
> why the compiler would need to generate endian-reversed accesses itself
> (I think it would be great if gcc supported a variable or type attribute
> specifying that the data should be accessed with reversed endianness,
> but that's not available at the moment).
>
  I am trying to modify gcc itself so that it can generate the lwx/stx
instruction.

int store_rev(int *n)
{
  return ((((*n) & 0xff000000) >> 24)
            | (((*n) & 0x00ff0000) >>  8)
            | (((*n) & 0x0000ff00) <<  8)
            | (((*n) & 0x000000ff) << 24));

}

for the above store_rev function I need to generate only single swx instruction.
I was successful in generating the swx instruction but instead of 3
registers compiler is generating one extra operand "0"  swx r0,r2,0,r0


> Using the instruction directly from your code is pretty easy with inline
> assembler:
>
> static inline uint32_t LMX(uint32_t * Ra, uint32_t Rb) {
>         uint32_t Rd;
>         asm(" lmx %[Rd], %[Ra], %[Rb]" :
>                 [Rd] "=r" (Rd) :
>                 [Ra] "r" (Ra), [Rb] "r" (Rb) );
>         return Rd;
> }
>
> That should give you optimal code.
>
> mvh.,
>
> David
>
>
>>
>>    My instructions will look as below:
>>
>>    LWX Rd,Ra,Rb
>>
>>     operation: Addr := Ra + Rb
>>                     Rd := *Addr    (loading data with the opposite endianness)
>>
>>       SWX Rd,Ra,Rb
>>
>>      operation: Addr := Ra + Rb
>>                     *Addr := Rd    (storing data with the opposite endianness)
>>
>>
>>
>>     To add the above instructions in to md file I tried below pattern in md file
>>
>>      (define_insn "movsi_rev"
>>   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,m")
>>         (bswap: SI (match_operand:SI 1 "move_src_operand"         "m,d")))]
>>   ""
>>   "@
>>    lwx\t%0,%1,%0
>>    swx\t%0,%1,%0"
>>   [(set_attr "type"     "load,store")
>>   (set_attr "mode"      "SI")
>>   (set_attr "length"    "4,4")])
>>
>>
>>    I wrote a small testcase which is generating swx instruction but
>> the operands are more due to which it is failing in assembler phase
>>
>>    ex: instead of swx r0,r2,r0 it is generating swx r0,r2,0,r0
>>
>> can anyone please help me in removing the extra operand in the above
>> instruction.
>>
>> Thanks,
>> Sravan
>>
>



More information about the Gcc-help mailing list