Add aarch32 const-time asm

Signed-off-by: Dave Rodgman <dave.rodgman@arm.com>
diff --git a/library/constant_time_impl.h b/library/constant_time_impl.h
index a5284cb..3c82bd5 100644
--- a/library/constant_time_impl.h
+++ b/library/constant_time_impl.h
@@ -132,6 +132,18 @@
                   :
                   );
     return (mbedtls_ct_condition_t) x;
+#elif defined(MBEDTLS_CT_ARM_ASM) && defined(MBEDTLS_CT_SIZE_32)
+    uint32_t s;
+    asm volatile ("neg %[s], %[x]                       \n\t"
+                  "orr %[x], %[x], %[s]                 \n\t"
+                  "asr %[x], %[x], #31"
+                  :
+                  [s] "=&l" (s),
+                  [x] "+&l" (x)
+                  :
+                  :
+                  );
+    return (mbedtls_ct_condition_t) x;
 #else
     const mbedtls_ct_uint_t xo = mbedtls_ct_compiler_opaque(x);
 #if defined(_MSC_VER)
@@ -165,6 +177,19 @@
                   :
                   );
     return (mbedtls_ct_uint_t) condition;
+#elif defined(MBEDTLS_CT_ARM_ASM) && defined(MBEDTLS_CT_SIZE_32)
+    asm volatile ("and %[if1], %[if1], %[condition]          \n\t"
+                  "mvn %[condition], %[condition]            \n\t"
+                  "and %[condition], %[condition], %[if0]    \n\t"
+                  "orr %[condition], %[if1], %[condition]"
+                  :
+                  [condition] "+&l" (condition),
+                  [if1] "+&l" (if1)
+                  :
+                  [if0] "l" (if0)
+                  :
+                  );
+    return (mbedtls_ct_uint_t) condition;
 #else
     mbedtls_ct_condition_t not_cond =
         (mbedtls_ct_condition_t) (~mbedtls_ct_compiler_opaque(condition));
@@ -187,6 +212,25 @@
                   :
                   );
     return (mbedtls_ct_condition_t) x;
+#elif defined(MBEDTLS_CT_ARM_ASM) && defined(MBEDTLS_CT_SIZE_32)
+    uint32_t s1;
+    asm volatile (
+#if defined(__thumb__) && !defined(__thumb2__)
+        "mov     %[s1], %[x]                \n\t"
+        "eor     %[s1], %[s1], %[y]         \n\t"
+#else
+        "eor     %[s1], %[x], %[y]          \n\t"
+#endif
+        "sub     %[x], %[x], %[y]           \n\t"
+        "bic     %[x], %[x], %[s1]          \n\t"
+        "and     %[y], %[s1], %[y]          \n\t"
+        "orr     %[x], %[x], %[y]           \n\t"
+        "asr     %[x], %[x], #31"
+        : [s1] "=&l" (s1), [x] "+&l" (x),  [y] "+&l" (y)
+        :
+        :
+        );
+    return (mbedtls_ct_condition_t) x;
 #else
     /* Ensure that the compiler cannot optimise the following operations over x and y,
      * even if it knows the value of x and y.