1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdint.h> 4 #include "sys.h" 5 #include "crisutils.h" 6 7 /* this would be better to do in asm, it's an orgy in GCC inline asm now. */ 8 9 #define cris_addo_b(o, v) \ 10 asm volatile ("addo.b\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr"); 11 #define cris_addo_w(o, v) \ 12 asm volatile ("addo.w\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr"); 13 #define cris_addo_d(o, v) \ 14 asm volatile ("addo.d\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr"); 15 #define cris_addo_pi_b(o, v) \ 16 asm volatile ("addo.b\t[%0+], %1, $acr\n" \ 17 : "+b" (o): "r" (v) : "acr"); 18 #define cris_addo_pi_w(o, v) \ 19 asm volatile ("addo.w\t[%0+], %1, $acr\n" \ 20 : "+b" (o): "r" (v) : "acr"); 21 #define cris_addo_pi_d(o, v) \ 22 asm volatile ("addo.d\t[%0+], %1, $acr\n" \ 23 : "+b" (o): "r" (v) : "acr"); 24 25 struct { 26 uint32_t v1; 27 uint16_t v2; 28 uint32_t v3; 29 uint8_t v4; 30 uint8_t v5; 31 uint16_t v6; 32 uint32_t v7; 33 } y = { 34 32769, 35 -1, 36 5, 37 3, -4, 38 2, 39 -76789887 40 }; 41 42 static int x[3] = {0x55aa77ff, 0xccff2244, 0x88ccee19}; 43 44 int main(void) 45 { 46 int *r; 47 unsigned char *t, *p; 48 49 /* Note, this test-case will trig an unaligned access, partly 50 to x[0] and to [x1]. */ 51 t = (unsigned char *)x; 52 t -= 32768; 53 p = (unsigned char *) &y.v1; 54 mb(); /* don't reorder anything beyond here. */ 55 cris_tst_cc_init(); 56 asm volatile ("setf\tzvnc\n"); 57 cris_addo_pi_d(p, t); 58 cris_tst_cc(1, 1, 1, 1); 59 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 60 if (*r != 0x4455aa77) 61 err(); 62 63 64 t += 32770; 65 mb(); /* don't reorder anything beyond here. */ 66 cris_tst_cc_init(); 67 asm volatile ("setf\tzvnc\n"); 68 cris_addo_pi_w(p, t); 69 cris_tst_cc(1, 1, 1, 1); 70 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 71 if (*r != 0x4455aa77) 72 err(); 73 74 mb(); /* don't reorder anything beyond here. */ 75 cris_tst_cc_init(); 76 asm volatile ("setf\tzvnc\n"); 77 cris_addo_d(p, r); 78 cris_tst_cc(1, 1, 1, 1); 79 p += 4; 80 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 81 if (*r != 0xee19ccff) 82 err(); 83 84 mb(); /* don't reorder anything beyond here. */ 85 cris_tst_cc_init(); 86 asm volatile ("setf\tzvnc\n"); 87 cris_addo_pi_b(p, t); 88 cris_tst_cc(0, 0, 0, 0); 89 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 90 if (*(uint16_t*)r != 0xff22) 91 err(); 92 93 mb(); /* don't reorder anything beyond here. */ 94 cris_tst_cc_init(); 95 asm volatile ("setf\tzvnc\n"); 96 cris_addo_b(p, r); 97 cris_tst_cc(1, 1, 1, 1); 98 p += 1; 99 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 100 if (*r != 0x4455aa77) 101 err(); 102 103 mb(); /* don't reorder anything beyond here. */ 104 cris_tst_cc_init(); 105 asm volatile ("setf\tzvnc\n"); 106 cris_addo_w(p, r); 107 cris_tst_cc(1, 1, 1, 1); 108 p += 2; 109 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 110 if (*r != 0xff224455) 111 err(); 112 113 mb(); /* don't reorder anything beyond here. */ 114 cris_tst_cc_init(); 115 asm volatile ("setf\tzvnc\n"); 116 cris_addo_pi_d(p, t); 117 cris_tst_cc(0, 0, 0, 0); 118 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); 119 r = (void*)(((char *)r) + 76789885); 120 if (*r != 0x55aa77ff) 121 err(); 122 123 pass(); 124 return 0; 125 } 126