nmat.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. {
  2. $Id$
  3. Copyright (c) 2000 by Florian Klaempfl
  4. Type checking and register allocation for math nodes
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit nmat;
  19. {$i defines.inc}
  20. interface
  21. uses
  22. node;
  23. type
  24. tmoddivnode = class(tbinopnode)
  25. function pass_1 : tnode;override;
  26. function det_resulttype:tnode;override;
  27. protected
  28. { override the following if you want to implement }
  29. { parts explicitely in the code generator (JM) }
  30. function first_moddiv64bitint: tnode; virtual;
  31. function firstoptimize: tnode; virtual;
  32. end;
  33. tmoddivnodeclass = class of tmoddivnode;
  34. tshlshrnode = class(tbinopnode)
  35. function pass_1 : tnode;override;
  36. function det_resulttype:tnode;override;
  37. end;
  38. tshlshrnodeclass = class of tshlshrnode;
  39. tunaryminusnode = class(tunarynode)
  40. constructor create(expr : tnode);virtual;
  41. function pass_1 : tnode;override;
  42. function det_resulttype:tnode;override;
  43. end;
  44. tunaryminusnodeclass = class of tunaryminusnode;
  45. tnotnode = class(tunarynode)
  46. constructor create(expr : tnode);virtual;
  47. function pass_1 : tnode;override;
  48. function det_resulttype:tnode;override;
  49. end;
  50. tnotnodeclass = class of tnotnode;
  51. var
  52. cmoddivnode : tmoddivnodeclass;
  53. cshlshrnode : tshlshrnodeclass;
  54. cunaryminusnode : tunaryminusnodeclass;
  55. cnotnode : tnotnodeclass;
  56. implementation
  57. uses
  58. systems,tokens,
  59. verbose,globals,cutils,
  60. globtype,
  61. symconst,symtype,symtable,symdef,types,
  62. htypechk,pass_1,cpubase,cpuinfo,
  63. cgbase,
  64. ncon,ncnv,ncal,nadd;
  65. {****************************************************************************
  66. TMODDIVNODE
  67. ****************************************************************************}
  68. function tmoddivnode.det_resulttype:tnode;
  69. var
  70. t : tnode;
  71. rd,ld : tdef;
  72. rv,lv : tconstexprint;
  73. begin
  74. result:=nil;
  75. resulttypepass(left);
  76. resulttypepass(right);
  77. set_varstate(left,true);
  78. set_varstate(right,true);
  79. if codegenerror then
  80. exit;
  81. { constant folding }
  82. if is_constintnode(left) and is_constintnode(right) then
  83. begin
  84. rv:=tordconstnode(right).value;
  85. lv:=tordconstnode(left).value;
  86. { check for division by zero }
  87. if (rv=0) then
  88. begin
  89. Message(parser_e_division_by_zero);
  90. { recover }
  91. rv:=1;
  92. end;
  93. case nodetype of
  94. modn:
  95. t:=genintconstnode(lv mod rv);
  96. divn:
  97. t:=genintconstnode(lv div rv);
  98. end;
  99. result:=t;
  100. exit;
  101. end;
  102. { allow operator overloading }
  103. t:=self;
  104. if isbinaryoverloaded(t) then
  105. begin
  106. result:=t;
  107. exit;
  108. end;
  109. { if one operand is a cardinal and the other is a positive constant, convert the }
  110. { constant to a cardinal as well so we don't have to do a 64bit division (JM) }
  111. { Do the same for qwords and positive constants as well, otherwise things like }
  112. { "qword mod 10" are evaluated with int64 as result, which is wrong if the }
  113. { "qword" was > high(int64) (JM) }
  114. if (left.resulttype.def.deftype=orddef) and (right.resulttype.def.deftype=orddef) then
  115. if (torddef(right.resulttype.def).typ in [u32bit,u64bit]) and
  116. is_constintnode(left) and
  117. (tordconstnode(left).value >= 0) then
  118. inserttypeconv(left,right.resulttype)
  119. else if (torddef(left.resulttype.def).typ in [u32bit,u64bit]) and
  120. is_constintnode(right) and
  121. (tordconstnode(right).value >= 0) then
  122. inserttypeconv(right,left.resulttype);
  123. if (left.resulttype.def.deftype=orddef) and (right.resulttype.def.deftype=orddef) and
  124. (is_64bitint(left.resulttype.def) or is_64bitint(right.resulttype.def) or
  125. { when mixing cardinals and signed numbers, convert everythign to 64bit (JM) }
  126. ((torddef(right.resulttype.def).typ = u32bit) and
  127. is_signed(left.resulttype.def)) or
  128. ((torddef(left.resulttype.def).typ = u32bit) and
  129. is_signed(right.resulttype.def))) then
  130. begin
  131. rd:=right.resulttype.def;
  132. ld:=left.resulttype.def;
  133. { issue warning if necessary }
  134. if not (is_64bitint(left.resulttype.def) or is_64bitint(right.resulttype.def)) then
  135. CGMessage(type_w_mixed_signed_unsigned);
  136. if is_signed(rd) or is_signed(ld) then
  137. begin
  138. if (torddef(ld).typ<>s64bit) then
  139. inserttypeconv(left,cs64bittype);
  140. if (torddef(rd).typ<>s64bit) then
  141. inserttypeconv(right,cs64bittype);
  142. end
  143. else
  144. begin
  145. if (torddef(ld).typ<>u64bit) then
  146. inserttypeconv(left,cu64bittype);
  147. if (torddef(rd).typ<>u64bit) then
  148. inserttypeconv(right,cu64bittype);
  149. end;
  150. resulttype:=left.resulttype;
  151. end
  152. else
  153. begin
  154. if not(right.resulttype.def.deftype=orddef) or
  155. not(torddef(right.resulttype.def).typ in [s32bit,u32bit]) then
  156. inserttypeconv(right,s32bittype);
  157. if not(left.resulttype.def.deftype=orddef) or
  158. not(torddef(left.resulttype.def).typ in [s32bit,u32bit]) then
  159. inserttypeconv(left,s32bittype);
  160. { the resulttype.def depends on the right side, because the left becomes }
  161. { always 64 bit }
  162. resulttype:=right.resulttype;
  163. end;
  164. end;
  165. function tmoddivnode.first_moddiv64bitint: tnode;
  166. var
  167. procname: string[31];
  168. begin
  169. result := nil;
  170. { otherwise create a call to a helper }
  171. if nodetype = divn then
  172. procname := 'fpc_div_'
  173. else
  174. procname := 'fpc_mod_';
  175. if is_signed(resulttype.def) then
  176. procname := procname + 'int64'
  177. else
  178. procname := procname + 'qword';
  179. result := ccallnode.createintern(procname,ccallparanode.create(left,
  180. ccallparanode.create(right,nil)));
  181. left := nil;
  182. right := nil;
  183. firstpass(result);
  184. end;
  185. function tmoddivnode.firstoptimize: tnode;
  186. var
  187. power{,shiftval} : longint;
  188. newtype: tnodetype;
  189. begin
  190. result := nil;
  191. { divide/mod a number by a constant which is a power of 2? }
  192. if (cs_optimize in aktglobalswitches) and
  193. (right.nodetype = ordconstn) and
  194. { ((nodetype = divn) or
  195. not is_signed(resulttype.def)) and}
  196. (not is_signed(resulttype.def)) and
  197. ispowerof2(tordconstnode(right).value,power) then
  198. begin
  199. if nodetype = divn then
  200. begin
  201. (*
  202. if is_signed(resulttype.def) then
  203. begin
  204. if is_64bitint(left.resulttype.def) then
  205. if not (cs_littlesize in aktglobalswitches) then
  206. shiftval := 63
  207. else
  208. { the shift code is a lot bigger than the call to }
  209. { the divide helper }
  210. exit
  211. else
  212. shiftval := 31;
  213. { we reuse left twice, so create once a copy of it }
  214. { !!! if left is a call is -> call gets executed twice }
  215. left := caddnode.create(addn,left,
  216. caddnode.create(andn,
  217. cshlshrnode.create(sarn,left.getcopy,
  218. cordconstnode.create(shiftval,s32bittype)),
  219. cordconstnode.create(tordconstnode(right).value-1,
  220. right.resulttype)));
  221. newtype := sarn;
  222. end
  223. else
  224. *)
  225. newtype := shrn;
  226. tordconstnode(right).value := power;
  227. result := cshlshrnode.create(newtype,left,right)
  228. end
  229. else
  230. begin
  231. dec(tordconstnode(right).value);
  232. result := caddnode.create(andn,left,right);
  233. end;
  234. { left and right are reused }
  235. left := nil;
  236. right := nil;
  237. firstpass(result);
  238. exit;
  239. end;
  240. end;
  241. function tmoddivnode.pass_1 : tnode;
  242. begin
  243. result:=nil;
  244. firstpass(left);
  245. firstpass(right);
  246. if codegenerror then
  247. exit;
  248. result := firstoptimize;
  249. if assigned(result) then
  250. exit;
  251. { 64bit }
  252. if (left.resulttype.def.deftype=orddef) and (right.resulttype.def.deftype=orddef) and
  253. (is_64bitint(left.resulttype.def) or is_64bitint(right.resulttype.def)) then
  254. begin
  255. result := first_moddiv64bitint;
  256. if assigned(result) then
  257. exit;
  258. location.loc:=LOC_REGISTER;
  259. calcregisters(self,2,0,0);
  260. end
  261. else
  262. begin
  263. left_right_max;
  264. if left.registers32<=right.registers32 then
  265. inc(registers32);
  266. end;
  267. location.loc:=LOC_REGISTER;
  268. end;
  269. {****************************************************************************
  270. TSHLSHRNODE
  271. ****************************************************************************}
  272. function tshlshrnode.det_resulttype:tnode;
  273. var
  274. t : tnode;
  275. begin
  276. result:=nil;
  277. resulttypepass(left);
  278. resulttypepass(right);
  279. set_varstate(right,true);
  280. set_varstate(left,true);
  281. if codegenerror then
  282. exit;
  283. { constant folding }
  284. if is_constintnode(left) and is_constintnode(right) then
  285. begin
  286. case nodetype of
  287. shrn:
  288. t:=genintconstnode(tordconstnode(left).value shr tordconstnode(right).value);
  289. shln:
  290. t:=genintconstnode(tordconstnode(left).value shl tordconstnode(right).value);
  291. end;
  292. result:=t;
  293. exit;
  294. end;
  295. { allow operator overloading }
  296. t:=self;
  297. if isbinaryoverloaded(t) then
  298. begin
  299. result:=t;
  300. exit;
  301. end;
  302. { 64 bit ints have their own shift handling }
  303. if not(is_64bitint(left.resulttype.def)) then
  304. begin
  305. if torddef(left.resulttype.def).typ <> u32bit then
  306. inserttypeconv(left,s32bittype);
  307. end;
  308. inserttypeconv(right,s32bittype);
  309. resulttype:=left.resulttype;
  310. end;
  311. function tshlshrnode.pass_1 : tnode;
  312. var
  313. regs : longint;
  314. begin
  315. result:=nil;
  316. firstpass(left);
  317. firstpass(right);
  318. if codegenerror then
  319. exit;
  320. { 64 bit ints have their own shift handling }
  321. if not(is_64bitint(left.resulttype.def)) then
  322. regs:=1
  323. else
  324. regs:=2;
  325. if (right.nodetype<>ordconstn) then
  326. inc(regs);
  327. location.loc:=LOC_REGISTER;
  328. calcregisters(self,regs,0,0);
  329. end;
  330. {****************************************************************************
  331. TUNARYMINUSNODE
  332. ****************************************************************************}
  333. constructor tunaryminusnode.create(expr : tnode);
  334. begin
  335. inherited create(unaryminusn,expr);
  336. end;
  337. function tunaryminusnode.det_resulttype : tnode;
  338. var
  339. t : tnode;
  340. minusdef : pprocdeflist;
  341. begin
  342. result:=nil;
  343. resulttypepass(left);
  344. set_varstate(left,true);
  345. if codegenerror then
  346. exit;
  347. { constant folding }
  348. if is_constintnode(left) then
  349. begin
  350. tordconstnode(left).value:=-tordconstnode(left).value;
  351. result:=left;
  352. left:=nil;
  353. exit;
  354. end;
  355. if is_constrealnode(left) then
  356. begin
  357. trealconstnode(left).value_real:=-trealconstnode(left).value_real;
  358. result:=left;
  359. left:=nil;
  360. exit;
  361. end;
  362. resulttype:=left.resulttype;
  363. if (left.resulttype.def.deftype=floatdef) then
  364. begin
  365. end
  366. {$ifdef SUPPORT_MMX}
  367. else if (cs_mmx in aktlocalswitches) and
  368. is_mmx_able_array(left.resulttype.def) then
  369. begin
  370. { if saturation is on, left.resulttype.def isn't
  371. "mmx able" (FK)
  372. if (cs_mmx_saturation in aktlocalswitches^) and
  373. (torddef(tarraydef(resulttype.def).definition).typ in
  374. [s32bit,u32bit]) then
  375. CGMessage(type_e_mismatch);
  376. }
  377. end
  378. {$endif SUPPORT_MMX}
  379. else if is_64bitint(left.resulttype.def) then
  380. begin
  381. end
  382. else if (left.resulttype.def.deftype=orddef) then
  383. begin
  384. inserttypeconv(left,s32bittype);
  385. resulttype:=left.resulttype;
  386. end
  387. else
  388. begin
  389. if assigned(overloaded_operators[_minus]) then
  390. minusdef:=overloaded_operators[_minus].defs
  391. else
  392. minusdef:=nil;
  393. while assigned(minusdef) do
  394. begin
  395. if is_equal(tparaitem(minusdef^.def.para.first).paratype.def,left.resulttype.def) and
  396. (tparaitem(minusdef^.def.para.first).next=nil) then
  397. begin
  398. t:=ccallnode.create(ccallparanode.create(left,nil),
  399. overloaded_operators[_minus],nil,nil);
  400. left:=nil;
  401. result:=t;
  402. exit;
  403. end;
  404. minusdef:=minusdef^.next;
  405. end;
  406. CGMessage(type_e_mismatch);
  407. end;
  408. end;
  409. { generic code }
  410. { overridden by: }
  411. { i386 }
  412. function tunaryminusnode.pass_1 : tnode;
  413. begin
  414. result:=nil;
  415. firstpass(left);
  416. if codegenerror then
  417. exit;
  418. registers32:=left.registers32;
  419. registersfpu:=left.registersfpu;
  420. {$ifdef SUPPORT_MMX}
  421. registersmmx:=left.registersmmx;
  422. {$endif SUPPORT_MMX}
  423. if (left.resulttype.def.deftype=floatdef) then
  424. begin
  425. if (left.location.loc<>LOC_REGISTER) and
  426. (registersfpu<1) then
  427. registersfpu:=1;
  428. location.loc:=LOC_REGISTER;
  429. end
  430. {$ifdef SUPPORT_MMX}
  431. else if (cs_mmx in aktlocalswitches) and
  432. is_mmx_able_array(left.resulttype.def) then
  433. begin
  434. if (left.location.loc<>LOC_MMXREGISTER) and
  435. (registersmmx<1) then
  436. registersmmx:=1;
  437. end
  438. {$endif SUPPORT_MMX}
  439. else if is_64bitint(left.resulttype.def) then
  440. begin
  441. if (left.location.loc<>LOC_REGISTER) and
  442. (registers32<2) then
  443. registers32:=2;
  444. location.loc:=LOC_REGISTER;
  445. end
  446. else if (left.resulttype.def.deftype=orddef) then
  447. begin
  448. if (left.location.loc<>LOC_REGISTER) and
  449. (registers32<1) then
  450. registers32:=1;
  451. location.loc:=LOC_REGISTER;
  452. end;
  453. end;
  454. {****************************************************************************
  455. TNOTNODE
  456. ****************************************************************************}
  457. constructor tnotnode.create(expr : tnode);
  458. begin
  459. inherited create(notn,expr);
  460. end;
  461. function tnotnode.det_resulttype : tnode;
  462. var
  463. t : tnode;
  464. notdef : pprocdeflist;
  465. v : tconstexprint;
  466. begin
  467. result:=nil;
  468. resulttypepass(left);
  469. set_varstate(left,true);
  470. if codegenerror then
  471. exit;
  472. { constant folding }
  473. if (left.nodetype=ordconstn) then
  474. begin
  475. v:=tordconstnode(left).value;
  476. case torddef(left.resulttype.def).typ of
  477. bool8bit,
  478. bool16bit,
  479. bool32bit :
  480. begin
  481. { here we do a boolean(byte(..)) type cast because }
  482. { boolean(<int64>) is buggy in 1.00 }
  483. v:=byte(not(boolean(byte(v))));
  484. end;
  485. uchar,
  486. u8bit :
  487. v:=byte(not byte(v));
  488. s8bit :
  489. v:=shortint(not shortint(v));
  490. uwidechar,
  491. u16bit :
  492. v:=word(not word(v));
  493. s16bit :
  494. v:=smallint(not smallint(v));
  495. u32bit :
  496. v:=cardinal(not cardinal(v));
  497. s32bit :
  498. v:=longint(not longint(v));
  499. u64bit :
  500. v:=int64(not int64(v)); { maybe qword is required }
  501. s64bit :
  502. v:=int64(not int64(v));
  503. else
  504. CGMessage(type_e_mismatch);
  505. end;
  506. t:=cordconstnode.create(v,left.resulttype);
  507. result:=t;
  508. exit;
  509. end;
  510. resulttype:=left.resulttype;
  511. if is_boolean(resulttype.def) then
  512. begin
  513. end
  514. else
  515. {$ifdef SUPPORT_MMX}
  516. if (cs_mmx in aktlocalswitches) and
  517. is_mmx_able_array(left.resulttype.def) then
  518. begin
  519. end
  520. else
  521. {$endif SUPPORT_MMX}
  522. if is_64bitint(left.resulttype.def) then
  523. begin
  524. end
  525. else if is_integer(left.resulttype.def) then
  526. begin
  527. end
  528. else
  529. begin
  530. if assigned(overloaded_operators[_op_not]) then
  531. notdef:=overloaded_operators[_op_not].defs
  532. else
  533. notdef:=nil;
  534. while assigned(notdef) do
  535. begin
  536. if is_equal(tparaitem(notdef^.def.para.first).paratype.def,left.resulttype.def) and
  537. (tparaitem(notdef^.def.para.first).next=nil) then
  538. begin
  539. t:=ccallnode.create(ccallparanode.create(left,nil),
  540. overloaded_operators[_op_not],nil,nil);
  541. left:=nil;
  542. result:=t;
  543. exit;
  544. end;
  545. notdef:=notdef^.next;
  546. end;
  547. CGMessage(type_e_mismatch);
  548. end;
  549. end;
  550. function tnotnode.pass_1 : tnode;
  551. begin
  552. result:=nil;
  553. firstpass(left);
  554. if codegenerror then
  555. exit;
  556. location.loc:=left.location.loc;
  557. registers32:=left.registers32;
  558. {$ifdef SUPPORT_MMX}
  559. registersmmx:=left.registersmmx;
  560. {$endif SUPPORT_MMX}
  561. if is_boolean(resulttype.def) then
  562. begin
  563. if (location.loc in [LOC_REFERENCE,LOC_MEM,LOC_CREGISTER]) then
  564. begin
  565. location.loc:=LOC_REGISTER;
  566. if (registers32<1) then
  567. registers32:=1;
  568. end;
  569. { before loading it into flags we need to load it into
  570. a register thus 1 register is need PM }
  571. {$ifdef i386}
  572. if left.location.loc<>LOC_JUMP then
  573. location.loc:=LOC_FLAGS;
  574. {$endif def i386}
  575. end
  576. else
  577. {$ifdef SUPPORT_MMX}
  578. if (cs_mmx in aktlocalswitches) and
  579. is_mmx_able_array(left.resulttype.def) then
  580. begin
  581. if (left.location.loc<>LOC_MMXREGISTER) and
  582. (registersmmx<1) then
  583. registersmmx:=1;
  584. end
  585. else
  586. {$endif SUPPORT_MMX}
  587. if is_64bitint(left.resulttype.def) then
  588. begin
  589. if (location.loc in [LOC_REFERENCE,LOC_MEM,LOC_CREGISTER]) then
  590. begin
  591. location.loc:=LOC_REGISTER;
  592. if (registers32<2) then
  593. registers32:=2;
  594. end;
  595. end
  596. else if is_integer(left.resulttype.def) then
  597. begin
  598. if (left.location.loc<>LOC_REGISTER) and
  599. (registers32<1) then
  600. registers32:=1;
  601. location.loc:=LOC_REGISTER;
  602. end
  603. end;
  604. begin
  605. cmoddivnode:=tmoddivnode;
  606. cshlshrnode:=tshlshrnode;
  607. cunaryminusnode:=tunaryminusnode;
  608. cnotnode:=tnotnode;
  609. end.
  610. {
  611. $Log$
  612. Revision 1.29 2002-03-04 19:10:11 peter
  613. * removed compiler warnings
  614. Revision 1.28 2002/02/11 11:45:51 michael
  615. * Compilation without mmx support fixed from Peter
  616. Revision 1.27 2001/12/29 15:27:24 jonas
  617. * made 'mod powerof2' -> 'and' optimization processor independent
  618. Revision 1.26 2001/12/27 15:33:58 jonas
  619. * fixed fpuregister counting errors ("merged")
  620. Revision 1.25 2001/11/02 22:58:02 peter
  621. * procsym definition rewrite
  622. Revision 1.24 2001/10/12 13:51:51 jonas
  623. * fixed internalerror(10) due to previous fpu overflow fixes ("merged")
  624. * fixed bug in n386add (introduced after compilerproc changes for string
  625. operations) where calcregisters wasn't called for shortstring addnodes
  626. * NOTE: from now on, the location of a binary node must now always be set
  627. before you call calcregisters() for it
  628. Revision 1.23 2001/09/05 15:22:09 jonas
  629. * made multiplying, dividing and mod'ing of int64 and qword processor
  630. independent with compilerprocs (+ small optimizations by using shift/and
  631. where possible)
  632. Revision 1.22 2001/09/02 21:12:07 peter
  633. * move class of definitions into type section for delphi
  634. Revision 1.21 2001/08/26 13:36:41 florian
  635. * some cg reorganisation
  636. * some PPC updates
  637. Revision 1.20 2001/04/13 01:22:10 peter
  638. * symtable change to classes
  639. * range check generation and errors fixed, make cycle DEBUG=1 works
  640. * memory leaks fixed
  641. Revision 1.19 2001/04/05 21:00:27 peter
  642. * fix constant not evaluation
  643. Revision 1.18 2001/04/04 22:42:40 peter
  644. * move constant folding into det_resulttype
  645. Revision 1.17 2001/04/02 21:20:31 peter
  646. * resulttype rewrite
  647. Revision 1.16 2001/03/20 18:11:03 jonas
  648. * not (cardinal) now has cardinal instead of longint result (bug reported
  649. in mailinglist) ("merged")
  650. Revision 1.15 2001/03/04 10:38:55 jonas
  651. * fixed 'qword mod/div pos_const' to have qword result
  652. Revision 1.14 2001/02/20 21:48:17 peter
  653. * remove nasm hack
  654. Revision 1.13 2001/01/06 18:28:39 peter
  655. * fixed wrong notes about locals
  656. Revision 1.12 2001/01/05 17:36:57 florian
  657. * the info about exception frames is stored now on the stack
  658. instead on the heap
  659. Revision 1.11 2000/12/25 00:07:26 peter
  660. + new tlinkedlist class (merge of old tstringqueue,tcontainer and
  661. tlinkedlist objects)
  662. Revision 1.10 2000/12/16 15:54:01 jonas
  663. * 'resulttype.def of cardinal shl/shr x' is cardinal instead of longint
  664. Revision 1.9 2000/11/29 00:30:34 florian
  665. * unused units removed from uses clause
  666. * some changes for widestrings
  667. Revision 1.8 2000/10/31 22:02:49 peter
  668. * symtable splitted, no real code changes
  669. Revision 1.7 2000/10/01 19:48:24 peter
  670. * lot of compile updates for cg11
  671. Revision 1.6 2000/09/27 21:33:22 florian
  672. * finally nadd.pas compiles
  673. Revision 1.5 2000/09/27 20:25:44 florian
  674. * more stuff fixed
  675. Revision 1.4 2000/09/24 15:06:19 peter
  676. * use defines.inc
  677. Revision 1.3 2000/09/22 22:48:54 florian
  678. * some fixes
  679. Revision 1.2 2000/09/22 22:09:54 florian
  680. * more stuff converted
  681. Revision 1.1 2000/09/20 21:35:12 florian
  682. * initial revision
  683. }