Re: Inline assembly and ldm/stm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Bryce Schober writes:
 > On 4/10/07, Andrew Haley <aph@xxxxxxxxxxx> wrote:
 > > Sure, but there's nothing to stop him picking two named register
 > > variables.
 > 
 > Following Andrew's hint, the following works:
 > 
 > typedef struct
 > {
 > 	int reg[2];
 > } arm_2_registers_t;
 > 
 > static inline
 > arm_2_registers_t arm_2_registers_load(
 > 	int *src_addr_ptr )
 > {
 > 	register int result_0 __asm__ ("r3");
 > 	register int result_1 __asm__ ("r4");
 > 	arm_2_registers_t result;
 > 	__asm__ __volatile__ (
 > 		"ldmia	%0, {%1,%2}	\n\t"
 > 		: "+r" (src_addr_ptr), "=r" (result_0), "=r" (result_1)
 > 	);
 > 	result.reg[0] = result_0;
 > 	result.reg[1] = result_1;
 > 	return( result );
 > }

 > It's still pretty sub-optimal, though, since the registers have to be
 > specified, which could lead to a bunch of register-to-register moving
 > when using several functions like this. It'd be a bit better as a
 > macro that could take the register names as arguments.

True.

 > It's too bad that the assembler can't just make the right choice for
 > us... It doesn't seem like *that* hard a problem...

Well, it would require at least a partial rewrite of gcc's register
allocator.  It depends what you mean by "hard", I guess.  ;-)

Andrew.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux