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