#include #include #include #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; }