altos: Make TeleMini v2.0 fit
[fw/altos] / src / test / ao_int64_test.c
index 67ba6ec542cbeb00a82607f081e7e942f650d414..8557a1c79648b2538622d4c79562fb7a4b416bfa 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
+#define __data
+#define __pdata
+#define __xdata
+#define __reentrant
+
 #include <ao_int64.h>
 #include <ao_int64.c>
 #include <stdio.h>
 #include <ao_int64.h>
 #include <ao_int64.c>
 #include <stdio.h>
 
 int    errors;
 
 
 int    errors;
 
-#define test(op,func,a,b,ao_a,ao_b) do {                               \
+#define test_o(op,func,mod,a,b,ao_a,ao_b) do {                         \
                r = (a) op (b);                                         \
                func(&ao_r, ao_a, ao_b);                                \
                c = ao_cast64(&ao_r);                                   \
                if (c != r) {                                           \
                r = (a) op (b);                                         \
                func(&ao_r, ao_a, ao_b);                                \
                c = ao_cast64(&ao_r);                                   \
                if (c != r) {                                           \
-                       printf ("trial %4d: %lld " #func " %lld = %lld (should be %lld)\n", \
+                       printf ("trial %4d: %lld " #func mod " %lld = %lld (should be %lld)\n", \
                                trial, (int64_t) (a), (int64_t) b, c, r); \
                        ++errors;                                       \
                }                                                       \
        } while (0)
 
                                trial, (int64_t) (a), (int64_t) b, c, r); \
                        ++errors;                                       \
                }                                                       \
        } while (0)
 
+#define test(op,func,a,b,ao_a,ao_b) test_o(op,func,"",a,b,ao_a,ao_b)
+
+#define test_a(op,func,a,b,ao_a,ao_b) do {     \
+               ao_r = *ao_a;                   \
+               test_o(op,func,"_a",a,b,&ao_r,ao_b);    \
+       } while (0)
+
+#define test_b(op,func,a,b,ao_a,ao_b) do {     \
+               ao_r = *ao_b;                   \
+               test_o(op,func,"_b",a,b,ao_a,&ao_r);    \
+       } while (0)
+
+#define test_x(op,func,a,b,ao_a,ao_b) do {     \
+               ao_r = *ao_a;                   \
+               test_o(op,func,"_xa",a,a,&ao_r,&ao_r);  \
+               ao_r = *ao_b;                   \
+               test_o(op,func,"_xb",b,b,&ao_r,&ao_r);  \
+       } while (0)
 
 void
 do_test(int trial, int64_t a, int64_t b)
 
 void
 do_test(int trial, int64_t a, int64_t b)
@@ -44,10 +67,24 @@ do_test(int trial, int64_t a, int64_t b)
        ao_int64_init64(&ao_b, b >> 32, b);
 
        test(+, ao_plus64, a, b, &ao_a, &ao_b);
        ao_int64_init64(&ao_b, b >> 32, b);
 
        test(+, ao_plus64, a, b, &ao_a, &ao_b);
-       test(*, ao_mul64,(int64_t) (int32_t) a, (int32_t) b, (int32_t) a, (int32_t) b);
+       test_a(+, ao_plus64, a, b, &ao_a, &ao_b);
+       test_b(+, ao_plus64, a, b, &ao_a, &ao_b);
+       test_x(+, ao_plus64, a, b, &ao_a, &ao_b);
+       test(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test_a(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test_b(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test_x(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test(*, ao_mul64_32_32,(int64_t) (int32_t) a, (int32_t) b, (int32_t) a, (int32_t) b);
+       test(*, ao_mul64, a, b, &ao_a, &ao_b);
+       test_a(*, ao_mul64, a, b, &ao_a, &ao_b);
+       test_b(*, ao_mul64, a, b, &ao_a, &ao_b);
+       test_x(*, ao_mul64, a, b, &ao_a, &ao_b);
+       test(*, ao_mul64_64_16, a, (uint16_t) b, &ao_a, (uint16_t) b);
+       test_a(*, ao_mul64_64_16, a, (uint16_t) b, &ao_a, (uint16_t) b);
        test(>>, ao_rshift64, a, (uint8_t) b & 0x3f, &ao_a, (uint8_t) b & 0x3f);
        test(>>, ao_rshift64, a, (uint8_t) b & 0x3f, &ao_a, (uint8_t) b & 0x3f);
+       test_a(>>, ao_rshift64, a, (uint8_t) b & 0x3f, &ao_a, (uint8_t) b & 0x3f);
        test(<<, ao_lshift64, a, (uint8_t) b & 0x3f, &ao_a, (uint8_t) b & 0x3f);
        test(<<, ao_lshift64, a, (uint8_t) b & 0x3f, &ao_a, (uint8_t) b & 0x3f);
-       test(*, ao_mul64_16, a, (uint16_t) b, &ao_a, (uint16_t) b);
+       test_a(<<, ao_lshift64, a, (uint8_t) b & 0x3f, &ao_a, (uint8_t) b & 0x3f);
 }
 
 #define TESTS  10000000
 }
 
 #define TESTS  10000000