1 #include<stdio.h>
2 #include<assert.h>
3 
main()4 int main()
5 {
6     int rt, rs, ach, acl, dsp;
7     int result;
8 
9     ach = 0x05;
10     acl = 0xB4CB;
11     dsp = 0x07;
12     rs  = 0x03;
13     result = 0xA0001699;
14 
15     __asm
16         ("wrdsp %1, 0x01\n\t"
17          "mthi %3, $ac1\n\t"
18          "mtlo %4, $ac1\n\t"
19          "extrv.w %0, $ac1, %2\n\t"
20          "rddsp %1\n\t"
21          : "=r"(rt), "+r"(dsp)
22          : "r"(rs), "r"(ach), "r"(acl)
23         );
24     dsp = (dsp >> 23) & 0x01;
25     assert(dsp == 1);
26     assert(result == rt);
27 
28     /* Clear dspcontrol */
29     dsp = 0;
30     __asm
31         ("wrdsp %0\n\t"
32          :
33          : "r"(dsp)
34         );
35 
36     rs = 4;
37     ach = 0x01;
38     acl = 0xB4CB;
39     result = 0x10000B4C;
40     __asm
41         ("wrdsp %1, 0x01\n\t"
42          "mthi %3, $ac1\n\t"
43          "mtlo %4, $ac1\n\t"
44          "extrv.w %0, $ac1, %2\n\t"
45          "rddsp %1\n\t"
46          : "=r"(rt), "+r"(dsp)
47          : "r"(rs), "r"(ach), "r"(acl)
48         );
49     dsp = (dsp >> 23) & 0x01;
50     assert(dsp == 0);
51     assert(result == rt);
52 
53     /* Clear dspcontrol */
54     dsp = 0;
55     __asm
56         ("wrdsp %0\n\t"
57          :
58          : "r"(dsp)
59         );
60 
61     rs = 31;
62     ach = 0x3fffffff;
63     acl = 0x2bcdef01;
64     result = 0x7ffffffe;
65     __asm
66         ("wrdsp %1, 0x01\n\t"
67          "mthi %3, $ac1\n\t"
68          "mtlo %4, $ac1\n\t"
69          "extrv.w %0, $ac1, %2\n\t"
70          "rddsp %1\n\t"
71          : "=r"(rt), "+r"(dsp)
72          : "r"(rs), "r"(ach), "r"(acl)
73         );
74     dsp = (dsp >> 23) & 0x01;
75     assert(dsp == 0);
76     assert(result == rt);
77 
78 
79     return 0;
80 }
81