From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Zijlstra Subject: [PATCH 2/2] math128, x86_64: Implement {mult,add}_u128 in 64bit asm Date: Wed, 25 Apr 2012 13:15:54 +0200 Message-ID: <20120425112244.953956269@chello.nl> References: <20120425111552.665217867@chello.nl> Return-path: Content-Disposition: inline; filename=math128-x86_64.patch Sender: linux-kernel-owner@vger.kernel.org To: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org Cc: Linus Torvalds , Andrew Morton , Juri Lelli , Andy Lutomirski , Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Peter Zijlstra List-Id: linux-arch.vger.kernel.org Cc: Ingo Molnar Cc: Thomas Gleixner Cc: H. Peter Anvin Cc: Andrew Morton Cc: Linus Torvalds Signed-off-by: Peter Zijlstra --- arch/x86/include/asm/Kbuild | 1 - arch/x86/include/asm/math128.h | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) --- a/arch/x86/include/asm/Kbuild +++ b/arch/x86/include/asm/Kbuild @@ -26,4 +26,3 @@ header-y += vsyscall.h genhdr-y += unistd_32.h genhdr-y += unistd_64.h genhdr-y += unistd_x32.h -generic-y += math128.h --- /dev/null +++ b/arch/x86/include/asm/math128.h @@ -0,0 +1,39 @@ +#ifndef _ASM_MATH128_H +#define _ASM_MATH128_H + +#ifdef CONFIG_X86_64 + +#ifdef __SIZEOF_INT128__ +#define ARCH_HAS_INT128 +#endif + +#ifndef ARCH_HAS_INT128 + +static inline mul_u64_u64(u64 a, u64 b) +{ + u128 res; + + asm("mulq %2" + : "=a" (res.lo), "=d" (res.hi) + : "rm" (b), "0" (a)); + + return res; +} +#define mult_u64_u64 mult_u64_u64 + +static inline add_u128(u128 a, u128 b) +{ + u128 res; + + asm("addq %2,%0;\n" + "adcq %3,%1;\n" + : "=rm" (res.lo), "=rm" (res.hi) + : "r" (b.lo), "r" (b.hi), "0" (a.lo), "1" (a.hi)); + + return res; +} +#define add_u128 add_u128 + +#endif /* ARCH_HAS_INT128 */ +#endif /* CONFIG_X86_64 */ +#endif /* _ASM_MATH128_H */