finsh_ops.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. #include "finsh_ops.h"
  2. #include "finsh_vm.h"
  3. #define OP_BIN_BYTE(x) do {\
  4. (finsh_sp - 2)->char_value = (finsh_sp - 2)->char_value x (finsh_sp - 1)->char_value; \
  5. finsh_sp--; \
  6. }while (0)
  7. #define OP_BIN_WORD(x) do {\
  8. (finsh_sp - 2)->short_value = (finsh_sp - 2)->short_value x (finsh_sp - 1)->short_value; \
  9. finsh_sp--; \
  10. }while (0)
  11. #define OP_BIN_DWORD(x) do {\
  12. (finsh_sp - 2)->long_value = (finsh_sp - 2)->long_value x (finsh_sp - 1)->long_value; \
  13. finsh_sp--; \
  14. }while (0)
  15. /* --- noop --- */
  16. void OP_no_op()
  17. {
  18. /* none */
  19. return ;
  20. }
  21. /* --- add --- */
  22. void OP_add_byte()
  23. {
  24. OP_BIN_BYTE(+);
  25. return ;
  26. }
  27. void OP_add_word()
  28. {
  29. OP_BIN_WORD(+);
  30. return ;
  31. }
  32. void OP_add_dword()
  33. {
  34. OP_BIN_DWORD(+);
  35. return ;
  36. }
  37. /* --- sub --- */
  38. void OP_sub_byte()
  39. {
  40. OP_BIN_BYTE(-);
  41. return ;
  42. }
  43. void OP_sub_word()
  44. {
  45. OP_BIN_WORD(-);
  46. return ;
  47. }
  48. void OP_sub_dword()
  49. {
  50. OP_BIN_DWORD(-);
  51. return ;
  52. }
  53. /* --- div --- */
  54. void OP_div_byte()
  55. {
  56. OP_BIN_BYTE(/);
  57. return ;
  58. }
  59. void OP_div_word()
  60. {
  61. OP_BIN_WORD(/);
  62. return ;
  63. }
  64. void OP_div_dword()
  65. {
  66. OP_BIN_DWORD(/);
  67. return ;
  68. }
  69. /* --- mod --- */
  70. void OP_mod_byte()
  71. {
  72. OP_BIN_BYTE(%);
  73. return ;
  74. }
  75. void OP_mod_word()
  76. {
  77. OP_BIN_WORD(%);
  78. return ;
  79. }
  80. void OP_mod_dword()
  81. {
  82. OP_BIN_DWORD(%);
  83. return ;
  84. }
  85. /* --- mul --- */
  86. void OP_mul_byte()
  87. {
  88. OP_BIN_BYTE(*);
  89. return ;
  90. }
  91. void OP_mul_word()
  92. {
  93. OP_BIN_WORD(*);
  94. return ;
  95. }
  96. void OP_mul_dword()
  97. {
  98. OP_BIN_DWORD(*);
  99. return ;
  100. }
  101. /* --- and --- */
  102. void OP_and_byte()
  103. {
  104. OP_BIN_BYTE(&);
  105. return ;
  106. }
  107. void OP_and_word()
  108. {
  109. OP_BIN_WORD(&);
  110. return ;
  111. }
  112. void OP_and_dword()
  113. {
  114. OP_BIN_DWORD(&);
  115. return ;
  116. }
  117. /* --- or --- */
  118. void OP_or_byte()
  119. {
  120. OP_BIN_BYTE(|);
  121. return ;
  122. }
  123. void OP_or_word()
  124. {
  125. OP_BIN_WORD(|);
  126. return ;
  127. }
  128. void OP_or_dword()
  129. {
  130. OP_BIN_DWORD(|);
  131. return ;
  132. }
  133. /* --- xor --- */
  134. void OP_xor_byte()
  135. {
  136. OP_BIN_BYTE(^);
  137. return ;
  138. }
  139. void OP_xor_word()
  140. {
  141. OP_BIN_WORD(^);
  142. return ;
  143. }
  144. void OP_xor_dword()
  145. {
  146. OP_BIN_DWORD(^);
  147. return ;
  148. }
  149. /* --- bw --- */
  150. void OP_bw_byte()
  151. {
  152. (finsh_sp - 1)->char_value = ~ ((finsh_sp - 1)->char_value);
  153. return ;
  154. }
  155. void OP_bw_word()
  156. {
  157. (finsh_sp - 1)->short_value = ~ ((finsh_sp - 1)->short_value);
  158. return ;
  159. }
  160. void OP_bw_dword()
  161. {
  162. (finsh_sp - 1)->long_value = ~ ((finsh_sp - 1)->long_value);
  163. return ;
  164. }
  165. /* --- shl --- */
  166. void OP_shl_byte()
  167. {
  168. OP_BIN_BYTE(<<);
  169. return ;
  170. }
  171. void OP_shl_word()
  172. {
  173. OP_BIN_WORD(<<);
  174. return ;
  175. }
  176. void OP_shl_dword()
  177. {
  178. OP_BIN_DWORD(<<);
  179. return ;
  180. }
  181. /* --- shr --- */
  182. void OP_shr_byte()
  183. {
  184. OP_BIN_BYTE(>>);
  185. return ;
  186. }
  187. void OP_shr_word()
  188. {
  189. OP_BIN_WORD(>>);
  190. return ;
  191. }
  192. void OP_shr_dword()
  193. {
  194. OP_BIN_DWORD(>>);
  195. return ;
  196. }
  197. /* --- ld --- */
  198. void OP_ld_byte()
  199. {
  200. finsh_sp->char_value = *finsh_pc;
  201. finsh_sp++;
  202. finsh_pc++;
  203. return ;
  204. }
  205. void OP_ld_word()
  206. {
  207. finsh_sp->short_value = FINSH_GET16(finsh_pc);
  208. finsh_sp ++;
  209. finsh_pc += 2;
  210. return ;
  211. }
  212. void OP_ld_dword()
  213. {
  214. finsh_sp->long_value = FINSH_GET32(finsh_pc);
  215. finsh_sp ++;
  216. finsh_pc += 4;
  217. return ;
  218. }
  219. void OP_ld_value_byte()
  220. {
  221. char* c;
  222. c = (char*) (FINSH_GET32(finsh_pc));
  223. finsh_sp->char_value = *c;
  224. finsh_sp ++;
  225. finsh_pc += 4;
  226. return;
  227. }
  228. void OP_ld_value_byte_stack()
  229. {
  230. char* c;
  231. c = (char *)(finsh_sp - 1)->long_value;
  232. (finsh_sp - 1)->char_value = *c;
  233. return;
  234. }
  235. void OP_ld_value_word()
  236. {
  237. short* s;
  238. s = (short*) (FINSH_GET32(finsh_pc));
  239. finsh_sp->short_value = *s;
  240. finsh_sp ++;
  241. finsh_pc += 4;
  242. return;
  243. }
  244. void OP_ld_value_word_stack()
  245. {
  246. short* s;
  247. s = (short *)(finsh_sp - 1)->long_value;
  248. (finsh_sp - 1)->short_value = *s;
  249. return;
  250. }
  251. void OP_ld_value_dword()
  252. {
  253. long* l;
  254. l = (long*) (FINSH_GET32(finsh_pc));
  255. finsh_sp->long_value = *l;
  256. finsh_sp ++;
  257. finsh_pc += 4;
  258. return;
  259. }
  260. void OP_ld_value_dword_stack()
  261. {
  262. long* l;
  263. l = (long *)(finsh_sp - 1)->long_value;
  264. (finsh_sp - 1)->long_value = *l;
  265. return;
  266. }
  267. /* --- st --- */
  268. /*
  269. * 2006-4-16 bernard
  270. * fixed the sp move bug
  271. */
  272. void OP_st_byte()
  273. {
  274. *(char*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->char_value;
  275. finsh_sp --;
  276. return ;
  277. }
  278. /*
  279. * 2006-4-16 bernard
  280. * fixed the sp move bug
  281. */
  282. void OP_st_word()
  283. {
  284. *(short*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->short_value;
  285. finsh_sp --;
  286. return ;
  287. }
  288. /*
  289. * 2006-4-16 bernard
  290. * fixed the sp move bug
  291. */
  292. void OP_st_dword()
  293. {
  294. *(long*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->long_value;
  295. finsh_sp --;
  296. return ;
  297. }
  298. /* --- pop --- */
  299. void OP_pop()
  300. {
  301. finsh_sp --;
  302. return ;
  303. }
  304. /* --- call --- */
  305. void OP_call()
  306. {
  307. /* the max number of arg*/
  308. unsigned long parameterv[16];
  309. unsigned int parameters, i;
  310. typedef unsigned long var_t;
  311. typedef var_t (*op_func)();
  312. op_func f;
  313. var_t r;
  314. parameters = *finsh_pc ++;
  315. i = 0; finsh_sp --;
  316. while (i < parameters)
  317. {
  318. parameterv[parameters - 1 - i] = finsh_sp->long_value;
  319. finsh_sp --;
  320. i++;
  321. }
  322. f = (op_func)(finsh_sp->long_value);
  323. switch (parameters)
  324. {
  325. case 0:
  326. r = f();
  327. break;
  328. case 1:
  329. r = f(parameterv[0]);
  330. break;
  331. case 2:
  332. r = f(parameterv[0], parameterv[1]);
  333. break;
  334. case 3:
  335. r = f(parameterv[0], parameterv[1], parameterv[2]);
  336. break;
  337. case 4:
  338. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3]);
  339. break;
  340. case 5:
  341. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  342. parameterv[4]);
  343. break;
  344. case 6:
  345. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  346. parameterv[4], parameterv[5]);
  347. break;
  348. case 7:
  349. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  350. parameterv[4], parameterv[5], parameterv[6]);
  351. break;
  352. case 8:
  353. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  354. parameterv[4], parameterv[5], parameterv[6], parameterv[7]);
  355. break;
  356. case 9:
  357. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  358. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  359. parameterv[8]);
  360. break;
  361. case 10:
  362. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  363. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  364. parameterv[8], parameterv[9]);
  365. break;
  366. case 11:
  367. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  368. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  369. parameterv[8], parameterv[9], parameterv[10]);
  370. break;
  371. case 12:
  372. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  373. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  374. parameterv[8], parameterv[9], parameterv[10], parameterv[11]);
  375. break;
  376. case 13:
  377. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  378. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  379. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  380. parameterv[12]);
  381. break;
  382. case 14:
  383. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  384. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  385. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  386. parameterv[12], parameterv[13]);
  387. break;
  388. case 15:
  389. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  390. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  391. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  392. parameterv[12], parameterv[13], parameterv[14]);
  393. break;
  394. case 16:
  395. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  396. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  397. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  398. parameterv[12], parameterv[13], parameterv[14], parameterv[15]);
  399. break;
  400. default:
  401. r = 0;
  402. break;
  403. }
  404. finsh_sp->long_value = r;
  405. finsh_sp ++;
  406. return ;
  407. }
  408. op_func op_table[] =
  409. {
  410. /* 00 */ OP_no_op,
  411. /* 01 */ OP_add_byte,
  412. /* 02 */ OP_add_word,
  413. /* 03 */ OP_add_dword,
  414. /* 04 */ OP_sub_byte,
  415. /* 05 */ OP_sub_word,
  416. /* 06 */ OP_sub_dword,
  417. /* 07 */ OP_div_byte,
  418. /* 08 */ OP_div_word,
  419. /* 09 */ OP_div_dword,
  420. /* 10 */ OP_mod_byte,
  421. /* 11 */ OP_mod_word,
  422. /* 12 */ OP_mod_dword,
  423. /* 13 */ OP_mul_byte,
  424. /* 14 */ OP_mul_word,
  425. /* 15 */ OP_mul_dword,
  426. /* 16 */ OP_and_byte,
  427. /* 17 */ OP_and_word,
  428. /* 18 */ OP_and_dword,
  429. /* 19 */ OP_or_byte,
  430. /* 20 */ OP_or_word,
  431. /* 21 */ OP_or_dword,
  432. /* 22 */ OP_xor_byte,
  433. /* 23 */ OP_xor_word,
  434. /* 24 */ OP_xor_dword,
  435. /* 25 */ OP_bw_byte,
  436. /* 26 */ OP_bw_word,
  437. /* 27 */ OP_bw_dword,
  438. /* 28 */ OP_shl_byte,
  439. /* 29 */ OP_shl_word,
  440. /* 30 */ OP_shl_dword,
  441. /* 31 */ OP_shr_byte,
  442. /* 32 */ OP_shr_word,
  443. /* 33 */ OP_shr_dword,
  444. /* 34 */ OP_ld_byte,
  445. /* 35 */ OP_ld_word,
  446. /* 36 */ OP_ld_dword,
  447. /* 37 */ OP_ld_value_byte,
  448. /* 38 */ OP_ld_value_word,
  449. /* 39 */ OP_ld_value_dword,
  450. /* 40 */ OP_st_byte,
  451. /* 41 */ OP_st_word,
  452. /* 42 */ OP_st_dword,
  453. /* 43 */ OP_pop,
  454. /* 44 */ OP_call,
  455. /* 45 */ OP_ld_value_byte_stack,
  456. /* 46 */ OP_ld_value_word_stack,
  457. /* 47 */ OP_ld_value_dword_stack,
  458. NULL
  459. };