This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Inline assembly and ldm/stm


So how should I go about wrapping ldm / stm for usage in C land?

I tried:

typedef struct
{
   UNS_32 reg[2];
} arm_2_registers_t;

static inline
arm_2_registers_t arm_2_registers_load(
    UNS_32 *src_addr_ptr )
{
   arm_2_registers_t result;
   __asm__ (
       "ldmia    %0, {%1,%2}    \n\t"
       : "+r" (src_addr_ptr), "=r" (result.reg[0]), "=r" ( result.reg[1])
   );
   return( result );
}

That seems to work fine until the compiler decides to use registers
for %1 and %2 that aren't in ascending order. I've examined the
assembly constraints and I don't see anything obvious.

--
Bryce Schober

--
For unsubscribe information see http://sourceware.org/lists.html#faq


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]