PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/misc/pascal/insn32/popt/pjopt.c

https://github.com/markangelo/PX4NuttX
C | 449 lines | 341 code | 67 blank | 41 comment | 16 complexity | ae0c81aba993769f76c0cb204b60006b MD5 | raw file
Possible License(s): GPL-2.0, 0BSD
  1. /**********************************************************************
  2. * pjopt.c
  3. * Branch Optimizations
  4. *
  5. * Copyright (C) 2008 Gregory Nutt. All rights reserved.
  6. * Author: Gregory Nutt <gnutt@nuttx.org>
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. *
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. * 3. Neither the name NuttX nor the names of its contributors may be
  19. * used to endorse or promote products derived from this software
  20. * without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  25. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  26. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  27. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  28. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  29. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  30. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  32. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33. * POSSIBILITY OF SUCH DAMAGE.
  34. *
  35. **********************************************************************/
  36. /**********************************************************************
  37. * Included Files
  38. **********************************************************************/
  39. #include <stdio.h>
  40. #include "keywords.h"
  41. #include "pdefs.h"
  42. #include "pinsn32.h"
  43. #include "popt.h"
  44. #include "polocal.h"
  45. #include "pjopt.h"
  46. /**********************************************************************/
  47. int BranchOptimize (void)
  48. {
  49. int nchanges = 0;
  50. register int i;
  51. TRACE(stderr, "[BranchOptimize]");
  52. /* At least two pcodes are need to perform branch optimizations */
  53. i = 0;
  54. while (i < nops-1)
  55. {
  56. switch (pptr[i]->op)
  57. {
  58. case oNOT :
  59. switch (pptr[i+1]->op)
  60. {
  61. case oJEQUZ :
  62. pptr[i+1]->op = oJNEQZ;
  63. deletePcode(i);
  64. nchanges++;
  65. break;
  66. case oJNEQZ :
  67. pptr[i+1]->op = oJEQUZ;
  68. deletePcode(i);
  69. nchanges++;
  70. break;
  71. default :
  72. i++;
  73. break;
  74. } /* end switch */
  75. break;
  76. case oNEG :
  77. switch (pptr[i+1]->op)
  78. {
  79. case oJLTZ :
  80. pptr[i+1]->op = oJGTZ;
  81. deletePcode(i);
  82. nchanges++;
  83. break;
  84. case oJGTEZ :
  85. pptr[i+1]->op = oJLTEZ;
  86. deletePcode(i);
  87. nchanges++;
  88. break;
  89. case oJGTZ :
  90. pptr[i+1]->op = oJLTZ;
  91. deletePcode(i);
  92. nchanges++;
  93. break;
  94. case oJLTEZ :
  95. pptr[i+1]->op = oJGTEZ;
  96. deletePcode(i);
  97. nchanges++;
  98. break;
  99. default :
  100. i++;
  101. break;
  102. } /* end switch */
  103. break;
  104. case oEQU :
  105. switch (pptr[i+1]->op)
  106. {
  107. case oNOT :
  108. pptr[i]->op = oNEQ;
  109. deletePcode(i+1);
  110. nchanges++;
  111. break;
  112. case oJEQUZ :
  113. pptr[i+1]->op = oJNEQ;
  114. deletePcode(i);
  115. nchanges++;
  116. break;
  117. case oJNEQZ :
  118. pptr[i+1]->op = oJEQU;
  119. deletePcode(i);
  120. nchanges++;
  121. break;
  122. default :
  123. i++;
  124. break;
  125. } /* end switch */
  126. break;
  127. case oNEQ :
  128. switch (pptr[i+1]->op)
  129. {
  130. case oNOT :
  131. pptr[i]->op = oEQU;
  132. deletePcode(i+1);
  133. nchanges++;
  134. break;
  135. case oJEQUZ :
  136. pptr[i+1]->op = oJEQU;
  137. deletePcode(i);
  138. nchanges++;
  139. break;
  140. case oJNEQZ :
  141. pptr[i+1]->op = oJNEQ;
  142. deletePcode(i);
  143. nchanges++;
  144. break;
  145. default :
  146. i++;
  147. break;
  148. } /* end switch */
  149. break;
  150. case oLT :
  151. switch (pptr[i+1]->op)
  152. {
  153. case oNOT :
  154. pptr[i]->op = oGTE;
  155. deletePcode(i+1);
  156. nchanges++;
  157. break;
  158. case oJEQUZ :
  159. pptr[i+1]->op = oJGTE;
  160. deletePcode(i);
  161. nchanges++;
  162. break;
  163. case oJNEQZ :
  164. pptr[i+1]->op = oJLT;
  165. deletePcode(i);
  166. nchanges++;
  167. break;
  168. default :
  169. i++;
  170. break;
  171. } /* end switch */
  172. break;
  173. case oGTE :
  174. switch (pptr[i+1]->op)
  175. {
  176. case oNOT :
  177. pptr[i]->op = oLT;
  178. deletePcode(i+1);
  179. nchanges++;
  180. break;
  181. case oJEQUZ :
  182. pptr[i+1]->op = oJLT;
  183. deletePcode(i);
  184. nchanges++;
  185. break;
  186. case oJNEQZ :
  187. pptr[i+1]->op = oJGTE;
  188. deletePcode(i);
  189. nchanges++;
  190. break;
  191. default :
  192. i++;
  193. break;
  194. } /* end switch */
  195. break;
  196. case oGT :
  197. switch (pptr[i+1]->op)
  198. {
  199. case oNOT :
  200. pptr[i]->op = oLTE;
  201. deletePcode(i+1);
  202. nchanges++;
  203. break;
  204. case oJEQUZ :
  205. pptr[i+1]->op = oJLTE;
  206. deletePcode(i);
  207. nchanges++;
  208. break;
  209. case oJNEQZ :
  210. pptr[i+1]->op = oJGT;
  211. deletePcode(i);
  212. nchanges++;
  213. break;
  214. default :
  215. i++;
  216. break;
  217. } /* end switch */
  218. break;
  219. case oLTE :
  220. switch (pptr[i+1]->op)
  221. {
  222. case oNOT :
  223. pptr[i]->op = oGT;
  224. deletePcode(i+1);
  225. nchanges++;
  226. break;
  227. case oJEQUZ :
  228. pptr[i+1]->op = oJGT;
  229. deletePcode(i);
  230. nchanges++;
  231. break;
  232. case oJNEQZ :
  233. pptr[i+1]->op = oJLTE;
  234. deletePcode(i);
  235. nchanges++;
  236. break;
  237. default :
  238. i++;
  239. break;
  240. } /* end switch */
  241. break;
  242. case oEQUZ :
  243. switch (pptr[i+1]->op)
  244. {
  245. case oNOT :
  246. pptr[i]->op = oNEQZ;
  247. deletePcode(i+1);
  248. nchanges++;
  249. break;
  250. case oJEQUZ :
  251. pptr[i+1]->op = oJNEQZ;
  252. deletePcode(i);
  253. nchanges++;
  254. break;
  255. case oJNEQZ :
  256. pptr[i+1]->op = oJEQUZ;
  257. deletePcode(i);
  258. nchanges++;
  259. break;
  260. default :
  261. i++;
  262. break;
  263. } /* end switch */
  264. break;
  265. case oNEQZ :
  266. switch (pptr[i+1]->op)
  267. {
  268. case oNOT :
  269. pptr[i]->op = oEQUZ;
  270. deletePcode(i+1);
  271. nchanges++;
  272. break;
  273. case oJEQUZ :
  274. case oJNEQZ :
  275. deletePcode(i);
  276. nchanges++;
  277. break;
  278. default :
  279. i++;
  280. break;
  281. } /* end switch */
  282. break;
  283. case oLTZ :
  284. switch (pptr[i+1]->op)
  285. {
  286. case oNOT :
  287. pptr[i]->op = oGTEZ;
  288. deletePcode(i+1);
  289. nchanges++;
  290. break;
  291. case oJEQUZ :
  292. pptr[i+1]->op = oJGTEZ;
  293. deletePcode(i);
  294. nchanges++;
  295. break;
  296. case oJNEQZ :
  297. pptr[i+1]->op = oJLTZ;
  298. deletePcode(i);
  299. nchanges++;
  300. break;
  301. default :
  302. i++;
  303. break;
  304. } /* end switch */
  305. break;
  306. case oGTEZ :
  307. switch (pptr[i+1]->op)
  308. {
  309. case oNOT :
  310. pptr[i]->op = oLTZ;
  311. deletePcode(i+1);
  312. nchanges++;
  313. break;
  314. case oJEQUZ :
  315. pptr[i+1]->op = oJLTZ;
  316. deletePcode(i);
  317. nchanges++;
  318. break;
  319. case oJNEQZ :
  320. pptr[i+1]->op = oJGTEZ;
  321. deletePcode(i);
  322. nchanges++;
  323. break;
  324. default :
  325. i++;
  326. break;
  327. } /* end switch */
  328. break;
  329. case oGTZ :
  330. switch (pptr[i+1]->op)
  331. {
  332. case oNOT :
  333. pptr[i]->op = oLTEZ;
  334. deletePcode(i+1);
  335. nchanges++;
  336. break;
  337. case oJEQUZ :
  338. pptr[i+1]->op = oJLTEZ;
  339. deletePcode(i);
  340. nchanges++;
  341. break;
  342. case oJNEQZ :
  343. pptr[i+1]->op = oJGTZ;
  344. deletePcode(i);
  345. nchanges++;
  346. break;
  347. default :
  348. i++;
  349. break;
  350. } /* end switch */
  351. break;
  352. case oLTEZ :
  353. switch (pptr[i+1]->op)
  354. {
  355. case oNOT :
  356. pptr[i]->op = oGTZ;
  357. deletePcode(i+1);
  358. nchanges++;
  359. break;
  360. case oJEQUZ :
  361. pptr[i+1]->op = oJGTZ;
  362. deletePcode(i);
  363. nchanges++;
  364. break;
  365. case oJNEQZ :
  366. pptr[i+1]->op = oJLTEZ;
  367. deletePcode(i);
  368. nchanges++;
  369. break;
  370. default :
  371. i++;
  372. break;
  373. } /* end switch */
  374. break;
  375. default :
  376. i++;
  377. break;
  378. } /* end switch */
  379. } /* end while */
  380. return (nchanges);
  381. } /* end BranchOptimize */
  382. /**********************************************************************/