1//  Test result extraction of mac instructions.
2//  Test basic edge values
3//  SIGNED FRACTIONAL mode into SINGLE destination register
4//  test ops: "+="
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// simple extraction with no saturation
24// 0x7fff * 0x7fff = 0x007ffe0002 -> 0x7ffe
25	R7 = 0;
26	ASTAT = R7;
27	A1 = A0 = 0;
28	R5.H = (A1 += R0.L * R1.L), R5.L = (A0 += R0.L * R1.L);
29	DBGA ( R5.L , 0x7ffe );
30	DBGA ( R5.H , 0x7ffe );
31	_DBG ASTAT;
32	R7 = ASTAT;
33	DBGA (R7.H, 0x0);
34	DBGA (R7.L, 0x0);
35
36// positive saturation at 32 bits
37// 0x0 * 0x0 + 0x7ff0000000 -> 0x7fff
38	R7 = 0;
39	ASTAT = R7;
40	A1 = A0 = 0;
41	A1.w = R2;
42	A1.x = R3.L;
43	A0.x = R3.L;
44	A0.w = R2;
45	R5.H = (A1 += R0.L * R2.L), R5.L = (A0 += R0.L * R2.L);
46	_DBG A1;
47	_DBG A0;
48	DBGA ( R5.L , 0x7fff );
49	DBGA ( R5.H , 0x7fff );
50	_DBG ASTAT;
51	R7 = ASTAT;
52	_DBG R7;
53	DBGA (R7.H, 0x300);
54	DBGA (R7.L, 0x8);
55
56// positive saturation at 32 bits
57// 0x7fff * 0x7fff + 0x7ff0000000 -> 0x7fff
58	R7 = 0;
59	ASTAT = R7;
60	A1 = A0 = 0;
61	A1.w = R2;
62	A1.x = R3.L;
63	A0.w = R2;
64	A0.x = R3.L;
65	R5.H = (A1 += R0.L * R1.L), R5.L = (A0 += R0.L * R1.L);
66	DBGA ( R5.L , 0x7fff );
67	DBGA ( R5.H , 0x7fff );
68	_DBG ASTAT;
69	R7 = ASTAT;
70	DBGA (R7.H, 0x30f);
71	DBGA (R7.L, 0x8);
72
73// negative saturation at 32 bits
74// 0x0 * 0x0 + 0x80f0000000 -> 0x8000
75	R7 = 0;
76	ASTAT = R7;
77	A1 = A0 = 0;
78	A1.w = R2;
79	A1.x = R4.L;
80	A0.w = R2;
81	A0.x = R4.L;
82	R5.H = (A1 += R0.L * R2.L), R5.L = (A0 += R0.L * R2.L);
83	DBGA ( R5.L , 0x8000 );
84	DBGA ( R5.H , 0x8000 );
85	_DBG A1;
86	_DBG A0;
87	_DBG ASTAT;
88	R7=ASTAT;
89	_DBG R7;
90	DBGA (R7.H, 0x300);
91	DBGA (R7.L, 0x0008);
92
93// negative saturation at 32 bits
94// 0x7fff * 0x8000 + 0x80f0000000 -> 0x8000
95	R7 = 0;
96	ASTAT = R7;
97	A1 = A0 = 0;
98	A1.w = R2;
99	A1.x = R4.L;
100	A0.w = R2;
101	A0.x = R4.L;
102	R5.H = (A1 += R0.H * R1.L), R5.L = (A0 += R0.H * R1.L);
103	DBGA ( R5.L , 0x8000 );
104	DBGA ( R5.H , 0x8000 );
105	R7=ASTAT;
106	_DBG ASTAT;
107	DBGA (R7.H, 0x300);
108	DBGA (R7.L, 0x0008);
109
110// negative saturation at 32 bits on MAC only
111// 0x7fff * 0x8000 + 0x80f0000000 -> 0x8000
112	R7 = 0;
113	ASTAT = R7;
114	A1 = A0 = 0;
115	A0.w = R2;
116	A0.x = R4.L;
117	_DBG ASTAT;
118	R5.H = A1, R5.L = (A0 += R0.H * R1.L);
119	_DBG A0;
120	DBGA ( R5.L , 0x8000 );
121	DBGA ( R5.H , 0x0000 );
122	R7=ASTAT;
123	_DBG ASTAT;
124	DBGA (R7.H, 0x300);
125	DBGA (R7.L, 0x0009);
126
127// 0x0100 * 0x0100 = 0x00020000 -> 0x0002
128	R7 = 0;
129	ASTAT = R7;
130	R0.L = 0x0100;
131	R1.L = 0x0100;
132	A1 = A0 = 0;
133	R5.H = (A1 = R0.L * R1.L), R5.L = (A0 = R0.L * R1.L) (T);
134	DBGA ( R5.L , 0x0002 );
135	DBGA ( R5.H , 0x0002 );
136	R7 = ASTAT;
137	DBGA (R7.H, 0x000);
138	DBGA (R7.L, 0x000);
139
140	pass
141
142	.data
143data0:
144	.dw 0x7fff
145	.dw 0x8000
146	.dw 0x7fff
147	.dw 0x8000
148	.dw 0x0000
149	.dw 0xf000
150	.dw 0x007f
151	.dw 0x0000
152	.dw 0x0080
153	.dw 0x0000
154