summaryrefslogtreecommitdiff
path: root/mpi/longlong.h
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2013-12-03 13:57:02 +0200
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2013-12-03 13:57:02 +0200
commit80896bc8f5e6ed9a627374e34f040ad5f3617584 (patch)
tree4025da8b0b8be08e1c479c6f39696805e83353ba /mpi/longlong.h
parentd4ce0cfe0d35d7ec69c115456848b5b735c928ea (diff)
downloadlibgcrypt-80896bc8f5e6ed9a627374e34f040ad5f3617584.tar.gz
Add aarch64 (arm64) mpi assembly
* mpi/aarch64/mpi-asm-defs.h: New. * mpi/aarch64/mpih-add1.S: New. * mpi/aarch64/mpih-mul1.S: New. * mpi/aarch64/mpih-mul2.S: New. * mpi/aarch64/mpih-mul3.S: New. * mpi/aarch64/mpih-sub1.S: New. * mpi/config.links [host=aarch64-*-*]: Add configguration for aarch64 assembly. * mpi/longlong.h [__aarch64__] (add_ssaaaa, sub_ddmmss, umul_ppmm) (count_leading_zeros): New. -- Add preliminary aarch64 assembly implementations for mpi. Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'mpi/longlong.h')
-rw-r--r--mpi/longlong.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/mpi/longlong.h b/mpi/longlong.h
index 146830b0..8dd8fe8d 100644
--- a/mpi/longlong.h
+++ b/mpi/longlong.h
@@ -268,6 +268,44 @@ extern UDItype __udiv_qrnnd ();
#endif /* __arm__ */
/***************************************
+ ********** ARM64 / Aarch64 **********
+ ***************************************/
+#if defined(__aarch64__) && W_TYPE_SIZE == 64
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+ __asm__ ("adds %1, %4, %5\n" \
+ "adc %0, %2, %3\n" \
+ : "=r" ((sh)), \
+ "=&r" ((sl)) \
+ : "r" ((UDItype)(ah)), \
+ "r" ((UDItype)(bh)), \
+ "r" ((UDItype)(al)), \
+ "r" ((UDItype)(bl)) __CLOBBER_CC)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+ __asm__ ("subs %1, %4, %5\n" \
+ "sbc %0, %2, %3\n" \
+ : "=r" ((sh)), \
+ "=&r" ((sl)) \
+ : "r" ((UDItype)(ah)), \
+ "r" ((UDItype)(bh)), \
+ "r" ((UDItype)(al)), \
+ "r" ((UDItype)(bl)) __CLOBBER_CC)
+#define umul_ppmm(ph, pl, m0, m1) \
+ do { \
+ UDItype __m0 = (m0), __m1 = (m1), __ph; \
+ (pl) = __m0 * __m1; \
+ __asm__ ("umulh %0,%1,%2" \
+ : "=r" (__ph) \
+ : "r" (__m0), \
+ "r" (__m1)); \
+ (ph) = __ph; \
+ } while (0)
+#define count_leading_zeros(count, x) \
+ __asm__ ("clz %0, %1\n" \
+ : "=r" ((count)) \
+ : "r" ((UDItype)(x)))
+#endif /* __aarch64__ */
+
+/***************************************
************** CLIPPER **************
***************************************/
#if defined (__clipper__) && W_TYPE_SIZE == 32