tumin.pp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. {****************************************************************}
  2. { CODE GENERATOR TEST PROGRAM }
  3. {****************************************************************}
  4. { NODE TESTED : secondunaryminus() }
  5. {****************************************************************}
  6. { PRE-REQUISITES: secondload() }
  7. { secondassign() }
  8. {****************************************************************}
  9. { DEFINES: VERBOSE = Write test information to screen }
  10. { FPC = Target is FreePascal compiler }
  11. {****************************************************************}
  12. { REMARKS: }
  13. { }
  14. { }
  15. { }
  16. {****************************************************************}
  17. {$mode objfpc}
  18. Program tumin;
  19. {----------------------------------------------------}
  20. { Cases to test: }
  21. { CURRENT NODE (result) }
  22. { - LOC_REGISTER }
  23. { - LOC_FLAGS }
  24. { LEFT NODE (value to complement) }
  25. { possible cases : int64,byte,word,longint }
  26. { boolean }
  27. { - LOC_CREGISTER }
  28. { - LOC_REFERENCE / LOC_MEM }
  29. { - LOC_REGISTER }
  30. { - LOC_FLAGS }
  31. { - LOC_JUMP }
  32. {----------------------------------------------------}
  33. uses
  34. SysUtils;
  35. {$IFNDEF FPC}
  36. type smallint = integer;
  37. {$ENDIF}
  38. function getintres : smallint;
  39. begin
  40. getintres := $7F7F;
  41. end;
  42. function getbyteboolval : boolean;
  43. begin
  44. getbyteboolval := TRUE;
  45. end;
  46. procedure test(value, required: longint);
  47. begin
  48. if value <> required then
  49. begin
  50. writeln('Got ',value,' instead of ',required);
  51. halt(1);
  52. end
  53. else
  54. writeln('Passed!');
  55. end;
  56. {$Q+}
  57. {$R+}
  58. var
  59. caught: boolean;
  60. longres : longint;
  61. cardres : cardinal;
  62. intres : smallint;
  63. byteboolval : bytebool;
  64. wordboolval : wordbool;
  65. longboolval : longbool;
  66. byteboolres : bytebool;
  67. wordboolres : wordbool;
  68. longboolres : longbool;
  69. {$ifdef fpc}
  70. int64res : int64;
  71. qwordres : qword;
  72. {$endif}
  73. Begin
  74. WriteLn('------------------------------ LONGINT --------------------------------');
  75. { CURRENT NODE: REGISTER }
  76. { LEFT NODE : REFERENCE }
  77. WriteLn('(current) : LOC_REGISTER; (left) : LOC_REFERENCE');
  78. longres := $7F7F7F7F;
  79. longres := -longres;
  80. Write('Value should be $80808081...');
  81. { the following test give range check errors }
  82. test(longres,longint($80808081));
  83. { CURRENT NODE : REGISTER }
  84. { LEFT NODE : REGISTER }
  85. WriteLn('(current) : LOC_REGISTER; (left) : LOC_REGISTER');
  86. longres := - getintres;
  87. Write('Value should be $FFFF8081...');
  88. test(longres, longint($FFFF8081));
  89. Writeln('Overflow tests');
  90. Write('-0...');
  91. longres:=0;
  92. longres:=-longres;
  93. test(longres,0);
  94. longres:=high(longint);
  95. longres:=-longres;
  96. Write('-',high(longint),'...');
  97. test(longres,longint($80000001));
  98. Write('-(',low(longint),')...');
  99. longres:=low(longint);
  100. caught:=false;
  101. try
  102. longres:=-longres;
  103. except
  104. {$ifdef cpu64}
  105. on erangeerror do
  106. {$else cpu64}
  107. on eintoverflow do
  108. {$endif cpu64}
  109. caught:=true;
  110. end;
  111. if not caught then
  112. begin
  113. Writeln('Overflow -$80000000 not caught');
  114. halt(1);
  115. end
  116. else
  117. writeln('Passed!');
  118. WriteLn('------------------------------ CARDINAL ----------------------------------');
  119. Writeln('Overflow/Rangecheck tests');
  120. Write('-0...');
  121. cardres:=0;
  122. longres:=-cardres;
  123. test(longres,0);
  124. cardres:=high(longint);
  125. longres:=-cardres;
  126. Write('-',high(longint),'...');
  127. test(longres,longint($80000001));
  128. Write('-',high(cardinal),'...');
  129. cardres:=high(cardinal);
  130. caught:=false;
  131. try
  132. longres:=-cardres;
  133. except
  134. on erangeerror do
  135. caught:=true;
  136. end;
  137. if not caught then
  138. begin
  139. Writeln('Rangecheck -high(cardinal) not caught');
  140. halt(1);
  141. end
  142. else
  143. writeln('Passed!');
  144. {$ifndef cpu64}
  145. { this is calculated in 64 bit on 64 bit cpus -> no range error }
  146. Write('-',cardinal($80000000),'...');
  147. cardres:=cardinal($80000000);
  148. caught:=false;
  149. try
  150. longres:=-cardres;
  151. except
  152. on erangeerror do
  153. caught:=true;
  154. end;
  155. if not caught then
  156. begin
  157. Writeln('Rangecheck -cardinal($80000000) not caught');
  158. halt(1);
  159. end
  160. else
  161. writeln('Passed!');
  162. {$endif cpu64}
  163. {$IFDEF FPC}
  164. WriteLn('------------------------------ INT64 ----------------------------------');
  165. { CURRENT NODE: REGISTER }
  166. { LEFT NODE : REFERENCE }
  167. WriteLn('(current) : LOC_REGISTER; (left) : LOC_REFERENCE');
  168. int64res := $7F7F7F7F;
  169. int64res := - int64res;
  170. Write('Value should be $80808081...');
  171. test(longint(int64res and $FFFFFFFF),longint($80808081));
  172. { CURRENT NODE : REGISTER }
  173. { LEFT NODE : REGISTER }
  174. WriteLn('(current) : LOC_REGISTER; (left) : LOC_REGISTER');
  175. int64res := - (word(getintres));
  176. Write('Value should be $8081...');
  177. test(longint(int64res and $FFFFFFFF),longint($FFFF8081));
  178. Writeln('Overflow tests');
  179. Write('-0...');
  180. int64res:=0;
  181. int64res:=-int64res;
  182. test(hi(int64res) or lo(int64res),0);
  183. int64res:=high(int64);
  184. int64res:=-int64res;
  185. Write('-',high(int64),'... (2 tests)');
  186. test(longint(hi(int64res)),longint($80000000));
  187. test(longint(lo(int64res)),1);
  188. Writeln('-(',low(int64),')...');
  189. int64res:=low(int64);
  190. caught:=false;
  191. try
  192. int64res:=-int64res;
  193. except
  194. on eintoverflow do
  195. caught:=true;
  196. end;
  197. if not caught then
  198. begin
  199. Writeln('Overflow -$8000000000000000 not caught');
  200. halt(1);
  201. end
  202. else
  203. writeln('Passed!');
  204. WriteLn('------------------------------ QWORD ----------------------------------');
  205. Writeln('Overflow/Rangecheck tests');
  206. Write('-0...');
  207. qwordres:=0;
  208. int64res:=-qwordres;
  209. test(hi(int64res) or lo(int64res),0);
  210. qwordres:=high(int64);
  211. int64res:=-qwordres;
  212. Write('-',high(int64),'... (2 tests)');
  213. test(longint(hi(int64res)),longint($80000000));
  214. test(longint(lo(int64res)),1);
  215. Write('-',high(qword),'...');
  216. qwordres:=high(qword);
  217. caught:=false;
  218. try
  219. int64res:=-qwordres;
  220. except
  221. on erangeerror do
  222. caught:=true;
  223. end;
  224. if not caught then
  225. begin
  226. Writeln('Rangecheck -high(qword) not caught');
  227. halt(1);
  228. end
  229. else
  230. writeln('Passed!');
  231. Write('-',qword($8000000000000000),'...');
  232. qwordres:=qword($8000000000000000);
  233. caught:=false;
  234. try
  235. int64res:=-qwordres;
  236. except
  237. on erangeerror do
  238. caught:=true;
  239. end;
  240. if not caught then
  241. begin
  242. Writeln('Rangecheck -qword($8000000000000000) not caught');
  243. halt(1);
  244. end
  245. else
  246. writeln('Passed!');
  247. {$ENDIF}
  248. end.