finsh_ops.c 9.0 KB

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