1/* Tests the MAC instructions.
2
3   Copyright (C) 2017-2023 Free Software Foundation, Inc.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 3 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18# mach: or1k
19# output: report(0x00000000);\n
20# output: report(0x00000006);\n
21# output: report(0x00000000);\n
22# output: report(0x0000000c);\n
23# output: report(0x00000001);\n
24# output: report(0x00000000);\n
25# output: report(0x40000000);\n
26# output: report(0x00000000);\n
27# output: report(0x00000000);\n
28# output: report(0x00000000);\n
29# output: report(0xffffffff);\n
30# output: report(0x00000006);\n
31# output: report(0x80000000);\n
32# output: report(0x00000006);\n
33# output: report(0x00000000);\n
34# output: report(0x7ffffffe);\n
35# output: report(0x00000000);\n
36# output: report(0x80000000);\n
37# output: report(0x00000001);\n
38# output: report(0x00000000);\n
39# output: report(0x7fffffff);\n
40# output: report(0xffffffff);\n
41# output: report(0x00000000);\n
42# output: report(0x7ffffffd);\n
43# output: report(0x00000000);\n
44# output: report(0x00000000);\n
45# output: report(0xffffffff);\n
46# output: report(0x00000000);\n
47# output: report(0x00000000);\n
48# output: report(0x00000006);\n
49# output: report(0x00000000);\n
50# output: report(0x0000000c);\n
51# output: report(0x00000000);\n
52# output: report(0x00000005);\n
53# output: report(0xffffffff);\n
54# output: report(0xfffffffa);\n
55# output: report(0x00000000);\n
56# output: report(0x00000006);\n
57# output: report(0x00000000);\n
58# output: report(0xffffffff);\n
59# output: report(0x7fffffff);\n
60# output: report(0xfffffff9);\n
61# output: report(0xffffffff);\n
62# output: report(0xfffffff9);\n
63# output: report(0xfffffffe);\n
64# output: report(0xffffffff);\n
65# output: report(0x80000000);\n
66# output: report(0x00000000);\n
67# output: report(0xffffffff);\n
68# output: report(0x80000000);\n
69# output: report(0xffffffff);\n
70# output: report(0x80000006);\n
71# output: report(0x00000000);\n
72# output: report(0x00000000);\n
73# output: report(0x7fffffff);\n
74# output: report(0x7fffffff);\n
75# output: report(0xffffffff);\n
76# output: report(0x7fffffff);\n
77# output: report(0xfffffffe);\n
78# output: report(0xffffffff);\n
79# output: report(0x80000000);\n
80# output: report(0x00000000);\n
81# output: report(0x00000000);\n
82# output: report(0x00000006);\n
83# output: report(0x00000000);\n
84# output: report(0x0000000c);\n
85# output: report(0x00000001);\n
86# output: report(0x00000000);\n
87# output: report(0x40000000);\n
88# output: report(0x00000000);\n
89# output: report(0x00000000);\n
90# output: report(0x00000000);\n
91# output: report(0xffffffff);\n
92# output: report(0x00000006);\n
93# output: report(0x80000000);\n
94# output: report(0x00000006);\n
95# output: report(0x00000000);\n
96# output: report(0x7ffffffe);\n
97# output: report(0x00000000);\n
98# output: report(0x80000000);\n
99# output: report(0x00000001);\n
100# output: report(0x00000000);\n
101# output: report(0x7fffffff);\n
102# output: report(0xffffffff);\n
103# output: report(0x00000000);\n
104# output: report(0x7ffffffd);\n
105# output: report(0x00000000);\n
106# output: report(0x00000000);\n
107# output: report(0xffffffff);\n
108# output: report(0x00000000);\n
109# output: report(0x00000000);\n
110# output: report(0x00000006);\n
111# output: report(0x00000000);\n
112# output: report(0x0000000c);\n
113# output: report(0x00000000);\n
114# output: report(0x00000005);\n
115# output: report(0xffffffff);\n
116# output: report(0xfffffffa);\n
117# output: report(0x00000000);\n
118# output: report(0x00000006);\n
119# output: report(0x00000000);\n
120# output: report(0xffffffff);\n
121# output: report(0x7fffffff);\n
122# output: report(0xfffffff9);\n
123# output: report(0xffffffff);\n
124# output: report(0xfffffff9);\n
125# output: report(0xfffffffe);\n
126# output: report(0xffffffff);\n
127# output: report(0x80000000);\n
128# output: report(0x00000000);\n
129# output: report(0xffffffff);\n
130# output: report(0x80000000);\n
131# output: report(0xffffffff);\n
132# output: report(0x80000006);\n
133# output: report(0x00000000);\n
134# output: report(0x00000000);\n
135# output: report(0x7fffffff);\n
136# output: report(0x7fffffff);\n
137# output: report(0xffffffff);\n
138# output: report(0x7fffffff);\n
139# output: report(0xfffffffe);\n
140# output: report(0xffffffff);\n
141# output: report(0x80000000);\n
142# output: report(0x00000000);\n
143# output: report(0x00000006);\n
144# output: report(0x0000000c);\n
145# output: report(0x00000000);\n
146# output: report(0x00000000);\n
147# output: report(0x00000000);\n
148# output: report(0x00000006);\n
149# output: report(0x00000006);\n
150# output: report(0x7ffffffe);\n
151# output: report(0x80000000);\n
152# output: report(0x00000000);\n
153# output: report(0xffffffff);\n
154# output: report(0x7ffffffd);\n
155# output: report(0x00000000);\n
156# output: report(0x00000000);\n
157# output: report(0x00000006);\n
158# output: report(0x0000000c);\n
159# output: report(0x00000005);\n
160# output: report(0xfffffffa);\n
161# output: report(0x00000006);\n
162# output: report(0xffffffff);\n
163# output: report(0xfffffff9);\n
164# output: report(0xfffffff9);\n
165# output: report(0xffffffff);\n
166# output: report(0x00000000);\n
167# output: report(0x80000000);\n
168# output: report(0x80000006);\n
169# output: report(0x00000000);\n
170# output: report(0x7fffffff);\n
171# output: report(0x7fffffff);\n
172# output: report(0xffffffff);\n
173# output: report(0x00000000);\n
174# output: report(0xffffffff);\n
175# output: report(0xfffffffa);\n
176# output: report(0x00000000);\n
177# output: report(0x00000006);\n
178# output: report(0x00000000);\n
179# output: report(0xfffffffa);\n
180# output: report(0x3fffffff);\n
181# output: report(0xfffffffa);\n
182# output: report(0xffffffff);\n
183# output: report(0xfffffff4);\n
184# output: report(0xfffffffe);\n
185# output: report(0xffffffff);\n
186# output: report(0x80000000);\n
187# output: report(0x00000000);\n
188# output: report(0xffffffff);\n
189# output: report(0x80000002);\n
190# output: report(0xffffffff);\n
191# output: report(0x80000004);\n
192# output: report(0x00000000);\n
193# output: report(0x00000004);\n
194# output: report(0x7ffffffe);\n
195# output: report(0xffffffff);\n
196# output: report(0xffffffff);\n
197# output: report(0x80000001);\n
198# output: report(0xffffffff);\n
199# output: report(0x00000004);\n
200# output: report(0xfffffffe);\n
201# output: report(0x00000004);\n
202# output: report(0x00000000);\n
203# output: report(0x00000000);\n
204# output: report(0x00000000);\n
205# output: report(0x00000006);\n
206# output: report(0xffffffff);\n
207# output: report(0xfffffff9);\n
208# output: report(0x00000000);\n
209# output: report(0x00000006);\n
210# output: report(0x00000000);\n
211# output: report(0x0000000c);\n
212# output: report(0x00000001);\n
213# output: report(0x00000005);\n
214# output: report(0x7fffffff);\n
215# output: report(0xffffffff);\n
216# output: report(0xffffffff);\n
217# output: report(0xffffffff);\n
218# output: report(0xffffffff);\n
219# output: report(0x00000005);\n
220# output: report(0x80000000);\n
221# output: report(0x00000006);\n
222# output: report(0x00000000);\n
223# output: report(0x80000000);\n
224# output: report(0x00000000);\n
225# output: report(0x80000006);\n
226# output: report(0x00000001);\n
227# output: report(0x00000000);\n
228# output: report(0x7fffffff);\n
229# output: report(0xffffffff);\n
230# output: report(0x00000000);\n
231# output: report(0x7fffffff);\n
232# output: report(0xffffffff);\n
233# output: report(0x7fffffff);\n
234# output: report(0x80000000);\n
235# output: report(0x80000000);\n
236# output: exit(0)\n
237
238#include "or1k-asm-test-helpers.h"
239
240	.macro TEST_MACRC mac_hi, mac_lo, op1, op2
241	LOAD_IMMEDIATE r2, \mac_hi
242	MOVE_TO_SPR SPR_MACHI, r2
243	LOAD_IMMEDIATE r2, \mac_lo
244	MOVE_TO_SPR SPR_MACLO, r2
245	LOAD_IMMEDIATE r5, \op1
246	LOAD_IMMEDIATE r6, \op2
247	l.mac   r5, r6
248	l.macrc r3
249	REPORT_REG_TO_CONSOLE r3
250	.endm
251
252	.macro TEST_MAC mac_hi, mac_lo, op1, op2
253	LOAD_IMMEDIATE r2, \mac_hi
254	MOVE_TO_SPR SPR_MACHI, r2
255	LOAD_IMMEDIATE r2, \mac_lo
256	MOVE_TO_SPR SPR_MACLO, r2
257	LOAD_IMMEDIATE r5, \op1
258	LOAD_IMMEDIATE r6, \op2
259	l.mac r5, r6
260	MOVE_FROM_SPR r3, SPR_MACHI
261	REPORT_REG_TO_CONSOLE r3
262	MOVE_FROM_SPR r3, SPR_MACLO
263	REPORT_REG_TO_CONSOLE r3
264	.endm
265
266	.macro TEST_MACI mac_hi, mac_lo, op1, op2_immediate
267	LOAD_IMMEDIATE r2, \mac_hi
268	MOVE_TO_SPR SPR_MACHI, r2
269	LOAD_IMMEDIATE r2, \mac_lo
270	MOVE_TO_SPR SPR_MACLO, r2
271	LOAD_IMMEDIATE r5, \op1
272	l.maci r5, \op2_immediate
273	MOVE_FROM_SPR r3, SPR_MACHI
274	REPORT_REG_TO_CONSOLE r3
275	MOVE_FROM_SPR r3, SPR_MACLO
276	REPORT_REG_TO_CONSOLE r3
277	.endm
278
279	.macro TEST_MSB mac_hi, mac_lo, op1, op2
280	LOAD_IMMEDIATE r2, \mac_hi
281	MOVE_TO_SPR SPR_MACHI, r2
282	LOAD_IMMEDIATE r2, \mac_lo
283	MOVE_TO_SPR SPR_MACLO, r2
284	LOAD_IMMEDIATE r5, \op1
285	LOAD_IMMEDIATE r6, \op2
286	l.msb r5, r6
287	MOVE_FROM_SPR r3, SPR_MACHI
288	REPORT_REG_TO_CONSOLE r3
289	MOVE_FROM_SPR r3, SPR_MACLO
290	REPORT_REG_TO_CONSOLE r3
291	.endm
292
293	STANDARD_TEST_ENVIRONMENT
294
295	.section .text
296start_tests:
297	PUSH LINK_REGISTER_R9
298
299	/* Test the l.mac instruction.  */
300
301	/* two small positive numbers  */
302
303	/* MAC two small positive numbers on a zero total  */
304	TEST_MAC 0x00000000, 0x00000000, 0x00000002, 0x00000003
305
306	/* MAC two small positive numbers on a small positive total  */
307	TEST_MAC 0x00000000, 0x00000006, 0x00000002, 0x00000003,
308
309	/* MAC two small positive numbers on a moderate positive total  */
310	TEST_MAC 0x00000000, 0xfffffffa, 0x00000002, 0x00000003
311
312	/* MAC two small positive numbers on a large positive total  */
313	TEST_MAC 0x3fffffff, 0xfffffffa, 0x00000002, 0x00000003
314
315	/* MAC two small positive numbers on a small negative total  */
316	TEST_MAC 0xffffffff, 0xfffffffa, 0x00000002, 0x00000003
317
318	/* MAC two small positive numbers on a moderate negative total  */
319	TEST_MAC 0xffffffff, 0x00000000, 0x00000002, 0x00000003
320
321	/* MAC two small positive numbers on a large negative total  */
322	TEST_MAC 0x80000000, 0x00000000, 0x00000002, 0x00000003
323
324	/* two moderate positive numbers  */
325
326	/* MAC two moderate positive numbers on a zero total  */
327	TEST_MAC 0x00000000, 0x00000000, 0x00008001, 0x0000fffe
328
329	/* MAC two moderate positive numbers on a small positive total  */
330	TEST_MAC 0x00000000, 0x00000002, 0x00008001, 0x0000fffe
331
332	/* MAC two moderate positive numbers on a moderate positive total  */
333	TEST_MAC 0x00000000, 0x80000002, 0x00008001, 0x0000fffe
334
335	/* MAC two moderate positive numbers on a large positive total  */
336	TEST_MAC 0x7fffffff, 0x80000001, 0x00008001, 0x0000fffe
337
338	/* MAC two moderate positive numbers on a small negative total  */
339	TEST_MAC 0xffffffff, 0xffffffff, 0x00008001, 0x0000fffe
340
341	/* MAC two moderate positive numbers on a moderate negative total  */
342	TEST_MAC 0xffffffff, 0x80000002, 0x00008001, 0x0000fffe
343
344	/* MAC two moderate positive numbers on a large negative total  */
345	TEST_MAC 0xfffffffe, 0x80000002, 0x00008001, 0x0000fffe
346
347	/* two small negative numbers  */
348
349	/* MAC two small negative numbers on a zero total  */
350	TEST_MAC 0x00000000, 0x00000000, 0xfffffffe, 0xfffffffd
351
352	/* MAC two small negative numbers on a small positive total  */
353	TEST_MAC 0x00000000, 0x00000006, 0xfffffffe, 0xfffffffd
354
355	/* MAC two small negative numbers on a small negative total  */
356	TEST_MAC 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffffd
357
358	/* one small positive and one small negative  */
359
360	/* MAC one small positive and one small negative number on a zero
361	   total  */
362	TEST_MAC 0x00000000, 0x00000000, 0x00000002, 0xfffffffd
363
364	/* MAC one small positive and one small negative number on a small
365	   positive total  */
366	TEST_MAC 0x00000000, 0x0000000c, 0x00000002, 0xfffffffd
367
368	/* MAC one small positive and one small negative number on a
369	   moderate positive total  */
370	TEST_MAC 0x00000001, 0x00000005, 0x00000002, 0xfffffffd
371
372	/* MAC one small positive and one small negative number on a large
373	   positive total  */
374	TEST_MAC 0x7fffffff, 0xffffffff, 0x00000002, 0xfffffffd
375
376	/* MAC one small positive and one small negative number on a small
377	   negative total  */
378	TEST_MAC 0xffffffff, 0xffffffff, 0x00000002, 0xfffffffd
379
380	/* MAC one small positive and one small negative number on a
381	   moderate negative total  */
382	TEST_MAC 0xffffffff, 0x00000005, 0x00000002, 0xfffffffd
383
384	/* MAC one small positive and one small negative number on a large
385	   negative total  */
386	TEST_MAC 0x80000000, 0x00000006, 0x00000002, 0xfffffffd
387
388	/* one moderate positive and one moderate negative number  */
389
390	/* MAC one moderate positive and one moderate negative number on a
391	   zero total  */
392	TEST_MAC 0x00000000, 0x00000000, 0x00008000, 0xffff0000
393
394	/* MAC one moderate positive and one moderate negative number on a
395	   small positive total  */
396	TEST_MAC 0x00000000, 0x00000006, 0x00008000, 0xffff0000
397
398	/* MAC one moderate positive and one moderate negative number on a
399	   moderate positive total  */
400	TEST_MAC 0x00000000, 0x80000000, 0x00008000, 0xffff0000
401
402	/* MAC one moderate positive and one moderate negative number on a
403	   large positive total  */
404	TEST_MAC 0x7fffffff, 0xffffffff, 0x00008000, 0xffff0000
405
406	/* MAC one moderate positive and one moderate negative number on a
407	   small negative total  */
408	TEST_MAC 0xffffffff, 0xffffffff, 0x00008000, 0xffff0000
409
410	/* MAC one moderate positive and one moderate negative number on a
411	   moderate negative total  */
412	TEST_MAC 0xffffffff, 0x7fffffff, 0x00008000, 0xffff0000
413
414	/* MAC one moderate positive and one moderate negative number on a
415	   large negative total  */
416	TEST_MAC 0x80000000, 0x80000000, 0x00008000, 0xffff0000
417
418	/* Test the l.maci instruction.  */
419
420	/* two small positive numbers  */
421
422	/* MAC two small positive numbers on a zero total  */
423	TEST_MACI 0x00000000, 0x00000000, 0x00000002, 0x0003
424
425	/* MAC two small positive numbers on a small positive total  */
426	TEST_MACI 0x00000000, 0x00000006, 0x00000002, 0x0003
427
428	/* MAC two small positive numbers on a moderate positive total  */
429	TEST_MACI 0x00000000, 0xfffffffa, 0x00000002, 0x0003
430
431	/* MAC two small positive numbers on a large positive total  */
432	TEST_MACI 0x3fffffff, 0xfffffffa, 0x00000002, 0x0003
433
434	/* MAC two small positive numbers on a small negative total  */
435	TEST_MACI 0xffffffff, 0xfffffffa, 0x00000002, 0x0003
436
437	/* MAC two small positive numbers on a moderate negative total  */
438	TEST_MACI 0xffffffff, 0x00000000, 0x00000002, 0x0003
439
440	/* MAC two small positive numbers on a large negative total  */
441	TEST_MACI 0x80000000, 0x00000000, 0x00000002, 0x0003
442
443	/* two moderate positive numbers  */
444
445	/* MAC two moderate positive numbers on a zero total  */
446	TEST_MACI 0x00000000, 0x00000000, 0x00010002, 0x7fff
447
448	/* MAC two moderate positive numbers on a small positive total  */
449	TEST_MACI 0x00000000, 0x00000002, 0x00010002, 0x7fff
450
451	/* MAC two moderate positive numbers on a moderate positive total  */
452	TEST_MACI 0x00000000, 0x80000002, 0x00010002, 0x7fff
453
454	/* MAC two moderate positive numbers on a large positive total  */
455	TEST_MACI 0x7fffffff, 0x80000001, 0x00010002, 0x7fff
456
457	/* MAC two moderate positive numbers on a small negative total  */
458	TEST_MACI 0xffffffff, 0xffffffff, 0x00010002, 0x7fff
459
460	/* MAC two moderate positive numbers on a moderate negative total  */
461	TEST_MACI 0xffffffff, 0x80000002, 0x00010002, 0x7fff
462
463	/* MAC two moderate positive numbers on a large negative total  */
464	TEST_MACI 0xfffffffe, 0x80000002, 0x00010002, 0x7fff
465
466	/* two small negative numbers  */
467
468	/* MAC two small negative numbers on a zero total  */
469	TEST_MACI 0x00000000, 0x00000000, 0xfffffffe, 0xfffd
470
471	/* MAC two small negative numbers on a small positive total  */
472	TEST_MACI 0x00000000, 0x00000006, 0xfffffffe, 0xfffd
473
474	/* MAC two small negative numbers on a small negative total  */
475	TEST_MACI 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffd
476
477	/* one small positive and one small negative  */
478
479	/* MAC one small positive and one small negative number on a zero
480	   total  */
481	TEST_MACI 0x00000000, 0x00000000, 0x00000002, 0xfffd
482
483	/* MAC one small positive and one small negative number on a small
484	   positive total  */
485	TEST_MACI 0x00000000, 0x0000000c, 0x00000002, 0xfffd
486
487	/* MAC one small positive and one small negative number on a
488	   moderate positive total  */
489	TEST_MACI 0x00000001, 0x00000005, 0x00000002, 0xfffd
490
491	/* MAC one small positive and one small negative number on a large
492	   positive total  */
493	TEST_MACI 0x7fffffff, 0xffffffff, 0x00000002, 0xfffd
494
495	/* MAC one small positive and one small negative number on a small
496	   negative total  */
497	TEST_MACI 0xffffffff, 0xffffffff, 0x00000002, 0xfffd
498
499	/* MAC one small positive and one small negative number on a
500	   moderate negative total  */
501	TEST_MACI 0xffffffff, 0x00000005, 0x00000002, 0xfffd
502
503	/* MAC one small positive and one small negative number on a large
504	   negative total  */
505	TEST_MACI 0x80000000, 0x00000006, 0x00000002, 0xfffd
506
507	/* one moderate positive and one moderate negative  */
508
509	/* MAC one moderate positive and one moderate negative number on a
510	   zero total  */
511	TEST_MACI 0x00000000, 0x00000000, 0x00010000, 0x8000
512
513	/* MAC one moderate positive and one moderate negative number on a
514	   small positive total  */
515	TEST_MACI 0x00000000, 0x00000006, 0x00010000, 0x8000
516
517	/* MAC one moderate positive and one moderate negative number on a
518	   moderate positive total  */
519	TEST_MACI 0x00000000, 0x80000000, 0x00010000, 0x8000
520
521	/* MAC one moderate positive and one moderate negative number on a
522	   large positive total  */
523	TEST_MACI 0x7fffffff, 0xffffffff, 0x00010000, 0x8000
524
525	/* MAC one moderate positive and one moderate negative number on a
526	   small negative total  */
527	TEST_MACI 0xffffffff, 0xffffffff, 0x00010000, 0x8000
528
529	/* MAC one moderate positive and one moderate negative number on a
530	   moderate negative total  */
531	TEST_MACI 0xffffffff, 0x7fffffff, 0x00010000, 0x8000
532
533	/* MAC one moderate positive and one moderate negative number on a
534	   large negative total  */
535	TEST_MACI 0x80000000, 0x80000000, 0x00010000, 0x8000
536
537	/* Test the l.macrc instruction.
538
539	   Note that these tests use the same input data as the ones for
540	   l.mac above.  The results are the same, but only the low 32-bits
541	   are compared.  */
542
543	/* two small positive numbers  */
544
545	/* MAC two small positive numbers on a zero total  */
546	TEST_MACRC 0x00000000, 0x00000000, 0x00000002, 0x00000003
547
548	/* MAC two small positive numbers on a small positive total  */
549	TEST_MACRC 0x00000000, 0x00000006, 0x00000002, 0x00000003
550
551	/* MAC two small positive numbers on a moderate positive total  */
552	TEST_MACRC 0x00000000, 0xfffffffa, 0x00000002, 0x00000003
553
554	/* MAC two small positive numbers on a large positive total  */
555	TEST_MACRC 0x3fffffff, 0xfffffffa, 0x00000002, 0x00000003
556
557	/* MAC two small positive numbers on a small negative total  */
558	TEST_MACRC 0xffffffff, 0xfffffffa, 0x00000002, 0x00000003
559
560	/* MAC two small positive numbers on a moderate negative total  */
561	TEST_MACRC 0xffffffff, 0x00000000, 0x00000002, 0x00000003
562
563	/* MAC two small positive numbers on a large negative total  */
564	TEST_MACRC 0x80000000, 0x00000000, 0x00000002, 0x00000003
565
566	/* two moderate positive numbers  */
567
568	/* MAC two moderate positive numbers on a zero total  */
569	TEST_MACRC 0x00000000, 0x00000000, 0x00008001, 0x0000fffe
570
571	/* MAC two moderate positive numbers on a small positive total  */
572	TEST_MACRC 0x00000000, 0x00000002, 0x00008001, 0x0000fffe
573
574	/* MAC two moderate positive numbers on a moderate positive total  */
575	TEST_MACRC 0x00000000, 0x80000002, 0x00008001, 0x0000fffe
576
577	/* MAC two moderate positive numbers on a large positive total  */
578	TEST_MACRC 0x7fffffff, 0x80000001, 0x00008001, 0x0000fffe
579
580	/* MAC two moderate positive numbers on a small negative total  */
581	TEST_MACRC 0xffffffff, 0xffffffff, 0x00008001, 0x0000fffe
582
583	/* MAC two moderate positive numbers on a moderate negative total  */
584	TEST_MACRC 0xffffffff, 0x80000002, 0x00008001, 0x0000fffe
585
586	/* MAC two moderate positive numbers on a large negative total  */
587	TEST_MACRC 0xfffffffe, 0x80000002, 0x00008001, 0x0000fffe
588
589	/* two small negative numbers  */
590
591	/* MAC two small negative numbers on a zero total  */
592	TEST_MACRC 0x00000000, 0x00000000, 0xfffffffe, 0xfffffffd
593
594	/* MAC two small negative numbers on a small positive total  */
595	TEST_MACRC 0x00000000, 0x00000006, 0xfffffffe, 0xfffffffd
596
597	/* MAC two small negative numbers on a small negative total  */
598	TEST_MACRC 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffffd
599
600	/* one small positive and one small negative number  */
601
602	/* MAC one small positive and one small negative number on a zero
603	   total  */
604	TEST_MACRC 0x00000000, 0x00000000, 0x00000002, 0xfffffffd
605
606	/* MAC one small positive and one small negative number on a small
607	   positive total  */
608	TEST_MACRC 0x00000000, 0x0000000c, 0x00000002, 0xfffffffd
609
610	/* MAC one small positive and one small negative number on a
611	   moderate positive total  */
612	TEST_MACRC 0x00000001, 0x00000005, 0x00000002, 0xfffffffd
613
614	/* MAC one small positive and one small negative number on a large
615	   positive total  */
616	TEST_MACRC 0x7fffffff, 0xffffffff, 0x00000002, 0xfffffffd
617
618	/* MAC one small positive and one small negative number on a small
619	   negative total  */
620	TEST_MACRC 0xffffffff, 0xffffffff, 0x00000002, 0xfffffffd
621
622	/* MAC one small positive and one small negative number on a
623	   moderate negative total  */
624	TEST_MACRC 0xffffffff, 0x00000005, 0x00000002, 0xfffffffd
625
626	/* MAC one small positive and one small negative number on a large
627	   negative total  */
628	TEST_MACRC 0x80000000, 0x00000006, 0x00000002, 0xfffffffd
629
630	/* one moderate positive and one moderate negative  */
631
632	/* MAC one moderate positive and one moderate negative number on a
633	   zero total  */
634	TEST_MACRC 0x00000000, 0x00000000, 0x00008000, 0xffff0000
635
636	/* MAC one moderate positive and one moderate negative number on a
637	   small positive total  */
638	TEST_MACRC 0x00000000, 0x00000006, 0x00008000, 0xffff0000
639
640	/* MAC one moderate positive and one moderate negative number on a
641	   moderate positive total  */
642	TEST_MACRC 0x00000000, 0x80000000, 0x00008000, 0xffff0000
643
644	/* MAC one moderate positive and one moderate negative number on a
645	   large positive total  */
646	TEST_MACRC 0x7fffffff, 0xffffffff, 0x00008000, 0xffff0000
647
648	/* MAC one moderate positive and one moderate negative number on a
649	   small negative total  */
650	TEST_MACRC 0xffffffff, 0xffffffff, 0x00008000, 0xffff0000
651
652	/* MAC one moderate positive and one moderate negative number on a
653	   moderate negative total  */
654	TEST_MACRC 0xffffffff, 0x7fffffff, 0x00008000, 0xffff0000
655
656	/* MAC one moderate positive and one moderate negative number on a
657	   large negative total  */
658	TEST_MACRC 0x80000000, 0x80000000, 0x00008000, 0xffff0000
659
660	/* Test the l.msb instruction.  */
661
662	/* MSB two small positive numbers on a zero total  */
663	TEST_MSB 0x00000000, 0x00000000, 0x00000002, 0x00000003
664
665	/* MSB two small positive numbers on a small positive total  */
666	TEST_MSB 0x00000000, 0x0000000c, 0x00000002, 0x00000003
667
668	/* MSB two small positive numbers on a moderate positive total  */
669	TEST_MSB 0x00000001, 0x00000000, 0x00000002, 0x00000003
670
671	/* MSB two small positive numbers on a large positive total  */
672	TEST_MSB 0x40000000, 0x00000000, 0x00000002, 0x00000003
673
674	/* MSB two small positive numbers on a small negative total  */
675	TEST_MSB 0xffffffff, 0xfffffffa, 0x00000002, 0x00000003
676
677	/* MSB two small positive numbers on a moderate negative total  */
678	TEST_MSB 0xffffffff, 0x00000005, 0x00000002, 0x00000003
679
680	/* MSB two small positive numbers on a large negative total  */
681	TEST_MSB 0x80000000, 0x00000006, 0x00000002, 0x00000003
682
683	/* two moderate positive numbers  */
684
685	/* MSB two moderate positive numbers on a zero total  */
686	TEST_MSB 0x00000000, 0x00000000, 0x00008001, 0x0000fffe
687
688	/* MSB two moderate positive numbers on a small positive total  */
689	TEST_MSB 0x00000000, 0x00000002, 0x00008001, 0x0000fffe
690
691	/* MSB two moderate positive numbers on a moderate positive total  */
692	TEST_MSB 0x00000000, 0x80000002, 0x00008001, 0x0000fffe
693
694	/* MSB two moderate positive numbers on a large positive total  */
695	TEST_MSB 0x7fffffff, 0x7ffffffd, 0x00008001, 0x0000fffe
696
697	/* MSB two moderate positive numbers on a small negative total  */
698	TEST_MSB 0xffffffff, 0xffffffff, 0x00008001, 0x0000fffe
699
700	/* MSB two moderate positive numbers on a moderate negative total  */
701	TEST_MSB 0xffffffff, 0x80000002, 0x00008001, 0x0000fffe
702
703	/* MSB two moderate positive numbers on a large negative total  */
704	TEST_MSB 0xfffffffe, 0x80000002, 0x00008001, 0x0000fffe
705
706	/* two small negative numbers  */
707
708	/* MSB two small negative numbers on a zero total  */
709	TEST_MSB 0x00000000, 0x00000006, 0xfffffffe, 0xfffffffd
710
711	/* MSB two small negative numbers on a small positive total  */
712	TEST_MSB 0x00000000, 0x0000000c, 0xfffffffe, 0xfffffffd
713
714	/* MSB two small negative numbers on a small negative total  */
715	TEST_MSB 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffffd
716
717	/* one small positive and one small negative number  */
718
719	/* MSB one small positive and one small negative number on a zero
720	   total  */
721	TEST_MSB 0x00000000, 0x00000000, 0x00000002, 0xfffffffd
722
723	/* MSB one small positive and one small negative number on a small
724	   positive total  */
725	TEST_MSB 0x00000000, 0x00000006, 0x00000002, 0xfffffffd
726
727	/* MSB one small positive and one small negative number on a
728	   moderate positive total  */
729	TEST_MSB 0x00000000, 0xffffffff, 0x00000002, 0xfffffffd
730
731	/* MSB one small positive and one small negative number on a large
732	   positive total  */
733	TEST_MSB 0x7fffffff, 0xfffffff9, 0x00000002, 0xfffffffd
734
735	/* MSB one small positive and one small negative number on a small
736	   negative total  */
737	TEST_MSB 0xffffffff, 0xfffffff9, 0x00000002, 0xfffffffd
738
739	/* MSB one small positive and one small negative number on a
740	   moderate negative total  */
741	TEST_MSB 0xfffffffe, 0xffffffff, 0x00000002, 0xfffffffd
742
743	/* MSB one small positive and one small negative number on a large
744	   negative total  */
745	TEST_MSB 0x80000000, 0x00000000, 0x00000002, 0xfffffffd
746
747	/* one moderate positive and one moderate negative number  */
748
749	/* MSB one moderate positive and one moderate negative number on a
750	   zero total  */
751	TEST_MSB 0x00000000, 0x00000000, 0x00008000, 0xffff0000
752
753	/* MSB one moderate positive and one moderate negative number on a
754	   small positive total  */
755	TEST_MSB 0x00000000, 0x00000006, 0x00008000, 0xffff0000
756
757	/* MSB one moderate positive and one moderate negative number on a
758	   moderate positive total  */
759	TEST_MSB 0x00000000, 0x80000000, 0x00008000, 0xffff0000
760
761	/* MSB one moderate positive and one moderate negative number on a
762	   large positive total  */
763	TEST_MSB 0x7fffffff, 0x7fffffff, 0x00008000, 0xffff0000
764
765	/* MSB one moderate positive and one moderate negative number on a
766	   small negative total  */
767	TEST_MSB 0xffffffff, 0xffffffff, 0x00008000, 0xffff0000
768
769	/* MSB one moderate positive and one moderate negative number on a
770	   moderate negative total  */
771	TEST_MSB 0xfffffffe, 0xffffffff, 0x00008000, 0xffff0000
772
773	/* MSB one moderate positive and one moderate negative number on a
774	   large negative total  */
775	TEST_MSB 0x80000000, 0x00000000, 0x00008000, 0xffff0000
776
777	POP LINK_REGISTER_R9
778	RETURN_TO_LINK_REGISTER_R9
779