|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.