arch/x86/include/asm/percpu.h | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 2278797c769d..b479a0e650e5 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h @@ -86,6 +86,17 @@ /* For arch-specific code, we can use direct single-insn ops (they * don't give an lvalue though). */ extern void __bad_percpu_size(void); +extern void __bad_expr_size(void); + +#define pick_type_expression(x, e8, e16, e32, e64) \ + __builtin_choose_expr(sizeof(x)==1, e8, \ + __builtin_choose_expr(sizeof(x)==2, e16, \ + __builtin_choose_expr(sizeof(x)==4, e32, \ + __builtin_choose_expr(sizeof(x)==8, e64, \ + __bad_expr_size())))) + +#define pick_type_statement(x, s8, s16, s32, s64) \ + pick_type_expression(x, ({s8;0;}), ({s16;0;}),({s32;0;}),({s64;0;})) #define percpu_to_op(qual, op, var, val) \ do { \ @@ -95,29 +106,19 @@ do { \ pto_tmp__ = (val); \ (void)pto_tmp__; \ } \ - switch (sizeof(var)) { \ - case 1: \ + pick_type_statement(var, \ asm qual (op "b %1,"__percpu_arg(0) \ : "+m" (var) \ - : "qi" ((pto_T__)(val))); \ - break; \ - case 2: \ + : "qi" ((pto_T__)(val))), \ asm qual (op "w %1,"__percpu_arg(0) \ : "+m" (var) \ - : "ri" ((pto_T__)(val))); \ - break; \ - case 4: \ + : "ri" ((pto_T__)(val))), \ asm qual (op "l %1,"__percpu_arg(0) \ : "+m" (var) \ - : "ri" ((pto_T__)(val))); \ - break; \ - case 8: \ + : "ri" ((pto_T__)(val))), \ asm qual (op "q %1,"__percpu_arg(0) \ : "+m" (var) \ - : "re" ((pto_T__)(val))); \ - break; \ - default: __bad_percpu_size(); \ - } \ + : "re" ((pto_T__)(val)))); \ } while (0) /*