From fc4f46fa9a04cab01aab75c4c44bf79fe6a5fc26 Mon Sep 17 00:00:00 2001
From: Paul Bakker
Date: Mon, 24 Jun 2013 19:23:56 +0200
Subject: [PATCH] Fixed bignum.c and bn_mul.h to support Thumb2 and LLVM
compiler (cherry picked from commit 52b845be34a6b5cfa48f34bfbcddd83069d8c0c3)
---
include/polarssl/bn_mul.h | 2 +-
library/bignum.c | 12 ++++++++++--
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/include/polarssl/bn_mul.h b/include/polarssl/bn_mul.h
index cffcd6bd4b38..1c2da136ab1d 100644
--- a/include/polarssl/bn_mul.h
+++ b/include/polarssl/bn_mul.h
@@ -548,7 +548,7 @@
#if defined(__arm__)
-#if defined(__thumb__)
+#if defined(__thumb__) && !defined(__thumb2__)
#define MULADDC_INIT \
asm( \
diff --git a/library/bignum.c b/library/bignum.c
index d9845da5d1b2..1422d5026226 100644
--- a/library/bignum.c
+++ b/library/bignum.c
@@ -934,8 +934,16 @@ int mpi_sub_int( mpi *X, const mpi *A, t_sint b )
/*
* Helper for mpi multiplication
- */
-static void mpi_mul_hlp( size_t i, t_uint *s, t_uint *d, t_uint b )
+ */
+static
+#if defined(__APPLE__) && defined(__arm__)
+/*
+ * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
+ * appears to need this to prevent bad ARM code generation at -O3.
+ */
+__attribute__ ((noinline))
+#endif
+void mpi_mul_hlp( size_t i, t_uint *s, t_uint *d, t_uint b )
{
t_uint c = 0, t = 0;