xref: /openbsd-src/regress/lib/libc/arch/alpha/divremtest/divremtest.c (revision 133306f0ca1ab5abad5849050ae073a8aba154e8)
1*133306f0Sniklas /*	$OpenBSD: divremtest.c,v 1.2 2001/01/29 02:05:39 niklas Exp $	*/
2df930be7Sderaadt /*	$NetBSD: divremtest.c,v 1.1 1995/04/24 05:53:35 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Copyright (c) 1995 Christopher G. Demetriou
6df930be7Sderaadt  * All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
16df930be7Sderaadt  * 3. All advertising materials mentioning features or use of this software
17df930be7Sderaadt  *    must display the following acknowledgement:
18df930be7Sderaadt  *      This product includes software developed by Christopher G. Demetriou
19df930be7Sderaadt  *	for the NetBSD Project.
20df930be7Sderaadt  * 4. The name of the author may not be used to endorse or promote products
21df930be7Sderaadt  *    derived from this software without specific prior written permission
22df930be7Sderaadt  *
23df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24df930be7Sderaadt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25df930be7Sderaadt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26df930be7Sderaadt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27df930be7Sderaadt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28df930be7Sderaadt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29df930be7Sderaadt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30df930be7Sderaadt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31df930be7Sderaadt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32df930be7Sderaadt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33df930be7Sderaadt  */
34df930be7Sderaadt 
35df930be7Sderaadt #include <stdio.h>
36df930be7Sderaadt #include <unistd.h>
37df930be7Sderaadt #include <signal.h>
38df930be7Sderaadt 
39df930be7Sderaadt void	testfile();
40df930be7Sderaadt void	usage();
41df930be7Sderaadt 
42df930be7Sderaadt int generate;
43df930be7Sderaadt 
44df930be7Sderaadt int
main(argc,argv)45df930be7Sderaadt main(argc, argv)
46df930be7Sderaadt 	int argc;
47df930be7Sderaadt 	char **argv;
48df930be7Sderaadt {
49df930be7Sderaadt 	int c;
50df930be7Sderaadt 
51df930be7Sderaadt 	signal(SIGFPE, SIG_IGN);
52df930be7Sderaadt 
53df930be7Sderaadt 	while ((c = getopt(argc, argv, "g")) != -1)
54df930be7Sderaadt 		switch (c) {
55df930be7Sderaadt 		case 'g':
56df930be7Sderaadt 			generate = 1;
57df930be7Sderaadt 			break;
58df930be7Sderaadt 
59df930be7Sderaadt 		default:
60df930be7Sderaadt 			usage();
61df930be7Sderaadt 			break;
62df930be7Sderaadt 	}
63df930be7Sderaadt 
64df930be7Sderaadt 	argc -= optind;
65df930be7Sderaadt 	argv += optind;
66df930be7Sderaadt 
67df930be7Sderaadt 	if (argc == 0)
68df930be7Sderaadt 		testfile();
69df930be7Sderaadt 	else
70df930be7Sderaadt 		for (; argc != 0; argc--, argv++) {
71df930be7Sderaadt 			if (freopen(argv[0], "r", stdin) == NULL) {
72df930be7Sderaadt 				fprintf(stderr,
73df930be7Sderaadt 				    "divremtest: couldn't open %s\n",
74df930be7Sderaadt 				    argv[0]);
75df930be7Sderaadt 				exit(1);
76df930be7Sderaadt 			}
77df930be7Sderaadt 
78df930be7Sderaadt 			testfile();
79df930be7Sderaadt 		}
80df930be7Sderaadt 
81df930be7Sderaadt 	exit(0);
82df930be7Sderaadt }
83df930be7Sderaadt 
84df930be7Sderaadt void
testfile()85df930be7Sderaadt testfile()
86df930be7Sderaadt {
87df930be7Sderaadt 	union operand {
88df930be7Sderaadt 		unsigned long	input;
89df930be7Sderaadt 		int		op_int;
90df930be7Sderaadt 		unsigned int	op_u_int;
91df930be7Sderaadt 		long		op_long;
92df930be7Sderaadt 		unsigned long	op_u_long;
93df930be7Sderaadt 	} op1, op2, divres, modres, divwant, modwant;
94df930be7Sderaadt 	char opspec[6];
95df930be7Sderaadt 	int encoded, i;
96df930be7Sderaadt 
97df930be7Sderaadt 	while (scanf("%6c %lx %lx %lx %lx\n", opspec, &op1.input,
98df930be7Sderaadt 	    &op2.input, &divwant.input, &modwant.input) != EOF) {
99df930be7Sderaadt 
100df930be7Sderaadt 		encoded = 0;
101df930be7Sderaadt 
102df930be7Sderaadt 		for (i = 0; i < 6; i += 2) {
103df930be7Sderaadt 			int posval;
104df930be7Sderaadt 
105df930be7Sderaadt 			switch (opspec[i]) {
106df930be7Sderaadt 			case '.':
107df930be7Sderaadt 				posval = 0;
108df930be7Sderaadt 				break;
109df930be7Sderaadt 			case '-':
110df930be7Sderaadt 				posval = 1;
111df930be7Sderaadt 				break;
112df930be7Sderaadt 			default:
113df930be7Sderaadt 				fprintf(stderr,
114df930be7Sderaadt 				    "unknown signedness spec %c\n",
115df930be7Sderaadt 				    opspec[i]);
116df930be7Sderaadt 				exit(1);
117df930be7Sderaadt 			}
118df930be7Sderaadt 			encoded |= posval << ((5 - i) * 4);
119df930be7Sderaadt 		}
120df930be7Sderaadt 
121df930be7Sderaadt 		for (i = 1; i < 6; i += 2) {
122df930be7Sderaadt 			int posval;
123df930be7Sderaadt 
124df930be7Sderaadt 			switch (opspec[i]) {
125df930be7Sderaadt 			case 'i':
126df930be7Sderaadt 				posval = 0;
127df930be7Sderaadt 				break;
128df930be7Sderaadt 			case 'l':
129df930be7Sderaadt 				posval = 1;
130df930be7Sderaadt 				break;
131df930be7Sderaadt 			default:
132df930be7Sderaadt 				fprintf(stderr, "unknown length spec %c\n",
133df930be7Sderaadt 				    opspec[i]);
134df930be7Sderaadt 				exit(1);
135df930be7Sderaadt 			}
136df930be7Sderaadt 			encoded |= posval << ((5 - i) * 4);
137df930be7Sderaadt 		}
138df930be7Sderaadt 
139df930be7Sderaadt 		/* KILL ME!!! */
140df930be7Sderaadt 		switch (encoded) {
141df930be7Sderaadt 
142df930be7Sderaadt #define TRY_IT(a, b, c)							\
143df930be7Sderaadt 	divres.a = op1.b / op2.c;					\
144df930be7Sderaadt 	modres.a = op1.b % op2.c;					\
145df930be7Sderaadt 	if (generate) {							\
146df930be7Sderaadt 		printf("%6s 0x%016lx 0x%016lx 0x%016lx 0x%016lx\n",	\
147df930be7Sderaadt 		    opspec, op1.input, op2.input,			\
148df930be7Sderaadt 		    divres.a, modres.a);				\
149df930be7Sderaadt 	} else {							\
150df930be7Sderaadt 		if ((divres.a != divwant.a) ||				\
151df930be7Sderaadt 		    (modres.a != modwant.a)) {				\
152df930be7Sderaadt 			fprintf(stderr, "%6s 0x%016lx 0x%016lx\n",	\
153df930be7Sderaadt 		    	    opspec, op1.input, op2.input);		\
154df930be7Sderaadt 			fprintf(stderr, "FAILED:\n");			\
155df930be7Sderaadt 			fprintf(stderr,					\
156df930be7Sderaadt 			    "div:\twanted 0x%16lx, got 0x%16lx\n",	\
157df930be7Sderaadt 			    divwant.a, divres.a);			\
158df930be7Sderaadt 			fprintf(stderr,					\
159df930be7Sderaadt 			    "mod:\twanted 0x%16lx, got 0x%16lx\n",	\
160df930be7Sderaadt 			    modwant.a, modres.a);			\
161df930be7Sderaadt 									\
162df930be7Sderaadt 			exit(1);					\
163df930be7Sderaadt 		}							\
164df930be7Sderaadt 	}
165df930be7Sderaadt 
166df930be7Sderaadt #include "cases.c"
167df930be7Sderaadt 
168df930be7Sderaadt #undef TRY_IT
169df930be7Sderaadt 
170df930be7Sderaadt 		default:
171df930be7Sderaadt 			fprintf(stderr,
172df930be7Sderaadt 			    "INTERNAL ERROR: unknown encoding %x\n", encoded);
173df930be7Sderaadt 			exit(1);
174df930be7Sderaadt 		}
175df930be7Sderaadt 	}
176df930be7Sderaadt }
177df930be7Sderaadt 
178df930be7Sderaadt void
usage()179df930be7Sderaadt usage()
180df930be7Sderaadt {
181df930be7Sderaadt 
182df930be7Sderaadt 	fprintf(stderr, "usage: divremtest [-v] [testfile ...]\n");
183df930be7Sderaadt 	exit(1);
184df930be7Sderaadt }
185