tvec.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. {****************************************************************}
  2. { CODE GENERATOR TEST PROGRAM }
  3. {****************************************************************}
  4. { NODE TESTED : secondvecn() }
  5. {****************************************************************}
  6. { PRE-REQUISITES: secondload() }
  7. { secondassign() }
  8. { secondfor() }
  9. { secondderef() }
  10. { Free Pascal compiler }
  11. { secondnew() }
  12. { seconddispose() }
  13. { secondinline() length() }
  14. {****************************************************************}
  15. { DEFINES: }
  16. {****************************************************************}
  17. { REMARKS: }
  18. { Missing tests : openarray tests }
  19. {****************************************************************}
  20. program tvec;
  21. { things to test : }
  22. { array/record offset with index = 0 }
  23. { array/record offset with index < MAX_CPU_DISP }
  24. { non-aligned word/dword access to record field }
  25. { ansistring }
  26. { LOC_REFERENCE, LOC_REGISTER }
  27. { string }
  28. { right (index value) }
  29. { LOC_REGISTER }
  30. { LOC_FLAGS }
  31. { LOC_JUMP }
  32. { LOC_REFERENCE, LOC_MEM }
  33. const
  34. min_small_neg_array = -127;
  35. max_small_neg_array = 255;
  36. min_small_array = 0;
  37. max_small_array = 255;
  38. min_big_neg_array = -77000;
  39. max_big_neg_array = 77000;
  40. min_big_array = 0;
  41. max_big_array = 77000;
  42. min_big_odd_array = 0;
  43. max_big_odd_array = 255;
  44. alphabet_size = ord('Z')-ord('A')+1;
  45. alphabet : array[1..alphabet_size] of char =
  46. (
  47. 'A','B','C','D','E','F','G','H','I',
  48. 'J','K','L','M','N','O','P','Q','R',
  49. 'S','T','U','V','W','X','Y','Z');
  50. type
  51. { alignment requirements are checked }
  52. { in tsubscript.pp not here }
  53. { so all elements are byte for easy }
  54. { testing. }
  55. toddelement = packed record
  56. _b0 : array[1..8] of byte;
  57. _b1 : byte;
  58. _b2 : byte;
  59. end;
  60. psmallnegarray = ^smallnegarray;
  61. smallnegarray = array[min_small_neg_array..max_small_neg_array] of word;
  62. psmallarray = ^smallarray;
  63. smallarray = array[min_small_array..max_small_array] of word;
  64. pbignegarray = ^bignegarray;
  65. bignegarray = array[min_big_neg_array..max_big_neg_array] of word;
  66. pbigarray = ^bigarray;
  67. bigarray = array[min_big_array..max_big_array] of word;
  68. { in the case of odd addresses }
  69. { call multiply in calculating offset }
  70. pbigoddarray = ^bigoddarray;
  71. bigoddarray = array[min_big_odd_array..max_big_odd_array] of toddelement;
  72. boolarray = array[boolean] of boolean;
  73. var
  74. globalsmallnegarray : smallnegarray;
  75. globalsmallarray : smallarray;
  76. globalbignegarray : bignegarray;
  77. globalbigarray : bigarray;
  78. globaloddarray : bigoddarray;
  79. globalindex : longint;
  80. globalansi : ansistring;
  81. globalboolarray : boolarray;
  82. { this routine clears all arrays }
  83. { without calling secondvecn() first }
  84. procedure clearglobalarrays;
  85. begin
  86. FillChar(globalsmallnegarray,sizeof(globalsmallnegarray),0);
  87. FillChar(globalsmallarray,sizeof(globalsmallarray),0);
  88. FillChar(globalbignegarray,sizeof(globalbignegarray),0);
  89. FillChar(globalbignegarray,sizeof(globalbignegarray),0);
  90. FillChar(globalbigarray,sizeof(globalbigarray),0);
  91. FillChar(globaloddarray,sizeof(globaloddarray),0);
  92. FillChar(globalboolarray,sizeof(globalboolarray),0);
  93. end;
  94. { left: array definition }
  95. { right : index constant }
  96. { NOT OPEN ARRAY }
  97. { (current): LOC_MEM, LOC_REFERENCE (symbol) }
  98. { (current): LOC_REFERENCE (with index register) }
  99. { (current): LOC_REFERENCE (without index register) }
  100. { (current): LOC_REFERENCE (without base register) }
  101. procedure testarrayglobal;
  102. var
  103. i : longint;
  104. passed : boolean;
  105. b1: boolean;
  106. b2: boolean;
  107. p : pointer;
  108. begin
  109. passed := true;
  110. ClearGlobalArrays;
  111. Write('Testing subscriptn() global variables...');
  112. { RIGHT : LOC_JUMP }
  113. { (current) : LOC_MEM (symbol) }
  114. b1 := true;
  115. b2 := false;
  116. globalboolarray[b1 or b2] := TRUE;
  117. if globalboolarray[true] <> TRUE then
  118. passed := false;
  119. { RIGHT : LOC_FLAGS }
  120. { (current) : LOC_MEM (symbol) }
  121. { IF ASSIGNED DOES NOT HAVE }
  122. { A RESULT IN FLAGS THIS WILL }
  123. { NOT WORK (LOC_FLAGS = OK) }
  124. { for FPC v1.0.x }
  125. p:= nil;
  126. globalboolarray[assigned(p)]:=true;
  127. if globalboolarray[false] <> true then
  128. passed := false;
  129. { RIGHT : LOC_REFERENCE }
  130. { (current) : LOC_MEM (symbol) }
  131. globalindex := max_big_array;
  132. globalbigarray[globalindex] := $F0F0;
  133. if globalbigarray[globalindex] <> $F0F0 then
  134. passed := false;
  135. { RIGHT : ordconstn }
  136. { (current) : LOC_MEM (symbol) }
  137. { index 1 : 1 }
  138. globalbigarray[max_big_array] := $FF;
  139. if globalbigarray[max_big_array] <> $FF then
  140. passed := false;
  141. { RIGHT : LOC_REGISTER }
  142. { (current) : LOC_MEM (symbol) }
  143. for i:=min_small_neg_array to max_small_neg_array do
  144. begin
  145. globalsmallnegarray[i] := word(i);
  146. end;
  147. { now compare if the values are correct }
  148. for i:=min_small_neg_array to max_small_neg_array do
  149. begin
  150. if globalsmallnegarray[i] <> word(i) then
  151. passed := false;
  152. end;
  153. for i:=min_small_array to max_small_array do
  154. begin
  155. globalsmallarray[i] := i;
  156. end;
  157. { now compare if the values are correct }
  158. for i:=min_small_array to max_small_array do
  159. begin
  160. if globalsmallarray[i] <> i then
  161. passed := false;
  162. end;
  163. for i:=min_big_neg_array to max_big_neg_array do
  164. begin
  165. globalbignegarray[i] := word(i);
  166. end;
  167. { now compare if the values are correct }
  168. for i:=min_big_neg_array to max_big_neg_array do
  169. begin
  170. if globalbignegarray[i] <> word(i) then
  171. passed := false;
  172. end;
  173. for i:=min_big_array to max_big_array do
  174. begin
  175. globalbigarray[i] := word(i);
  176. end;
  177. { now compare if the values are correct }
  178. for i:=min_big_array to max_big_array do
  179. begin
  180. if globalbigarray[i] <> word(i) then
  181. passed := false;
  182. end;
  183. for i:=min_big_odd_array to max_big_odd_array do
  184. begin
  185. globaloddarray[i]._b1 := byte(i);
  186. end;
  187. { now compare if the values are correct }
  188. for i:=min_big_odd_array to max_big_odd_array do
  189. begin
  190. if globaloddarray[i]._b1 <> byte(i) then
  191. passed := false;
  192. end;
  193. if passed then
  194. WriteLn('Success.')
  195. else
  196. WriteLn('Failure.');
  197. end;
  198. { left: array definition }
  199. { right : index constant }
  200. { OPEN ARRAY }
  201. { (current): LOC_MEM, LOC_REFERENCE (symbol) }
  202. { (current): LOC_REFERENCE (with index register) }
  203. { (current): LOC_REFERENCE (without index register) }
  204. { (current): LOC_REFERENCE (without base register) }
  205. procedure testarraylocal;
  206. var
  207. localsmallnegarray : psmallnegarray;
  208. localsmallarray : psmallarray;
  209. localbignegarray : pbignegarray;
  210. localbigarray : pbigarray;
  211. localindex : longint;
  212. localboolarray: boolarray;
  213. i : longint;
  214. passed : boolean;
  215. b1, b2: boolean;
  216. p : pointer;
  217. begin
  218. Write('Testing subscriptn() local variables...');
  219. new(localsmallnegarray);
  220. new(localsmallarray);
  221. new(localbignegarray);
  222. new(localbigarray);
  223. passed := true;
  224. FillChar(localsmallnegarray^,sizeof(smallnegarray),0);
  225. FillChar(localsmallarray^,sizeof(smallarray),0);
  226. FillChar(localbignegarray^,sizeof(bignegarray),0);
  227. FillChar(localbignegarray^,sizeof(bignegarray),0);
  228. FillChar(localbigarray^,sizeof(bigarray),0);
  229. FillChar(localboolarray, sizeof(localboolarray),0);
  230. { RIGHT : LOC_JUMP }
  231. { (current) : LOC_MEM (symbol) }
  232. b1 := true;
  233. b2 := true;
  234. localboolarray[b1 and b2] := TRUE;
  235. if localboolarray[true] <> TRUE then
  236. passed := false;
  237. { RIGHT : LOC_FLAGS }
  238. { (current) : LOC_MEM (symbol) }
  239. { IF ASSIGNED DOES NOT HAVE }
  240. { A RESULT IN FLAGS THIS WILL }
  241. { NOT WORK (LOC_FLAGS = OK) }
  242. { for FPC v1.0.x }
  243. p := nil;
  244. localboolarray[assigned(p)]:=true;
  245. if localboolarray[false] <> true then
  246. passed := false;
  247. { RIGHT : LOC_REFERENCE }
  248. { (current) : LOC_MEM () }
  249. localindex := max_big_array;
  250. localbigarray^[localindex] := $F0F0;
  251. if localbigarray^[localindex] <> $F0F0 then
  252. passed := false;
  253. { RIGHT : ordconstn }
  254. { (current) : LOC_MEM () }
  255. { index 1 : 1 }
  256. localbigarray^[max_big_array] := $FF;
  257. if localbigarray^[max_big_array] <> $FF then
  258. passed := false;
  259. { RIGHT : LOC_REGISTER }
  260. { (current) : LOC_MEM () }
  261. for i:=min_small_neg_array to max_small_neg_array do
  262. begin
  263. localsmallnegarray^[i] := word(i);
  264. end;
  265. { now compare if the values are correct }
  266. for i:=min_small_neg_array to max_small_neg_array do
  267. begin
  268. if localsmallnegarray^[i] <> word(i) then
  269. passed := false;
  270. end;
  271. for i:=min_small_array to max_small_array do
  272. begin
  273. localsmallarray^[i] := i;
  274. end;
  275. { now compare if the values are correct }
  276. for i:=min_small_array to max_small_array do
  277. begin
  278. if localsmallarray^[i] <> i then
  279. passed := false;
  280. end;
  281. for i:=min_big_neg_array to max_big_neg_array do
  282. begin
  283. localbignegarray^[i] := word(i);
  284. end;
  285. { now compare if the values are correct }
  286. for i:=min_big_neg_array to max_big_neg_array do
  287. begin
  288. if localbignegarray^[i] <> word(i) then
  289. passed := false;
  290. end;
  291. for i:=min_big_array to max_big_array do
  292. begin
  293. localbigarray^[i] := word(i);
  294. end;
  295. { now compare if the values are correct }
  296. for i:=min_big_array to max_big_array do
  297. begin
  298. if localbigarray^[i] <> word(i) then
  299. passed := false;
  300. end;
  301. if passed then
  302. WriteLn('Success.')
  303. else
  304. WriteLn('Failure.');
  305. dispose(localbigarray);
  306. dispose(localbignegarray);
  307. dispose(localsmallarray);
  308. dispose(localsmallnegarray);
  309. end;
  310. { (current): LOC_MEM, LOC_REFERENCE (symbol) }
  311. { (current): LOC_REFERENCE (with index register) }
  312. { (current): LOC_REFERENCE (without index register) }
  313. { (current): LOC_REFERENCE (without base register) }
  314. procedure testansistring;
  315. var
  316. localansi : ansistring;
  317. passed : boolean;
  318. i : longint;
  319. begin
  320. Write('Testing subscriptn() ansistring()...');
  321. passed := true;
  322. localansi := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  323. { RIGHT : LOC_REFERENCE }
  324. { (current) : LOC_REFERENCE () }
  325. for i:=1 to length(localansi) do
  326. begin
  327. if localansi[i]<>alphabet[i] then
  328. passed := false;
  329. end;
  330. { RIGHT : LOC_REFERENCE
  331. (current) : LOC_REGISTER ()
  332. for i:=0 to length(localansi) do
  333. begin
  334. if ansistring(getansistr)[i]<>alphabet[i] then
  335. passed := false;
  336. end;
  337. }
  338. if passed then
  339. WriteLn('Success.')
  340. else
  341. WriteLn('Failure.');
  342. end;
  343. { left: array definition }
  344. { right : + operator }
  345. { right right : index constant }
  346. { With -Or switch only }
  347. { left: array definition }
  348. { right : - operator }
  349. { right right : index constant }
  350. { With -Or switch only }
  351. var
  352. i: integer;
  353. b1,b2: boolean;
  354. p: pointer;
  355. begin
  356. globalansi := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  357. testarrayglobal;
  358. testarraylocal;
  359. testansistring;
  360. end.
  361. {
  362. $Log$
  363. Revision 1.3 2001-06-30 02:16:28 carl
  364. - reduced sizes of arrays to make it work under m68k
  365. Revision 1.2 2001/06/30 00:48:37 carl
  366. + added LOC_FLAGS and LOC_JUMP tests (still missing open array tests)
  367. Revision 1.1 2001/06/29 02:02:10 carl
  368. + add array indexing test suite (incomplete)
  369. }