summaryrefslogtreecommitdiff
path: root/include/linux/math.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/math.h')
-rw-r--r--include/linux/math.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/include/linux/math.h b/include/linux/math.h
index db7cdd23..85c8c8aa 100644
--- a/include/linux/math.h
+++ b/include/linux/math.h
@@ -153,4 +153,19 @@ static inline u32 int_sqrt64(u64 x)
}
#endif
+#define abs(x) __abs_choose_expr(x, long long, \
+ __abs_choose_expr(x, long, \
+ __abs_choose_expr(x, int, \
+ __abs_choose_expr(x, short, \
+ __abs_choose_expr(x, char, \
+ __builtin_choose_expr( \
+ __builtin_types_compatible_p(typeof(x), char), \
+ (char)({ signed char __x = (x); __x<0?-__x:__x; }), \
+ ((void)0)))))))
+
+#define __abs_choose_expr(x, type, other) __builtin_choose_expr( \
+ __builtin_types_compatible_p(typeof(x), signed type) || \
+ __builtin_types_compatible_p(typeof(x), unsigned type), \
+ ({ signed type __x = (x); __x < 0 ? -__x : __x; }), other)
+
#endif /* _LINUX_MATH_H */