Subversion Repositories planix.SVN

Rev

Rev 33 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#!/bin/rc
2
echo '
3
cmp	in	in	retsign
4
magcmp	in	in	retsign
5
add	in	in	out
6
sub	in	in	out
7
magadd	in	in	out
8
magsub	in	in	out
9
and	in	in	out
10
bic	in	in	out
11
or	in	in	out
12
xor	in	in	out
13
not	in	out
14
left	in	int	out
15
right	in	int	out
16
asr	in	int	out
17
div_	in	in	out	out
18
' | sed 's/#.*//g' | awk '
19
BEGIN {
20
	print "#include <u.h>"
21
	print "#include <libc.h>"
22
	print "#include <mp.h>"
23
	print "#include \"dat.h\""
24
	print "#include \"fns.h\""
25
}
26
function initio()
27
{
28
	for(j=2;j<=NF;j++){
29
		if($j == "in")
30
			printf "ldtomp(l%d, m%d);\n", j, j
31
		if($j == "out")
32
			printf "mptarget(m%d);\n", j
33
	}
34
}
35
function fail0()
36
{
37
	printf "fprint(2, \"FAIL: mp%s(", $1
38
	first = 1
39
	for(j=2;j<=NF;j++){
40
		if(!first) printf ", "
41
		first = 0
42
		if($j == "in")
43
			printf "%%L"
44
		if($j == "int")
45
			printf "%%d"
46
		if($j == "out")
47
			printf "out"
48
	}
49
	printf "): "
50
	if(test) printf "%s: ", test
51
}
52
function fail1()
53
{
54
	for(j=2;j<=NF;j++){
55
		if($j == "in")
56
			printf ", l%d", j
57
		if($j == "int")
58
			printf ", i%d", j
59
	}
60
}
61
function testarg(ref,i,t)
62
{
63
	if(t == "in"){
64
		printf "if(!ldmpeq(l%d, m%d)){\n", ref, i
65
		fail0()
66
		printf "arg %d: input corrupted\\n\"", ref - 1
67
		fail1()
68
		printf ");\n"
69
		printf "fail=1;\n}\n"
70
	}
71
	if(t == "out"){
72
		printf "if(m%d->top == 0 && m%d->sign < 0){\n", i, i
73
		fail0()
74
		printf "arg %d: got -0, shouldn''t happen\\n\"", ref - 1
75
		fail1()
76
		printf ");\n"
77
		print "fail=1;"
78
		printf "}else if(m%d->top != 0 && m%d->p[m%d->top - 1] == 0){\n", i, i, i
79
		fail0()
80
		printf "arg %d: got denormalised result\\n\"", ref - 1
81
		fail1()
82
		printf ");\n"
83
		print "fail=1;"
84
		printf "}else if(!ldmpeq(l%d, m%d)){\n", ref, i
85
		fail0()
86
		printf "arg %d: got %%#B, expected %%L\\n\"", ref - 1
87
		fail1()
88
		printf ", m%d, l%d);\n", i, ref
89
		printf "fail=1;\n"
90
		printf "}\n"
91
	}
92
}
93
 
