tfma1.pp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. { %CPU=i386,x86_64 }
  2. { %OPT=-Cfavx2 -Cpcoreavx2 }
  3. uses
  4. cpu;
  5. var
  6. d0,d1,d2,d3 : double;
  7. s0,s1,s2,s3 : single;
  8. procedure testsingle;
  9. var
  10. l0,l1,l2,l3 : single;
  11. begin
  12. l1:=2;
  13. l2:=3;
  14. l3:=4;
  15. s0:=0;
  16. l0:=FMASingle(l1,l2,l3);
  17. writeln(l0);
  18. if l0<>10.0 then
  19. halt(1);
  20. l0:=FMASingle(l1+1.0,l2,l3);
  21. writeln(l0);
  22. if l0<>13.0 then
  23. halt(1);
  24. l0:=FMASingle(l1,l1+1.0,l3);
  25. writeln(l0);
  26. if l0<>10.0 then
  27. halt(1);
  28. l0:=FMASingle(s1,l2,l3);
  29. writeln(l0);
  30. if l0<>10.0 then
  31. halt(1);
  32. l0:=FMASingle(l1,s2,l3);
  33. writeln(l0);
  34. if l0<>10.0 then
  35. halt(1);
  36. l0:=FMASingle(l1,l2,s3);
  37. writeln(l0);
  38. if l0<>10.0 then
  39. halt(1);
  40. l0:=FMASingle(s1,s2,l3);
  41. writeln(l0);
  42. if l0<>10.0 then
  43. halt(1);
  44. l0:=FMASingle(s1,l2,s3);
  45. writeln(l0);
  46. if l0<>10.0 then
  47. halt(1);
  48. l0:=FMASingle(l1,s2,s3);
  49. writeln(l0);
  50. if l0<>10.0 then
  51. halt(1);
  52. { first operand negative }
  53. l0:=FMASingle(-l1,l2,l3);
  54. writeln(l0);
  55. if l0<>-2.0 then
  56. halt(1);
  57. l0:=FMASingle(-(l1+1.0),l2,l3);
  58. writeln(l0);
  59. if l0<>-5.0 then
  60. halt(1);
  61. l0:=FMASingle(-l1,l1+1.0,l3);
  62. writeln(l0);
  63. if l0<>-2.0 then
  64. halt(1);
  65. l0:=FMASingle(-s1,l2,l3);
  66. writeln(l0);
  67. if l0<>-2.0 then
  68. halt(1);
  69. l0:=FMASingle(-l1,s2,l3);
  70. writeln(l0);
  71. if l0<>-2.0 then
  72. halt(1);
  73. l0:=FMASingle(-l1,l2,s3);
  74. writeln(l0);
  75. if l0<>-2.0 then
  76. halt(1);
  77. l0:=FMASingle(-s1,s2,l3);
  78. writeln(l0);
  79. if l0<>-2.0 then
  80. halt(1);
  81. l0:=FMASingle(-s1,l2,s3);
  82. writeln(l0);
  83. if l0<>-2.0 then
  84. halt(1);
  85. l0:=FMASingle(-l1,s2,s3);
  86. writeln(l0);
  87. if l0<>-2.0 then
  88. halt(1);
  89. { second operand negative }
  90. l0:=FMASingle(l1,-l2,l3);
  91. writeln(l0);
  92. if l0<>-2.0 then
  93. halt(1);
  94. l0:=FMASingle(l1+1.0,-l2,l3);
  95. writeln(l0);
  96. if l0<>-5.0 then
  97. halt(1);
  98. l0:=FMASingle(l1,-(l1+1.0),l3);
  99. writeln(l0);
  100. if l0<>-2.0 then
  101. halt(1);
  102. l0:=FMASingle(s1,-l2,l3);
  103. writeln(l0);
  104. if l0<>-2.0 then
  105. halt(1);
  106. l0:=FMASingle(l1,-s2,l3);
  107. writeln(l0);
  108. if l0<>-2.0 then
  109. halt(1);
  110. l0:=FMASingle(l1,-l2,s3);
  111. writeln(l0);
  112. if l0<>-2.0 then
  113. halt(1);
  114. l0:=FMASingle(s1,-s2,l3);
  115. writeln(l0);
  116. if l0<>-2.0 then
  117. halt(1);
  118. l0:=FMASingle(s1,-l2,s3);
  119. writeln(l0);
  120. if l0<>-2.0 then
  121. halt(1);
  122. l0:=FMASingle(l1,-s2,s3);
  123. writeln(l0);
  124. if l0<>-2.0 then
  125. halt(1);
  126. { third operand negative }
  127. l0:=FMASingle(l1,l2,-l3);
  128. writeln(l0);
  129. if l0<>2.0 then
  130. halt(1);
  131. l0:=FMASingle(l1+1.0,l2,-l3);
  132. writeln(l0);
  133. if l0<>5.0 then
  134. halt(1);
  135. l0:=FMASingle(l1,l1+1.0,-l3);
  136. writeln(l0);
  137. if l0<>2.0 then
  138. halt(1);
  139. l0:=FMASingle(s1,l2,-l3);
  140. writeln(l0);
  141. if l0<>2.0 then
  142. halt(1);
  143. l0:=FMASingle(l1,s2,-l3);
  144. writeln(l0);
  145. if l0<>2.0 then
  146. halt(1);
  147. l0:=FMASingle(l1,l2,-s3);
  148. writeln(l0);
  149. if l0<>2.0 then
  150. halt(1);
  151. l0:=FMASingle(s1,s2,-l3);
  152. writeln(l0);
  153. if l0<>2.0 then
  154. halt(1);
  155. l0:=FMASingle(s1,l2,-s3);
  156. writeln(l0);
  157. if l0<>2.0 then
  158. halt(1);
  159. l0:=FMASingle(l1,s2,-s3);
  160. writeln(l0);
  161. if l0<>2.0 then
  162. halt(1);
  163. { first and third operand negative }
  164. l0:=FMASingle(-l1,l2,-l3);
  165. writeln(l0);
  166. if l0<>-10.0 then
  167. halt(1);
  168. l0:=FMASingle(-(l1+1.0),l2,-l3);
  169. writeln(l0);
  170. if l0<>-13.0 then
  171. halt(1);
  172. l0:=FMASingle(-l1,l1+1.0,-l3);
  173. writeln(l0);
  174. if l0<>-10.0 then
  175. halt(1);
  176. l0:=FMASingle(-s1,l2,-l3);
  177. writeln(l0);
  178. if l0<>-10.0 then
  179. halt(1);
  180. l0:=FMASingle(-l1,s2,-l3);
  181. writeln(l0);
  182. if l0<>-10.0 then
  183. halt(1);
  184. l0:=FMASingle(-l1,l2,-s3);
  185. writeln(l0);
  186. if l0<>-10.0 then
  187. halt(1);
  188. l0:=FMASingle(-s1,s2,-l3);
  189. writeln(l0);
  190. if l0<>-10.0 then
  191. halt(1);
  192. l0:=FMASingle(-s1,l2,-s3);
  193. writeln(l0);
  194. if l0<>-10.0 then
  195. halt(1);
  196. l0:=FMASingle(-l1,s2,-s3);
  197. writeln(l0);
  198. if l0<>-10.0 then
  199. halt(1);
  200. end;
  201. procedure testdouble;
  202. var
  203. l0,l1,l2,l3 : double;
  204. begin
  205. l1:=2;
  206. l2:=3;
  207. l3:=4;
  208. d0:=0;
  209. l0:=FMADouble(l1,l2,l3);
  210. writeln(l0);
  211. if l0<>10.0 then
  212. halt(1);
  213. l0:=FMADouble(l1+1.0,l2,l3);
  214. writeln(l0);
  215. if l0<>13.0 then
  216. halt(1);
  217. l0:=FMADouble(l1,l1+1.0,l3);
  218. writeln(l0);
  219. if l0<>10.0 then
  220. halt(1);
  221. l0:=FMADouble(d1,l2,l3);
  222. writeln(l0);
  223. if l0<>10.0 then
  224. halt(1);
  225. l0:=FMADouble(l1,d2,l3);
  226. writeln(l0);
  227. if l0<>10.0 then
  228. halt(1);
  229. l0:=FMADouble(l1,l2,d3);
  230. writeln(l0);
  231. if l0<>10.0 then
  232. halt(1);
  233. l0:=FMADouble(d1,d2,l3);
  234. writeln(l0);
  235. if l0<>10.0 then
  236. halt(1);
  237. l0:=FMADouble(d1,l2,d3);
  238. writeln(l0);
  239. if l0<>10.0 then
  240. halt(1);
  241. l0:=FMADouble(l1,d2,d3);
  242. writeln(l0);
  243. if l0<>10.0 then
  244. halt(1);
  245. { first operand negative }
  246. l0:=FMADouble(-l1,l2,l3);
  247. writeln(l0);
  248. if l0<>-2.0 then
  249. halt(1);
  250. l0:=FMADouble(-(l1+1.0),l2,l3);
  251. writeln(l0);
  252. if l0<>-5.0 then
  253. halt(1);
  254. l0:=FMADouble(-l1,l1+1.0,l3);
  255. writeln(l0);
  256. if l0<>-2.0 then
  257. halt(1);
  258. l0:=FMADouble(-d1,l2,l3);
  259. writeln(l0);
  260. if l0<>-2.0 then
  261. halt(1);
  262. l0:=FMADouble(-l1,d2,l3);
  263. writeln(l0);
  264. if l0<>-2.0 then
  265. halt(1);
  266. l0:=FMADouble(-l1,l2,d3);
  267. writeln(l0);
  268. if l0<>-2.0 then
  269. halt(1);
  270. l0:=FMADouble(-d1,d2,l3);
  271. writeln(l0);
  272. if l0<>-2.0 then
  273. halt(1);
  274. l0:=FMADouble(-d1,l2,d3);
  275. writeln(l0);
  276. if l0<>-2.0 then
  277. halt(1);
  278. l0:=FMADouble(-l1,d2,d3);
  279. writeln(l0);
  280. if l0<>-2.0 then
  281. halt(1);
  282. { second operand negative }
  283. l0:=FMADouble(l1,-l2,l3);
  284. writeln(l0);
  285. if l0<>-2.0 then
  286. halt(1);
  287. l0:=FMADouble(l1+1.0,-l2,l3);
  288. writeln(l0);
  289. if l0<>-5.0 then
  290. halt(1);
  291. l0:=FMADouble(l1,-(l1+1.0),l3);
  292. writeln(l0);
  293. if l0<>-2.0 then
  294. halt(1);
  295. l0:=FMADouble(d1,-l2,l3);
  296. writeln(l0);
  297. if l0<>-2.0 then
  298. halt(1);
  299. l0:=FMADouble(l1,-d2,l3);
  300. writeln(l0);
  301. if l0<>-2.0 then
  302. halt(1);
  303. l0:=FMADouble(l1,-l2,d3);
  304. writeln(l0);
  305. if l0<>-2.0 then
  306. halt(1);
  307. l0:=FMADouble(d1,-d2,l3);
  308. writeln(l0);
  309. if l0<>-2.0 then
  310. halt(1);
  311. l0:=FMADouble(d1,-l2,d3);
  312. writeln(l0);
  313. if l0<>-2.0 then
  314. halt(1);
  315. l0:=FMADouble(l1,-d2,d3);
  316. writeln(l0);
  317. if l0<>-2.0 then
  318. halt(1);
  319. { third operand negative }
  320. l0:=FMADouble(l1,l2,-l3);
  321. writeln(l0);
  322. if l0<>2.0 then
  323. halt(1);
  324. l0:=FMADouble(l1+1.0,l2,-l3);
  325. writeln(l0);
  326. if l0<>5.0 then
  327. halt(1);
  328. l0:=FMADouble(l1,l1+1.0,-l3);
  329. writeln(l0);
  330. if l0<>2.0 then
  331. halt(1);
  332. l0:=FMADouble(d1,l2,-l3);
  333. writeln(l0);
  334. if l0<>2.0 then
  335. halt(1);
  336. l0:=FMADouble(l1,d2,-l3);
  337. writeln(l0);
  338. if l0<>2.0 then
  339. halt(1);
  340. l0:=FMADouble(l1,l2,-d3);
  341. writeln(l0);
  342. if l0<>2.0 then
  343. halt(1);
  344. l0:=FMADouble(d1,d2,-l3);
  345. writeln(l0);
  346. if l0<>2.0 then
  347. halt(1);
  348. l0:=FMADouble(d1,l2,-d3);
  349. writeln(l0);
  350. if l0<>2.0 then
  351. halt(1);
  352. l0:=FMADouble(l1,d2,-d3);
  353. writeln(l0);
  354. if l0<>2.0 then
  355. halt(1);
  356. { first and third operand negative }
  357. l0:=FMADouble(-l1,l2,-l3);
  358. writeln(l0);
  359. if l0<>-10.0 then
  360. halt(1);
  361. l0:=FMADouble(-(l1+1.0),l2,-l3);
  362. writeln(l0);
  363. if l0<>-13.0 then
  364. halt(1);
  365. l0:=FMADouble(-l1,l1+1.0,-l3);
  366. writeln(l0);
  367. if l0<>-10.0 then
  368. halt(1);
  369. l0:=FMADouble(-d1,l2,-l3);
  370. writeln(l0);
  371. if l0<>-10.0 then
  372. halt(1);
  373. l0:=FMADouble(-l1,d2,-l3);
  374. writeln(l0);
  375. if l0<>-10.0 then
  376. halt(1);
  377. l0:=FMADouble(-l1,l2,-d3);
  378. writeln(l0);
  379. if l0<>-10.0 then
  380. halt(1);
  381. l0:=FMADouble(-d1,d2,-l3);
  382. writeln(l0);
  383. if l0<>-10.0 then
  384. halt(1);
  385. l0:=FMADouble(-d1,l2,-d3);
  386. writeln(l0);
  387. if l0<>-10.0 then
  388. halt(1);
  389. l0:=FMADouble(-l1,d2,-d3);
  390. writeln(l0);
  391. if l0<>-10.0 then
  392. halt(1);
  393. end;
  394. begin
  395. if AVXSupport and FMASupport then
  396. begin
  397. d1:=2;
  398. d2:=3;
  399. d3:=4;
  400. d0:=FMADouble(d1,d2,d3);
  401. writeln(d0);
  402. if d0<>10.0 then
  403. halt(1);
  404. s1:=2;
  405. s2:=3;
  406. s3:=4;
  407. s0:=FMASingle(s1,s2,s3);
  408. writeln(s0);
  409. if s0<>10.0 then
  410. halt(1);
  411. testsingle;
  412. testdouble;
  413. writeln('ok');
  414. end
  415. else
  416. writeln('Skipped because not supported by the CPU');
  417. end.