FPU.ob07 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE FPU;
  7. IMPORT SYSTEM;
  8. CONST
  9. INF = 07F800000H;
  10. NINF = 0FF800000H;
  11. NAN = 07FC00000H;
  12. PROCEDURE [code] div2 (b, a: INTEGER): INTEGER
  13. 0B470H, (* push {r4, r5, r6} *)
  14. 09C03H, (* ldr r4, [sp, 12] *)
  15. 09D04H, (* ldr r5, [sp, 16] *)
  16. 0002BH, (* movs r3, r5 *)
  17. 04063H, (* eors r3, r4 *)
  18. 00FDBH, (* lsrs r3, 31 *)
  19. 007DBH, (* lsls r3, 31 *)
  20. 0002AH, (* movs r2, r5 *)
  21. 00052H, (* lsls r2, 1 *)
  22. 00E12H, (* lsrs r2, 24 *)
  23. 00026H, (* movs r6, r4 *)
  24. 00076H, (* lsls r6, 1 *)
  25. 00E36H, (* lsrs r6, 24 *)
  26. 01B92H, (* subs r2, r2, r6 *)
  27. 0327FH, (* adds r2, 127 *)
  28. 02601H, (* movs r6, 1 *)
  29. 005F6H, (* lsls r6, 23 *)
  30. 0026DH, (* lsls r5, 9 *)
  31. 00A6DH, (* lsrs r5, 9 *)
  32. 019ADH, (* adds r5, r5, r6 *)
  33. 00264H, (* lsls r4, 9 *)
  34. 00A64H, (* lsrs r4, 9 *)
  35. 019A4H, (* adds r4, r4, r6 *)
  36. 00031H, (* movs r1, r6 *)
  37. 02000H, (* movs r0, 0 *)
  38. 042A5H, (* cmp r5, r4 *)
  39. 0DA01H, (* bge L1 *)
  40. 0006DH, (* lsls r5, 1 *)
  41. 03A01H, (* subs r2, 1 *)
  42. (* L1: *)
  43. 02D00H, (* cmp r5, 0 *)
  44. 0DD08H, (* ble L2 *)
  45. 02900H, (* cmp r1, 0 *)
  46. 0DD06H, (* ble L2 *)
  47. 042A5H, (* cmp r5, r4 *)
  48. 0DB01H, (* blt L3 *)
  49. 01840H, (* adds r0, r0, r1 *)
  50. 01B2DH, (* subs r5, r5, r4 *)
  51. (* L3: *)
  52. 0006DH, (* lsls r5, 1 *)
  53. 00849H, (* lsrs r1, 1 *)
  54. 0E7F4H, (* b L1 *)
  55. (* L2: *)
  56. 02A00H, (* cmp r2, 0 *)
  57. 0DC03H, (* bgt L4 *)
  58. 02200H, (* movs r2, 0 *)
  59. 00030H, (* movs r0, r6 *)
  60. 02300H, (* movs r3, 0 *)
  61. 0E003H, (* b L5 *)
  62. (* L4: *)
  63. 02AFFH, (* cmp r2, 255 *)
  64. 0DB01H, (* blt L5 *)
  65. 022FFH, (* movs r2, 255 *)
  66. 00030H, (* movs r0, r6 *)
  67. (* L5: *)
  68. 01B80H, (* subs r0, r0, r6 *)
  69. 005D2H, (* lsls r2, 23 *)
  70. 01880H, (* adds r0, r0, r2 *)
  71. 018C0H, (* adds r0, r0, r3 *)
  72. 0BC70H; (* pop {r4, r5, r6} *)
  73. PROCEDURE [code] mul2 (b, a: INTEGER): INTEGER
  74. 0B470H, (* push {r4, r5, r6} *)
  75. 09C03H, (* ldr r4, [sp, 12] *)
  76. 09D04H, (* ldr r5, [sp, 16] *)
  77. 0002BH, (* movs r3, r5 *)
  78. 04063H, (* eors r3, r4 *)
  79. 00FDBH, (* lsrs r3, 31 *)
  80. 007DBH, (* lsls r3, 31 *)
  81. 0002AH, (* movs r2, r5 *)
  82. 00052H, (* lsls r2, 1 *)
  83. 00E12H, (* lsrs r2, 24 *)
  84. 00026H, (* movs r6, r4 *)
  85. 00076H, (* lsls r6, 1 *)
  86. 00E36H, (* lsrs r6, 24 *)
  87. 01992H, (* adds r2, r2, r6 *)
  88. 03A7FH, (* subs r2, 127 *)
  89. 02601H, (* movs r6, 1 *)
  90. 005F6H, (* lsls r6, 23 *)
  91. 0026DH, (* lsls r5, 9 *)
  92. 00A6DH, (* lsrs r5, 9 *)
  93. 019ADH, (* adds r5, r5, r6 *)
  94. 00264H, (* lsls r4, 9 *)
  95. 00A64H, (* lsrs r4, 9 *)
  96. 019A4H, (* adds r4, r4, r6 *)
  97. 00021H, (* movs r1, r4 *)
  98. 00609H, (* lsls r1, 24 *)
  99. 00E09H, (* lsrs r1, 24 *)
  100. 00028H, (* movs r0, r5 *)
  101. 04348H, (* muls r0, r1, r0 *)
  102. 00A24H, (* lsrs r4, 8 *)
  103. 00A00H, (* lsrs r0, 8 *)
  104. 00021H, (* movs r1, r4 *)
  105. 00609H, (* lsls r1, 24 *)
  106. 00E09H, (* lsrs r1, 24 *)
  107. 04369H, (* muls r1, r5, r1 *)
  108. 01840H, (* adds r0, r0, r1 *)
  109. 00A24H, (* lsrs r4, 8 *)
  110. 00A00H, (* lsrs r0, 8 *)
  111. 00021H, (* movs r1, r4 *)
  112. 00609H, (* lsls r1, 24 *)
  113. 00E09H, (* lsrs r1, 24 *)
  114. 04369H, (* muls r1, r5, r1 *)
  115. 01840H, (* adds r0, r0, r1 *)
  116. 009C0H, (* lsrs r0, 7 *)
  117. 02101H, (* movs r1, 1 *)
  118. 00609H, (* lsls r1, 24 *)
  119. 04288H, (* cmp r0, r1 *)
  120. 0DB01H, (* blt L2 *)
  121. 00840H, (* lsrs r0, 1 *)
  122. 03201H, (* adds r2, 1 *)
  123. (* L2: *)
  124. 02A00H, (* cmp r2, 0 *)
  125. 0DC03H, (* bgt L4 *)
  126. 02200H, (* movs r2, 0 *)
  127. 00030H, (* movs r0, r6 *)
  128. 02300H, (* movs r3, 0 *)
  129. 0E003H, (* b L5 *)
  130. (* L4: *)
  131. 02AFFH, (* cmp r2, 255 *)
  132. 0DB01H, (* blt L5 *)
  133. 022FFH, (* movs r2, 255 *)
  134. 00030H, (* movs r0, r6 *)
  135. (* L5: *)
  136. 01B80H, (* subs r0, r0, r6 *)
  137. 005D2H, (* lsls r2, 23 *)
  138. 01880H, (* adds r0, r0, r2 *)
  139. 018C0H, (* adds r0, r0, r3 *)
  140. 0BC70H; (* pop {r4, r5, r6} *)
  141. PROCEDURE [code] add2 (b, a: INTEGER): INTEGER
  142. 0B410H, (* push {r4} *)
  143. 09901H, (* ldr r1, [sp, 4] *)
  144. 09802H, (* ldr r0, [sp, 8] *)
  145. 00002H, (* movs r2, r0 *)
  146. 00052H, (* lsls r2, 1 *)
  147. 00E12H, (* lsrs r2, 24 *)
  148. 0000BH, (* movs r3, r1 *)
  149. 0005BH, (* lsls r3, 1 *)
  150. 00E1BH, (* lsrs r3, 24 *)
  151. 01AD4H, (* subs r4, r2, r3 *)
  152. 0DA00H, (* bge L1 *)
  153. 0001AH, (* movs r2, r3 *)
  154. (* L1: *)
  155. 02301H, (* movs r3, 1 *)
  156. 005DBH, (* lsls r3, 23 *)
  157. 00240H, (* lsls r0, 9 *)
  158. 00A40H, (* lsrs r0, 9 *)
  159. 018C0H, (* adds r0, r0, r3 *)
  160. 00249H, (* lsls r1, 9 *)
  161. 00A49H, (* lsrs r1, 9 *)
  162. 018C9H, (* adds r1, r1, r3 *)
  163. 02C00H, (* cmp r4, 0 *)
  164. 0DB05H, (* blt L2 *)
  165. 0D009H, (* beq L3 *)
  166. 02C18H, (* cmp r4, 24 *)
  167. 0DB00H, (* blt L4 *)
  168. 02100H, (* movs r1, 0 *)
  169. (* L4: *)
  170. 040E1H, (* lsrs r1, r4 *)
  171. 0E004H, (* b L3 *)
  172. (* L2: *)
  173. 04264H, (* negs r4, r4 *)
  174. 02C18H, (* cmp r4, 24 *)
  175. 0DB00H, (* blt L5 *)
  176. 02000H, (* movs r0, 0 *)
  177. (* L5: *)
  178. 040E0H, (* lsrs r0, r4 *)
  179. (* L3: *)
  180. 01840H, (* adds r0, r0, r1 *)
  181. 02401H, (* movs r4, 1 *)
  182. 00624H, (* lsls r4, 24 *)
  183. 042A0H, (* cmp r0, r4 *)
  184. 0DB01H, (* blt L6 *)
  185. 00840H, (* lsrs r0, 1 *)
  186. 03201H, (* adds r2, 1 *)
  187. (* L6: *)
  188. 02AFFH, (* cmp r2, 255 *)
  189. 0DB01H, (* blt L7 *)
  190. 022FFH, (* movs r2, 255 *)
  191. 00018H, (* movs r0, r3 *)
  192. (* L7: *)
  193. 005D2H, (* lsls r2, 23 *)
  194. 01AC0H, (* subs r0, r0, r3 *)
  195. 01880H, (* adds r0, r0, r2 *)
  196. 0BC10H; (* pop {r4} *)
  197. PROCEDURE [code] sub2 (b, a: INTEGER): INTEGER
  198. 0B430H, (* push {r4, r5} *)
  199. 09902H, (* ldr r1, [sp, 8] *)
  200. 09803H, (* ldr r0, [sp, 12] *)
  201. 00002H, (* movs r2, r0 *)
  202. 00052H, (* lsls r2, 1 *)
  203. 00E12H, (* lsrs r2, 24 *)
  204. 0000DH, (* movs r5, r1 *)
  205. 0006DH, (* lsls r5, 1 *)
  206. 00E2DH, (* lsrs r5, 24 *)
  207. 00240H, (* lsls r0, 9 *)
  208. 00A40H, (* lsrs r0, 9 *)
  209. 00249H, (* lsls r1, 9 *)
  210. 00A49H, (* lsrs r1, 9 *)
  211. 02301H, (* movs r3, 1 *)
  212. 005DBH, (* lsls r3, 23 *)
  213. 018C0H, (* adds r0, r0, r3 *)
  214. 018C9H, (* adds r1, r1, r3 *)
  215. 01B54H, (* subs r4, r2, r5 *)
  216. 0DB04H, (* blt L1 *)
  217. 0DC01H, (* bgt L2 *)
  218. 04288H, (* cmp r0, r1 *)
  219. 0DB01H, (* blt L1 *)
  220. (* L2: *)
  221. 02300H, (* movs r3, 0 *)
  222. 0E006H, (* b L3 *)
  223. (* L1: *)
  224. 0002AH, (* movs r2, r5 *)
  225. 04264H, (* negs r4, r4 *)
  226. 00005H, (* movs r5, r0 *)
  227. 00008H, (* movs r0, r1 *)
  228. 00029H, (* movs r1, r5 *)
  229. 02301H, (* movs r3, 1 *)
  230. 007DBH, (* lsls r3, 31 *)
  231. (* L3: *)
  232. 02501H, (* movs r5, 1 *)
  233. 005EDH, (* lsls r5, 23 *)
  234. 02C00H, (* cmp r4, 0 *)
  235. 0DD04H, (* ble L4 *)
  236. 02C18H, (* cmp r4, 24 *)
  237. 0DA01H, (* bge L5 *)
  238. 040E1H, (* lsrs r1, r4 *)
  239. 0E000H, (* b L4 *)
  240. (* L5: *)
  241. 02100H, (* movs r1, 0 *)
  242. (* L4: *)
  243. 01A40H, (* subs r0, r0, r1 *)
  244. 0D103H, (* bne L6 *)
  245. 02200H, (* movs r2, 0 *)
  246. 00028H, (* movs r0, r5 *)
  247. 02300H, (* movs r3, 0 *)
  248. 0E004H, (* b L7 *)
  249. (* L6: *)
  250. 042A8H, (* cmp r0, r5 *)
  251. 0DA02H, (* bge L7 *)
  252. 00040H, (* lsls r0, 1 *)
  253. 03A01H, (* subs r2, 1 *)
  254. 0E7FAH, (* b L6 *)
  255. (* L7: *)
  256. 02A00H, (* cmp r2, 0 *)
  257. 0DC02H, (* bgt L8 *)
  258. 02200H, (* movs r2, 0 *)
  259. 00028H, (* movs r0, r5 *)
  260. 02300H, (* movs r3, 0 *)
  261. (* L8: *)
  262. 005D2H, (* lsls r2, 23 *)
  263. 01B40H, (* subs r0, r0, r5 *)
  264. 01880H, (* adds r0, r0, r2 *)
  265. 018C0H, (* adds r0, r0, r3 *)
  266. 0BC30H; (* pop {r4, r5} *)
  267. PROCEDURE [code] zero (VAR a, b: INTEGER)
  268. 09800H, (* ldr r0, [sp, 0] *)
  269. 00001H, (* movs r1, r0 *)
  270. 06800H, (* ldr r0, [r0, 0] *)
  271. 00040H, (* lsls r0, 1 *)
  272. 00E00H, (* lsrs r0, 24 *)
  273. 0D100H, (* bne L1 *)
  274. 06008H, (* str r0, [r1, 0] *)
  275. (* L1: *)
  276. 09801H, (* ldr r0, [sp, 4] *)
  277. 00001H, (* movs r1, r0 *)
  278. 06800H, (* ldr r0, [r0, 0] *)
  279. 00040H, (* lsls r0, 1 *)
  280. 00E00H, (* lsrs r0, 24 *)
  281. 0D100H, (* bne L2 *)
  282. 06008H; (* str r0, [r1, 0] *)
  283. (* L2: *)
  284. PROCEDURE [code] isNaN (a: INTEGER): BOOLEAN
  285. 09800H, (* ldr r0, [sp, 0] *)
  286. 00040H, (* lsls r0, 1 *)
  287. 00E00H, (* lsrs r0, 24 *)
  288. 028FFH, (* cmp r0, 255 *)
  289. 0D104H, (* bne L1 *)
  290. 09800H, (* ldr r0, [sp, 0] *)
  291. 00240H, (* lsls r0, 9 *)
  292. 0D002H, (* beq L2 *)
  293. 02001H, (* movs r0, 1 *)
  294. 04770H, (* bx lr *)
  295. (* L1: *)
  296. 02000H; (* movs r0, 0 *)
  297. (* L2: *)
  298. PROCEDURE [code] isInf (a: INTEGER): BOOLEAN
  299. 09800H, (* ldr r0, [sp, 0] *)
  300. 00040H, (* lsls r0, 1 *)
  301. 02118H, (* movs r1, 24 *)
  302. 041C8H, (* rors r0, r1 *)
  303. 028FFH, (* cmp r0, 255 *)
  304. 0D002H, (* beq L1 *)
  305. 02000H, (* movs r0, 0 *)
  306. 04770H, (* bx lr *)
  307. (* L1: *)
  308. 02001H; (* movs r0, 1 *)
  309. PROCEDURE [code] isNormal (a, b: INTEGER): BOOLEAN
  310. 09800H, (* ldr r0, [sp, 0] *)
  311. 00040H, (* lsls r0, 1 *)
  312. 00E00H, (* lsrs r0, 24 *)
  313. 0D00AH, (* beq L2 *)
  314. 028FFH, (* cmp r0, 255 *)
  315. 0D007H, (* beq L1 *)
  316. 09801H, (* ldr r0, [sp, 4] *)
  317. 00040H, (* lsls r0, 1 *)
  318. 00E00H, (* lsrs r0, 24 *)
  319. 0D004H, (* beq L2 *)
  320. 028FFH, (* cmp r0, 255 *)
  321. 0D001H, (* beq L1 *)
  322. 02001H, (* movs r0, 1 *)
  323. 04770H, (* bx lr *)
  324. (* L1: *)
  325. 02000H; (* movs r0, 0 *)
  326. (* L2: *)
  327. PROCEDURE add* (b, a: INTEGER): INTEGER;
  328. VAR
  329. r: INTEGER;
  330. BEGIN
  331. zero(a, b);
  332. IF isNormal(a, b) THEN
  333. IF a > 0 THEN
  334. IF b > 0 THEN
  335. r := add2(b, a)
  336. ELSE
  337. r := sub2(b, a)
  338. END
  339. ELSE
  340. IF b > 0 THEN
  341. r := sub2(a, b)
  342. ELSE
  343. r := add2(b, a) + 80000000H
  344. END
  345. END
  346. ELSIF isNaN(a) OR isNaN(b) THEN
  347. r := NAN
  348. ELSIF isInf(a) & isInf(b) THEN
  349. IF a = b THEN
  350. r := a
  351. ELSE
  352. r := NAN
  353. END
  354. ELSIF isInf(a) THEN
  355. r := a
  356. ELSIF isInf(b) THEN
  357. r := b
  358. ELSIF a = 0 THEN
  359. r := b
  360. ELSIF b = 0 THEN
  361. r := a
  362. END
  363. RETURN r
  364. END add;
  365. PROCEDURE sub* (b, a: INTEGER): INTEGER;
  366. VAR
  367. r: INTEGER;
  368. BEGIN
  369. zero(a, b);
  370. IF isNormal(a, b) THEN
  371. IF a > 0 THEN
  372. IF b > 0 THEN
  373. r := sub2(b, a)
  374. ELSE
  375. r := add2(b, a)
  376. END
  377. ELSE
  378. IF b > 0 THEN
  379. r := add2(b, a) + 80000000H
  380. ELSE
  381. r := sub2(a, b)
  382. END
  383. END
  384. ELSIF isNaN(a) OR isNaN(b) THEN
  385. r := NAN
  386. ELSIF isInf(a) & isInf(b) THEN
  387. IF a # b THEN
  388. r := a
  389. ELSE
  390. r := NAN
  391. END
  392. ELSIF isInf(a) THEN
  393. r := a
  394. ELSIF isInf(b) THEN
  395. r := INF + ORD(BITS(b) / {31} - {0..30})
  396. ELSIF (a = 0) & (b = 0) THEN
  397. r := 0
  398. ELSIF a = 0 THEN
  399. r := ORD(BITS(b) / {31})
  400. ELSIF b = 0 THEN
  401. r := a
  402. END
  403. RETURN r
  404. END sub;
  405. PROCEDURE mul* (b, a: INTEGER): INTEGER;
  406. VAR
  407. r: INTEGER;
  408. BEGIN
  409. zero(a, b);
  410. IF isNormal(a, b) THEN
  411. r := mul2(b, a)
  412. ELSIF isNaN(a) OR isNaN(b) OR (isInf(a) & (b = 0)) OR (isInf(b) & (a = 0)) THEN
  413. r := NAN
  414. ELSIF isInf(a) OR isInf(b) THEN
  415. r := INF + ORD(BITS(a) / BITS(b) - {0..30})
  416. ELSIF (a = 0) OR (b = 0) THEN
  417. r := 0
  418. END
  419. RETURN r
  420. END mul;
  421. PROCEDURE _div* (b, a: INTEGER): INTEGER;
  422. VAR
  423. r: INTEGER;
  424. BEGIN
  425. zero(a, b);
  426. IF isNormal(a, b) THEN
  427. r := div2(b, a)
  428. ELSIF isNaN(a) OR isNaN(b) OR isInf(a) & isInf(b) THEN
  429. r := NAN
  430. ELSIF isInf(a) THEN
  431. r := INF + ORD(BITS(a) / BITS(b) - {0..30})
  432. ELSIF isInf(b) THEN
  433. r := 0
  434. ELSIF a = 0 THEN
  435. IF b = 0 THEN
  436. r := NAN
  437. ELSE
  438. r := 0
  439. END
  440. ELSIF b = 0 THEN
  441. IF a > 0 THEN
  442. r := INF
  443. ELSE
  444. r := NINF
  445. END
  446. END
  447. RETURN r
  448. END _div;
  449. PROCEDURE [code] cmp* (op, b, a: INTEGER): BOOLEAN
  450. 09802H, (* ldr r0, [sp, 8] *)
  451. 09901H, (* ldr r1, [sp, 4] *)
  452. 00002H, (* movs r2, r0 *)
  453. 00052H, (* lsls r2, 1 *)
  454. 00E12H, (* lsrs r2, 24 *)
  455. 0D100H, (* bne L1 *)
  456. 02000H, (* movs r0, 0 *)
  457. (* L1: *)
  458. 0000BH, (* movs r3, r1 *)
  459. 0005BH, (* lsls r3, 1 *)
  460. 00E1BH, (* lsrs r3, 24 *)
  461. 0D100H, (* bne L2 *)
  462. 02100H, (* movs r1, 0 *)
  463. (* L2: *)
  464. 02AFFH, (* cmp r2, 255 *)
  465. 0D103H, (* bne L3 *)
  466. 00002H, (* movs r2, r0 *)
  467. 00252H, (* lsls r2, 9 *)
  468. 00A52H, (* lsrs r2, 9 *)
  469. 0D105H, (* bne L4 *)
  470. (* L3: *)
  471. 02BFFH, (* cmp r3, 255 *)
  472. 0D107H, (* bne L5 *)
  473. 0000BH, (* movs r3, r1 *)
  474. 0025BH, (* lsls r3, 9 *)
  475. 00A5BH, (* lsrs r3, 9 *)
  476. 0D003H, (* beq L5 *)
  477. (* L4: *)
  478. 09A00H, (* ldr r2, [sp, 0] *)
  479. 02A01H, (* cmp r2, 1 *)
  480. 0D123H, (* bne L6 *)
  481. 0E020H, (* b L8 *)
  482. (* L5: *)
  483. 09A00H, (* ldr r2, [sp, 0] *)
  484. 02800H, (* cmp r0, 0 *)
  485. 0DA02H, (* bge L7 *)
  486. 02900H, (* cmp r1, 0 *)
  487. 0DA00H, (* bge L7 *)
  488. 03206H, (* adds r2, 6 *)
  489. (* L7: *)
  490. 00092H, (* lsls r2, 2 *)
  491. 03A02H, (* subs r2, 2 *)
  492. 04288H, (* cmp r0, r1 *)
  493. 04497H, (* add pc, r2 *)
  494. 0D117H, (* bne L6 *)
  495. 0E014H, (* b L8 *)
  496. 0D015H, (* beq L6 *)
  497. 0E012H, (* b L8 *)
  498. 0DA13H, (* bge L6 *)
  499. 0E010H, (* b L8 *)
  500. 0DC11H, (* bgt L6 *)
  501. 0E00EH, (* b L8 *)
  502. 0DD0FH, (* ble L6 *)
  503. 0E00CH, (* b L8 *)
  504. 0DB0DH, (* blt L6 *)
  505. 0E00AH, (* b L8 *)
  506. 0D10BH, (* bne L6 *)
  507. 0E008H, (* b L8 *)
  508. 0D009H, (* beq L6 *)
  509. 0E006H, (* b L8 *)
  510. 0DD07H, (* ble L6 *)
  511. 0E004H, (* b L8 *)
  512. 0DB05H, (* blt L6 *)
  513. 0E002H, (* b L8 *)
  514. 0DA03H, (* bge L6 *)
  515. 0E000H, (* b L8 *)
  516. 0DC01H, (* bgt L6 *)
  517. (* L8: *)
  518. 02001H, (* movs r0, 1 *)
  519. 04770H, (* bx lr *)
  520. (* L6: *)
  521. 02000H, (* movs r0, 0 *)
  522. 04770H; (* bx lr *)
  523. PROCEDURE [code] flt* (x: INTEGER): INTEGER
  524. 09800H, (* ldr r0, [sp, 0] *)
  525. 02800H, (* cmp r0, 0 *)
  526. 0D105H, (* bne L1 *)
  527. 02300H, (* movs r3, 0 *)
  528. 02001H, (* movs r0, 1 *)
  529. 005C0H, (* lsls r0, 23 *)
  530. 0227EH, (* movs r2, 126 *)
  531. 04252H, (* negs r2, r2 *)
  532. 0E01EH, (* b L9 *)
  533. (* L1: *)
  534. 02101H, (* movs r1, 1 *)
  535. 007C9H, (* lsls r1, 31 *)
  536. 04288H, (* cmp r0, r1 *)
  537. 0D104H, (* bne L2 *)
  538. 00003H, (* movs r3, r0 *)
  539. 02001H, (* movs r0, 1 *)
  540. 005C0H, (* lsls r0, 23 *)
  541. 02220H, (* movs r2, 32 *)
  542. 0E015H, (* b L9 *)
  543. (* L2: *)
  544. 02800H, (* cmp r0, 0 *)
  545. 0DA03H, (* bge L4 *)
  546. 02301H, (* movs r3, 1 *)
  547. 007DBH, (* lsls r3, 31 *)
  548. 04240H, (* negs r0, r0 *)
  549. 0E000H, (* b L5 *)
  550. (* L4: *)
  551. 02300H, (* movs r3, 0 *)
  552. (* L5: *)
  553. 02200H, (* movs r2, 0 *)
  554. 00001H, (* movs r1, r0 *)
  555. (* L7: *)
  556. 02900H, (* cmp r1, 0 *)
  557. 0DD02H, (* ble L6 *)
  558. 00849H, (* lsrs r1, 1 *)
  559. 03201H, (* adds r2, 1 *)
  560. 0E7FAH, (* b L7 *)
  561. (* L6: *)
  562. 00011H, (* movs r1, r2 *)
  563. 03A18H, (* subs r2, 24 *)
  564. 0DD01H, (* ble L8 *)
  565. 040D0H, (* lsrs r0, r2 *)
  566. 0E001H, (* b L3 *)
  567. (* L8: *)
  568. 04252H, (* negs r2, r2 *)
  569. 04090H, (* lsls r0, r2 *)
  570. (* L3: *)
  571. 0000AH, (* movs r2, r1 *)
  572. (* L9: *)
  573. 02101H, (* movs r1, 1 *)
  574. 005C9H, (* lsls r1, 23 *)
  575. 01A40H, (* subs r0, r0, r1 *)
  576. 0327EH, (* adds r2, 126 *)
  577. 005D2H, (* lsls r2, 23 *)
  578. 01880H, (* adds r0, r0, r2 *)
  579. 018C0H; (* adds r0, r0, r3 *)
  580. PROCEDURE [code] floor* (x: INTEGER): INTEGER
  581. 09900H, (* ldr r1, [sp, 0] *)
  582. 00008H, (* movs r0, r1 *)
  583. 00040H, (* lsls r0, 1 *)
  584. 00E00H, (* lsrs r0, 24 *)
  585. 0D100H, (* bne L4 *)
  586. 02100H, (* movs r1, 0 *)
  587. (* L4: *)
  588. 0000AH, (* movs r2, r1 *)
  589. 00052H, (* lsls r2, 1 *)
  590. 00E12H, (* lsrs r2, 24 *)
  591. 03A7FH, (* subs r2, 127 *)
  592. 00008H, (* movs r0, r1 *)
  593. 00240H, (* lsls r0, 9 *)
  594. 00A40H, (* lsrs r0, 9 *)
  595. 02301H, (* movs r3, 1 *)
  596. 005DBH, (* lsls r3, 23 *)
  597. 018C0H, (* adds r0, r0, r3 *)
  598. 02A00H, (* cmp r2, 0 *)
  599. 0DB12H, (* blt L1 *)
  600. 02A16H, (* cmp r2, 22 *)
  601. 0DC0BH, (* bgt L2 *)
  602. 03A17H, (* subs r2, 23 *)
  603. 04252H, (* negs r2, r2 *)
  604. 00003H, (* movs r3, r0 *)
  605. 040D0H, (* lsrs r0, r2 *)
  606. 04252H, (* negs r2, r2 *)
  607. 03220H, (* adds r2, 32 *)
  608. 02900H, (* cmp r1, 0 *)
  609. 0DA0CH, (* bge L5 *)
  610. 04093H, (* lsls r3, r2 *)
  611. 0D00AH, (* beq L5 *)
  612. 03001H, (* adds r0, 1 *)
  613. 0E008H, (* b L5 *)
  614. (* L2: *)
  615. 02A36H, (* cmp r2, 54 *)
  616. 0DC05H, (* bgt L6 *)
  617. 03A17H, (* subs r2, 23 *)
  618. 04090H, (* lsls r0, r2 *)
  619. 0E003H, (* b L5 *)
  620. (* L1: *)
  621. 00008H, (* movs r0, r1 *)
  622. 00FC0H, (* lsrs r0, 31 *)
  623. 0E000H, (* b L5 *)
  624. (* L6: *)
  625. 02000H, (* movs r0, 0 *)
  626. (* L5: *)
  627. 02900H, (* cmp r1, 0 *)
  628. 0DA00H, (* bge L3 *)
  629. 04240H; (* negs r0, r0 *)
  630. (* L3: *)
  631. END FPU.