|
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(); /* dont 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(); /* dont 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(); /* dont 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(); /* dont 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(1, 1, 1, 1); |
|
89 asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); |
|
90 if (*(uint16_t*)r != 0xff22) |
|
91 err(); |
|
92 |
|
93 mb(); /* dont 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(); /* dont 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(); /* dont 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(1, 1, 1, 1); |
|
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 } |