1//  Test ALU   RND RND12 RND20
2# mach: bfin
3
4.include "testutils.inc"
5	start
6
7
8// positive saturation
9	R0 = 0xffffffff;
10	A0.w = R0;
11	A1.w = R0;
12	R0 = 0x7f (X);
13	A0.x = R0;
14	A1.x = R0;
15	R3 = A1 + A0, R4 = A1 - A0 (S);
16	DBGA ( R3.H , 0x7fff );	DBGA ( R3.L , 0xffff );
17	DBGA ( R4.H , 0x0000 );	DBGA ( R4.L , 0x0000 );
18
19// neg saturation
20	R0 = 0;
21	A0.w = R0;
22	A1.w = R0;
23	R0 = 0x80 (X);
24	A0.x = R0;
25	A1.x = R0;
26	R3 = A1 + A0, R4 = A1 - A0 (S);
27	DBGA ( R3.H , 0x8000 );	DBGA ( R3.L , 0x0000 );
28	DBGA ( R4.H , 0x0000 );	DBGA ( R4.L , 0x0000 );
29
30// positive saturation
31	R0 = 0xfffffff0;
32	A0.w = R0;
33	A1.w = R0;
34	R0 = 0x01;
35	A0.x = R0;
36	A1.x = R0;
37	R3 = A1 + A0, R4 = A1 - A0 (S);
38	DBGA ( R3.H , 0x7fff );	DBGA ( R3.L , 0xffff );
39	DBGA ( R4.H , 0x0000 );	DBGA ( R4.L , 0x0000 );
40
41// no sat
42	R0 = 0xfffffff0;
43	A0.w = R0;
44	A1.w = R0;
45	R0 = 0x01;
46	A0.x = R0;
47	A1.x = R0;
48	R3 = A1 + A0, R4 = A1 - A0 (NS);
49	DBGA ( R3.H , 0xffff );	DBGA ( R3.L , 0xffe0 );
50	DBGA ( R4.H , 0x0000 );	DBGA ( R4.L , 0x0000 );
51
52// add and sub +1 -1
53	R0 = 0x00000001;
54	A0.w = R0;
55	R0 = 0xffffffff;
56	A1.w = R0;
57	R0 = 0;
58	A0.x = R0;
59	R0 = 0xff (X);
60	A1.x = R0;
61	R3 = A1 + A0, R4 = A1 - A0 (NS);
62	DBGA ( R3.H , 0x0000 );	DBGA ( R3.L , 0x0000 ); // 0
63	DBGA ( R4.H , 0xffff );	DBGA ( R4.L , 0xfffe ); // -2
64
65// should get the same with saturation
66	R3 = A1 + A0, R4 = A1 - A0 (S);
67	DBGA ( R3.H , 0x0000 );	DBGA ( R3.L , 0x0000 ); // 0
68	DBGA ( R4.H , 0xffff );	DBGA ( R4.L , 0xfffe ); // -2
69
70// add and sub -1 +1 but with reverse order of A0 A1
71	R0 = 0x00000001;
72	A0.w = R0;
73	R0 = 0xffffffff;
74	A1.w = R0;
75	R0 = 0;
76	A0.x = R0;
77	R0 = 0xff (X);
78	A1.x = R0;
79	R3 = A0 + A1, R4 = A0 - A1 (NS);
80	DBGA ( R3.H , 0x0000 );	DBGA ( R3.L , 0x0000 );
81	DBGA ( R4.H , 0x0000 );	DBGA ( R4.L , 0x0002 );
82
83	pass
84