Add qemu 2.4.0
[kvmfornfv.git] / qemu / tests / tcg / cris / check_addcm.c
diff --git a/qemu/tests/tcg/cris/check_addcm.c b/qemu/tests/tcg/cris/check_addcm.c
new file mode 100644 (file)
index 0000000..7928bc9
--- /dev/null
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "sys.h"
+#include "crisutils.h"
+
+/* need to avoid acr as source here.  */
+static inline int cris_addc_m(int a, const int *b)
+{
+       asm volatile ("addc [%1], %0\n" : "+r" (a) : "r" (b));
+       return a;
+}
+
+/* 'b' is a crisv32 constrain to avoid postinc with $acr.  */
+static inline int cris_addc_pi_m(int a, int **b)
+{
+       asm volatile ("addc [%1+], %0\n" : "+r" (a), "+b" (*b));
+       return a;
+}
+
+#define verify_addc_m(a, b, res, n, z, v, c)  \
+{                                           \
+       int r;                              \
+       r = cris_addc_m((a), (b));            \
+       cris_tst_cc((n), (z), (v), (c));    \
+       if (r != (res))                     \
+               err();                      \
+}
+
+#define verify_addc_pi_m(a, b, res, n, z, v, c)  \
+{                                           \
+       int r;                              \
+       r = cris_addc_pi_m((a), (b));            \
+       cris_tst_cc((n), (z), (v), (c));    \
+       if (r != (res))                     \
+               err();                      \
+}
+
+int x[] = { 0, 0, 2, -1, 0xffff, -1, 0x5432f789};
+
+int main(void)
+{
+       int *p = (void *)&x[0];
+#if 1
+       cris_tst_cc_init();
+       asm volatile ("clearf cz");
+       verify_addc_m(0, p, 0, 0, 0, 0, 0);
+
+       cris_tst_cc_init();
+       asm volatile ("setf z");
+       verify_addc_m(0, p, 0, 0, 1, 0, 0);
+
+       cris_tst_cc_init();
+       asm volatile ("setf c");
+       verify_addc_m(0, p, 1, 0, 0, 0, 0);
+
+       cris_tst_cc_init();
+       asm volatile ("clearf c");
+       verify_addc_pi_m(0, &p, 0, 0, 1, 0, 0);
+
+       p = &x[1];
+       cris_tst_cc_init();
+       asm volatile ("setf c");
+       verify_addc_pi_m(0, &p, 1, 0, 0, 0, 0);
+
+       if (p != &x[2])
+               err();
+
+       cris_tst_cc_init();
+       asm volatile ("clearf c");
+       verify_addc_pi_m(-1, &p, 1, 0, 0, 0, 1);
+
+       if (p != &x[3])
+               err();
+#endif
+       p = &x[3];
+       /* TODO: investigate why this one fails.  */
+       cris_tst_cc_init();
+       asm volatile ("setf c");
+       verify_addc_m(2, p, 2, 0, 0, 0, 1);
+       p += 4;
+
+       pass();
+       return 0;
+}