tvec.pp 12 KB

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