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;
241:	fail
252:
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
127