tin.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. {****************************************************************}
  2. { CODE GENERATOR TEST PROGRAM }
  3. {****************************************************************}
  4. { NODE TESTED : secondin() }
  5. {****************************************************************}
  6. { PRE-REQUISITES: secondload() }
  7. { secondassign() }
  8. { secondtypeconv() }
  9. { secondadd() for sets }
  10. { secondsetelement() }
  11. { secondcalln() }
  12. { secondfuncret() }
  13. {****************************************************************}
  14. { DEFINES: }
  15. { FPC = Target is FreePascal compiler }
  16. {****************************************************************}
  17. { REMARKS: }
  18. { }
  19. { }
  20. { }
  21. {****************************************************************}
  22. type
  23. { DO NOT CHANGE THE VALUES OF THESE ENUMERATIONS! }
  24. { This will fit into a 32-bit small set }
  25. tsmallenum = (dA,dB,dC,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dop,dp,dq,dr);
  26. { This will fit into a normal 32-byte set }
  27. tbigenum = (A_ABCD,
  28. A_ADD,A_ADDA,A_ADDI,A_ADDQ,A_ADDX,A_AND,A_ANDI,
  29. A_ASL,A_ASR,A_BCC,A_BCS,A_BEQ,A_BGE,A_BGT,A_BHI,
  30. A_BLE,A_BLS,A_BLT,A_BMI,A_BNE,A_BPL,A_BVC,A_BVS,
  31. A_BCHG,A_BCLR,A_BRA,A_BSET,A_BSR,A_BTST,A_CHK,
  32. A_CLR,A_CMP,A_CMPA,A_CMPI,A_CMPM,A_DBCC,A_DBCS,A_DBEQ,A_DBGE,
  33. A_DBGT,A_DBHI,A_DBLE,A_DBLS,A_DBLT,A_DBMI,A_DBNE,A_DBRA,
  34. A_DBPL,A_DBT,A_DBVC,A_DBVS,A_DBF,A_DIVS,A_DIVU,
  35. A_EOR,A_EORI,A_EXG,A_ILLEGAL,A_EXT,A_JMP,A_JSR,
  36. A_LEA,A_LINK,A_LSL,A_LSR,A_MOVE,A_MOVEA,A_MOVEI,A_MOVEQ,
  37. A_MOVEM,A_MOVEP,A_MULS,A_MULU,A_NBCD,A_NEG,A_NEGX,
  38. A_NOP,A_NOT,A_OR,A_ORI,A_PEA,A_ROL,A_ROR,A_ROXL,
  39. A_ROXR,A_RTR,A_RTS,A_SBCD,A_SCC,A_SCS,A_SEQ,A_SGE,
  40. A_SGT,A_SHI,A_SLE,A_SLS,A_SLT,A_SMI,A_SNE,
  41. A_SPL,A_ST,A_SVC,A_SVS,A_SF,A_SUB,A_SUBA,A_SUBI,A_SUBQ,
  42. A_SUBX,A_SWAP,A_TAS,A_TRAP,A_TRAPV,A_TST,A_UNLK,
  43. A_RTE,A_RESET,A_STOP,
  44. A_BKPT,A_MOVEC,A_MOVES,A_RTD,
  45. A_BFCHG,A_BFCLR,A_BFEXTS,A_BFEXTU,A_BFFFO,
  46. A_BFINS,A_BFSET,A_BFTST,A_CALLM,A_CAS,A_CAS2,
  47. A_CHK2,A_CMP2,A_DIVSL,A_DIVUL,A_EXTB,A_PACK,A_RTM,
  48. A_TRAPCC,A_TRACS,A_TRAPEQ,A_TRAPF,A_TRAPGE,A_TRAPGT,
  49. A_TRAPHI,A_TRAPLE,A_TRAPLS,A_TRAPLT,A_TRAPMI,A_TRAPNE,
  50. A_TRAPPL,A_TRAPT,A_TRAPVC,A_TRAPVS,A_UNPK,
  51. { FPU Processor instructions - directly supported only. }
  52. { IEEE aware and misc. condition codes not supported }
  53. A_FABS,A_FADD,
  54. A_FBEQ,A_FBNE,A_FBNGT,A_FBGT,A_FBGE,A_FBNGE,
  55. A_FBLT,A_FBNLT,A_FBLE,A_FBGL,A_FBNGL,A_FBGLE,A_FBNGLE,
  56. A_FDBEQ,A_FDBNE,A_FDBGT,A_FDBNGT,A_FDBGE,A_FDBNGE,
  57. A_FDBLT,A_FDBNLT,A_FDBLE,A_FDBGL,A_FDBNGL,A_FDBGLE,A_FBDNGLE,
  58. A_FSEQ,A_FSNE,A_FSGT,A_FSNGT,A_FSGE,A_FSNGE,
  59. A_FSLT,A_FSNLT,A_FSLE,A_FSGL,A_FSNGL,A_FSGLE,A_FSNGLE,
  60. A_FCMP,A_FDIV,A_FMOVE,A_FMOVEM,
  61. A_FMUL,A_FNEG,A_FNOP,A_FSQRT,A_FSUB,A_FSGLDIV,
  62. A_FSFLMUL,A_FTST,
  63. A_FTRAPEQ,A_FTRAPNE,A_FTRAPGT,A_FTRAPNGT,A_FTRAPGE,A_FTRAPNGE,
  64. A_FTRAPLT,A_FTRAPNLT,A_FTRAPLE,A_FTRAPGL,A_FTRAPNGL,A_FTRAPGLE,A_FTRAPNGLE,
  65. A_CPRESTORE,A_CPSAVE,
  66. A_FRESTORE,A_FSAVE,A_PFLUSH,A_PFLUSHA,A_PLOAD,A_PMOVE,A_PTEST,
  67. A_LABEL,A_NONE);
  68. { this is also a normal set }
  69. tregister = (R_NO,
  70. R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
  71. R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
  72. R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_BH,R_DH,
  73. R_CS,R_DS,R_ES,R_SS,R_FS,R_GS,
  74. R_ST,R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7,
  75. R_DR0,R_DR1,R_DR2,R_DR3,R_DR6,R_DR7,
  76. R_CR0,R_CR2,R_CR3,R_CR4,
  77. R_TR3,R_TR4,R_TR5,R_TR6,R_TR7,
  78. R_MM0,R_MM1,R_MM2,R_MM3,R_MM4,R_MM5,R_MM6,R_MM7,
  79. R_XMM0,R_XMM1,R_XMM2,R_XMM3,R_XMM4,R_XMM5,R_XMM6,R_XMM7
  80. );
  81. const
  82. LoReg = R_EAX;
  83. HiReg = R_DH;
  84. type
  85. tnormalset = set of tbigenum;
  86. tsmallset = set of tsmallenum;
  87. tregset = set of LoReg..HiReg;
  88. procedure checkpassed(passed : boolean);
  89. begin
  90. if passed then
  91. WriteLn('Passed!')
  92. else
  93. begin
  94. WriteLn('Failure.');
  95. Halt(1);
  96. end;
  97. end;
  98. var
  99. NewRegsEncountered : TRegSet;
  100. function Reg32 : tregister;
  101. begin
  102. Reg32:=R_EAX;
  103. end;
  104. {*******************************************************************}
  105. { The following cases are possible }
  106. { jump table usage }
  107. { small set or normal set }
  108. { source location : REFERENCE,MEMORY,CONSTANT or REGISTER }
  109. {*******************************************************************}
  110. { NO GENERATION OF JUMP TABLE }
  111. { SMALL SET }
  112. procedure smallsettestone;
  113. var
  114. op1 : tsmallset;
  115. op2 : tsmallset;
  116. op3 : tsmallset;
  117. op : tsmallenum;
  118. passed : boolean;
  119. begin
  120. passed := true;
  121. Write('Small set in operator test (without case table)...');
  122. { LEFT : LOC_REFERENCE (not a constant node) }
  123. { RIGHT : LOC_REFERENCE }
  124. op1 := [DI];
  125. op2 := [DI];
  126. op := DI;
  127. if not (op in op1) then
  128. passed := false;
  129. { LEFT : LOC_REFERENCE (a constant node) }
  130. { RIGHT: LOC_REFERENCE }
  131. op1 := [DL];
  132. op := DI;
  133. if not (DL in op1) then
  134. passed := false;
  135. { LEFT : LOC_REFERENCE (a constant node) }
  136. { THIS CAN NEVER HAPPEN - EVALUATED AT COMPILE TIME BY COMPILER }
  137. op1 := [DB];
  138. op := DB;
  139. if not (DB in [DA..DL]) then
  140. passed := false;
  141. { LEFT : LOC_REFERENCE (not a constant node) }
  142. { RIGHT : LOC_REGISTER,LOC_CREGISTER }
  143. op := DF;
  144. op2 := [DB];
  145. op3 := [DF];
  146. if not (op in (op2+op3)) then
  147. passed := false;
  148. { LEFT : LOC_REGISTER (a constant node) }
  149. { RIGHT : LOC_REGISTER,LOC_CREGISTER }
  150. op2 := [DB];
  151. op3 := [DF];
  152. if not (DB in (op2+op3)) then
  153. passed := false;
  154. checkpassed(passed);
  155. end;
  156. { returns result in register }
  157. function getsmallop : tsmallenum;
  158. begin
  159. getsmallop := DQ;
  160. end;
  161. { NO GENERATION OF JUMP TABLE }
  162. { SMALL SET }
  163. procedure smallsettestthree;
  164. var
  165. op1 : tsmallset;
  166. op2 : tsmallset;
  167. op3 : tsmallset;
  168. op : tsmallenum;
  169. passed : boolean;
  170. begin
  171. passed := true;
  172. Write('Small set in operator test (without case table)...');
  173. { LEFT : LOC_REGISTER (not a constant node) }
  174. { RIGHT : LOC_REFERENCE }
  175. op1 := [DQ];
  176. op2 := [DQ];
  177. if not (getsmallop in op1) then
  178. passed := false;
  179. { LEFT : LOC_REGISTER (not a constant node) }
  180. { RIGHT : LOC_REGISTER }
  181. op := DF;
  182. op2 := [DB,DQ];
  183. op3 := [DF];
  184. if not (getsmallop in (op2+op3)) then
  185. passed := false;
  186. checkpassed(passed);
  187. end;
  188. { GENERATION OF JUMP TABLE }
  189. { SMALL SET }
  190. procedure smallsettesttwo;
  191. var
  192. op1 : tsmallset;
  193. op2 : tsmallset;
  194. op : tsmallenum;
  195. passed : boolean;
  196. begin
  197. Write('Small set in operator test (with case table)...');
  198. passed := true;
  199. op := DN;
  200. { LEFT : LOC_REFERENCE }
  201. { RIGHT: range constant set (carry flag) }
  202. if not (op in [DB..DN]) then
  203. passed := false;
  204. { LEFT : LOC_REFERENCE }
  205. { RIGHT: NOT range constant set (zero flag) }
  206. op := DH;
  207. if not (op in [DB,DH,DP]) then
  208. passed := false;
  209. { LEFT : LOC_REFERENCE }
  210. { RIGHT : range constant set with full set }
  211. op:=DK;
  212. if not (op in [dA,dB,dC,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dop,dp,dq,dr]) then
  213. passed := false;
  214. { LEFT : LOC_REGISTER }
  215. { RIGHT : NOT range constant set (zero flag) }
  216. op := DH;
  217. if not (getsmallop in [DA,DB..DN,DQ]) then
  218. passed := false;
  219. { LEFT : LOC_REGISTER }
  220. { RIGHT : range constant set with full set }
  221. if not (getsmallop in [dA,dB,dC,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dop,dp,dq,dr]) then
  222. passed := false;
  223. checkpassed(passed);
  224. end;
  225. { returns result in register }
  226. function getop : tbigenum;
  227. begin
  228. getop := A_BFSET;
  229. end;
  230. { NO JUMP TABLE }
  231. { NORMAL SETS }
  232. procedure settestone;
  233. var
  234. op1 : tnormalset;
  235. op2 : tnormalset;
  236. op : tbigenum;
  237. passed : boolean;
  238. begin
  239. Write('Normal set in operator test (without case table)...');
  240. passed := true;
  241. { RIGHT NODE = immediate value in reference field ?? }
  242. { RIGHT node = ordconstn (how is this possible?) - it goes through }
  243. { analizeset! }
  244. { Left : LOC_REGISTER }
  245. { right : LOC_REFERENCE (call to sys) }
  246. if not (getop in [A_BFSET,A_MOVE,A_TRAP,A_CMP,A_CMPI,A_FADD,A_LABEL,A_ASL,A_ADDX]) then
  247. passed := false;
  248. op := A_MOVE;
  249. { Left : LOC_REFERENCE }
  250. { right : LOC_REFERENCE }
  251. if not (op in [A_BFSET,A_MOVE,A_TRAP,A_CMP,A_CMPI,A_FADD,A_LABEL,A_ASL,A_ADDX]) then
  252. passed := false;
  253. { Left : ordinal constant }
  254. { right : LOC_REFERENCE }
  255. op1 := [A_MOVE,A_TRAP];
  256. if not (A_MOVE in op1) then
  257. passed := false;
  258. checkpassed(passed);
  259. end;
  260. { WITH JUMP TABLE }
  261. { NORMAL SETS }
  262. procedure settesttwo;
  263. var
  264. op1 : tnormalset;
  265. op2 : tnormalset;
  266. bs : set of boolean;
  267. op : tbigenum;
  268. passed : boolean;
  269. begin
  270. Write('Normal set in operator test (with case table)...');
  271. passed := true;
  272. { Left : LOC_REGISTER }
  273. { right : LOC_REFERENCE with ranges }
  274. if not (getop in [A_BFSET,A_MOVE,A_ASL..A_BCC]) then
  275. passed := false;
  276. { Left : LOC_REGISTER }
  277. { right : LOC_REFERENCE no ranges }
  278. if not (getop in [A_BFSET,A_MOVE]) then
  279. passed := false;
  280. { Left : LOC_REGISTER }
  281. { right : no set at all }
  282. if getop in [] then
  283. passed:=false;
  284. { Left : LOC_REGISTER }
  285. { right : complete set definition }
  286. if not (getop in [A_ABCD..A_NONE]) then
  287. passed:=false;
  288. op := A_MOVE;
  289. { Left : LOC_REFERENCE }
  290. { right : LOC_REFERENCE with ranges }
  291. if not (getop in [A_BFSET,A_MOVE,A_ASL..A_BCC]) then
  292. passed := false;
  293. op:= A_MOVE;
  294. if not (getop in [A_BFSET,A_MOVE]) then
  295. passed := false;
  296. { Left : LOC_REFERENCE }
  297. { right : no set at all }
  298. op := A_MOVE;
  299. if op in [] then
  300. passed:=false;
  301. { Left : LOC_REFERENCE }
  302. { right : complete set definition }
  303. op:=A_MOVE;
  304. if not (op in [A_ABCD..A_NONE]) then
  305. passed:=false;
  306. checkpassed(passed);
  307. { LEFT : LOC_JUMP }
  308. { RIGHT : LOC_REGISTER,LOC_CREGISTER }
  309. bs:=[false,true];
  310. op:=A_MOVE;
  311. passed:=true;
  312. if not(not(op in [A_BFSET,A_MOVE,A_ASL..A_BCC]) in bs) then
  313. passed := false;
  314. if not((op in [A_BFSET,A_MOVE,A_ASL..A_BCC]) in bs) then
  315. passed := false;
  316. bs:=[false];
  317. if ((op in [A_BFSET,A_MOVE,A_ASL..A_BCC]) in bs) then
  318. passed := false;
  319. checkpassed(passed);
  320. end;
  321. { WITH JUMP TABLE }
  322. { NORMAL SETS }
  323. procedure settestthree;
  324. var
  325. passed : boolean;
  326. begin
  327. Write('Normal set in operator test II (without case table)...');
  328. passed := false;
  329. NewRegsEncountered := [R_EAX..R_EDX];
  330. If (Reg32 in NewRegsEncountered) Then
  331. passed := true;
  332. checkpassed(passed);
  333. end;
  334. Begin
  335. smallsettestone;
  336. smallsettesttwo;
  337. smallsettestthree;
  338. settestone;
  339. settesttwo;
  340. settestthree;
  341. end.