-/* LibTomMath, multiple-precision integer library -- Tom St Denis\r
- *\r
- * LibTomMath is library that provides for multiple-precision\r
- * integer arithmetic as well as number theoretic functionality.\r
- *\r
- * The library is designed directly after the MPI library by\r
- * Michael Fromberger but has been written from scratch with\r
- * additional optimizations in place.\r
- *\r
- * The library is free for all purposes without any express\r
- * guarantee it works.\r
- *\r
- * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org\r
- */\r
-#include <tommath.h>\r
-\r
-/* divide by three (based on routine from MPI and the GMP manual) */\r
-int\r
-mp_div_3 (mp_int * a, mp_int *c, mp_digit * d)\r
-{\r
- mp_int q;\r
- mp_word w, t;\r
- mp_digit b;\r
- int res, ix;\r
- \r
- /* b = 2**DIGIT_BIT / 3 */\r
- b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3);\r
-\r
- if ((res = mp_init_size(&q, a->used)) != MP_OKAY) {\r
- return res;\r
- }\r
- \r
- q.used = a->used;\r
- q.sign = a->sign;\r
- w = 0;\r
- for (ix = a->used - 1; ix >= 0; ix--) {\r
- w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]);\r
- \r
- if (w >= 3) {\r
- t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT);\r
- w -= (t << ((mp_word)1)) + t;\r
- while (w >= 3) {\r
- t += 1;\r
- w -= 3;\r
- }\r
- } else {\r
- t = 0;\r
- }\r
- q.dp[ix] = (mp_digit)t;\r
- }\r
- \r
- if (d != NULL) {\r
- *d = (mp_digit)w;\r
- }\r
- \r
- if (c != NULL) {\r
- mp_clamp(&q);\r
- mp_exch(&q, c);\r
- }\r
- mp_clear(&q);\r
- \r
- return res;\r
-}\r
-\r
+#include <tommath.h>
+#ifdef BN_MP_DIV_3_C
+/* LibTomMath, multiple-precision integer library -- Tom St Denis
+ *
+ * LibTomMath is a library that provides multiple-precision
+ * integer arithmetic as well as number theoretic functionality.
+ *
+ * The library was designed directly after the MPI library by
+ * Michael Fromberger but has been written from scratch with
+ * additional optimizations in place.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org
+ */
+
+/* divide by three (based on routine from MPI and the GMP manual) */
+int
+mp_div_3 (mp_int * a, mp_int *c, mp_digit * d)
+{
+ mp_int q;
+ mp_word w, t;
+ mp_digit b;
+ int res, ix;
+
+ /* b = 2**DIGIT_BIT / 3 */
+ b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3);
+
+ if ((res = mp_init_size(&q, a->used)) != MP_OKAY) {
+ return res;
+ }
+
+ q.used = a->used;
+ q.sign = a->sign;
+ w = 0;
+ for (ix = a->used - 1; ix >= 0; ix--) {
+ w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]);
+
+ if (w >= 3) {
+ /* multiply w by [1/3] */
+ t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT);
+
+ /* now subtract 3 * [w/3] from w, to get the remainder */
+ w -= t+t+t;
+
+ /* fixup the remainder as required since
+ * the optimization is not exact.
+ */
+ while (w >= 3) {
+ t += 1;
+ w -= 3;
+ }
+ } else {
+ t = 0;
+ }
+ q.dp[ix] = (mp_digit)t;
+ }
+
+ /* [optional] store the remainder */
+ if (d != NULL) {
+ *d = (mp_digit)w;
+ }
+
+ /* [optional] store the quotient */
+ if (c != NULL) {
+ mp_clamp(&q);
+ mp_exch(&q, c);
+ }
+ mp_clear(&q);
+
+ return res;
+}
+
+#endif