94
NF > 0 && !($NF ~ /^ret/) {
95
	printf "void ld%s(", $1
96
	for(i=2;i<=NF;i++){
97
		if($i == "in" || $i == "out")
98
			printf "ldint *"
99
		if($i == "int")
100
			printf "int"
101
		if(i<NF) printf ", "
102
	}
103
	printf ");\n"
104
 
105
	printf "void\ntest%s(void)\n{\n", $1
106
	print "int fail=0;"
107
	for(i=2;i<=NF;i++){
108
		if($i == "in" || $i == "out"){
109
			printf "ldint *l%d = ldnew(0);\n", i
110
			printf "mpint *m%d = mpnew(0);\n", i
111
		}
112
		if($i == "int" || $i == "in")
113
			printf "int i%d;\n", i
114
	}
115
	for(i=2;i<=NF;i++){
116
		if($i == "in"){
117
			printf "for(i%d=0;i%d<NTEST;i%d++){\n", i, i, i
118
			printf "testgen(i%d, l%d);\n", i, i
119
		}
120
		if($i == "int")
121
			printf "for(i%d=-128;i%d<=128;i%d++){\n", i, i, i
122
	}
123
 
124
	test=""
125
	printf "ld%s(", $1
126
	for(i=2;i<=NF;i++){
127
		if($i == "in" || $i == "out")
128
			printf "l%d", i
129
		if($i == "int")
130
			printf "i%d", i
131
		if(i<NF) printf ", "
132
	}
133
	printf ");\n"
134
	initio()
135
 
136
	printf "mp%s(", $1
137
	for(i=2;i<=NF;i++){
138
		if($i == "in" || $i == "out")
139
			printf "m%d", i
140
		if($i == "int")
141
			printf "i%d", i
142
		if(i<NF) printf ", "
143
	}
144
	printf ");\n"
145
 
146
	for(i=2;i<=NF;i++)
147
		testarg(i, i, $i)
148
 
149
	for(i=2;i<=NF;i++){
150
		if($i != "out") continue
151
		for(k=2;k<=NF;k++){
152
			if($k != "in") continue
153
			test="alias "(i-1)" and "(k-1)
154
			initio()
155
			printf "mp%s(", $1
156
			for(l=2;l<=NF;l++){
157
				if(l == i){
158
					printf "m%d", k
159
				}else{
160
					if($l == "in" || $l == "out")
161
						printf "m%d", l
162
					if($l == "int")
163
						printf "i%d", l
164
				}
165
				if(l<NF) printf ", "
166
			}
167
			printf ");\n"
168
			for(l=2;l<=NF;l++)
169
				if(l != k && l != i)
170
					testarg(l, l, $l)
171
			testarg(i, k, "out")
172
		}
173
	}
174
 
175
	for(i=2;i<=NF;i++)
176
		if($i == "in" || $i == "int")
177
			printf "}\n"
178
	for(i=2;i<=NF;i++)
179
		if($i == "in" || $i == "out"){
180
			printf "ldfree(l%d);\nmpfree(m%d);\n", i, i
181
		}
182
	printf "if(!fail) fprint(2, \"mp%s: passed\\n\");\n", $1
183
	printf "}\n"
184
	tests[ntests++] = $1
185
	next
186
}
187
NF > 0 {
188
	sign=$NF=="retsign";
189
	NF--
190
	printf "int ld%s(", $1
191
	for(i=2;i<=NF;i++){
192
		if($i == "in" || $i == "out")
193
			printf "ldint *"
194
		if($i == "int")
195
			printf "int"
196
		if(i<NF) printf ", "
197
	}
198
	printf ");\n"
199
 
200
	printf "void\ntest%s(void)\n{\n", $1
201
	print "int fail=0;"
202
	print "int a, b;"
203
	for(i=2;i<=NF;i++){
204
		if($i == "in" || $i == "out"){
205
			printf "ldint *l%d = ldnew(0);\n", i
206
			printf "mpint *m%d = mpnew(0);\n", i
207
		}
208
		if($i == "int" || $i == "in")
209
			printf "int i%d;\n", i
210
	}
211
	for(i=2;i<=NF;i++){
212
		if($i == "in"){
213
			printf "for(i%d=0;i%d<NTEST;i%d++){\n", i, i, i
214
			printf "testgen(i%d, l%d);\n", i, i
215
		}
216
		if($i == "int")
217
			printf "for(i%d=-128;i%d<=128;i%d++){\n", i, i, i
218
	}
219
 
220
	test=""
221
	printf "a=ld%s(", $1
222
	for(i=2;i<=NF;i++){
223
		if($i == "in" || $i == "out")
224
			printf "l%d", i
225
		if($i == "int")
226
			printf "i%d", i
227
		if(i<NF) printf ", "
228
	}
229
	printf ");\n"
230
	initio()
231
 
232
	printf "b=mp%s(", $1
233
	for(i=2;i<=NF;i++){
234
		if($i == "in" || $i == "out")
235
			printf "m%d", i
236
		if($i == "int")
237
			printf "i%d", i
238
		if(i<NF) printf ", "
239
	}
240
	printf ");\n"
241
 
242
	if(sign) printf "if(b<0) b=-1;\nif(b>0) b=1;\n"
243
	printf "if(a != b){\n", ref, i
244
	fail0()
245
	printf "return value: got %%d, expected %%d\\n\""
246
	fail1()
247
	printf ", b, a);\n"
248
	printf "fail=1;\n"
249
	printf "}\n"
250
 
251
	for(i=2;i<=NF;i++)
252
		testarg(i, i, $i)
253
 
254
	for(i=2;i<=NF;i++)
255
		if($i == "in" || $i == "int")
256
			printf "}\n"
257
	for(i=2;i<=NF;i++)
258
		if($i == "in" || $i == "out"){
259
			printf "ldfree(l%d);\nmpfree(m%d);\n", i, i
260
		}
261
	printf "if(!fail) fprint(2, \"mp%s: passed\\n\");\n", $1
262
	printf "}\n"
263
	tests[ntests++] = $1
264
}
265
END {
266
	printf "void\ntests()\n{\n"
267
	for(i = 0; i < ntests; i++)
268
		printf "test%s();\n", tests[i]
269
	printf "}\n"
270
}
271
' | awk '
272
/^[ 	]*}/ { ind = substr(ind, 2) }
273
{ printf "%s%s\n", ind, $0 }
274
/{ *$/ { ind = "\t" ind }
275
'