xref: /nrf52832-nimble/rt-thread/components/finsh/finsh_ops.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2010-03-22     Bernard      first version
9*10465441SEvalZero  */
10*10465441SEvalZero #include "finsh_ops.h"
11*10465441SEvalZero #include "finsh_vm.h"
12*10465441SEvalZero 
13*10465441SEvalZero #define OP_BIN_BYTE(x)  do {\
14*10465441SEvalZero         (finsh_sp - 2)->char_value = (finsh_sp - 2)->char_value x (finsh_sp - 1)->char_value; \
15*10465441SEvalZero         finsh_sp--; \
16*10465441SEvalZero     }while (0)
17*10465441SEvalZero 
18*10465441SEvalZero #define OP_BIN_WORD(x)  do {\
19*10465441SEvalZero         (finsh_sp - 2)->short_value = (finsh_sp - 2)->short_value x (finsh_sp - 1)->short_value; \
20*10465441SEvalZero         finsh_sp--; \
21*10465441SEvalZero     }while (0)
22*10465441SEvalZero 
23*10465441SEvalZero #define OP_BIN_DWORD(x)  do {\
24*10465441SEvalZero         (finsh_sp - 2)->long_value = (finsh_sp - 2)->long_value x (finsh_sp - 1)->long_value; \
25*10465441SEvalZero         finsh_sp--; \
26*10465441SEvalZero     }while (0)
27*10465441SEvalZero 
28*10465441SEvalZero /* --- noop --- */
OP_no_op()29*10465441SEvalZero void OP_no_op()
30*10465441SEvalZero {
31*10465441SEvalZero     /* none */
32*10465441SEvalZero     return ;
33*10465441SEvalZero }
34*10465441SEvalZero 
35*10465441SEvalZero /* --- add --- */
OP_add_byte()36*10465441SEvalZero void OP_add_byte()
37*10465441SEvalZero {
38*10465441SEvalZero     OP_BIN_BYTE(+);
39*10465441SEvalZero 
40*10465441SEvalZero     return ;
41*10465441SEvalZero }
42*10465441SEvalZero 
OP_add_word()43*10465441SEvalZero void OP_add_word()
44*10465441SEvalZero {
45*10465441SEvalZero     OP_BIN_WORD(+);
46*10465441SEvalZero 
47*10465441SEvalZero     return ;
48*10465441SEvalZero }
49*10465441SEvalZero 
OP_add_dword()50*10465441SEvalZero void OP_add_dword()
51*10465441SEvalZero {
52*10465441SEvalZero     OP_BIN_DWORD(+);
53*10465441SEvalZero 
54*10465441SEvalZero     return ;
55*10465441SEvalZero }
56*10465441SEvalZero 
57*10465441SEvalZero /* --- sub --- */
OP_sub_byte()58*10465441SEvalZero void OP_sub_byte()
59*10465441SEvalZero {
60*10465441SEvalZero     OP_BIN_BYTE(-);
61*10465441SEvalZero 
62*10465441SEvalZero     return ;
63*10465441SEvalZero }
64*10465441SEvalZero 
OP_sub_word()65*10465441SEvalZero void OP_sub_word()
66*10465441SEvalZero {
67*10465441SEvalZero     OP_BIN_WORD(-);
68*10465441SEvalZero 
69*10465441SEvalZero     return ;
70*10465441SEvalZero }
71*10465441SEvalZero 
OP_sub_dword()72*10465441SEvalZero void OP_sub_dword()
73*10465441SEvalZero {
74*10465441SEvalZero     OP_BIN_DWORD(-);
75*10465441SEvalZero 
76*10465441SEvalZero     return ;
77*10465441SEvalZero }
78*10465441SEvalZero 
79*10465441SEvalZero /* --- div --- */
OP_div_byte()80*10465441SEvalZero void OP_div_byte()
81*10465441SEvalZero {
82*10465441SEvalZero     OP_BIN_BYTE(/);
83*10465441SEvalZero 
84*10465441SEvalZero     return ;
85*10465441SEvalZero }
86*10465441SEvalZero 
OP_div_word()87*10465441SEvalZero void OP_div_word()
88*10465441SEvalZero {
89*10465441SEvalZero     OP_BIN_WORD(/);
90*10465441SEvalZero 
91*10465441SEvalZero     return ;
92*10465441SEvalZero }
93*10465441SEvalZero 
OP_div_dword()94*10465441SEvalZero void OP_div_dword()
95*10465441SEvalZero {
96*10465441SEvalZero     OP_BIN_DWORD(/);
97*10465441SEvalZero 
98*10465441SEvalZero     return ;
99*10465441SEvalZero }
100*10465441SEvalZero 
101*10465441SEvalZero /* --- mod --- */
OP_mod_byte()102*10465441SEvalZero void OP_mod_byte()
103*10465441SEvalZero {
104*10465441SEvalZero     OP_BIN_BYTE(%);
105*10465441SEvalZero 
106*10465441SEvalZero     return ;
107*10465441SEvalZero }
108*10465441SEvalZero 
OP_mod_word()109*10465441SEvalZero void OP_mod_word()
110*10465441SEvalZero {
111*10465441SEvalZero     OP_BIN_WORD(%);
112*10465441SEvalZero 
113*10465441SEvalZero     return ;
114*10465441SEvalZero }
115*10465441SEvalZero 
OP_mod_dword()116*10465441SEvalZero void OP_mod_dword()
117*10465441SEvalZero {
118*10465441SEvalZero     OP_BIN_DWORD(%);
119*10465441SEvalZero 
120*10465441SEvalZero     return ;
121*10465441SEvalZero }
122*10465441SEvalZero 
123*10465441SEvalZero /* --- mul --- */
OP_mul_byte()124*10465441SEvalZero void OP_mul_byte()
125*10465441SEvalZero {
126*10465441SEvalZero     OP_BIN_BYTE(*);
127*10465441SEvalZero 
128*10465441SEvalZero     return ;
129*10465441SEvalZero }
130*10465441SEvalZero 
OP_mul_word()131*10465441SEvalZero void OP_mul_word()
132*10465441SEvalZero {
133*10465441SEvalZero     OP_BIN_WORD(*);
134*10465441SEvalZero 
135*10465441SEvalZero     return ;
136*10465441SEvalZero }
137*10465441SEvalZero 
OP_mul_dword()138*10465441SEvalZero void OP_mul_dword()
139*10465441SEvalZero {
140*10465441SEvalZero     OP_BIN_DWORD(*);
141*10465441SEvalZero 
142*10465441SEvalZero     return ;
143*10465441SEvalZero }
144*10465441SEvalZero 
145*10465441SEvalZero /* --- and --- */
OP_and_byte()146*10465441SEvalZero void OP_and_byte()
147*10465441SEvalZero {
148*10465441SEvalZero     OP_BIN_BYTE(&);
149*10465441SEvalZero 
150*10465441SEvalZero     return ;
151*10465441SEvalZero }
152*10465441SEvalZero 
OP_and_word()153*10465441SEvalZero void OP_and_word()
154*10465441SEvalZero {
155*10465441SEvalZero     OP_BIN_WORD(&);
156*10465441SEvalZero 
157*10465441SEvalZero     return ;
158*10465441SEvalZero }
159*10465441SEvalZero 
OP_and_dword()160*10465441SEvalZero void OP_and_dword()
161*10465441SEvalZero {
162*10465441SEvalZero     OP_BIN_DWORD(&);
163*10465441SEvalZero 
164*10465441SEvalZero     return ;
165*10465441SEvalZero }
166*10465441SEvalZero 
167*10465441SEvalZero /* --- or --- */
OP_or_byte()168*10465441SEvalZero void OP_or_byte()
169*10465441SEvalZero {
170*10465441SEvalZero     OP_BIN_BYTE(|);
171*10465441SEvalZero 
172*10465441SEvalZero     return ;
173*10465441SEvalZero }
174*10465441SEvalZero 
OP_or_word()175*10465441SEvalZero void OP_or_word()
176*10465441SEvalZero {
177*10465441SEvalZero     OP_BIN_WORD(|);
178*10465441SEvalZero 
179*10465441SEvalZero     return ;
180*10465441SEvalZero }
181*10465441SEvalZero 
OP_or_dword()182*10465441SEvalZero void OP_or_dword()
183*10465441SEvalZero {
184*10465441SEvalZero     OP_BIN_DWORD(|);
185*10465441SEvalZero 
186*10465441SEvalZero     return ;
187*10465441SEvalZero }
188*10465441SEvalZero 
189*10465441SEvalZero /* --- xor --- */
OP_xor_byte()190*10465441SEvalZero void OP_xor_byte()
191*10465441SEvalZero {
192*10465441SEvalZero     OP_BIN_BYTE(^);
193*10465441SEvalZero 
194*10465441SEvalZero     return ;
195*10465441SEvalZero }
196*10465441SEvalZero 
OP_xor_word()197*10465441SEvalZero void OP_xor_word()
198*10465441SEvalZero {
199*10465441SEvalZero     OP_BIN_WORD(^);
200*10465441SEvalZero 
201*10465441SEvalZero     return ;
202*10465441SEvalZero }
203*10465441SEvalZero 
OP_xor_dword()204*10465441SEvalZero void OP_xor_dword()
205*10465441SEvalZero {
206*10465441SEvalZero     OP_BIN_DWORD(^);
207*10465441SEvalZero 
208*10465441SEvalZero     return ;
209*10465441SEvalZero }
210*10465441SEvalZero 
211*10465441SEvalZero /* --- bw --- */
OP_bw_byte()212*10465441SEvalZero void OP_bw_byte()
213*10465441SEvalZero {
214*10465441SEvalZero     (finsh_sp - 1)->char_value = ~ ((finsh_sp - 1)->char_value);
215*10465441SEvalZero 
216*10465441SEvalZero     return ;
217*10465441SEvalZero }
218*10465441SEvalZero 
OP_bw_word()219*10465441SEvalZero void OP_bw_word()
220*10465441SEvalZero {
221*10465441SEvalZero     (finsh_sp - 1)->short_value = ~ ((finsh_sp - 1)->short_value);
222*10465441SEvalZero 
223*10465441SEvalZero     return ;
224*10465441SEvalZero }
225*10465441SEvalZero 
OP_bw_dword()226*10465441SEvalZero void OP_bw_dword()
227*10465441SEvalZero {
228*10465441SEvalZero     (finsh_sp - 1)->long_value = ~ ((finsh_sp - 1)->long_value);
229*10465441SEvalZero 
230*10465441SEvalZero     return ;
231*10465441SEvalZero }
232*10465441SEvalZero 
233*10465441SEvalZero /* --- shl --- */
OP_shl_byte()234*10465441SEvalZero void OP_shl_byte()
235*10465441SEvalZero {
236*10465441SEvalZero     OP_BIN_BYTE(<<);
237*10465441SEvalZero 
238*10465441SEvalZero     return ;
239*10465441SEvalZero }
240*10465441SEvalZero 
OP_shl_word()241*10465441SEvalZero void OP_shl_word()
242*10465441SEvalZero {
243*10465441SEvalZero     OP_BIN_WORD(<<);
244*10465441SEvalZero 
245*10465441SEvalZero     return ;
246*10465441SEvalZero }
247*10465441SEvalZero 
OP_shl_dword()248*10465441SEvalZero void OP_shl_dword()
249*10465441SEvalZero {
250*10465441SEvalZero     OP_BIN_DWORD(<<);
251*10465441SEvalZero 
252*10465441SEvalZero     return ;
253*10465441SEvalZero }
254*10465441SEvalZero 
255*10465441SEvalZero /* --- shr --- */
OP_shr_byte()256*10465441SEvalZero void OP_shr_byte()
257*10465441SEvalZero {
258*10465441SEvalZero     OP_BIN_BYTE(>>);
259*10465441SEvalZero 
260*10465441SEvalZero     return ;
261*10465441SEvalZero }
262*10465441SEvalZero 
OP_shr_word()263*10465441SEvalZero void OP_shr_word()
264*10465441SEvalZero {
265*10465441SEvalZero     OP_BIN_WORD(>>);
266*10465441SEvalZero 
267*10465441SEvalZero     return ;
268*10465441SEvalZero }
269*10465441SEvalZero 
OP_shr_dword()270*10465441SEvalZero void OP_shr_dword()
271*10465441SEvalZero {
272*10465441SEvalZero     OP_BIN_DWORD(>>);
273*10465441SEvalZero 
274*10465441SEvalZero     return ;
275*10465441SEvalZero }
276*10465441SEvalZero 
277*10465441SEvalZero /* --- ld --- */
OP_ld_byte()278*10465441SEvalZero void OP_ld_byte()
279*10465441SEvalZero {
280*10465441SEvalZero     finsh_sp->char_value = *finsh_pc;
281*10465441SEvalZero 
282*10465441SEvalZero     finsh_sp++;
283*10465441SEvalZero     finsh_pc++;
284*10465441SEvalZero 
285*10465441SEvalZero     return ;
286*10465441SEvalZero }
287*10465441SEvalZero 
OP_ld_word()288*10465441SEvalZero void OP_ld_word()
289*10465441SEvalZero {
290*10465441SEvalZero     finsh_sp->short_value = FINSH_GET16(finsh_pc);
291*10465441SEvalZero 
292*10465441SEvalZero     finsh_sp ++;
293*10465441SEvalZero     finsh_pc += 2;
294*10465441SEvalZero 
295*10465441SEvalZero     return ;
296*10465441SEvalZero }
297*10465441SEvalZero 
OP_ld_dword()298*10465441SEvalZero void OP_ld_dword()
299*10465441SEvalZero {
300*10465441SEvalZero     finsh_sp->long_value = FINSH_GET32(finsh_pc);
301*10465441SEvalZero 
302*10465441SEvalZero     finsh_sp ++;
303*10465441SEvalZero     finsh_pc += 4;
304*10465441SEvalZero 
305*10465441SEvalZero     return ;
306*10465441SEvalZero }
307*10465441SEvalZero 
OP_ld_value_byte()308*10465441SEvalZero void OP_ld_value_byte()
309*10465441SEvalZero {
310*10465441SEvalZero     char* c;
311*10465441SEvalZero 
312*10465441SEvalZero     c = (char*) (FINSH_GET32(finsh_pc));
313*10465441SEvalZero 
314*10465441SEvalZero     finsh_sp->char_value = *c;
315*10465441SEvalZero 
316*10465441SEvalZero     finsh_sp ++;
317*10465441SEvalZero     finsh_pc += 4;
318*10465441SEvalZero 
319*10465441SEvalZero     return;
320*10465441SEvalZero }
321*10465441SEvalZero 
OP_ld_value_byte_stack()322*10465441SEvalZero void OP_ld_value_byte_stack()
323*10465441SEvalZero {
324*10465441SEvalZero     char* c;
325*10465441SEvalZero 
326*10465441SEvalZero     c = (char *)(finsh_sp - 1)->long_value;
327*10465441SEvalZero     (finsh_sp - 1)->char_value = *c;
328*10465441SEvalZero 
329*10465441SEvalZero     return;
330*10465441SEvalZero }
331*10465441SEvalZero 
OP_ld_value_word()332*10465441SEvalZero void OP_ld_value_word()
333*10465441SEvalZero {
334*10465441SEvalZero     short* s;
335*10465441SEvalZero 
336*10465441SEvalZero     s = (short*) (FINSH_GET32(finsh_pc));
337*10465441SEvalZero 
338*10465441SEvalZero     finsh_sp->short_value = *s;
339*10465441SEvalZero 
340*10465441SEvalZero     finsh_sp ++;
341*10465441SEvalZero     finsh_pc += 4;
342*10465441SEvalZero 
343*10465441SEvalZero     return;
344*10465441SEvalZero }
345*10465441SEvalZero 
OP_ld_value_word_stack()346*10465441SEvalZero void OP_ld_value_word_stack()
347*10465441SEvalZero {
348*10465441SEvalZero     short* s;
349*10465441SEvalZero 
350*10465441SEvalZero     s = (short *)(finsh_sp - 1)->long_value;
351*10465441SEvalZero     (finsh_sp - 1)->short_value = *s;
352*10465441SEvalZero 
353*10465441SEvalZero     return;
354*10465441SEvalZero }
355*10465441SEvalZero 
OP_ld_value_dword()356*10465441SEvalZero void OP_ld_value_dword()
357*10465441SEvalZero {
358*10465441SEvalZero     long* l;
359*10465441SEvalZero 
360*10465441SEvalZero     l = (long*) (FINSH_GET32(finsh_pc));
361*10465441SEvalZero 
362*10465441SEvalZero     finsh_sp->long_value = *l;
363*10465441SEvalZero 
364*10465441SEvalZero     finsh_sp ++;
365*10465441SEvalZero     finsh_pc += 4;
366*10465441SEvalZero 
367*10465441SEvalZero     return;
368*10465441SEvalZero }
369*10465441SEvalZero 
OP_ld_value_dword_stack()370*10465441SEvalZero void OP_ld_value_dword_stack()
371*10465441SEvalZero {
372*10465441SEvalZero     long* l;
373*10465441SEvalZero 
374*10465441SEvalZero     l = (long *)(finsh_sp - 1)->long_value;
375*10465441SEvalZero     (finsh_sp - 1)->long_value = *l;
376*10465441SEvalZero 
377*10465441SEvalZero     return;
378*10465441SEvalZero }
379*10465441SEvalZero 
380*10465441SEvalZero /* --- st --- */
381*10465441SEvalZero /*
382*10465441SEvalZero  * 2006-4-16 bernard
383*10465441SEvalZero  * fixed the sp move bug
384*10465441SEvalZero  */
OP_st_byte()385*10465441SEvalZero void OP_st_byte()
386*10465441SEvalZero {
387*10465441SEvalZero     *(char*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->char_value;
388*10465441SEvalZero     finsh_sp --;
389*10465441SEvalZero 
390*10465441SEvalZero     return ;
391*10465441SEvalZero }
392*10465441SEvalZero 
393*10465441SEvalZero /*
394*10465441SEvalZero  * 2006-4-16 bernard
395*10465441SEvalZero  * fixed the sp move bug
396*10465441SEvalZero  */
OP_st_word()397*10465441SEvalZero void OP_st_word()
398*10465441SEvalZero {
399*10465441SEvalZero     *(short*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->short_value;
400*10465441SEvalZero     finsh_sp --;
401*10465441SEvalZero 
402*10465441SEvalZero     return ;
403*10465441SEvalZero }
404*10465441SEvalZero 
405*10465441SEvalZero /*
406*10465441SEvalZero  * 2006-4-16 bernard
407*10465441SEvalZero  * fixed the sp move bug
408*10465441SEvalZero  */
OP_st_dword()409*10465441SEvalZero void OP_st_dword()
410*10465441SEvalZero {
411*10465441SEvalZero     *(long*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->long_value;
412*10465441SEvalZero     finsh_sp --;
413*10465441SEvalZero 
414*10465441SEvalZero     return ;
415*10465441SEvalZero }
416*10465441SEvalZero 
417*10465441SEvalZero /* --- pop --- */
OP_pop()418*10465441SEvalZero void OP_pop()
419*10465441SEvalZero {
420*10465441SEvalZero     finsh_sp --;
421*10465441SEvalZero     return ;
422*10465441SEvalZero }
423*10465441SEvalZero 
424*10465441SEvalZero /* --- call --- */
OP_call()425*10465441SEvalZero void OP_call()
426*10465441SEvalZero {
427*10465441SEvalZero     /* the max number of arg*/
428*10465441SEvalZero     unsigned long parameterv[16];
429*10465441SEvalZero     unsigned int  parameters, i;
430*10465441SEvalZero 
431*10465441SEvalZero     typedef unsigned long var_t;
432*10465441SEvalZero     typedef var_t (*op_func)();
433*10465441SEvalZero     op_func f;
434*10465441SEvalZero     var_t   r;
435*10465441SEvalZero 
436*10465441SEvalZero     parameters = *finsh_pc ++;
437*10465441SEvalZero 
438*10465441SEvalZero     i = 0; finsh_sp --;
439*10465441SEvalZero     while (i < parameters)
440*10465441SEvalZero     {
441*10465441SEvalZero         parameterv[parameters - 1 - i] = finsh_sp->long_value;
442*10465441SEvalZero         finsh_sp --;
443*10465441SEvalZero         i++;
444*10465441SEvalZero     }
445*10465441SEvalZero 
446*10465441SEvalZero     f = (op_func)(finsh_sp->long_value);
447*10465441SEvalZero     switch (parameters)
448*10465441SEvalZero     {
449*10465441SEvalZero     case 0:
450*10465441SEvalZero         r = f(0);
451*10465441SEvalZero         break;
452*10465441SEvalZero 
453*10465441SEvalZero     case 1:
454*10465441SEvalZero         r = f(parameterv[0]);
455*10465441SEvalZero         break;
456*10465441SEvalZero 
457*10465441SEvalZero     case 2:
458*10465441SEvalZero         r = f(parameterv[0], parameterv[1]);
459*10465441SEvalZero         break;
460*10465441SEvalZero 
461*10465441SEvalZero     case 3:
462*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2]);
463*10465441SEvalZero         break;
464*10465441SEvalZero 
465*10465441SEvalZero     case 4:
466*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3]);
467*10465441SEvalZero         break;
468*10465441SEvalZero 
469*10465441SEvalZero     case 5:
470*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
471*10465441SEvalZero                 parameterv[4]);
472*10465441SEvalZero         break;
473*10465441SEvalZero 
474*10465441SEvalZero     case 6:
475*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
476*10465441SEvalZero                 parameterv[4], parameterv[5]);
477*10465441SEvalZero         break;
478*10465441SEvalZero 
479*10465441SEvalZero     case 7:
480*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
481*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6]);
482*10465441SEvalZero         break;
483*10465441SEvalZero 
484*10465441SEvalZero     case 8:
485*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
486*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7]);
487*10465441SEvalZero         break;
488*10465441SEvalZero 
489*10465441SEvalZero     case 9:
490*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
491*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
492*10465441SEvalZero                 parameterv[8]);
493*10465441SEvalZero         break;
494*10465441SEvalZero 
495*10465441SEvalZero     case 10:
496*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
497*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
498*10465441SEvalZero                 parameterv[8], parameterv[9]);
499*10465441SEvalZero         break;
500*10465441SEvalZero 
501*10465441SEvalZero     case 11:
502*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
503*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
504*10465441SEvalZero                 parameterv[8], parameterv[9], parameterv[10]);
505*10465441SEvalZero         break;
506*10465441SEvalZero 
507*10465441SEvalZero     case 12:
508*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
509*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
510*10465441SEvalZero                 parameterv[8], parameterv[9], parameterv[10], parameterv[11]);
511*10465441SEvalZero         break;
512*10465441SEvalZero 
513*10465441SEvalZero     case 13:
514*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
515*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
516*10465441SEvalZero                 parameterv[8], parameterv[9], parameterv[10], parameterv[11],
517*10465441SEvalZero                 parameterv[12]);
518*10465441SEvalZero         break;
519*10465441SEvalZero 
520*10465441SEvalZero     case 14:
521*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
522*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
523*10465441SEvalZero                 parameterv[8], parameterv[9], parameterv[10], parameterv[11],
524*10465441SEvalZero                 parameterv[12], parameterv[13]);
525*10465441SEvalZero         break;
526*10465441SEvalZero 
527*10465441SEvalZero     case 15:
528*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
529*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
530*10465441SEvalZero                 parameterv[8], parameterv[9], parameterv[10], parameterv[11],
531*10465441SEvalZero                 parameterv[12], parameterv[13], parameterv[14]);
532*10465441SEvalZero         break;
533*10465441SEvalZero 
534*10465441SEvalZero     case 16:
535*10465441SEvalZero         r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
536*10465441SEvalZero                 parameterv[4], parameterv[5], parameterv[6], parameterv[7],
537*10465441SEvalZero                 parameterv[8], parameterv[9], parameterv[10], parameterv[11],
538*10465441SEvalZero                 parameterv[12], parameterv[13], parameterv[14], parameterv[15]);
539*10465441SEvalZero         break;
540*10465441SEvalZero 
541*10465441SEvalZero     default:
542*10465441SEvalZero         r = 0;
543*10465441SEvalZero         break;
544*10465441SEvalZero     }
545*10465441SEvalZero 
546*10465441SEvalZero     finsh_sp->long_value = r;
547*10465441SEvalZero     finsh_sp ++;
548*10465441SEvalZero 
549*10465441SEvalZero     return ;
550*10465441SEvalZero }
551*10465441SEvalZero 
552*10465441SEvalZero const op_func op_table[] =
553*10465441SEvalZero {
554*10465441SEvalZero     /* 00 */ OP_no_op,
555*10465441SEvalZero     /* 01 */ OP_add_byte,
556*10465441SEvalZero     /* 02 */ OP_add_word,
557*10465441SEvalZero     /* 03 */ OP_add_dword,
558*10465441SEvalZero     /* 04 */ OP_sub_byte,
559*10465441SEvalZero     /* 05 */ OP_sub_word,
560*10465441SEvalZero     /* 06 */ OP_sub_dword,
561*10465441SEvalZero     /* 07 */ OP_div_byte,
562*10465441SEvalZero     /* 08 */ OP_div_word,
563*10465441SEvalZero     /* 09 */ OP_div_dword,
564*10465441SEvalZero     /* 10 */ OP_mod_byte,
565*10465441SEvalZero     /* 11 */ OP_mod_word,
566*10465441SEvalZero     /* 12 */ OP_mod_dword,
567*10465441SEvalZero     /* 13 */ OP_mul_byte,
568*10465441SEvalZero     /* 14 */ OP_mul_word,
569*10465441SEvalZero     /* 15 */ OP_mul_dword,
570*10465441SEvalZero     /* 16 */ OP_and_byte,
571*10465441SEvalZero     /* 17 */ OP_and_word,
572*10465441SEvalZero     /* 18 */ OP_and_dword,
573*10465441SEvalZero     /* 19 */ OP_or_byte,
574*10465441SEvalZero     /* 20 */ OP_or_word,
575*10465441SEvalZero     /* 21 */ OP_or_dword,
576*10465441SEvalZero     /* 22 */ OP_xor_byte,
577*10465441SEvalZero     /* 23 */ OP_xor_word,
578*10465441SEvalZero     /* 24 */ OP_xor_dword,
579*10465441SEvalZero     /* 25 */ OP_bw_byte,
580*10465441SEvalZero     /* 26 */ OP_bw_word,
581*10465441SEvalZero     /* 27 */ OP_bw_dword,
582*10465441SEvalZero     /* 28 */ OP_shl_byte,
583*10465441SEvalZero     /* 29 */ OP_shl_word,
584*10465441SEvalZero     /* 30 */ OP_shl_dword,
585*10465441SEvalZero     /* 31 */ OP_shr_byte,
586*10465441SEvalZero     /* 32 */ OP_shr_word,
587*10465441SEvalZero     /* 33 */ OP_shr_dword,
588*10465441SEvalZero     /* 34 */ OP_ld_byte,
589*10465441SEvalZero     /* 35 */ OP_ld_word,
590*10465441SEvalZero     /* 36 */ OP_ld_dword,
591*10465441SEvalZero     /* 37 */ OP_ld_value_byte,
592*10465441SEvalZero     /* 38 */ OP_ld_value_word,
593*10465441SEvalZero     /* 39 */ OP_ld_value_dword,
594*10465441SEvalZero     /* 40 */ OP_st_byte,
595*10465441SEvalZero     /* 41 */ OP_st_word,
596*10465441SEvalZero     /* 42 */ OP_st_dword,
597*10465441SEvalZero     /* 43 */ OP_pop,
598*10465441SEvalZero     /* 44 */ OP_call,
599*10465441SEvalZero     /* 45 */ OP_ld_value_byte_stack,
600*10465441SEvalZero     /* 46 */ OP_ld_value_word_stack,
601*10465441SEvalZero     /* 47 */ OP_ld_value_dword_stack,
602*10465441SEvalZero     NULL
603*10465441SEvalZero };
604