xref: /aosp_15_r20/external/libgsm/add-test/add_test.c (revision 8ec969cea971fe25ff2d3933a5a9f8504f8e86c9)
1*8ec969ceSTreehugger Robot /*
2*8ec969ceSTreehugger Robot  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3*8ec969ceSTreehugger Robot  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
4*8ec969ceSTreehugger Robot  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5*8ec969ceSTreehugger Robot  */
6*8ec969ceSTreehugger Robot 
7*8ec969ceSTreehugger Robot /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/add_test.c,v 1.2 1994/05/10 20:18:17 jutta Exp $ */
8*8ec969ceSTreehugger Robot 
9*8ec969ceSTreehugger Robot #ifndef _POSIX_C_SOURCE
10*8ec969ceSTreehugger Robot #define _POSIX_C_SOURCE 200809L
11*8ec969ceSTreehugger Robot #endif
12*8ec969ceSTreehugger Robot 
13*8ec969ceSTreehugger Robot #include <stdio.h>
14*8ec969ceSTreehugger Robot #include <stdlib.h>
15*8ec969ceSTreehugger Robot #include <string.h>
16*8ec969ceSTreehugger Robot #include <unistd.h>
17*8ec969ceSTreehugger Robot 
18*8ec969ceSTreehugger Robot #include "gsm.h"
19*8ec969ceSTreehugger Robot 
20*8ec969ceSTreehugger Robot #include "../src/add.c"
21*8ec969ceSTreehugger Robot 
22*8ec969ceSTreehugger Robot int		interactive = 1;
23*8ec969ceSTreehugger Robot 
24*8ec969ceSTreehugger Robot char		* opname;
25*8ec969ceSTreehugger Robot longword	L_op1, L_op2, L_expect;
26*8ec969ceSTreehugger Robot word		op1, op2, expect;
27*8ec969ceSTreehugger Robot int		do_expect;
28*8ec969ceSTreehugger Robot 
29*8ec969ceSTreehugger Robot word M_gsm_add P((word op1, word op2));
30*8ec969ceSTreehugger Robot word M_gsm_sub P((word op1, word op2));
31*8ec969ceSTreehugger Robot word M_gsm_mult P((word op1, word op2));
32*8ec969ceSTreehugger Robot word M_gsm_mult_r P((word op1, word op2));
33*8ec969ceSTreehugger Robot word M_gsm_abs P((word op1));
34*8ec969ceSTreehugger Robot longword M_gsm_L_mult P((word op1, word op2));
35*8ec969ceSTreehugger Robot longword M_gsm_L_add P((longword op1, longword op2));
36*8ec969ceSTreehugger Robot 
help()37*8ec969ceSTreehugger Robot void help()
38*8ec969ceSTreehugger Robot {
39*8ec969ceSTreehugger Robot puts( "  add a b      sub a b     mult a b   div    a b" );
40*8ec969ceSTreehugger Robot puts( "L_add A B    L_sub A B   L_mult A B   mult_r a b" );
41*8ec969ceSTreehugger Robot puts( "" );
42*8ec969ceSTreehugger Robot puts( "abs   a      norm  a        >> a b      << a b" );
43*8ec969ceSTreehugger Robot puts( "                          L_>> A B    L_<< A B" );
44*8ec969ceSTreehugger Robot }
45*8ec969ceSTreehugger Robot 
46*8ec969ceSTreehugger Robot char * strtek P2((str, sep), char * str, char * sep) {
47*8ec969ceSTreehugger Robot 
48*8ec969ceSTreehugger Robot 	static char     * S = (char *)0;
49*8ec969ceSTreehugger Robot 	char		* c, * base;
50*8ec969ceSTreehugger Robot 
51*8ec969ceSTreehugger Robot 	if (str) S = str;
52*8ec969ceSTreehugger Robot 
53*8ec969ceSTreehugger Robot 	if (!S || !*S) return (char *)0;
54*8ec969ceSTreehugger Robot 
55*8ec969ceSTreehugger Robot 	/*  Skip delimiters.
56*8ec969ceSTreehugger Robot 	 */
57*8ec969ceSTreehugger Robot 	while (*S) {
58*8ec969ceSTreehugger Robot 		for (c = sep; *c && *c != *S; c++) ;
59*8ec969ceSTreehugger Robot 		if (*c) *S++ = 0;
60*8ec969ceSTreehugger Robot 		else break;
61*8ec969ceSTreehugger Robot 	}
62*8ec969ceSTreehugger Robot 
63*8ec969ceSTreehugger Robot 	base = S;
64*8ec969ceSTreehugger Robot 
65*8ec969ceSTreehugger Robot 	/*   Skip non-delimiters.
66*8ec969ceSTreehugger Robot 	 */
67*8ec969ceSTreehugger Robot 	for (base = S; *S; S++) {
68*8ec969ceSTreehugger Robot 
69*8ec969ceSTreehugger Robot 		for (c = sep; *c; c++)
70*8ec969ceSTreehugger Robot 			if (*c == *S) {
71*8ec969ceSTreehugger Robot 				*S++ = 0;
72*8ec969ceSTreehugger Robot 				return base;
73*8ec969ceSTreehugger Robot 			}
74*8ec969ceSTreehugger Robot 	}
75*8ec969ceSTreehugger Robot 
76*8ec969ceSTreehugger Robot 	return base == S ? (char *)0 : base;
77*8ec969ceSTreehugger Robot }
78*8ec969ceSTreehugger Robot 
79*8ec969ceSTreehugger Robot long value P1((s), char * s)
80*8ec969ceSTreehugger Robot {
81*8ec969ceSTreehugger Robot 	switch (*s) {
82*8ec969ceSTreehugger Robot 	case '-': switch (s[1]) {
83*8ec969ceSTreehugger Robot 		  case '\0': return MIN_WORD;
84*8ec969ceSTreehugger Robot 		  case '-':  return MIN_LONGWORD;
85*8ec969ceSTreehugger Robot 		  default:   break;
86*8ec969ceSTreehugger Robot 		  }
87*8ec969ceSTreehugger Robot 		  break;
88*8ec969ceSTreehugger Robot 
89*8ec969ceSTreehugger Robot 	case '+': switch (s[1]) {
90*8ec969ceSTreehugger Robot 		  case '\0': return MAX_WORD;
91*8ec969ceSTreehugger Robot 		  case '+':  return MAX_LONGWORD;
92*8ec969ceSTreehugger Robot 		  default:   break;
93*8ec969ceSTreehugger Robot 		  }
94*8ec969ceSTreehugger Robot 	default:  break;
95*8ec969ceSTreehugger Robot 	}
96*8ec969ceSTreehugger Robot 
97*8ec969ceSTreehugger Robot 	return strtol(s, (char **)0, 0);
98*8ec969ceSTreehugger Robot }
99*8ec969ceSTreehugger Robot 
100*8ec969ceSTreehugger Robot char * parse P1((buf), char * buf)
101*8ec969ceSTreehugger Robot {
102*8ec969ceSTreehugger Robot 	char  * s, * a;
103*8ec969ceSTreehugger Robot 
104*8ec969ceSTreehugger Robot 	if ((a = strchr(buf, '=')) != 0) *a++ = 0;
105*8ec969ceSTreehugger Robot 
106*8ec969ceSTreehugger Robot 	opname = s = strtek(buf, " \t(");
107*8ec969ceSTreehugger Robot 	if (!s) return (char *)0;
108*8ec969ceSTreehugger Robot 
109*8ec969ceSTreehugger Robot 	op1 = op2 = L_op1 = L_op2 = 0;
110*8ec969ceSTreehugger Robot 
111*8ec969ceSTreehugger Robot 	if ((s = strtek( (char *)0, "( \t,")) != 0) {
112*8ec969ceSTreehugger Robot 		op1 = L_op1 = value(s);
113*8ec969ceSTreehugger Robot 		if ((s = strtek( (char *)0, ", \t)")) != 0)
114*8ec969ceSTreehugger Robot 			op2 = L_op2 = value(s);
115*8ec969ceSTreehugger Robot 	}
116*8ec969ceSTreehugger Robot 
117*8ec969ceSTreehugger Robot 	if (a) {
118*8ec969ceSTreehugger Robot 		do_expect = 1;
119*8ec969ceSTreehugger Robot 		while (*a == ' ' || *a == '\t') a++;
120*8ec969ceSTreehugger Robot 		expect = L_expect = value(a);
121*8ec969ceSTreehugger Robot 	}
122*8ec969ceSTreehugger Robot 
123*8ec969ceSTreehugger Robot 	return opname;
124*8ec969ceSTreehugger Robot }
125*8ec969ceSTreehugger Robot 
126*8ec969ceSTreehugger Robot void fprint_word P2((f, w), FILE * f,  word w)
127*8ec969ceSTreehugger Robot {
128*8ec969ceSTreehugger Robot 	if (!w) putc('0', f);
129*8ec969ceSTreehugger Robot 	else fprintf(f, "0x%4.4x (%d%s)",
130*8ec969ceSTreehugger Robot 		(unsigned int)w,
131*8ec969ceSTreehugger Robot 		(int)w,
132*8ec969ceSTreehugger Robot 		w == MIN_WORD? "/-" : (w == MAX_WORD ? "/+" : ""));
133*8ec969ceSTreehugger Robot }
134*8ec969ceSTreehugger Robot 
135*8ec969ceSTreehugger Robot void print_word P1((w), word w)
136*8ec969ceSTreehugger Robot {
137*8ec969ceSTreehugger Robot 	fprint_word( stdout, w );
138*8ec969ceSTreehugger Robot }
139*8ec969ceSTreehugger Robot 
140*8ec969ceSTreehugger Robot void fprint_longword P2((f, w), FILE * f, longword w)
141*8ec969ceSTreehugger Robot {
142*8ec969ceSTreehugger Robot 	if (!w) putc('0', f);
143*8ec969ceSTreehugger Robot 	else fprintf(f, "0x%8.8lx (%ld%s)",
144*8ec969ceSTreehugger Robot 		(unsigned long)w, (long)w, w == MIN_WORD ? "/-"
145*8ec969ceSTreehugger Robot 		: (w == MAX_WORD ? "/+"
146*8ec969ceSTreehugger Robot 		: (w == MIN_LONGWORD ? "/--"
147*8ec969ceSTreehugger Robot 		: (w == MAX_LONGWORD ? "/++" : ""))));
148*8ec969ceSTreehugger Robot }
149*8ec969ceSTreehugger Robot 
150*8ec969ceSTreehugger Robot void print_longword P1((w),longword w)
151*8ec969ceSTreehugger Robot {
152*8ec969ceSTreehugger Robot 	fprint_longword(stdout, w);
153*8ec969ceSTreehugger Robot }
154*8ec969ceSTreehugger Robot 
155*8ec969ceSTreehugger Robot void do_longword P1((w), longword w)
156*8ec969ceSTreehugger Robot {
157*8ec969ceSTreehugger Robot 	if (interactive) print_longword(w);
158*8ec969ceSTreehugger Robot 	if (do_expect) {
159*8ec969ceSTreehugger Robot 		if ((w & 0xfffffffful) != (L_expect & 0xfffffffful)) {
160*8ec969ceSTreehugger Robot 			if (!interactive) fprint_longword(stderr, w);
161*8ec969ceSTreehugger Robot 			fprintf(stderr, " != %s (%ld, %ld) -- expected ",
162*8ec969ceSTreehugger Robot 				opname, (long)L_op1, (long)L_op2 );
163*8ec969ceSTreehugger Robot 			fprint_longword(stderr, L_expect);
164*8ec969ceSTreehugger Robot 			putc( '\n', stderr );
165*8ec969ceSTreehugger Robot 		}
166*8ec969ceSTreehugger Robot 	} else if (interactive) putchar('\n');
167*8ec969ceSTreehugger Robot }
168*8ec969ceSTreehugger Robot 
169*8ec969ceSTreehugger Robot void do_word P1((w), word w )
170*8ec969ceSTreehugger Robot {
171*8ec969ceSTreehugger Robot 	if (interactive) print_word(w);
172*8ec969ceSTreehugger Robot 	if (do_expect) {
173*8ec969ceSTreehugger Robot 		if (w != expect) {
174*8ec969ceSTreehugger Robot 			if (!interactive) fprint_word(stderr, w);
175*8ec969ceSTreehugger Robot 			fprintf(stderr, " != %s (%ld, %ld) -- expected ",
176*8ec969ceSTreehugger Robot 				opname, (long)L_op1, (long)L_op2 );
177*8ec969ceSTreehugger Robot 			fprint_word(stderr, expect);
178*8ec969ceSTreehugger Robot 			putc('\n', stderr);
179*8ec969ceSTreehugger Robot 		}
180*8ec969ceSTreehugger Robot 	} else if (interactive) putchar('\n');
181*8ec969ceSTreehugger Robot }
182*8ec969ceSTreehugger Robot 
main(ac,av)183*8ec969ceSTreehugger Robot int main(ac, av) char ** av;
184*8ec969ceSTreehugger Robot {
185*8ec969ceSTreehugger Robot 	char	buf[299];
186*8ec969ceSTreehugger Robot 	char	* c;
187*8ec969ceSTreehugger Robot 	FILE 	* in;
188*8ec969ceSTreehugger Robot 
189*8ec969ceSTreehugger Robot 	if (ac > 2) {
190*8ec969ceSTreehugger Robot 		fprintf(stderr, "Usage: %s [filename]\n", av[0]);
191*8ec969ceSTreehugger Robot fail:
192*8ec969ceSTreehugger Robot #ifdef EXIT_FAILURE
193*8ec969ceSTreehugger Robot 		exit(EXIT_FAILURE);
194*8ec969ceSTreehugger Robot #else
195*8ec969ceSTreehugger Robot 		exit(1);
196*8ec969ceSTreehugger Robot #endif
197*8ec969ceSTreehugger Robot 	}
198*8ec969ceSTreehugger Robot 	if (ac < 2) in = stdin;
199*8ec969ceSTreehugger Robot 	else if (!(in = fopen(av[1], "r"))) {
200*8ec969ceSTreehugger Robot 		perror(av[1]);
201*8ec969ceSTreehugger Robot 		fprintf(stderr, "%s: cannot open file \"%s\" for reading\n",
202*8ec969ceSTreehugger Robot 			av[0], av[1]);
203*8ec969ceSTreehugger Robot 		goto fail;
204*8ec969ceSTreehugger Robot 	}
205*8ec969ceSTreehugger Robot 
206*8ec969ceSTreehugger Robot 	interactive = isatty(fileno(in));
207*8ec969ceSTreehugger Robot 
208*8ec969ceSTreehugger Robot 	for (;;) {
209*8ec969ceSTreehugger Robot 		if (interactive) fprintf(stderr, "? ");
210*8ec969ceSTreehugger Robot 
211*8ec969ceSTreehugger Robot 		if (!fgets(buf, sizeof(buf), in)) exit(0);
212*8ec969ceSTreehugger Robot 		if ((c = strchr(buf, '\n')) != 0) *c = 0;
213*8ec969ceSTreehugger Robot 
214*8ec969ceSTreehugger Robot 		if (*buf == ';' || *buf == '#') continue;
215*8ec969ceSTreehugger Robot 		if (*buf == '\'') {
216*8ec969ceSTreehugger Robot 			puts(buf + 1);
217*8ec969ceSTreehugger Robot 			continue;
218*8ec969ceSTreehugger Robot 		}
219*8ec969ceSTreehugger Robot 		if (*buf == '\"') {
220*8ec969ceSTreehugger Robot 			fprintf(stderr,  "%s\n", buf + 1);
221*8ec969ceSTreehugger Robot 			continue;
222*8ec969ceSTreehugger Robot 		}
223*8ec969ceSTreehugger Robot 
224*8ec969ceSTreehugger Robot 		c = parse(buf);
225*8ec969ceSTreehugger Robot 
226*8ec969ceSTreehugger Robot 		if (!c) continue;
227*8ec969ceSTreehugger Robot 		if (!strcmp(c,   "add")) {
228*8ec969ceSTreehugger Robot 			do_word(    gsm_add( op1, op2 ));
229*8ec969ceSTreehugger Robot 			continue;
230*8ec969ceSTreehugger Robot 		}
231*8ec969ceSTreehugger Robot 		if (!strcmp(c,   "M_add")) {
232*8ec969ceSTreehugger Robot 			do_word(    M_gsm_add( op1, op2 ));
233*8ec969ceSTreehugger Robot 			continue;
234*8ec969ceSTreehugger Robot 		}
235*8ec969ceSTreehugger Robot 		if (!strcmp(c, "sub")) {
236*8ec969ceSTreehugger Robot 			do_word(    gsm_sub( op1, op2 ));
237*8ec969ceSTreehugger Robot 			continue;
238*8ec969ceSTreehugger Robot 		}
239*8ec969ceSTreehugger Robot 		if (!strcmp(c, "M_sub")) {
240*8ec969ceSTreehugger Robot 			do_word(    M_gsm_sub( op1, op2 ));
241*8ec969ceSTreehugger Robot 			continue;
242*8ec969ceSTreehugger Robot 		}
243*8ec969ceSTreehugger Robot 		if (!strcmp(c, "mult")) {
244*8ec969ceSTreehugger Robot 			do_word(    gsm_mult( op1, op2 ));
245*8ec969ceSTreehugger Robot 			continue;
246*8ec969ceSTreehugger Robot 		}
247*8ec969ceSTreehugger Robot 		if (!strcmp(c, "M_mult")) {
248*8ec969ceSTreehugger Robot 			do_word(    M_gsm_mult( op1, op2 ));
249*8ec969ceSTreehugger Robot 			continue;
250*8ec969ceSTreehugger Robot 		}
251*8ec969ceSTreehugger Robot 		if (!strcmp(c, "mult_r")) {
252*8ec969ceSTreehugger Robot 			do_word(    gsm_mult_r(op1, op2));
253*8ec969ceSTreehugger Robot 			continue;
254*8ec969ceSTreehugger Robot 		}
255*8ec969ceSTreehugger Robot 		if (!strcmp(c, "M_mult_r")) {
256*8ec969ceSTreehugger Robot 			do_word(    M_gsm_mult_r(op1, op2));
257*8ec969ceSTreehugger Robot 			continue;
258*8ec969ceSTreehugger Robot 		}
259*8ec969ceSTreehugger Robot 		if (!strcmp(c, "abs" )) {
260*8ec969ceSTreehugger Robot 			do_word(    gsm_abs(op1) );
261*8ec969ceSTreehugger Robot 			continue;
262*8ec969ceSTreehugger Robot 		}
263*8ec969ceSTreehugger Robot 		if (!strcmp(c, "M_abs" )) {
264*8ec969ceSTreehugger Robot 			do_word(    M_gsm_abs(op1) );
265*8ec969ceSTreehugger Robot 			continue;
266*8ec969ceSTreehugger Robot 		}
267*8ec969ceSTreehugger Robot 		if (!strcmp(c, "div" )) {
268*8ec969ceSTreehugger Robot 			do_word(    gsm_div( op1, op2 ));
269*8ec969ceSTreehugger Robot 			continue;
270*8ec969ceSTreehugger Robot 		}
271*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "norm" )) {
272*8ec969ceSTreehugger Robot 			do_word(	gsm_norm(L_op1));
273*8ec969ceSTreehugger Robot 			continue;
274*8ec969ceSTreehugger Robot 		}
275*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "<<" )) {
276*8ec969ceSTreehugger Robot 			do_word(    gsm_asl( op1, op2));
277*8ec969ceSTreehugger Robot 			continue;
278*8ec969ceSTreehugger Robot 		}
279*8ec969ceSTreehugger Robot 		if (!strcmp(c,  ">>" )) {
280*8ec969ceSTreehugger Robot 			do_word(    gsm_asr( op1, op2 ));
281*8ec969ceSTreehugger Robot 			continue;
282*8ec969ceSTreehugger Robot 		}
283*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "L_mult")) {
284*8ec969ceSTreehugger Robot 			do_longword( gsm_L_mult( op1, op2 ));
285*8ec969ceSTreehugger Robot 			continue;
286*8ec969ceSTreehugger Robot 		}
287*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "M_L_mult")) {
288*8ec969ceSTreehugger Robot 			do_longword( M_gsm_L_mult( op1, op2 ));
289*8ec969ceSTreehugger Robot 			continue;
290*8ec969ceSTreehugger Robot 		}
291*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "L_add" )) {
292*8ec969ceSTreehugger Robot 			do_longword( gsm_L_add( L_op1, L_op2 ));
293*8ec969ceSTreehugger Robot 			continue;
294*8ec969ceSTreehugger Robot 		}
295*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "M_L_add" )) {
296*8ec969ceSTreehugger Robot 			do_longword( M_gsm_L_add( L_op1, L_op2 ));
297*8ec969ceSTreehugger Robot 			continue;
298*8ec969ceSTreehugger Robot 		}
299*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "L_sub" )) {
300*8ec969ceSTreehugger Robot 			do_longword( gsm_L_sub( L_op1, L_op2 ));
301*8ec969ceSTreehugger Robot 			continue;
302*8ec969ceSTreehugger Robot 		}
303*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "L_<<" )) {
304*8ec969ceSTreehugger Robot 			do_longword(    gsm_L_asl( L_op1, L_op2 ));
305*8ec969ceSTreehugger Robot 			continue;
306*8ec969ceSTreehugger Robot 		}
307*8ec969ceSTreehugger Robot 		if (!strcmp(c,  "L_>>")) {
308*8ec969ceSTreehugger Robot 			do_longword(    gsm_L_asr( L_op1, L_op2 ));
309*8ec969ceSTreehugger Robot 			continue;
310*8ec969ceSTreehugger Robot 		}
311*8ec969ceSTreehugger Robot 		help();
312*8ec969ceSTreehugger Robot 	}
313*8ec969ceSTreehugger Robot }
314*8ec969ceSTreehugger Robot 
315*8ec969ceSTreehugger Robot #include "private.h"
316*8ec969ceSTreehugger Robot 
317*8ec969ceSTreehugger Robot /*
318*8ec969ceSTreehugger Robot  * Function stubs for macro implementations of commonly used
319*8ec969ceSTreehugger Robot  * math functions
320*8ec969ceSTreehugger Robot  */
321*8ec969ceSTreehugger Robot word M_gsm_add P2((op1, op2),word op1, word op2)
322*8ec969ceSTreehugger Robot {
323*8ec969ceSTreehugger Robot 	longword ltmp;
324*8ec969ceSTreehugger Robot 	return GSM_ADD(op1, op2);
325*8ec969ceSTreehugger Robot }
326*8ec969ceSTreehugger Robot 
327*8ec969ceSTreehugger Robot word M_gsm_sub P2((op1, op2), word op1, word op2)
328*8ec969ceSTreehugger Robot {
329*8ec969ceSTreehugger Robot 	longword ltmp;
330*8ec969ceSTreehugger Robot 	return GSM_SUB(op1, op2);
331*8ec969ceSTreehugger Robot }
332*8ec969ceSTreehugger Robot 
333*8ec969ceSTreehugger Robot word M_gsm_mult P2((op1, op2), word op1, word op2)
334*8ec969ceSTreehugger Robot {
335*8ec969ceSTreehugger Robot 	return GSM_MULT(op1, op2);
336*8ec969ceSTreehugger Robot }
337*8ec969ceSTreehugger Robot 
338*8ec969ceSTreehugger Robot word M_gsm_mult_r P2((op1, op2), word op1, word op2)
339*8ec969ceSTreehugger Robot {
340*8ec969ceSTreehugger Robot 	return GSM_MULT_R(op1, op2);
341*8ec969ceSTreehugger Robot }
342*8ec969ceSTreehugger Robot 
343*8ec969ceSTreehugger Robot word M_gsm_abs P1((op1), word op1)
344*8ec969ceSTreehugger Robot {
345*8ec969ceSTreehugger Robot 	return GSM_ABS(op1);
346*8ec969ceSTreehugger Robot }
347*8ec969ceSTreehugger Robot 
348*8ec969ceSTreehugger Robot longword M_gsm_L_mult P2((op1, op2), word op1, word op2)
349*8ec969ceSTreehugger Robot {
350*8ec969ceSTreehugger Robot 	return GSM_L_MULT(op1, op2);
351*8ec969ceSTreehugger Robot }
352*8ec969ceSTreehugger Robot 
353*8ec969ceSTreehugger Robot longword M_gsm_L_add P2((op1, op2), longword op1, longword op2)
354*8ec969ceSTreehugger Robot {
355*8ec969ceSTreehugger Robot 	ulongword utmp;
356*8ec969ceSTreehugger Robot 	return GSM_L_ADD(op1, op2);
357*8ec969ceSTreehugger Robot }
358