1//  MAC test program.
2//  Test basic edge values
3//  SIGNED INTEGER mode
4//  test ops: "+=" "-=" "=" "NOP"
5# mach: bfin
6
7.include "testutils.inc"
8	start
9
10
11// load r0=0x80007fff
12// load r1=0x80007fff
13// load r2=0xf0000000
14// load r3=0x0000007f
15// load r4=0x00000080
16	loadsym P0, data0;
17	R0 = [ P0 ++ ];
18	R1 = [ P0 ++ ];
19	R2 = [ P0 ++ ];
20	R3 = [ P0 ++ ];
21	R4 = [ P0 ++ ];
22
23// 0x7fff * 0x7fff = 0x003fff0001
24	A1 = A0 = 0;
25	A1 += R0.L * R1.L, A0 += R0.L * R1.L (IS);
26	R6 = A1.w;
27	R7.L = A1.x;
28	DBGA ( R6.L , 0x0001 );
29	DBGA ( R6.H , 0x3fff );
30	DBGA ( R7.L , 0x0000 );
31
32// 0x8000 * 0x7fff = 0xffc0008000
33	A1 = A0 = 0;
34	A1 += R0.H * R1.L, A0 += R0.H * R1.L (IS);
35	R6 = A1.w;
36	R7.L = A1.x;
37	DBGA ( R6.L , 0x8000 );
38	DBGA ( R6.H , 0xc000 );
39	DBGA ( R7.L , 0xffff );
40
41// 0x8000 * 0x8000 = 0x0040000000
42	A1 = A0 = 0;
43	A1 += R0.H * R1.H, A0 += R0.H * R1.H (IS);
44	R6 = A1.w;
45	R7.L = A1.x;
46	DBGA ( R6.L , 0x0000 );
47	DBGA ( R6.H , 0x4000 );
48	DBGA ( R7.L , 0x0000 );
49
50// saturate positive by first loading large value into accums
51// expected value is 0x7fffffffff
52	A1 = A0 = 0;
53	A1.w = R2;
54	A1.x = R3.L;
55	A0.w = R2;
56	A0.x = R3.L;
57	A1 += R0.L * R1.L, A0 += R0.L * R1.L (IS);
58	R6 = A1.w;
59	R7.L = A1.x;
60	DBGA ( R6.L , 0xffff );
61	DBGA ( R6.H , 0xffff );
62	DBGA ( R7.L , 0x007f );
63
64// saturate negative
65// expected value is 0x8000000000
66	A1 = A0 = 0;
67	A1.x = R4.L;
68	A0.x = R4.L;
69	A1 += R0.L * R1.H, A0 += R0.L * R1.H (IS);
70	R6 = A1.w;
71	R7.L = A1.x;
72	DBGA ( R6.L , 0x0000 );
73	DBGA ( R6.H , 0x0000 );
74	DBGA ( R7.L , 0xff80 );
75
76// saturate positive with "-="
77// expected value is 0x7fffffffff
78	A1 = A0 = 0;
79	A1.w = R2;
80	A1.x = R3.L;
81	A0.w = R2;
82	A0.x = R3.L;
83	A1 -= R0.H * R1.L, A0 -= R0.H * R1.L (IS);
84	R6 = A1.w;
85	R7.L = A1.x;
86	DBGA ( R6.L , 0xffff );
87	DBGA ( R6.H , 0xffff );
88	DBGA ( R7.L , 0x007f );
89
90// saturate negative with "-="
91// expected value is 0x8000000000
92	A1 = A0 = 0;
93	A1.x = R4.L;
94	A0.x = R4.L;
95	A1 -= R0.L * R1.L, A0 -= R0.L * R1.L (IS);
96	R6 = A1.w;
97	R7.L = A1.x;
98	DBGA ( R6.L , 0x0000 );
99	DBGA ( R6.H , 0x0000 );
100	DBGA ( R7.L , 0xff80 );
101
102// 0x8000 * 0x8000 = 0xffc0000000 with "-="
103	A1 = A0 = 0;
104	A1 -= R0.H * R1.H, A0 -= R0.H * R1.H (IS);
105	R6 = A1.w;
106	R7.L = A1.x;
107	DBGA ( R6.L , 0x0000 );
108	DBGA ( R6.H , 0xc000 );
109	DBGA ( R7.L , 0xffff );
110
111	pass
112
113	.data 0x1000;
114data0:
115	.dw 0x7fff
116	.dw 0x8000
117	.dw 0x7fff
118	.dw 0x8000
119	.dw 0x0000
120	.dw 0xf000
121	.dw 0x007f
122	.dw 0x0000
123	.dw 0x0080
124	.dw 0x0000
125