x86: make asm/asm.h work for asm code.
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) \
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
Quoted 3 lines · Jeremy Fitzhardinge
This is useful for unifying some pieces of asm code.
Signed-off-by Jeremy Fitzhardinge <[email protected]>
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 ... */
Quoted 6 lines · H. Peter Anvin
Quoted 3 lines · Jeremy Fitzhardinge
This is useful for unifying some pieces of asm code.
Signed-off-by Jeremy Fitzhardinge <[email protected]>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) \
H. Peter Anvin
Acked-byQuoted 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.
Signed-off-by Jeremy Fitzhardinge <[email protected]>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
H. Peter Anvin
AppliedQuoted 5 lines · H. Peter Anvin
Acked-by H. Peter Anvin <[email protected]>I'll pull this into -tip once I figure out which topic it should go under.
I applied this to x86/cleanups last night.
-hpa