Skip to contentSkip to conversation

x86: make asm/asm.h work for asm code.

PATCH Applied Jeremy Fitzhardinge 2 participants 6 messages Jun 16, 2008 – Jun 17, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 x86: make asm/asm.h work for asm code.

This is useful for unifying some pieces of asm code.

---
include/asm-x86/asm.h | 56 +++++++++++++++++++++++++++++++++++--------------

1 file changed, 40 insertions(+), 16 deletions(-)

===================================================================

include/asm-x86/asm.h +0 -0
@@ -1,33 +1,57 @@

#ifndef _ASM_X86_ASM_H
#define _ASM_X86_ASM_H
+
+#include <linux/stringify.h>

#ifdef CONFIG_X86_32
/* 32 bits */

-# define _ASM_PTR " .long "
-# define _ASM_ALIGN " .balign 4 "
-# define _ASM_MOV_UL " movl "
+# define __ASM_PTR .long
+# define __ASM_ALIGN .balign 4
+# define __ASM_MOV_UL movl

-# define _ASM_INC " incl "
-# define _ASM_DEC " decl "
-# define _ASM_ADD " addl "
-# define _ASM_SUB " subl "
-# define _ASM_XADD " xaddl "
+# define __ASM_INC incl
+# define __ASM_DEC decl
+# define __ASM_ADD addl
+# define __ASM_SUB subl
+# define __ASM_XADD xaddl

#else
/* 64 bits */

-# define _ASM_PTR " .quad "
-# define _ASM_ALIGN " .balign 8 "
-# define _ASM_MOV_UL " movq "
+# define __ASM_PTR .quad
+# define __ASM_ALIGN .balign 8
+# define __ASM_MOV_UL movq

-# define _ASM_INC " incq "
-# define _ASM_DEC " decq "
-# define _ASM_ADD " addq "
-# define _ASM_SUB " subq "
-# define _ASM_XADD " xaddq "
+# define __ASM_INC incq
+# define __ASM_DEC decq
+# define __ASM_ADD addq
+# define __ASM_SUB subq
+# define __ASM_XADD xaddq

#endif /* CONFIG_X86_32 */
+
+#ifdef __ASSEMBLER__
+#define _ASM_PTR __ASM_PTR
+#define _ASM_ALIGN __ASM_ALIGN
+#define _ASM_MOV_UL __ASM_MOV_UL
+
+#define _ASM_INC __ASM_INC
+#define _ASM_DEC __ASM_DEC
+#define _ASM_ADD __ASM_ADD
+#define _ASM_SUB __ASM_SUB
+#define _ASM_XADD __ASM_XADD
+#else /* !ASSEMBLER */
+#define _ASM_PTR " " __stringify(__ASM_PTR) " "
+#define _ASM_ALIGN " " __stringify(__ASM_ALIGN) " "
+#define _ASM_MOV_UL " " __stringify(__ASM_MOV_UL) " "
+
+#define _ASM_INC " " __stringify(__ASM_INC) " "
+#define _ASM_DEC " " __stringify(__ASM_DEC) " "
+#define _ASM_ADD " " __stringify(__ASM_ADD) " "
+#define _ASM_SUB " " __stringify(__ASM_SUB) " "
+#define _ASM_XADD " " __stringify(__ASM_XADD) " "
+#endif /* __ASSEMBLER__ */

/* Exception table entry */

# define _ASM_EXTABLE(from,to) \
#1 lore raw

Review

Quoted 4 lines · Jeremy Fitzhardinge
(quoted diff) +4 -0
+# define __ASM_INC    incl
+# define __ASM_INC    incq
+#define _ASM_INC    __ASM_INC
+#define _ASM_INC    " " __stringify(__ASM_INC) " "

You have *exactly* as many #defines as if one would simply do four cases (32 C, 64 C, 32 asm, 64 asm), and that would be easier to read...

-hpa

#2 lore raw
In reply to Jeremy Fitzhardinge
Quoted 3 lines · Jeremy Fitzhardinge

This is useful for unifying some pieces of asm code.

Thinking about it some more, this should be possible to do cleaner like this:

#ifdef CONFIG_X86_32

# ifdef __ASSEMBLY__
#  define __ASM_SEL(a,b) a
# else
#  define __ASM_SEL(a,b) " " #a " "
# endif
#else
# ifdef __ASSEMBLY__
#  define __ASM_SEL(a,b) b
# else
#  define __ASM_SEL(a,b) " " #b " "
# endif
#endif

#define _ASM_INC _ASM_SEL(incl,incq)
#define _ASM_DEC _ASM_SEL(decl,decq)

/* ... etc ... */

#3 lore raw
Quoted 6 lines · H. Peter Anvin
Quoted 3 lines · Jeremy Fitzhardinge

This is useful for unifying some pieces of asm code.

Thinking about it some more, this should be possible to do cleaner like this:

OK, how about this...

J

Subject: x86: make asm/asm.h work for asm code.

This is useful for unifying some pieces of asm code.

---
include/asm-x86/asm.h | 42 +++++++++++++++++++-----------------------

1 file changed, 19 insertions(+), 23 deletions(-)

===================================================================

include/asm-x86/asm.h +0 -0
@@ -1,33 +1,29 @@

#ifndef _ASM_X86_ASM_H
#define _ASM_X86_ASM_H

+#ifdef __ASSEMBLY__
+# define __ASM_FORM(x) x
+#else
+# define __ASM_FORM(x) " " #x " "
+#endif
+
#ifdef CONFIG_X86_32
-/* 32 bits */
+# define __ASM_SEL(a,b) __ASM_FORM(a)
+#else
+# define __ASM_SEL(a,b) __ASM_FORM(b)
+#endif

-# define _ASM_PTR " .long "
-# define _ASM_ALIGN " .balign 4 "
-# define _ASM_MOV_UL " movl "
+#define __ASM_SIZE(inst) __ASM_SEL(inst##l, inst##q)

-# define _ASM_INC " incl "
-# define _ASM_DEC " decl "
-# define _ASM_ADD " addl "
-# define _ASM_SUB " subl "
-# define _ASM_XADD " xaddl "
+#define _ASM_PTR __ASM_SEL(.long, .quad)
+#define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8)
+#define _ASM_MOV_UL __ASM_SIZE(mov)

-#else
-/* 64 bits */
-
-# define _ASM_PTR " .quad "
-# define _ASM_ALIGN " .balign 8 "
-# define _ASM_MOV_UL " movq "
-
-# define _ASM_INC " incq "
-# define _ASM_DEC " decq "
-# define _ASM_ADD " addq "
-# define _ASM_SUB " subq "
-# define _ASM_XADD " xaddq "
-
-#endif /* CONFIG_X86_32 */
+#define _ASM_INC __ASM_SIZE(inc)
+#define _ASM_DEC __ASM_SIZE(dec)
+#define _ASM_ADD __ASM_SIZE(add)
+#define _ASM_SUB __ASM_SIZE(sub)
+#define _ASM_XADD __ASM_SIZE(xadd)

/* Exception table entry */

# define _ASM_EXTABLE(from,to) \
#4 lore raw
Quoted 9 lines · Jeremy Fitzhardinge
Quoted 6 lines · H. Peter Anvin
Quoted 3 lines · Jeremy Fitzhardinge

This is useful for unifying some pieces of asm code.

Thinking about it some more, this should be possible to do cleaner like this:

OK, how about this...

A little over the top, but looks great ;)

I'll pull this into -tip once I figure out which topic it should go under.

-hpa