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