tin.pp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. type
  69. tnormalset = set of tbigenum;
  70. tsmallset = set of tsmallenum;
  71. { The following cases are possible }
  72. { jump table usage }
  73. { small set or normal set }
  74. { source location : REFERENCE,MEMORY,CONSTANT or REGISTER }
  75. { NO GENERATION OF JUMP TABLE }
  76. { SMALL SET }
  77. procedure smallsettestone;
  78. var
  79. op1 : tsmallset;
  80. op2 : tsmallset;
  81. op3 : tsmallset;
  82. op : tsmallenum;
  83. passed : boolean;
  84. begin
  85. passed := true;
  86. Write('Small set in operator test (without case table)...');
  87. { LEFT : LOC_REFERENCE (not a constant node) }
  88. { RIGHT : LOC_REFERENCE }
  89. op1 := [DI];
  90. op2 := [DI];
  91. op := DI;
  92. if not (op in op1) then
  93. passed := false;
  94. { LEFT : LOC_REFERENCE (a constant node) }
  95. { RIGHT: LOC_REFERENCE }
  96. op1 := [DL];
  97. op := DI;
  98. if not (DL in op1) then
  99. passed := false;
  100. { LEFT : LOC_REFERENCE (a constant node) }
  101. { RIGHT: LOC_REFERENCE (a constant set) }
  102. { THIS CAN NEVER HAPPEN - EVALUATED AT COMPILE TIME BY COMPILER }
  103. op1 := [DB];
  104. op := DB;
  105. if not (DB in [DA..DL]) then
  106. passed := false;
  107. { LEFT : LOC_REFERENCE (not a constant node) }
  108. { RIGHT : LOC_REGISTER,LOC_CREGISTER }
  109. op := DF;
  110. op2 := [DB];
  111. op3 := [DF];
  112. if not (op in (op2+op3)) then
  113. passed := false;
  114. { LEFT : LOC_REGISTER (a constant node) }
  115. { RIGHT : LOC_REGISTER,LOC_CREGISTER }
  116. op2 := [DB];
  117. op3 := [DF];
  118. if not (DB in (op2+op3)) then
  119. passed := false;
  120. if passed then
  121. WriteLn('Success.')
  122. else
  123. WriteLn('Failure.');
  124. end;
  125. { returns result in register }
  126. function getsmallop : tsmallenum;
  127. begin
  128. getsmallop := DQ;
  129. end;
  130. { GENERATION OF JUMP TABLE }
  131. { SMALL SET }
  132. procedure smallsettesttwo;
  133. var
  134. op1 : tsmallset;
  135. op2 : tsmallset;
  136. op : tsmallenum;
  137. passed : boolean;
  138. begin
  139. Write('Small set in operator test (with case table)...');
  140. passed := true;
  141. op := DN;
  142. { LEFT : LOC_REFERENCE }
  143. { RIGHT: range constant set (carry flag) }
  144. if not (op in [DB..DN]) then
  145. passed := false;
  146. { LEFT : LOC_REFERENCE }
  147. { RIGHT: NOT range constant set (zero flag) }
  148. op := DH;
  149. if not (op in [DB,DH,DP]) then
  150. passed := false;
  151. { LEFT : LOC_REGISTER }
  152. { RIGHT : NOT range constant set (zero flag) }
  153. op := DH;
  154. if not (getsmallop in [DA,DB..DN,DQ]) then
  155. passed := false;
  156. { LEFT : LOC_REGISTER }
  157. { RIGHT : range constant set (carry flag) }
  158. if passed then
  159. WriteLn('Success.')
  160. else
  161. WriteLn('Failure.');
  162. end;
  163. { returns result in register }
  164. function getop : tbigenum;
  165. begin
  166. getop := A_BFSET;
  167. end;
  168. { NO JUMP TABLE }
  169. { NORMAL SETS }
  170. procedure settestone;
  171. var
  172. op1 : tnormalset;
  173. op2 : tnormalset;
  174. op : tbigenum;
  175. passed : boolean;
  176. begin
  177. Write('Normal set in operator test (without case table)...');
  178. passed := true;
  179. { RIGHT NODE = immediate value in reference field ?? }
  180. { RIGHT node = ordconstn (how is this possible?) - it goes through }
  181. { analizeset! }
  182. { Left : LOC_REGISTER }
  183. { right : LOC_REFERENCE (call to sys) }
  184. if not (getop in [A_BFSET,A_MOVE,A_TRAP,A_CMP,A_CMPI,A_FADD,A_LABEL,A_ASL,A_ADDX]) then
  185. passed := false;
  186. op := A_MOVE;
  187. { Left : LOC_REFERENCE }
  188. { right : LOC_REFERENCE }
  189. if not (op in [A_BFSET,A_MOVE,A_TRAP,A_CMP,A_CMPI,A_FADD,A_LABEL,A_ASL,A_ADDX]) then
  190. passed := false;
  191. { Left : ordinal constant }
  192. { right : LOC_REFERENCE }
  193. op1 := [A_MOVE,A_TRAP];
  194. if not (A_MOVE in op1) then
  195. passed := false;
  196. if passed then
  197. WriteLn('Success.')
  198. else
  199. WriteLn('Failure.');
  200. end;
  201. { WITH JUMP TABLE }
  202. { NORMAL SETS }
  203. procedure settesttwo;
  204. var
  205. op1 : tnormalset;
  206. op2 : tnormalset;
  207. op : tbigenum;
  208. passed : boolean;
  209. begin
  210. Write('Normal set in operator test (with case table)...');
  211. passed := true;
  212. { Left : LOC_REGISTER }
  213. { right : LOC_REFERENCE with ranges }
  214. if not (getop in [A_BFSET,A_MOVE,A_ASL..A_BCC]) then
  215. passed := false;
  216. { Left : LOC_REGISTER }
  217. { right : LOC_REFERENCE no ranges }
  218. if not (getop in [A_BFSET,A_MOVE]) then
  219. passed := false;
  220. op := A_MOVE;
  221. { Left : LOC_REFERENCE }
  222. { right : LOC_REFERENCE with ranges }
  223. if not (getop in [A_BFSET,A_MOVE,A_ASL..A_BCC]) then
  224. passed := false;
  225. if passed then
  226. WriteLn('Success.')
  227. else
  228. WriteLn('Failure.');
  229. end;
  230. Begin
  231. smallsettestone;
  232. smallsettesttwo;
  233. settestone;
  234. settesttwo;
  235. end.
  236. {
  237. $Log$
  238. Revision 1.1 2001-06-25 01:34:03 carl
  239. + secondin() node testing
  240. }