nadd.pas 83 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. Type checking and register allocation for add 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 nadd;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. node;
  23. type
  24. taddnode = class(tbinopnode)
  25. constructor create(tt : tnodetype;l,r : tnode);override;
  26. function pass_1 : tnode;override;
  27. function det_resulttype:tnode;override;
  28. {$ifdef state_tracking}
  29. function track_state_pass(exec_known:boolean):boolean;override;
  30. {$endif}
  31. protected
  32. { override the following if you want to implement }
  33. { parts explicitely in the code generator (JM) }
  34. function first_addstring: tnode; virtual;
  35. function first_addset: tnode; virtual;
  36. { only implements "muln" nodes, the rest always has to be done in }
  37. { the code generator for performance reasons (JM) }
  38. function first_add64bitint: tnode; virtual;
  39. {$ifdef cpufpemu}
  40. { This routine calls internal runtime library helpers
  41. for all floating point arithmetic in the case
  42. where the emulation switches is on. Otherwise
  43. returns nil, and everything must be done in
  44. the code generation phase.
  45. }
  46. function first_addfloat : tnode; virtual;
  47. {$endif cpufpemu}
  48. end;
  49. taddnodeclass = class of taddnode;
  50. var
  51. { caddnode is used to create nodes of the add type }
  52. { the virtual constructor allows to assign }
  53. { another class type to caddnode => processor }
  54. { specific node types can be created }
  55. caddnode : taddnodeclass;
  56. implementation
  57. uses
  58. globtype,systems,
  59. cutils,verbose,globals,widestr,
  60. symconst,symtype,symdef,symsym,symtable,defutil,defcmp,
  61. cginfo,cgbase,
  62. htypechk,pass_1,
  63. nbas,nmat,ncnv,ncon,nset,nopt,ncal,ninl,
  64. {$ifdef state_tracking}
  65. nstate,
  66. {$endif}
  67. cpubase,cpuinfo;
  68. {*****************************************************************************
  69. TADDNODE
  70. *****************************************************************************}
  71. {$ifdef fpc}
  72. {$maxfpuregisters 0}
  73. {$endif fpc}
  74. constructor taddnode.create(tt : tnodetype;l,r : tnode);
  75. begin
  76. inherited create(tt,l,r);
  77. end;
  78. function taddnode.det_resulttype:tnode;
  79. var
  80. hp,t : tnode;
  81. lt,rt : tnodetype;
  82. rd,ld : tdef;
  83. htype : ttype;
  84. ot : tnodetype;
  85. concatstrings : boolean;
  86. resultset : Tconstset;
  87. i : longint;
  88. b : boolean;
  89. s1,s2 : pchar;
  90. ws1,ws2 : pcompilerwidestring;
  91. l1,l2 : longint;
  92. rv,lv : tconstexprint;
  93. rvd,lvd : bestreal;
  94. resultrealtype : ttype;
  95. {$ifdef state_tracking}
  96. factval : Tnode;
  97. change : boolean;
  98. {$endif}
  99. begin
  100. result:=nil;
  101. { first do the two subtrees }
  102. resulttypepass(left);
  103. resulttypepass(right);
  104. { both left and right need to be valid }
  105. set_varstate(left,true);
  106. set_varstate(right,true);
  107. if codegenerror then
  108. exit;
  109. { convert array constructors to sets, because there is no other operator
  110. possible for array constructors }
  111. if is_array_constructor(left.resulttype.def) then
  112. begin
  113. arrayconstructor_to_set(left);
  114. resulttypepass(left);
  115. end;
  116. if is_array_constructor(right.resulttype.def) then
  117. begin
  118. arrayconstructor_to_set(right);
  119. resulttypepass(right);
  120. end;
  121. { allow operator overloading }
  122. hp:=self;
  123. if isbinaryoverloaded(hp) then
  124. begin
  125. result:=hp;
  126. exit;
  127. end;
  128. { Stop checking when an error was found in the operator checking }
  129. if codegenerror then
  130. begin
  131. result:=cerrornode.create;
  132. exit;
  133. end;
  134. { Kylix allows enum+ordconstn in an enum declaration (blocktype
  135. is bt_type), we need to do the conversion here before the
  136. constant folding }
  137. if (m_delphi in aktmodeswitches) and
  138. (blocktype=bt_type) then
  139. begin
  140. if (left.resulttype.def.deftype=enumdef) and
  141. (right.resulttype.def.deftype=orddef) then
  142. begin
  143. { insert explicit typecast to s32bit }
  144. left:=ctypeconvnode.create_explicit(left,s32bittype);
  145. resulttypepass(left);
  146. end
  147. else
  148. if (left.resulttype.def.deftype=orddef) and
  149. (right.resulttype.def.deftype=enumdef) then
  150. begin
  151. { insert explicit typecast to s32bit }
  152. right:=ctypeconvnode.create_explicit(right,s32bittype);
  153. resulttypepass(right);
  154. end;
  155. end;
  156. { is one a real float, then both need to be floats, this
  157. need to be done before the constant folding so constant
  158. operation on a float and int are also handled }
  159. resultrealtype:=pbestrealtype^;
  160. if (right.resulttype.def.deftype=floatdef) or (left.resulttype.def.deftype=floatdef) then
  161. begin
  162. { when both floattypes are already equal then use that
  163. floattype for results }
  164. if (right.resulttype.def.deftype=floatdef) and
  165. (left.resulttype.def.deftype=floatdef) and
  166. (tfloatdef(left.resulttype.def).typ=tfloatdef(right.resulttype.def).typ) then
  167. resultrealtype:=left.resulttype
  168. { when there is a currency type then use currency, but
  169. only when currency is defined as float }
  170. else
  171. if (s64currencytype.def.deftype=floatdef) and
  172. (is_currency(right.resulttype.def) or
  173. is_currency(left.resulttype.def)) then
  174. begin
  175. resultrealtype:=s64currencytype;
  176. inserttypeconv(right,resultrealtype);
  177. inserttypeconv(left,resultrealtype);
  178. end
  179. else
  180. begin
  181. inserttypeconv(right,resultrealtype);
  182. inserttypeconv(left,resultrealtype);
  183. end;
  184. end;
  185. { if one operand is a widechar or a widestring, both operands }
  186. { are converted to widestring. This must be done before constant }
  187. { folding to allow char+widechar etc. }
  188. if is_widestring(right.resulttype.def) or
  189. is_widestring(left.resulttype.def) or
  190. is_widechar(right.resulttype.def) or
  191. is_widechar(left.resulttype.def) then
  192. begin
  193. inserttypeconv(right,cwidestringtype);
  194. inserttypeconv(left,cwidestringtype);
  195. end;
  196. { load easier access variables }
  197. rd:=right.resulttype.def;
  198. ld:=left.resulttype.def;
  199. rt:=right.nodetype;
  200. lt:=left.nodetype;
  201. if (nodetype = slashn) and
  202. (((rt = ordconstn) and
  203. (tordconstnode(right).value = 0)) or
  204. ((rt = realconstn) and
  205. (trealconstnode(right).value_real = 0.0))) then
  206. begin
  207. Message(parser_e_division_by_zero);
  208. case rt of
  209. ordconstn:
  210. tordconstnode(right).value := 1;
  211. realconstn:
  212. trealconstnode(right).value_real := 1.0;
  213. end;
  214. end;
  215. { both are int constants }
  216. if ((is_constintnode(left) and is_constintnode(right)) or
  217. (is_constboolnode(left) and is_constboolnode(right) and
  218. (nodetype in [slashn,ltn,lten,gtn,gten,equaln,unequaln,andn,xorn,orn])) or
  219. (is_constenumnode(left) and is_constenumnode(right) and
  220. (nodetype in [equaln,unequaln,ltn,lten,gtn,gten]))) or
  221. { support pointer arithmetics on constants (JM) }
  222. ((lt = pointerconstn) and is_constintnode(right) and
  223. (nodetype in [addn,subn])) or
  224. (((lt = pointerconstn) or (lt = niln)) and
  225. ((rt = pointerconstn) or (rt = niln)) and
  226. (nodetype in [ltn,lten,gtn,gten,equaln,unequaln,subn])) then
  227. begin
  228. { when comparing/substracting pointers, make sure they are }
  229. { of the same type (JM) }
  230. if (lt = pointerconstn) and (rt = pointerconstn) then
  231. begin
  232. if not(cs_extsyntax in aktmoduleswitches) and
  233. not(nodetype in [equaln,unequaln]) then
  234. CGMessage(type_e_mismatch)
  235. else
  236. if (nodetype <> subn) and
  237. is_voidpointer(rd) then
  238. inserttypeconv(right,left.resulttype)
  239. else if (nodetype <> subn) and
  240. is_voidpointer(ld) then
  241. inserttypeconv(left,right.resulttype)
  242. else if not(equal_defs(ld,rd)) then
  243. CGMessage2(type_e_incompatible_types,ld.typename,rd.typename);
  244. end
  245. else if (ld.deftype=enumdef) and (rd.deftype=enumdef) then
  246. begin
  247. if not(equal_defs(ld,rd)) then
  248. inserttypeconv(right,left.resulttype);
  249. end
  250. else if (lt=ordconstn) and (rt=ordconstn) then
  251. begin
  252. { make left const type the biggest (u32bit is bigger than
  253. s32bit for or,and,xor) }
  254. if (rd.size>ld.size) or
  255. ((torddef(rd).typ=u32bit) and
  256. (torddef(ld).typ=s32bit) and
  257. (nodetype in [orn,andn,xorn])) then
  258. inserttypeconv(left,right.resulttype);
  259. end;
  260. { load values }
  261. case lt of
  262. ordconstn:
  263. lv:=tordconstnode(left).value;
  264. pointerconstn:
  265. lv:=tpointerconstnode(left).value;
  266. niln:
  267. lv:=0;
  268. else
  269. internalerror(2002080202);
  270. end;
  271. case rt of
  272. ordconstn:
  273. rv:=tordconstnode(right).value;
  274. pointerconstn:
  275. rv:=tpointerconstnode(right).value;
  276. niln:
  277. rv:=0;
  278. else
  279. internalerror(2002080203);
  280. end;
  281. if (lt = pointerconstn) and
  282. (rt <> pointerconstn) then
  283. rv := rv * tpointerdef(left.resulttype.def).pointertype.def.size;
  284. if (rt = pointerconstn) and
  285. (lt <> pointerconstn) then
  286. lv := lv * tpointerdef(right.resulttype.def).pointertype.def.size;
  287. case nodetype of
  288. addn :
  289. if (lt <> pointerconstn) then
  290. t := genintconstnode(lv+rv)
  291. else
  292. t := cpointerconstnode.create(lv+rv,left.resulttype);
  293. subn :
  294. if (lt <> pointerconstn) or (rt = pointerconstn) then
  295. t := genintconstnode(lv-rv)
  296. else
  297. t := cpointerconstnode.create(lv-rv,left.resulttype);
  298. muln :
  299. t:=genintconstnode(lv*rv);
  300. xorn :
  301. t:=cordconstnode.create(lv xor rv,left.resulttype,true);
  302. orn :
  303. t:=cordconstnode.create(lv or rv,left.resulttype,true);
  304. andn :
  305. t:=cordconstnode.create(lv and rv,left.resulttype,true);
  306. ltn :
  307. t:=cordconstnode.create(ord(lv<rv),booltype,true);
  308. lten :
  309. t:=cordconstnode.create(ord(lv<=rv),booltype,true);
  310. gtn :
  311. t:=cordconstnode.create(ord(lv>rv),booltype,true);
  312. gten :
  313. t:=cordconstnode.create(ord(lv>=rv),booltype,true);
  314. equaln :
  315. t:=cordconstnode.create(ord(lv=rv),booltype,true);
  316. unequaln :
  317. t:=cordconstnode.create(ord(lv<>rv),booltype,true);
  318. slashn :
  319. begin
  320. { int/int becomes a real }
  321. rvd:=rv;
  322. lvd:=lv;
  323. t:=crealconstnode.create(lvd/rvd,resultrealtype);
  324. end;
  325. else
  326. begin
  327. CGMessage(type_e_mismatch);
  328. t:=cnothingnode.create;
  329. end;
  330. end;
  331. result:=t;
  332. exit;
  333. end;
  334. { both real constants ? }
  335. if (lt=realconstn) and (rt=realconstn) then
  336. begin
  337. lvd:=trealconstnode(left).value_real;
  338. rvd:=trealconstnode(right).value_real;
  339. case nodetype of
  340. addn :
  341. t:=crealconstnode.create(lvd+rvd,resultrealtype);
  342. subn :
  343. t:=crealconstnode.create(lvd-rvd,resultrealtype);
  344. muln :
  345. t:=crealconstnode.create(lvd*rvd,resultrealtype);
  346. starstarn,
  347. caretn :
  348. begin
  349. if lvd<0 then
  350. begin
  351. Message(parser_e_invalid_float_operation);
  352. t:=crealconstnode.create(0,resultrealtype);
  353. end
  354. else if lvd=0 then
  355. t:=crealconstnode.create(1.0,resultrealtype)
  356. else
  357. t:=crealconstnode.create(exp(ln(lvd)*rvd),resultrealtype);
  358. end;
  359. slashn :
  360. t:=crealconstnode.create(lvd/rvd,resultrealtype);
  361. ltn :
  362. t:=cordconstnode.create(ord(lvd<rvd),booltype,true);
  363. lten :
  364. t:=cordconstnode.create(ord(lvd<=rvd),booltype,true);
  365. gtn :
  366. t:=cordconstnode.create(ord(lvd>rvd),booltype,true);
  367. gten :
  368. t:=cordconstnode.create(ord(lvd>=rvd),booltype,true);
  369. equaln :
  370. t:=cordconstnode.create(ord(lvd=rvd),booltype,true);
  371. unequaln :
  372. t:=cordconstnode.create(ord(lvd<>rvd),booltype,true);
  373. else
  374. begin
  375. CGMessage(type_e_mismatch);
  376. t:=cnothingnode.create;
  377. end;
  378. end;
  379. result:=t;
  380. exit;
  381. end;
  382. { first, we handle widestrings, so we can check later for }
  383. { stringconstn only }
  384. { widechars are converted above to widestrings too }
  385. { this isn't veryy efficient, but I don't think }
  386. { that it does matter that much (FK) }
  387. if (lt=stringconstn) and (rt=stringconstn) and
  388. (tstringconstnode(left).st_type=st_widestring) and
  389. (tstringconstnode(right).st_type=st_widestring) then
  390. begin
  391. initwidestring(ws1);
  392. initwidestring(ws2);
  393. copywidestring(pcompilerwidestring(tstringconstnode(left).value_str),ws1);
  394. copywidestring(pcompilerwidestring(tstringconstnode(right).value_str),ws2);
  395. case nodetype of
  396. addn :
  397. begin
  398. concatwidestrings(ws1,ws2);
  399. t:=cstringconstnode.createwstr(ws1);
  400. end;
  401. ltn :
  402. t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<0),booltype,true);
  403. lten :
  404. t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<=0),booltype,true);
  405. gtn :
  406. t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>0),booltype,true);
  407. gten :
  408. t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>=0),booltype,true);
  409. equaln :
  410. t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)=0),booltype,true);
  411. unequaln :
  412. t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<>0),booltype,true);
  413. else
  414. begin
  415. CGMessage(type_e_mismatch);
  416. t:=cnothingnode.create;
  417. end;
  418. end;
  419. donewidestring(ws1);
  420. donewidestring(ws2);
  421. result:=t;
  422. exit;
  423. end;
  424. { concating strings ? }
  425. concatstrings:=false;
  426. s1:=nil;
  427. s2:=nil;
  428. if (lt=ordconstn) and (rt=ordconstn) and
  429. is_char(ld) and is_char(rd) then
  430. begin
  431. s1:=strpnew(char(byte(tordconstnode(left).value)));
  432. s2:=strpnew(char(byte(tordconstnode(right).value)));
  433. l1:=1;
  434. l2:=1;
  435. concatstrings:=true;
  436. end
  437. else
  438. if (lt=stringconstn) and (rt=ordconstn) and is_char(rd) then
  439. begin
  440. s1:=tstringconstnode(left).getpcharcopy;
  441. l1:=tstringconstnode(left).len;
  442. s2:=strpnew(char(byte(tordconstnode(right).value)));
  443. l2:=1;
  444. concatstrings:=true;
  445. end
  446. else
  447. if (lt=ordconstn) and (rt=stringconstn) and is_char(ld) then
  448. begin
  449. s1:=strpnew(char(byte(tordconstnode(left).value)));
  450. l1:=1;
  451. s2:=tstringconstnode(right).getpcharcopy;
  452. l2:=tstringconstnode(right).len;
  453. concatstrings:=true;
  454. end
  455. else if (lt=stringconstn) and (rt=stringconstn) then
  456. begin
  457. s1:=tstringconstnode(left).getpcharcopy;
  458. l1:=tstringconstnode(left).len;
  459. s2:=tstringconstnode(right).getpcharcopy;
  460. l2:=tstringconstnode(right).len;
  461. concatstrings:=true;
  462. end;
  463. if concatstrings then
  464. begin
  465. case nodetype of
  466. addn :
  467. t:=cstringconstnode.createpchar(concatansistrings(s1,s2,l1,l2),l1+l2);
  468. ltn :
  469. t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<0),booltype,true);
  470. lten :
  471. t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<=0),booltype,true);
  472. gtn :
  473. t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>0),booltype,true);
  474. gten :
  475. t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>=0),booltype,true);
  476. equaln :
  477. t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)=0),booltype,true);
  478. unequaln :
  479. t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<>0),booltype,true);
  480. end;
  481. ansistringdispose(s1,l1);
  482. ansistringdispose(s2,l2);
  483. result:=t;
  484. exit;
  485. end;
  486. { set constant evaluation }
  487. if (right.nodetype=setconstn) and
  488. not assigned(tsetconstnode(right).left) and
  489. (left.nodetype=setconstn) and
  490. not assigned(tsetconstnode(left).left) then
  491. begin
  492. { check if size adjusting is needed, only for left
  493. to right as the other way is checked in the typeconv }
  494. if (tsetdef(right.resulttype.def).settype=smallset) and
  495. (tsetdef(left.resulttype.def).settype<>smallset) then
  496. tsetdef(right.resulttype.def).changesettype(normset);
  497. { check base types }
  498. inserttypeconv(left,right.resulttype);
  499. if codegenerror then
  500. begin
  501. { recover by only returning the left part }
  502. result:=left;
  503. left:=nil;
  504. exit;
  505. end;
  506. {$ifdef oldset}
  507. case nodetype of
  508. addn :
  509. begin
  510. for i:=0 to 31 do
  511. resultset[i]:=tsetconstnode(right).value_set^[i] or tsetconstnode(left).value_set^[i];
  512. t:=csetconstnode.create(@resultset,left.resulttype);
  513. end;
  514. muln :
  515. begin
  516. for i:=0 to 31 do
  517. resultset[i]:=tsetconstnode(right).value_set^[i] and tsetconstnode(left).value_set^[i];
  518. t:=csetconstnode.create(@resultset,left.resulttype);
  519. end;
  520. subn :
  521. begin
  522. for i:=0 to 31 do
  523. resultset[i]:=tsetconstnode(left).value_set^[i] and not(tsetconstnode(right).value_set^[i]);
  524. t:=csetconstnode.create(@resultset,left.resulttype);
  525. end;
  526. symdifn :
  527. begin
  528. for i:=0 to 31 do
  529. resultset[i]:=tsetconstnode(left).value_set^[i] xor tsetconstnode(right).value_set^[i];
  530. t:=csetconstnode.create(@resultset,left.resulttype);
  531. end;
  532. unequaln :
  533. begin
  534. b:=true;
  535. for i:=0 to 31 do
  536. if tsetconstnode(right).value_set^[i]=tsetconstnode(left).value_set^[i] then
  537. begin
  538. b:=false;
  539. break;
  540. end;
  541. t:=cordconstnode.create(ord(b),booltype,true);
  542. end;
  543. equaln :
  544. begin
  545. b:=true;
  546. for i:=0 to 31 do
  547. if tsetconstnode(right).value_set^[i]<>tsetconstnode(left).value_set^[i] then
  548. begin
  549. b:=false;
  550. break;
  551. end;
  552. t:=cordconstnode.create(ord(b),booltype,true);
  553. end;
  554. lten :
  555. begin
  556. b := true;
  557. for i := 0 to 31 Do
  558. if (tsetconstnode(right).value_set^[i] And tsetconstnode(left).value_set^[i]) <>
  559. tsetconstnode(left).value_set^[i] Then
  560. begin
  561. b := false;
  562. break
  563. end;
  564. t := cordconstnode.create(ord(b),booltype,true);
  565. end;
  566. gten :
  567. begin
  568. b := true;
  569. for i := 0 to 31 Do
  570. If (tsetconstnode(left).value_set^[i] And tsetconstnode(right).value_set^[i]) <>
  571. tsetconstnode(right).value_set^[i] Then
  572. begin
  573. b := false;
  574. break
  575. end;
  576. t := cordconstnode.create(ord(b),booltype,true);
  577. end;
  578. end;
  579. {$else}
  580. case nodetype of
  581. addn :
  582. begin
  583. resultset:=tsetconstnode(right).value_set^ + tsetconstnode(left).value_set^;
  584. t:=csetconstnode.create(@resultset,left.resulttype);
  585. end;
  586. muln :
  587. begin
  588. resultset:=tsetconstnode(right).value_set^ * tsetconstnode(left).value_set^;
  589. t:=csetconstnode.create(@resultset,left.resulttype);
  590. end;
  591. subn :
  592. begin
  593. resultset:=tsetconstnode(left).value_set^ - tsetconstnode(right).value_set^;
  594. t:=csetconstnode.create(@resultset,left.resulttype);
  595. end;
  596. symdifn :
  597. begin
  598. resultset:=tsetconstnode(right).value_set^ >< tsetconstnode(left).value_set^;
  599. t:=csetconstnode.create(@resultset,left.resulttype);
  600. end;
  601. unequaln :
  602. begin
  603. b:=tsetconstnode(right).value_set^ <> tsetconstnode(left).value_set^;
  604. t:=cordconstnode.create(byte(b),booltype,true);
  605. end;
  606. equaln :
  607. begin
  608. b:=tsetconstnode(right).value_set^ = tsetconstnode(left).value_set^;
  609. t:=cordconstnode.create(byte(b),booltype,true);
  610. end;
  611. lten :
  612. begin
  613. b:=tsetconstnode(left).value_set^ <= tsetconstnode(right).value_set^;
  614. t:=cordconstnode.create(byte(b),booltype,true);
  615. end;
  616. gten :
  617. begin
  618. b:=tsetconstnode(left).value_set^ >= tsetconstnode(right).value_set^;
  619. t:=cordconstnode.create(byte(b),booltype,true);
  620. end;
  621. end;
  622. {$endif}
  623. result:=t;
  624. exit;
  625. end;
  626. { but an int/int gives real/real! }
  627. if nodetype=slashn then
  628. begin
  629. if (left.resulttype.def.deftype <> floatdef) and
  630. (right.resulttype.def.deftype <> floatdef) then
  631. CGMessage(type_h_use_div_for_int);
  632. inserttypeconv(right,resultrealtype);
  633. inserttypeconv(left,resultrealtype);
  634. end
  635. { if both are orddefs then check sub types }
  636. else if (ld.deftype=orddef) and (rd.deftype=orddef) then
  637. begin
  638. { optimize multiplacation by a power of 2 }
  639. if not(cs_check_overflow in aktlocalswitches) and
  640. (nodetype = muln) and
  641. (((left.nodetype = ordconstn) and
  642. ispowerof2(tordconstnode(left).value,i)) or
  643. ((right.nodetype = ordconstn) and
  644. ispowerof2(tordconstnode(right).value,i))) then
  645. begin
  646. if left.nodetype = ordconstn then
  647. begin
  648. tordconstnode(left).value := i;
  649. result := cshlshrnode.create(shln,right,left);
  650. end
  651. else
  652. begin
  653. tordconstnode(right).value := i;
  654. result := cshlshrnode.create(shln,left,right);
  655. end;
  656. left := nil;
  657. right := nil;
  658. exit;
  659. end;
  660. { 2 booleans? Make them equal to the largest boolean }
  661. if is_boolean(ld) and is_boolean(rd) then
  662. begin
  663. if torddef(left.resulttype.def).size>torddef(right.resulttype.def).size then
  664. begin
  665. right:=ctypeconvnode.create_explicit(right,left.resulttype);
  666. ttypeconvnode(right).convtype:=tc_bool_2_int;
  667. resulttypepass(right);
  668. end
  669. else if torddef(left.resulttype.def).size<torddef(right.resulttype.def).size then
  670. begin
  671. left:=ctypeconvnode.create_explicit(left,right.resulttype);
  672. ttypeconvnode(left).convtype:=tc_bool_2_int;
  673. resulttypepass(left);
  674. end;
  675. case nodetype of
  676. xorn,
  677. ltn,
  678. lten,
  679. gtn,
  680. gten,
  681. andn,
  682. orn:
  683. begin
  684. end;
  685. unequaln,
  686. equaln:
  687. begin
  688. if not(cs_full_boolean_eval in aktlocalswitches) then
  689. begin
  690. { Remove any compares with constants }
  691. if (left.nodetype=ordconstn) then
  692. begin
  693. hp:=right;
  694. b:=(tordconstnode(left).value<>0);
  695. ot:=nodetype;
  696. left.free;
  697. left:=nil;
  698. right:=nil;
  699. if (not(b) and (ot=equaln)) or
  700. (b and (ot=unequaln)) then
  701. begin
  702. hp:=cnotnode.create(hp);
  703. end;
  704. result:=hp;
  705. exit;
  706. end;
  707. if (right.nodetype=ordconstn) then
  708. begin
  709. hp:=left;
  710. b:=(tordconstnode(right).value<>0);
  711. ot:=nodetype;
  712. right.free;
  713. right:=nil;
  714. left:=nil;
  715. if (not(b) and (ot=equaln)) or
  716. (b and (ot=unequaln)) then
  717. begin
  718. hp:=cnotnode.create(hp);
  719. end;
  720. result:=hp;
  721. exit;
  722. end;
  723. end;
  724. end;
  725. else
  726. CGMessage(type_e_mismatch);
  727. end;
  728. end
  729. { Both are chars? }
  730. else if is_char(rd) and is_char(ld) then
  731. begin
  732. if nodetype=addn then
  733. begin
  734. resulttype:=cshortstringtype;
  735. if not(is_constcharnode(left) and is_constcharnode(right)) then
  736. begin
  737. inserttypeconv(left,cshortstringtype);
  738. hp := genaddsstringcharoptnode(self);
  739. result := hp;
  740. exit;
  741. end;
  742. end;
  743. end
  744. { is there a currency type ? }
  745. else if ((torddef(rd).typ=scurrency) or (torddef(ld).typ=scurrency)) then
  746. begin
  747. if (torddef(ld).typ<>scurrency) then
  748. inserttypeconv(left,s64currencytype);
  749. if (torddef(rd).typ<>scurrency) then
  750. inserttypeconv(right,s64currencytype);
  751. end
  752. { is there a signed 64 bit type ? }
  753. else if ((torddef(rd).typ=s64bit) or (torddef(ld).typ=s64bit)) then
  754. begin
  755. if (torddef(ld).typ<>s64bit) then
  756. inserttypeconv(left,cs64bittype);
  757. if (torddef(rd).typ<>s64bit) then
  758. inserttypeconv(right,cs64bittype);
  759. end
  760. { is there a unsigned 64 bit type ? }
  761. else if ((torddef(rd).typ=u64bit) or (torddef(ld).typ=u64bit)) then
  762. begin
  763. if (torddef(ld).typ<>u64bit) then
  764. inserttypeconv(left,cu64bittype);
  765. if (torddef(rd).typ<>u64bit) then
  766. inserttypeconv(right,cu64bittype);
  767. end
  768. { is there a cardinal? }
  769. else if ((torddef(rd).typ=u32bit) or (torddef(ld).typ=u32bit)) then
  770. begin
  771. if is_signed(ld) and
  772. { then rd = u32bit }
  773. { convert positive constants to u32bit }
  774. not(is_constintnode(left) and
  775. (tordconstnode(left).value >= 0)) and
  776. { range/overflow checking on mixed signed/cardinal expressions }
  777. { is only possible if you convert everything to 64bit (JM) }
  778. ((aktlocalswitches * [cs_check_overflow,cs_check_range] <> []) and
  779. (nodetype in [addn,subn,muln])) then
  780. begin
  781. { perform the operation in 64bit }
  782. CGMessage(type_w_mixed_signed_unsigned);
  783. inserttypeconv(left,cs64bittype);
  784. inserttypeconv(right,cs64bittype);
  785. end
  786. else
  787. begin
  788. { and,or,xor work on bit patterns and don't care
  789. about the sign }
  790. if nodetype in [andn,orn,xorn] then
  791. inserttypeconv_explicit(left,u32bittype)
  792. else
  793. begin
  794. if is_signed(ld) and
  795. not(is_constintnode(left) and
  796. (tordconstnode(left).value >= 0)) and
  797. (cs_check_range in aktlocalswitches) then
  798. CGMessage(type_w_mixed_signed_unsigned2);
  799. inserttypeconv(left,u32bittype);
  800. end;
  801. if is_signed(rd) and
  802. { then ld = u32bit }
  803. { convert positive constants to u32bit }
  804. not(is_constintnode(right) and
  805. (tordconstnode(right).value >= 0)) and
  806. ((aktlocalswitches * [cs_check_overflow,cs_check_range] <> []) and
  807. (nodetype in [addn,subn,muln])) then
  808. begin
  809. { perform the operation in 64bit }
  810. CGMessage(type_w_mixed_signed_unsigned);
  811. inserttypeconv(left,cs64bittype);
  812. inserttypeconv(right,cs64bittype);
  813. end
  814. else
  815. begin
  816. { and,or,xor work on bit patterns and don't care
  817. about the sign }
  818. if nodetype in [andn,orn,xorn] then
  819. inserttypeconv_explicit(left,u32bittype)
  820. else
  821. begin
  822. if is_signed(rd) and
  823. not(is_constintnode(right) and
  824. (tordconstnode(right).value >= 0)) and
  825. (cs_check_range in aktlocalswitches) then
  826. CGMessage(type_w_mixed_signed_unsigned2);
  827. inserttypeconv(right,u32bittype);
  828. end;
  829. end;
  830. end;
  831. end
  832. { generic ord conversion is s32bit }
  833. else
  834. begin
  835. { if the left or right value is smaller than the normal
  836. type s32bittype and is unsigned, and the other value
  837. is a constant < 0, the result will always be false/true
  838. for equal / unequal nodes.
  839. }
  840. if (
  841. { left : unsigned ordinal var, right : < 0 constant }
  842. (
  843. ((is_signed(ld)=false) and (is_constintnode(left) =false)) and
  844. ((is_constintnode(right)) and (tordconstnode(right).value < 0))
  845. ) or
  846. { right : unsigned ordinal var, left : < 0 constant }
  847. (
  848. ((is_signed(rd)=false) and (is_constintnode(right) =false)) and
  849. ((is_constintnode(left)) and (tordconstnode(left).value < 0))
  850. )
  851. ) then
  852. begin
  853. if nodetype = equaln then
  854. CGMessage(type_w_signed_unsigned_always_false)
  855. else
  856. if nodetype = unequaln then
  857. CGMessage(type_w_signed_unsigned_always_true)
  858. else
  859. if (is_constintnode(left) and (nodetype in [ltn,lten])) or
  860. (is_constintnode(right) and (nodetype in [gtn,gten])) then
  861. CGMessage(type_w_signed_unsigned_always_true)
  862. else
  863. if (is_constintnode(right) and (nodetype in [ltn,lten])) or
  864. (is_constintnode(left) and (nodetype in [gtn,gten])) then
  865. CGMessage(type_w_signed_unsigned_always_false);
  866. end;
  867. inserttypeconv(right,s32bittype);
  868. inserttypeconv(left,s32bittype);
  869. end;
  870. end
  871. { if both are floatdefs, conversion is already done before constant folding }
  872. else if (ld.deftype=floatdef) then
  873. begin
  874. { already converted }
  875. end
  876. { left side a setdef, must be before string processing,
  877. else array constructor can be seen as array of char (PFV) }
  878. else if (ld.deftype=setdef) then
  879. begin
  880. { trying to add a set element? }
  881. if (nodetype=addn) and (rd.deftype<>setdef) then
  882. begin
  883. if (rt=setelementn) then
  884. begin
  885. if not(equal_defs(tsetdef(ld).elementtype.def,rd)) then
  886. CGMessage(type_e_set_element_are_not_comp);
  887. end
  888. else
  889. CGMessage(type_e_mismatch)
  890. end
  891. else
  892. begin
  893. if not(nodetype in [addn,subn,symdifn,muln,equaln,unequaln,lten,gten]) then
  894. CGMessage(type_e_set_operation_unknown);
  895. { right def must be a also be set }
  896. if (rd.deftype<>setdef) or not(equal_defs(rd,ld)) then
  897. CGMessage(type_e_set_element_are_not_comp);
  898. end;
  899. { ranges require normsets }
  900. if (tsetdef(ld).settype=smallset) and
  901. (rt=setelementn) and
  902. assigned(tsetelementnode(right).right) then
  903. begin
  904. { generate a temporary normset def, it'll be destroyed
  905. when the symtable is unloaded }
  906. htype.setdef(tsetdef.create(tsetdef(ld).elementtype,255));
  907. inserttypeconv(left,htype);
  908. end;
  909. { if the right side is also a setdef then the settype must
  910. be the same as the left setdef }
  911. if (rd.deftype=setdef) and
  912. (tsetdef(ld).settype<>tsetdef(rd).settype) then
  913. begin
  914. { when right is a normset we need to typecast both
  915. to normsets }
  916. if (tsetdef(rd).settype=normset) then
  917. inserttypeconv(left,right.resulttype)
  918. else
  919. inserttypeconv(right,left.resulttype);
  920. end;
  921. end
  922. { compare pchar to char arrays by addresses like BP/Delphi }
  923. else if ((is_pchar(ld) or (lt=niln)) and is_chararray(rd)) or
  924. ((is_pchar(rd) or (rt=niln)) and is_chararray(ld)) then
  925. begin
  926. if is_chararray(rd) then
  927. inserttypeconv(right,charpointertype)
  928. else
  929. inserttypeconv(left,charpointertype);
  930. end
  931. { pointer comparision and subtraction }
  932. else if (rd.deftype=pointerdef) and (ld.deftype=pointerdef) then
  933. begin
  934. case nodetype of
  935. equaln,unequaln :
  936. begin
  937. if is_voidpointer(right.resulttype.def) then
  938. inserttypeconv(right,left.resulttype)
  939. else if is_voidpointer(left.resulttype.def) then
  940. inserttypeconv(left,right.resulttype)
  941. else if not(equal_defs(ld,rd)) then
  942. CGMessage2(type_e_incompatible_types,ld.typename,rd.typename);
  943. end;
  944. ltn,lten,gtn,gten:
  945. begin
  946. if (cs_extsyntax in aktmoduleswitches) then
  947. begin
  948. if is_voidpointer(right.resulttype.def) then
  949. inserttypeconv(right,left.resulttype)
  950. else if is_voidpointer(left.resulttype.def) then
  951. inserttypeconv(left,right.resulttype)
  952. else if not(equal_defs(ld,rd)) then
  953. CGMessage2(type_e_incompatible_types,ld.typename,rd.typename);
  954. end
  955. else
  956. CGMessage(type_e_mismatch);
  957. end;
  958. subn:
  959. begin
  960. if (cs_extsyntax in aktmoduleswitches) then
  961. begin
  962. if is_voidpointer(right.resulttype.def) then
  963. inserttypeconv(right,left.resulttype)
  964. else if is_voidpointer(left.resulttype.def) then
  965. inserttypeconv(left,right.resulttype)
  966. else if not(equal_defs(ld,rd)) then
  967. CGMessage2(type_e_incompatible_types,ld.typename,rd.typename);
  968. end
  969. else
  970. CGMessage(type_e_mismatch);
  971. resulttype:=s32bittype;
  972. exit;
  973. end;
  974. addn:
  975. begin
  976. if (cs_extsyntax in aktmoduleswitches) then
  977. begin
  978. if is_voidpointer(right.resulttype.def) then
  979. inserttypeconv(right,left.resulttype)
  980. else if is_voidpointer(left.resulttype.def) then
  981. inserttypeconv(left,right.resulttype)
  982. else if not(equal_defs(ld,rd)) then
  983. CGMessage2(type_e_incompatible_types,ld.typename,rd.typename);
  984. end
  985. else
  986. CGMessage(type_e_mismatch);
  987. resulttype:=s32bittype;
  988. exit;
  989. end;
  990. else
  991. CGMessage(type_e_mismatch);
  992. end;
  993. end
  994. { is one of the operands a string?,
  995. chararrays are also handled as strings (after conversion), also take
  996. care of chararray+chararray and chararray+char.
  997. Note: Must be done after pointerdef+pointerdef has been checked, else
  998. pchar is converted to string }
  999. else if (rd.deftype=stringdef) or (ld.deftype=stringdef) or
  1000. ((is_pchar(rd) or is_chararray(rd) or is_char(rd)) and
  1001. (is_pchar(ld) or is_chararray(ld) or is_char(ld))) then
  1002. begin
  1003. if is_widestring(rd) or is_widestring(ld) then
  1004. begin
  1005. if not(is_widestring(rd)) then
  1006. inserttypeconv(right,cwidestringtype);
  1007. if not(is_widestring(ld)) then
  1008. inserttypeconv(left,cwidestringtype);
  1009. end
  1010. else if is_ansistring(rd) or is_ansistring(ld) then
  1011. begin
  1012. if not(is_ansistring(rd)) then
  1013. inserttypeconv(right,cansistringtype);
  1014. if not(is_ansistring(ld)) then
  1015. inserttypeconv(left,cansistringtype);
  1016. end
  1017. else if is_longstring(rd) or is_longstring(ld) then
  1018. begin
  1019. if not(is_longstring(rd)) then
  1020. inserttypeconv(right,clongstringtype);
  1021. if not(is_longstring(ld)) then
  1022. inserttypeconv(left,clongstringtype);
  1023. end
  1024. else
  1025. begin
  1026. if not(is_shortstring(ld)) then
  1027. inserttypeconv(left,cshortstringtype);
  1028. { don't convert char, that can be handled by the optimized node }
  1029. if not(is_shortstring(rd) or is_char(rd)) then
  1030. inserttypeconv(right,cshortstringtype);
  1031. end;
  1032. end
  1033. { class or interface equation }
  1034. else if is_class_or_interface(rd) or is_class_or_interface(ld) then
  1035. begin
  1036. if is_class_or_interface(rd) and is_class_or_interface(ld) then
  1037. begin
  1038. if tobjectdef(rd).is_related(tobjectdef(ld)) then
  1039. inserttypeconv(right,left.resulttype)
  1040. else
  1041. inserttypeconv(left,right.resulttype);
  1042. end
  1043. else if is_class_or_interface(rd) then
  1044. inserttypeconv(left,right.resulttype)
  1045. else
  1046. inserttypeconv(right,left.resulttype);
  1047. if not(nodetype in [equaln,unequaln]) then
  1048. CGMessage(type_e_mismatch);
  1049. end
  1050. else if (rd.deftype=classrefdef) and (ld.deftype=classrefdef) then
  1051. begin
  1052. if tobjectdef(tclassrefdef(rd).pointertype.def).is_related(
  1053. tobjectdef(tclassrefdef(ld).pointertype.def)) then
  1054. inserttypeconv(right,left.resulttype)
  1055. else
  1056. inserttypeconv(left,right.resulttype);
  1057. if not(nodetype in [equaln,unequaln]) then
  1058. CGMessage(type_e_mismatch);
  1059. end
  1060. { allows comperasion with nil pointer }
  1061. else if is_class_or_interface(rd) or (rd.deftype=classrefdef) then
  1062. begin
  1063. inserttypeconv(left,right.resulttype);
  1064. if not(nodetype in [equaln,unequaln]) then
  1065. CGMessage(type_e_mismatch);
  1066. end
  1067. else if is_class_or_interface(ld) or (ld.deftype=classrefdef) then
  1068. begin
  1069. inserttypeconv(right,left.resulttype);
  1070. if not(nodetype in [equaln,unequaln]) then
  1071. CGMessage(type_e_mismatch);
  1072. end
  1073. { support procvar=nil,procvar<>nil }
  1074. else if ((ld.deftype=procvardef) and (rt=niln)) or
  1075. ((rd.deftype=procvardef) and (lt=niln)) then
  1076. begin
  1077. if not(nodetype in [equaln,unequaln]) then
  1078. CGMessage(type_e_mismatch);
  1079. end
  1080. { support dynamicarray=nil,dynamicarray<>nil }
  1081. else if (is_dynamic_array(ld) and (rt=niln)) or
  1082. (is_dynamic_array(rd) and (lt=niln)) then
  1083. begin
  1084. if not(nodetype in [equaln,unequaln]) then
  1085. CGMessage(type_e_mismatch);
  1086. end
  1087. {$ifdef SUPPORT_MMX}
  1088. { mmx support, this must be before the zero based array
  1089. check }
  1090. else if (cs_mmx in aktlocalswitches) and
  1091. is_mmx_able_array(ld) and
  1092. is_mmx_able_array(rd) and
  1093. equal_defs(ld,rd) then
  1094. begin
  1095. case nodetype of
  1096. addn,subn,xorn,orn,andn:
  1097. ;
  1098. { mul is a little bit restricted }
  1099. muln:
  1100. if not(mmx_type(ld) in [mmxu16bit,mmxs16bit,mmxfixed16]) then
  1101. CGMessage(type_e_mismatch);
  1102. else
  1103. CGMessage(type_e_mismatch);
  1104. end;
  1105. end
  1106. {$endif SUPPORT_MMX}
  1107. { this is a little bit dangerous, also the left type }
  1108. { pointer to should be checked! This broke the mmx support }
  1109. else if (rd.deftype=pointerdef) or is_zero_based_array(rd) then
  1110. begin
  1111. if is_zero_based_array(rd) then
  1112. begin
  1113. resulttype.setdef(tpointerdef.create(tarraydef(rd).elementtype));
  1114. inserttypeconv(right,resulttype);
  1115. end;
  1116. inserttypeconv(left,s32bittype);
  1117. if nodetype=addn then
  1118. begin
  1119. if not(cs_extsyntax in aktmoduleswitches) or
  1120. (not(is_pchar(ld)) and not(m_add_pointer in aktmodeswitches)) then
  1121. CGMessage(type_e_mismatch);
  1122. if (rd.deftype=pointerdef) and
  1123. (tpointerdef(rd).pointertype.def.size>1) then
  1124. left:=caddnode.create(muln,left,
  1125. cordconstnode.create(tpointerdef(rd).pointertype.def.size,s32bittype,true));
  1126. end
  1127. else
  1128. CGMessage(type_e_mismatch);
  1129. end
  1130. else if (ld.deftype=pointerdef) or is_zero_based_array(ld) then
  1131. begin
  1132. if is_zero_based_array(ld) then
  1133. begin
  1134. resulttype.setdef(tpointerdef.create(tarraydef(ld).elementtype));
  1135. inserttypeconv(left,resulttype);
  1136. end;
  1137. inserttypeconv(right,s32bittype);
  1138. if nodetype in [addn,subn] then
  1139. begin
  1140. if not(cs_extsyntax in aktmoduleswitches) or
  1141. (not(is_pchar(ld)) and not(m_add_pointer in aktmodeswitches)) then
  1142. CGMessage(type_e_mismatch);
  1143. if (ld.deftype=pointerdef) and
  1144. (tpointerdef(ld).pointertype.def.size>1) then
  1145. right:=caddnode.create(muln,right,
  1146. cordconstnode.create(tpointerdef(ld).pointertype.def.size,s32bittype,true));
  1147. end
  1148. else
  1149. CGMessage(type_e_mismatch);
  1150. end
  1151. else if (rd.deftype=procvardef) and
  1152. (ld.deftype=procvardef) and
  1153. equal_defs(rd,ld) then
  1154. begin
  1155. if not (nodetype in [equaln,unequaln]) then
  1156. CGMessage(type_e_mismatch);
  1157. end
  1158. { enums }
  1159. else if (ld.deftype=enumdef) and (rd.deftype=enumdef) then
  1160. begin
  1161. if not(equal_defs(ld,rd)) then
  1162. inserttypeconv(right,left.resulttype);
  1163. if not(nodetype in [equaln,unequaln,ltn,lten,gtn,gten]) then
  1164. CGMessage(type_e_mismatch);
  1165. end
  1166. { generic conversion, this is for error recovery }
  1167. else
  1168. begin
  1169. inserttypeconv(left,s32bittype);
  1170. inserttypeconv(right,s32bittype);
  1171. end;
  1172. { set resulttype if not already done }
  1173. if not assigned(resulttype.def) then
  1174. begin
  1175. case nodetype of
  1176. ltn,lten,gtn,gten,equaln,unequaln :
  1177. resulttype:=booltype;
  1178. slashn :
  1179. resulttype:=resultrealtype;
  1180. addn:
  1181. begin
  1182. { for strings, return is always a 255 char string }
  1183. if is_shortstring(left.resulttype.def) then
  1184. resulttype:=cshortstringtype
  1185. else
  1186. resulttype:=left.resulttype;
  1187. end;
  1188. else
  1189. resulttype:=left.resulttype;
  1190. end;
  1191. end;
  1192. { when the result is currency we need some extra code for
  1193. multiplication and division. this should not be done when
  1194. the muln or slashn node is created internally }
  1195. if not(nf_is_currency in flags) and
  1196. is_currency(resulttype.def) then
  1197. begin
  1198. case nodetype of
  1199. slashn :
  1200. begin
  1201. { slashn will only work with floats }
  1202. hp:=caddnode.create(muln,getcopy,crealconstnode.create(10000.0,s64currencytype));
  1203. include(hp.flags,nf_is_currency);
  1204. result:=hp;
  1205. end;
  1206. muln :
  1207. begin
  1208. if s64currencytype.def.deftype=floatdef then
  1209. hp:=caddnode.create(slashn,getcopy,crealconstnode.create(10000.0,s64currencytype))
  1210. else
  1211. hp:=cmoddivnode.create(divn,getcopy,cordconstnode.create(10000,s64currencytype,false));
  1212. include(hp.flags,nf_is_currency);
  1213. result:=hp
  1214. end;
  1215. end;
  1216. end;
  1217. end;
  1218. function taddnode.first_addstring: tnode;
  1219. var
  1220. p: tnode;
  1221. begin
  1222. { when we get here, we are sure that both the left and the right }
  1223. { node are both strings of the same stringtype (JM) }
  1224. case nodetype of
  1225. addn:
  1226. begin
  1227. { note: if you implemented an fpc_shortstr_concat similar to the }
  1228. { one in i386.inc, you have to override first_addstring like in }
  1229. { ti386addnode.first_string and implement the shortstring concat }
  1230. { manually! The generic routine is different from the i386 one (JM) }
  1231. { create the call to the concat routine both strings as arguments }
  1232. result := ccallnode.createintern('fpc_'+
  1233. tstringdef(resulttype.def).stringtypname+'_concat',
  1234. ccallparanode.create(right,ccallparanode.create(left,nil)));
  1235. { we reused the arguments }
  1236. left := nil;
  1237. right := nil;
  1238. end;
  1239. ltn,lten,gtn,gten,equaln,unequaln :
  1240. begin
  1241. { generate better code for s='' and s<>'' }
  1242. if (nodetype in [equaln,unequaln]) and
  1243. (((left.nodetype=stringconstn) and (str_length(left)=0)) or
  1244. ((right.nodetype=stringconstn) and (str_length(right)=0))) then
  1245. begin
  1246. { switch so that the constant is always on the right }
  1247. if left.nodetype = stringconstn then
  1248. begin
  1249. p := left;
  1250. left := right;
  1251. right := p;
  1252. end;
  1253. if is_shortstring(left.resulttype.def) then
  1254. { compare the length with 0 }
  1255. result := caddnode.create(nodetype,
  1256. cinlinenode.create(in_length_x,false,left),
  1257. cordconstnode.create(0,s32bittype,false))
  1258. else
  1259. begin
  1260. { compare the pointer with nil (for ansistrings etc), }
  1261. { faster than getting the length (JM) }
  1262. result:= caddnode.create(nodetype,
  1263. ctypeconvnode.create_explicit(left,voidpointertype),
  1264. cpointerconstnode.create(0,voidpointertype));
  1265. end;
  1266. { left is reused }
  1267. left := nil;
  1268. { right isn't }
  1269. right.free;
  1270. right := nil;
  1271. exit;
  1272. end;
  1273. { no string constant -> call compare routine }
  1274. result := ccallnode.createintern('fpc_'+
  1275. tstringdef(left.resulttype.def).stringtypname+'_compare',
  1276. ccallparanode.create(right,ccallparanode.create(left,nil)));
  1277. { and compare its result with 0 according to the original operator }
  1278. result := caddnode.create(nodetype,result,
  1279. cordconstnode.create(0,s32bittype,false));
  1280. left := nil;
  1281. right := nil;
  1282. end;
  1283. end;
  1284. end;
  1285. function taddnode.first_addset: tnode;
  1286. var
  1287. procname: string[31];
  1288. tempn: tnode;
  1289. paras: tcallparanode;
  1290. srsym: ttypesym;
  1291. begin
  1292. { get the sym that represents the fpc_normal_set type }
  1293. if not searchsystype('FPC_NORMAL_SET',srsym) then
  1294. internalerror(200108313);
  1295. case nodetype of
  1296. equaln,unequaln,lten,gten:
  1297. begin
  1298. case nodetype of
  1299. equaln,unequaln:
  1300. procname := 'fpc_set_comp_sets';
  1301. lten,gten:
  1302. begin
  1303. procname := 'fpc_set_contains_sets';
  1304. { (left >= right) = (right <= left) }
  1305. if nodetype = gten then
  1306. begin
  1307. tempn := left;
  1308. left := right;
  1309. right := tempn;
  1310. end;
  1311. end;
  1312. end;
  1313. { convert the arguments (explicitely) to fpc_normal_set's }
  1314. left := ctypeconvnode.create_explicit(left,srsym.restype);
  1315. right := ctypeconvnode.create_explicit(right,srsym.restype);
  1316. result := ccallnode.createintern(procname,ccallparanode.create(right,
  1317. ccallparanode.create(left,nil)));
  1318. { left and right are reused as parameters }
  1319. left := nil;
  1320. right := nil;
  1321. { for an unequaln, we have to negate the result of comp_sets }
  1322. if nodetype = unequaln then
  1323. result := cnotnode.create(result);
  1324. end;
  1325. addn:
  1326. begin
  1327. { optimize first loading of a set }
  1328. if (right.nodetype=setelementn) and
  1329. not(assigned(tsetelementnode(right).right)) and
  1330. is_emptyset(left) then
  1331. begin
  1332. { type cast the value to pass as argument to a byte, }
  1333. { since that's what the helper expects }
  1334. tsetelementnode(right).left :=
  1335. ctypeconvnode.create_explicit(tsetelementnode(right).left,u8bittype);
  1336. { set the resulttype to the actual one (otherwise it's }
  1337. { "fpc_normal_set") }
  1338. result := ccallnode.createinternres('fpc_set_create_element',
  1339. ccallparanode.create(tsetelementnode(right).left,nil),
  1340. resulttype);
  1341. { reused }
  1342. tsetelementnode(right).left := nil;
  1343. end
  1344. else
  1345. begin
  1346. if right.nodetype=setelementn then
  1347. begin
  1348. { convert the arguments to bytes, since that's what }
  1349. { the helper expects }
  1350. tsetelementnode(right).left :=
  1351. ctypeconvnode.create_explicit(tsetelementnode(right).left,
  1352. u8bittype);
  1353. { convert the original set (explicitely) to an }
  1354. { fpc_normal_set so we can pass it to the helper }
  1355. left := ctypeconvnode.create_explicit(left,srsym.restype);
  1356. { add a range or a single element? }
  1357. if assigned(tsetelementnode(right).right) then
  1358. begin
  1359. tsetelementnode(right).right :=
  1360. ctypeconvnode.create_explicit(tsetelementnode(right).right,
  1361. u8bittype);
  1362. { create the call }
  1363. result := ccallnode.createinternres('fpc_set_set_range',
  1364. ccallparanode.create(tsetelementnode(right).right,
  1365. ccallparanode.create(tsetelementnode(right).left,
  1366. ccallparanode.create(left,nil))),resulttype);
  1367. end
  1368. else
  1369. begin
  1370. result := ccallnode.createinternres('fpc_set_set_byte',
  1371. ccallparanode.create(tsetelementnode(right).left,
  1372. ccallparanode.create(left,nil)),resulttype);
  1373. end;
  1374. { remove reused parts from original node }
  1375. tsetelementnode(right).right := nil;
  1376. tsetelementnode(right).left := nil;
  1377. left := nil;
  1378. end
  1379. else
  1380. begin
  1381. { add two sets }
  1382. { convert the sets to fpc_normal_set's }
  1383. result := ccallnode.createinternres('fpc_set_add_sets',
  1384. ccallparanode.create(
  1385. ctypeconvnode.create_explicit(right,srsym.restype),
  1386. ccallparanode.create(
  1387. ctypeconvnode.create_explicit(left,srsym.restype),nil)),resulttype);
  1388. { remove reused parts from original node }
  1389. left := nil;
  1390. right := nil;
  1391. end;
  1392. end
  1393. end;
  1394. subn,symdifn,muln:
  1395. begin
  1396. { convert the sets to fpc_normal_set's }
  1397. paras := ccallparanode.create(ctypeconvnode.create_explicit(right,srsym.restype),
  1398. ccallparanode.create(ctypeconvnode.create_explicit(left,srsym.restype),nil));
  1399. case nodetype of
  1400. subn:
  1401. result := ccallnode.createinternres('fpc_set_sub_sets',
  1402. paras,resulttype);
  1403. symdifn:
  1404. result := ccallnode.createinternres('fpc_set_symdif_sets',
  1405. paras,resulttype);
  1406. muln:
  1407. result := ccallnode.createinternres('fpc_set_mul_sets',
  1408. paras,resulttype);
  1409. end;
  1410. { remove reused parts from original node }
  1411. left := nil;
  1412. right := nil;
  1413. end;
  1414. else
  1415. internalerror(200108311);
  1416. end;
  1417. end;
  1418. function taddnode.first_add64bitint: tnode;
  1419. var
  1420. procname: string[31];
  1421. temp: tnode;
  1422. power: longint;
  1423. begin
  1424. result := nil;
  1425. { create helper calls mul }
  1426. if nodetype <> muln then
  1427. exit;
  1428. { make sure that if there is a constant, that it's on the right }
  1429. if left.nodetype = ordconstn then
  1430. begin
  1431. temp := right;
  1432. right := left;
  1433. left := temp;
  1434. end;
  1435. { can we use a shift instead of a mul? }
  1436. if (right.nodetype = ordconstn) and
  1437. ispowerof2(tordconstnode(right).value,power) then
  1438. begin
  1439. tordconstnode(right).value := power;
  1440. result := cshlshrnode.create(shln,left,right);
  1441. { left and right are reused }
  1442. left := nil;
  1443. right := nil;
  1444. { return firstpassed new node }
  1445. exit;
  1446. end;
  1447. { when currency is used set the result of the
  1448. parameters to s64bit, so they are not converted }
  1449. if is_currency(resulttype.def) then
  1450. begin
  1451. left.resulttype:=cs64bittype;
  1452. right.resulttype:=cs64bittype;
  1453. end;
  1454. { otherwise, create the parameters for the helper }
  1455. right := ccallparanode.create(
  1456. cordconstnode.create(ord(cs_check_overflow in aktlocalswitches),booltype,true),
  1457. ccallparanode.create(right,ccallparanode.create(left,nil)));
  1458. left := nil;
  1459. { only qword needs the unsigned code, the
  1460. signed code is also used for currency }
  1461. if is_signed(resulttype.def) then
  1462. procname := 'fpc_mul_int64'
  1463. else
  1464. procname := 'fpc_mul_qword';
  1465. result := ccallnode.createintern(procname,right);
  1466. right := nil;
  1467. end;
  1468. {$ifdef cpufpemu}
  1469. function taddnode.first_addfloat: tnode;
  1470. var
  1471. procname: string[31];
  1472. temp: tnode;
  1473. power: longint;
  1474. { do we need to reverse the result ? }
  1475. notnode : boolean;
  1476. begin
  1477. result := nil;
  1478. notnode := false;
  1479. { In non-emulation mode, real opcodes are
  1480. emitted for floating point values.
  1481. }
  1482. if not (cs_fp_emulation in aktmoduleswitches) then
  1483. exit;
  1484. case nodetype of
  1485. addn : procname := 'fpc_single_add';
  1486. muln : procname := 'fpc_single_mul';
  1487. subn : procname := 'fpc_single_sub';
  1488. slashn : procname := 'fpc_single_div';
  1489. ltn : procname := 'fpc_single_lt';
  1490. lten: procname := 'fpc_single_le';
  1491. gtn:
  1492. begin
  1493. procname := 'fpc_single_le';
  1494. notnode := true;
  1495. end;
  1496. gten:
  1497. begin
  1498. procname := 'fpc_single_lt';
  1499. notnode := true;
  1500. end;
  1501. equaln: procname := 'fpc_single_eq';
  1502. unequaln :
  1503. begin
  1504. procname := 'fpc_single_eq';
  1505. notnode := true;
  1506. end;
  1507. else
  1508. CGMessage(type_e_mismatch);
  1509. end;
  1510. { convert the arguments (explicitely) to fpc_normal_set's }
  1511. result := ccallnode.createintern(procname,ccallparanode.create(right,
  1512. ccallparanode.create(left,nil)));
  1513. left:=nil;
  1514. right:=nil;
  1515. { do we need to reverse the result }
  1516. if notnode then
  1517. result := cnotnode.create(result);
  1518. end;
  1519. {$endif cpufpemu}
  1520. function taddnode.pass_1 : tnode;
  1521. var
  1522. hp : tnode;
  1523. lt,rt : tnodetype;
  1524. rd,ld : tdef;
  1525. begin
  1526. result:=nil;
  1527. { first do the two subtrees }
  1528. firstpass(left);
  1529. firstpass(right);
  1530. if codegenerror then
  1531. exit;
  1532. { load easier access variables }
  1533. rd:=right.resulttype.def;
  1534. ld:=left.resulttype.def;
  1535. rt:=right.nodetype;
  1536. lt:=left.nodetype;
  1537. { int/int gives real/real! }
  1538. if nodetype=slashn then
  1539. begin
  1540. {$ifdef cpufpemu}
  1541. result := first_addfloat;
  1542. if assigned(result) then
  1543. exit;
  1544. {$endif cpufpemu}
  1545. expectloc:=LOC_FPUREGISTER;
  1546. { maybe we need an integer register to save }
  1547. { a reference }
  1548. if ((left.expectloc<>LOC_FPUREGISTER) or
  1549. (right.expectloc<>LOC_FPUREGISTER)) and
  1550. (left.registers32=right.registers32) then
  1551. calcregisters(self,1,1,0)
  1552. else
  1553. calcregisters(self,0,1,0);
  1554. { an add node always first loads both the left and the }
  1555. { right in the fpu before doing the calculation. However, }
  1556. { calcregisters(0,2,0) will overestimate the number of }
  1557. { necessary registers (it will make it 3 in case one of }
  1558. { the operands is already in the fpu) (JM) }
  1559. if ((left.expectloc<>LOC_FPUREGISTER) or
  1560. (right.expectloc<>LOC_FPUREGISTER)) and
  1561. (registersfpu < 2) then
  1562. inc(registersfpu);
  1563. end
  1564. { if both are orddefs then check sub types }
  1565. else if (ld.deftype=orddef) and (rd.deftype=orddef) then
  1566. begin
  1567. { 2 booleans ? }
  1568. if is_boolean(ld) and is_boolean(rd) then
  1569. begin
  1570. if not(cs_full_boolean_eval in aktlocalswitches) and
  1571. (nodetype in [andn,orn]) then
  1572. begin
  1573. expectloc:=LOC_JUMP;
  1574. calcregisters(self,0,0,0);
  1575. end
  1576. else
  1577. begin
  1578. expectloc:=LOC_FLAGS;
  1579. if (left.expectloc in [LOC_JUMP,LOC_FLAGS]) and
  1580. (left.expectloc in [LOC_JUMP,LOC_FLAGS]) then
  1581. calcregisters(self,2,0,0)
  1582. else
  1583. calcregisters(self,1,0,0);
  1584. end;
  1585. end
  1586. else
  1587. { Both are chars? only convert to shortstrings for addn }
  1588. if is_char(ld) then
  1589. begin
  1590. if nodetype=addn then
  1591. internalerror(200103291);
  1592. expectloc:=LOC_FLAGS;
  1593. calcregisters(self,1,0,0);
  1594. end
  1595. { is there a 64 bit type ? }
  1596. else if (torddef(ld).typ in [s64bit,u64bit,scurrency]) then
  1597. begin
  1598. result := first_add64bitint;
  1599. if assigned(result) then
  1600. exit;
  1601. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1602. expectloc:=LOC_REGISTER
  1603. else
  1604. expectloc:=LOC_JUMP;
  1605. calcregisters(self,2,0,0)
  1606. end
  1607. { is there a cardinal? }
  1608. else if (torddef(ld).typ=u32bit) then
  1609. begin
  1610. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1611. expectloc:=LOC_REGISTER
  1612. else
  1613. expectloc:=LOC_FLAGS;
  1614. calcregisters(self,1,0,0);
  1615. { for unsigned mul we need an extra register }
  1616. if nodetype=muln then
  1617. inc(registers32);
  1618. end
  1619. { generic s32bit conversion }
  1620. else
  1621. begin
  1622. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1623. expectloc:=LOC_REGISTER
  1624. else
  1625. expectloc:=LOC_FLAGS;
  1626. calcregisters(self,1,0,0);
  1627. end;
  1628. end
  1629. { left side a setdef, must be before string processing,
  1630. else array constructor can be seen as array of char (PFV) }
  1631. else if (ld.deftype=setdef) then
  1632. begin
  1633. if tsetdef(ld).settype=smallset then
  1634. begin
  1635. if nodetype in [ltn,lten,gtn,gten,equaln,unequaln] then
  1636. expectloc:=LOC_FLAGS
  1637. else
  1638. expectloc:=LOC_REGISTER;
  1639. { are we adding set elements ? }
  1640. if right.nodetype=setelementn then
  1641. calcregisters(self,2,0,0)
  1642. else
  1643. calcregisters(self,1,0,0);
  1644. end
  1645. else
  1646. begin
  1647. result := first_addset;
  1648. if assigned(result) then
  1649. exit;
  1650. expectloc:=LOC_CREFERENCE;
  1651. calcregisters(self,0,0,0);
  1652. { here we call SET... }
  1653. include(current_procinfo.flags,pi_do_call);
  1654. end;
  1655. end
  1656. { compare pchar by addresses like BP/Delphi }
  1657. else if is_pchar(ld) then
  1658. begin
  1659. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1660. expectloc:=LOC_REGISTER
  1661. else
  1662. expectloc:=LOC_FLAGS;
  1663. calcregisters(self,1,0,0);
  1664. end
  1665. { is one of the operands a string }
  1666. else if (ld.deftype=stringdef) then
  1667. begin
  1668. if is_widestring(ld) then
  1669. begin
  1670. { this is only for add, the comparisaion is handled later }
  1671. expectloc:=LOC_REGISTER;
  1672. end
  1673. else if is_ansistring(ld) then
  1674. begin
  1675. { this is only for add, the comparisaion is handled later }
  1676. expectloc:=LOC_REGISTER;
  1677. end
  1678. else if is_longstring(ld) then
  1679. begin
  1680. { this is only for add, the comparisaion is handled later }
  1681. expectloc:=LOC_REFERENCE;
  1682. end
  1683. else
  1684. begin
  1685. if canbeaddsstringcharoptnode(self) then
  1686. begin
  1687. hp := genaddsstringcharoptnode(self);
  1688. pass_1 := hp;
  1689. exit;
  1690. end
  1691. else
  1692. begin
  1693. { Fix right to be shortstring }
  1694. if is_char(right.resulttype.def) then
  1695. begin
  1696. inserttypeconv(right,cshortstringtype);
  1697. firstpass(right);
  1698. end;
  1699. end;
  1700. if canbeaddsstringcsstringoptnode(self) then
  1701. begin
  1702. hp := genaddsstringcsstringoptnode(self);
  1703. pass_1 := hp;
  1704. exit;
  1705. end;
  1706. end;
  1707. { otherwise, let addstring convert everything }
  1708. result := first_addstring;
  1709. exit;
  1710. end
  1711. { is one a real float ? }
  1712. else if (rd.deftype=floatdef) or (ld.deftype=floatdef) then
  1713. begin
  1714. {$ifdef cpufpemu}
  1715. result := first_addfloat;
  1716. if assigned(result) then
  1717. exit;
  1718. {$endif cpufpemu}
  1719. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1720. expectloc:=LOC_FPUREGISTER
  1721. else
  1722. expectloc:=LOC_FLAGS;
  1723. calcregisters(self,0,1,0);
  1724. { an add node always first loads both the left and the }
  1725. { right in the fpu before doing the calculation. However, }
  1726. { calcregisters(0,2,0) will overestimate the number of }
  1727. { necessary registers (it will make it 3 in case one of }
  1728. { the operands is already in the fpu) (JM) }
  1729. if ((left.expectloc<>LOC_FPUREGISTER) or
  1730. (right.expectloc<>LOC_FPUREGISTER)) and
  1731. (registersfpu < 2) then
  1732. inc(registersfpu);
  1733. end
  1734. { pointer comperation and subtraction }
  1735. else if (ld.deftype=pointerdef) then
  1736. begin
  1737. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1738. expectloc:=LOC_REGISTER
  1739. else
  1740. expectloc:=LOC_FLAGS;
  1741. calcregisters(self,1,0,0);
  1742. end
  1743. else if is_class_or_interface(ld) then
  1744. begin
  1745. expectloc:=LOC_FLAGS;
  1746. calcregisters(self,1,0,0);
  1747. end
  1748. else if (ld.deftype=classrefdef) then
  1749. begin
  1750. expectloc:=LOC_FLAGS;
  1751. calcregisters(self,1,0,0);
  1752. end
  1753. { support procvar=nil,procvar<>nil }
  1754. else if ((ld.deftype=procvardef) and (rt=niln)) or
  1755. ((rd.deftype=procvardef) and (lt=niln)) then
  1756. begin
  1757. expectloc:=LOC_FLAGS;
  1758. calcregisters(self,1,0,0);
  1759. end
  1760. {$ifdef SUPPORT_MMX}
  1761. { mmx support, this must be before the zero based array
  1762. check }
  1763. else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(ld) and
  1764. is_mmx_able_array(rd) then
  1765. begin
  1766. expectloc:=LOC_MMXREGISTER;
  1767. calcregisters(self,0,0,1);
  1768. end
  1769. {$endif SUPPORT_MMX}
  1770. else if (rd.deftype=pointerdef) or (ld.deftype=pointerdef) then
  1771. begin
  1772. expectloc:=LOC_REGISTER;
  1773. calcregisters(self,1,0,0);
  1774. end
  1775. else if (rd.deftype=procvardef) and
  1776. (ld.deftype=procvardef) and
  1777. equal_defs(rd,ld) then
  1778. begin
  1779. expectloc:=LOC_FLAGS;
  1780. calcregisters(self,1,0,0);
  1781. end
  1782. else if (ld.deftype=enumdef) then
  1783. begin
  1784. expectloc:=LOC_FLAGS;
  1785. calcregisters(self,1,0,0);
  1786. end
  1787. {$ifdef SUPPORT_MMX}
  1788. else if (cs_mmx in aktlocalswitches) and
  1789. is_mmx_able_array(ld) and
  1790. is_mmx_able_array(rd) then
  1791. begin
  1792. expectloc:=LOC_MMXREGISTER;
  1793. calcregisters(self,0,0,1);
  1794. end
  1795. {$endif SUPPORT_MMX}
  1796. { the general solution is to convert to 32 bit int }
  1797. else
  1798. begin
  1799. expectloc:=LOC_REGISTER;
  1800. calcregisters(self,1,0,0);
  1801. end;
  1802. end;
  1803. {$ifdef state_tracking}
  1804. function Taddnode.track_state_pass(exec_known:boolean):boolean;
  1805. var factval:Tnode;
  1806. begin
  1807. track_state_pass:=false;
  1808. if left.track_state_pass(exec_known) then
  1809. begin
  1810. track_state_pass:=true;
  1811. left.resulttype.def:=nil;
  1812. do_resulttypepass(left);
  1813. end;
  1814. factval:=aktstate.find_fact(left);
  1815. if factval<>nil then
  1816. begin
  1817. track_state_pass:=true;
  1818. left.destroy;
  1819. left:=factval.getcopy;
  1820. end;
  1821. if right.track_state_pass(exec_known) then
  1822. begin
  1823. track_state_pass:=true;
  1824. right.resulttype.def:=nil;
  1825. do_resulttypepass(right);
  1826. end;
  1827. factval:=aktstate.find_fact(right);
  1828. if factval<>nil then
  1829. begin
  1830. track_state_pass:=true;
  1831. right.destroy;
  1832. right:=factval.getcopy;
  1833. end;
  1834. end;
  1835. {$endif}
  1836. begin
  1837. caddnode:=taddnode;
  1838. end.
  1839. {
  1840. $Log$
  1841. Revision 1.87 2003-04-27 11:21:32 peter
  1842. * aktprocdef renamed to current_procdef
  1843. * procinfo renamed to current_procinfo
  1844. * procinfo will now be stored in current_module so it can be
  1845. cleaned up properly
  1846. * gen_main_procsym changed to create_main_proc and release_main_proc
  1847. to also generate a tprocinfo structure
  1848. * fixed unit implicit initfinal
  1849. Revision 1.86 2003/04/26 09:12:55 peter
  1850. * add string returns in LOC_REFERENCE
  1851. Revision 1.85 2003/04/24 22:29:57 florian
  1852. * fixed a lot of PowerPC related stuff
  1853. Revision 1.84 2003/04/23 20:16:04 peter
  1854. + added currency support based on int64
  1855. + is_64bit for use in cg units instead of is_64bitint
  1856. * removed cgmessage from n386add, replace with internalerrors
  1857. Revision 1.83 2003/04/23 10:10:07 peter
  1858. * expectloc fixes
  1859. Revision 1.82 2003/04/22 23:50:22 peter
  1860. * firstpass uses expectloc
  1861. * checks if there are differences between the expectloc and
  1862. location.loc from secondpass in EXTDEBUG
  1863. Revision 1.81 2003/02/15 22:20:14 carl
  1864. * bugfix for generic calls to FPU emulation code
  1865. Revision 1.80 2003/02/12 22:10:07 carl
  1866. * load_frame_pointer is now generic
  1867. * change fpu emulation routine names
  1868. Revision 1.79 2003/01/02 22:19:54 peter
  1869. * support pchar-char operations converting to string first
  1870. * support chararray-nil
  1871. Revision 1.78 2002/12/11 22:41:03 peter
  1872. * stop processing assignment node when the binaryoverload generates
  1873. a codegenerror
  1874. Revision 1.77 2002/12/06 16:56:57 peter
  1875. * only compile cs_fp_emulation support when cpufpuemu is defined
  1876. * define cpufpuemu for m68k only
  1877. Revision 1.76 2002/11/30 21:32:24 carl
  1878. + Add loading of softfpu in emulation mode
  1879. + Correct routine call for softfpu
  1880. * Extended type must also be defined even with softfpu
  1881. Revision 1.75 2002/11/27 13:11:38 peter
  1882. * more currency fixes, taddcurr runs now successfull
  1883. Revision 1.74 2002/11/27 11:28:40 peter
  1884. * when both flaottypes are the same then handle the addnode using
  1885. that floattype instead of bestrealtype
  1886. Revision 1.73 2002/11/25 18:43:32 carl
  1887. - removed the invalid if <> checking (Delphi is strange on this)
  1888. + implemented abstract warning on instance creation of class with
  1889. abstract methods.
  1890. * some error message cleanups
  1891. Revision 1.72 2002/11/25 17:43:17 peter
  1892. * splitted defbase in defutil,symutil,defcmp
  1893. * merged isconvertable and is_equal into compare_defs(_ext)
  1894. * made operator search faster by walking the list only once
  1895. Revision 1.71 2002/11/23 22:50:06 carl
  1896. * some small speed optimizations
  1897. + added several new warnings/hints
  1898. Revision 1.70 2002/11/16 14:20:22 peter
  1899. * fix tbs0417
  1900. Revision 1.69 2002/11/15 01:58:50 peter
  1901. * merged changes from 1.0.7 up to 04-11
  1902. - -V option for generating bug report tracing
  1903. - more tracing for option parsing
  1904. - errors for cdecl and high()
  1905. - win32 import stabs
  1906. - win32 records<=8 are returned in eax:edx (turned off by default)
  1907. - heaptrc update
  1908. - more info for temp management in .s file with EXTDEBUG
  1909. Revision 1.68 2002/10/08 16:50:43 jonas
  1910. * fixed web bug 2136
  1911. Revision 1.67 2002/10/05 00:47:03 peter
  1912. * support dynamicarray<>nil
  1913. Revision 1.66 2002/10/04 21:19:28 jonas
  1914. * fixed web bug 2139: checking for division by zero fixed
  1915. Revision 1.65 2002/09/07 15:25:02 peter
  1916. * old logs removed and tabs fixed
  1917. Revision 1.64 2002/09/07 12:16:05 carl
  1918. * second part bug report 1996 fix, testrange in cordconstnode
  1919. only called if option is set (also make parsing a tiny faster)
  1920. Revision 1.63 2002/09/04 19:32:56 jonas
  1921. * changed some ctypeconvnode/toggleflag(nf_explizit) combo's to
  1922. ctypeconvnode.create_explicit() statements
  1923. Revision 1.62 2002/08/17 09:23:34 florian
  1924. * first part of current_procinfo rewrite
  1925. Revision 1.61 2002/08/15 15:15:55 carl
  1926. * jmpbuf size allocation for exceptions is now cpu specific (as it should)
  1927. * more generic nodes for maths
  1928. * several fixes for better m68k support
  1929. Revision 1.60 2002/08/12 15:08:39 carl
  1930. + stab register indexes for powerpc (moved from gdb to cpubase)
  1931. + tprocessor enumeration moved to cpuinfo
  1932. + linker in target_info is now a class
  1933. * many many updates for m68k (will soon start to compile)
  1934. - removed some ifdef or correct them for correct cpu
  1935. Revision 1.59 2002/08/02 07:44:30 jonas
  1936. * made assigned() handling generic
  1937. * add nodes now can also evaluate constant expressions at compile time
  1938. that contain nil nodes
  1939. Revision 1.58 2002/07/26 11:17:52 jonas
  1940. * the optimization of converting a multiplication with a power of two to
  1941. a shl is moved from n386add/secondpass to nadd/resulttypepass
  1942. Revision 1.57 2002/07/23 13:08:16 jonas
  1943. * fixed constant set evaluation of new set handling for non-commutative
  1944. operators
  1945. Revision 1.56 2002/07/23 12:34:29 daniel
  1946. * Readded old set code. To use it define 'oldset'. Activated by default
  1947. for ppc.
  1948. Revision 1.55 2002/07/22 11:48:04 daniel
  1949. * Sets are now internally sets.
  1950. Revision 1.54 2002/07/20 11:57:53 florian
  1951. * types.pas renamed to defbase.pas because D6 contains a types
  1952. unit so this would conflicts if D6 programms are compiled
  1953. + Willamette/SSE2 instructions to assembler added
  1954. Revision 1.53 2002/07/19 11:41:34 daniel
  1955. * State tracker work
  1956. * The whilen and repeatn are now completely unified into whilerepeatn. This
  1957. allows the state tracker to change while nodes automatically into
  1958. repeat nodes.
  1959. * Resulttypepass improvements to the notn. 'not not a' is optimized away and
  1960. 'not(a>b)' is optimized into 'a<=b'.
  1961. * Resulttypepass improvements to the whilerepeatn. 'while not a' is optimized
  1962. by removing the notn and later switchting the true and falselabels. The
  1963. same is done with 'repeat until not a'.
  1964. Revision 1.52 2002/07/14 18:00:43 daniel
  1965. + Added the beginning of a state tracker. This will track the values of
  1966. variables through procedures and optimize things away.
  1967. Revision 1.51 2002/05/18 13:34:08 peter
  1968. * readded missing revisions
  1969. Revision 1.50 2002/05/16 19:46:37 carl
  1970. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  1971. + try to fix temp allocation (still in ifdef)
  1972. + generic constructor calls
  1973. + start of tassembler / tmodulebase class cleanup
  1974. Revision 1.48 2002/05/13 19:54:36 peter
  1975. * removed n386ld and n386util units
  1976. * maybe_save/maybe_restore added instead of the old maybe_push
  1977. Revision 1.47 2002/05/12 16:53:06 peter
  1978. * moved entry and exitcode to ncgutil and cgobj
  1979. * foreach gets extra argument for passing local data to the
  1980. iterator function
  1981. * -CR checks also class typecasts at runtime by changing them
  1982. into as
  1983. * fixed compiler to cycle with the -CR option
  1984. * fixed stabs with elf writer, finally the global variables can
  1985. be watched
  1986. * removed a lot of routines from cga unit and replaced them by
  1987. calls to cgobj
  1988. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  1989. u32bit then the other is typecasted also to u32bit without giving
  1990. a rangecheck warning/error.
  1991. * fixed pascal calling method with reversing also the high tree in
  1992. the parast, detected by tcalcst3 test
  1993. Revision 1.46 2002/04/23 19:16:34 peter
  1994. * add pinline unit that inserts compiler supported functions using
  1995. one or more statements
  1996. * moved finalize and setlength from ninl to pinline
  1997. Revision 1.45 2002/04/04 19:05:56 peter
  1998. * removed unused units
  1999. * use tlocation.size in cg.a_*loc*() routines
  2000. Revision 1.44 2002/04/02 17:11:28 peter
  2001. * tlocation,treference update
  2002. * LOC_CONSTANT added for better constant handling
  2003. * secondadd splitted in multiple routines
  2004. * location_force_reg added for loading a location to a register
  2005. of a specified size
  2006. * secondassignment parses now first the right and then the left node
  2007. (this is compatible with Kylix). This saves a lot of push/pop especially
  2008. with string operations
  2009. * adapted some routines to use the new cg methods
  2010. }