tizen 2.4 release
[external/binutils.git] / sim / testsuite / sim / bfin / cc-alu.S
1 # Blackfin testcase for CC/A0/A1 compares
2 # mach: bfin
3
4 #include "test.h"
5         .include "testutils.inc"
6
7         start
8
9 /* Clear ASTAT before test */
10 #define CHECK_ASTAT(op, exp) ASTAT = R2; CC = A0 op A1; check_astat exp
11         .macro check_astat exp:req
12         R5 = ASTAT;
13         R6 = \exp;
14         CC = R5 == R6;
15         IF !CC JUMP 1f;
16         .endm
17
18         .macro _acc_test exp_eq:req, exp_le:req, exp_lt:req
19         CHECK_ASTAT(==, \exp_eq)
20         CHECK_ASTAT(<=, \exp_le)
21         CHECK_ASTAT(<, \exp_lt)
22
23         jump 2f;
24 1:      fail
25 2:
26         .endm
27
28         .macro acc_test acc0:req, acc1:req, eq:req, le:req, lt:req
29         dmm32 A0, \acc0
30         dmm32 A1, \acc1
31         _acc_test \eq, \le, \lt
32         .endm
33
34         .macro acc_ex_test a0x:req, a0w:req, a1x:req, a1w:req, eq:req, le:req, lt:req
35         imm32 R0, \a0w
36         A0.W = R0;
37         R0 = \a0x;
38         A0.X = R0;
39         imm32 R1, \a1w
40         A1.W = R1;
41         R1 = \a1x;
42         A1.X = R1;
43         _acc_test \eq, \le, \lt
44         .endm
45
46         # Keep R2 with a value of 0
47         imm32 R2, 0
48
49 #define _EQ     _AC0|_CC|_AC0_COPY|_AZ, _AC0|_CC|_AC0_COPY|_AZ, _AC0|    _AC0_COPY|_AZ
50 #define _POS_GT                    _AN,      _CC|          _AN,      _CC|          _AN
51 #define _POS_LT _AC0|    _AC0_COPY    , _AC0|    _AC0_COPY    , _AC0|    _AC0_COPY
52 #define _NEG_GT _AC0|    _AC0_COPY|_AN, _AC0|_CC|_AC0_COPY|_AN, _AC0|_CC|_AC0_COPY|_AN
53 #define _NEG_LT 0, 0, 0
54
55         # Simple tests around zero
56         acc_test      0,      0, _EQ
57         acc_test      0,      1, _POS_GT
58         acc_test      0,  10000, _POS_GT
59         acc_test      1,      0, _POS_LT
60         acc_test  10000,      0, _POS_LT
61         acc_test      0,     -1, _NEG_LT
62         acc_test      0, -10000, _NEG_LT
63         acc_test     -1,      0, _NEG_GT
64         acc_test -10000,      0, _NEG_GT
65
66         # Simple positive-only tests
67         acc_test      1,      1, _EQ
68         acc_test  10000,  10000, _EQ
69         acc_test      1,      2, _POS_GT
70         acc_test      1,  20000, _POS_GT
71         acc_test      2,      1, _POS_LT
72         acc_test  20000,      1, _POS_LT
73
74         # Simple negative-only tests
75         acc_test     -1,     -1, _EQ
76         acc_test -10000, -10000, _EQ
77         acc_test     -1,     -2, _POS_LT
78         acc_test     -1, -20000, _POS_LT
79         acc_test     -2,     -1, _POS_GT
80         acc_test -20000,     -1, _POS_GT
81
82         # Simple postitive/negative tests
83         acc_test      1,     -1, _NEG_LT
84         acc_test     -1,      1, _NEG_GT
85         acc_test      1, -10000, _NEG_LT
86         acc_test -10000,      1, _NEG_GT
87         acc_test     -1,  10000, _NEG_GT
88         acc_test  10000,     -1, _NEG_LT
89         acc_test -10000,  10000, _NEG_GT
90         acc_test  10000, -10000, _NEG_LT
91
92         # Max boundary limits
93 #define MAX_POS 0x7f, 0xffffffff
94 #define MAX_NEG 0x80, 0x00000000
95         acc_ex_test    0, 0, MAX_POS, _POS_GT
96         acc_ex_test MAX_POS,    0, 0, _POS_LT
97         acc_ex_test    0, 1, MAX_POS, _POS_GT
98         acc_ex_test MAX_POS,    0, 1, _POS_LT
99         acc_ex_test  -1, -1, MAX_POS, _NEG_GT
100         acc_ex_test MAX_POS,  -1, -1, _NEG_LT
101         acc_ex_test MAX_POS, MAX_POS, _EQ
102         acc_ex_test    0, 0, MAX_POS, _POS_GT
103         acc_ex_test MAX_POS,    0, 0, _POS_LT
104         acc_ex_test    0, 1, MAX_POS, _POS_GT
105         acc_ex_test MAX_POS,    0, 1, _POS_LT
106         acc_ex_test  -1, -1, MAX_POS, _NEG_GT
107         acc_ex_test MAX_POS,  -1, -1, _NEG_LT
108
109         acc_ex_test    0, 0, MAX_NEG, _NEG_LT
110         acc_ex_test MAX_NEG,    0, 0, _NEG_GT
111         acc_ex_test    0, 1, MAX_NEG, _NEG_LT
112         acc_ex_test MAX_NEG,    0, 1, _NEG_GT
113         acc_ex_test  -1, -1, MAX_NEG, _POS_LT
114         acc_ex_test MAX_NEG,  -1, -1, _POS_GT
115         acc_ex_test MAX_NEG, MAX_NEG, _EQ
116         acc_ex_test    0, 0, MAX_NEG, _NEG_LT
117         acc_ex_test MAX_NEG,    0, 0, _NEG_GT
118         acc_ex_test    0, 1, MAX_NEG, _NEG_LT
119         acc_ex_test MAX_NEG,    0, 1, _NEG_GT
120         acc_ex_test  -1, -1, MAX_NEG, _POS_LT
121         acc_ex_test MAX_NEG,  -1, -1, _POS_GT
122
123         acc_ex_test MAX_POS, MAX_NEG, _NEG_LT
124         acc_ex_test MAX_NEG, MAX_POS, _NEG_GT
125
126         pass