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

[MiNT] Improvements for inline assembler



Hello.

Here is a proposal for improving the syntax of inline assembly inside the MiNTLib. The generated code will not be affected in any way.

Current inline assembly is like this :

#define trap_1_w(n)							\
__extension__								\
({									\
	register long retvalue __asm__("d0");				\
	    								\
	__asm__ volatile						\
	("\
		movw    %1,sp@-; \
		trap    #1;	\
		addqw   #2,sp "						\
	: "=r"(retvalue)			/* outputs */		\
	: "g"(n)				/* inputs  */		\
	: __CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2"    /* clobbered regs */	\
	  AND_MEMORY							\
	);								\
	retvalue;							\
})

I propose to change it to the following :

#define trap_1_w(n)							\
__extension__								\
({									\
	register long retvalue __asm__("d0");				\
	    								\
	__asm__ volatile						\
	(								\
		"movw	%1,sp@-\n\t"					\
		"trap	#1\n\t"						\
		"addqw	#2,sp\n\t"					\
	: "=r"(retvalue)			/* outputs */		\
	: "g"(n)				/* inputs  */		\
	: __CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2"    /* clobbered regs */	\
	  AND_MEMORY							\
	);								\
	retvalue;							\
})

Basically, I removed the embedded newlines and semicolumns.
Instead, I used one string for each assembler line. The strings are merged by the compiler.

There are 2 advantages :

- Since every line is independent, it is possible to replace a single instruction by a macro. That will be very useful for supporting multiple CPU variants, such as ColdFire.

- The assembler code generated by gcc -S was unreadable, because all the instructions were outputted on a single line. With the second version, the generated assembler is clean, very helpful for debugging GCC output.

If there is no objection, I will submit a patch for the whole MiNTLib with changes like this one.

NB: The ugly MIT syntax for opcodes is not required anymore by the binutils, we could use the normal Motorola syntax. That may be the purpose of a further patch.

--
Vincent Rivière