nadd.pas 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163
  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. if assigned(procinfo) then
  1654. procinfo.flags:=procinfo.flags or pi_do_call;
  1655. end;
  1656. end
  1657. { compare pchar by addresses like BP/Delphi }
  1658. else if is_pchar(ld) then
  1659. begin
  1660. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1661. expectloc:=LOC_REGISTER
  1662. else
  1663. expectloc:=LOC_FLAGS;
  1664. calcregisters(self,1,0,0);
  1665. end
  1666. { is one of the operands a string }
  1667. else if (ld.deftype=stringdef) then
  1668. begin
  1669. if is_widestring(ld) then
  1670. begin
  1671. { we use reference counted widestrings so no fast exit here }
  1672. if assigned(procinfo) then
  1673. procinfo.no_fast_exit:=true;
  1674. { this is only for add, the comparisaion is handled later }
  1675. expectloc:=LOC_REGISTER;
  1676. end
  1677. else if is_ansistring(ld) then
  1678. begin
  1679. { we use ansistrings so no fast exit here }
  1680. if assigned(procinfo) then
  1681. procinfo.no_fast_exit:=true;
  1682. { this is only for add, the comparisaion is handled later }
  1683. expectloc:=LOC_REGISTER;
  1684. end
  1685. else if is_longstring(ld) then
  1686. begin
  1687. { this is only for add, the comparisaion is handled later }
  1688. expectloc:=LOC_REFERENCE;
  1689. end
  1690. else
  1691. begin
  1692. if canbeaddsstringcharoptnode(self) then
  1693. begin
  1694. hp := genaddsstringcharoptnode(self);
  1695. pass_1 := hp;
  1696. exit;
  1697. end
  1698. else
  1699. begin
  1700. { Fix right to be shortstring }
  1701. if is_char(right.resulttype.def) then
  1702. begin
  1703. inserttypeconv(right,cshortstringtype);
  1704. firstpass(right);
  1705. end;
  1706. end;
  1707. if canbeaddsstringcsstringoptnode(self) then
  1708. begin
  1709. hp := genaddsstringcsstringoptnode(self);
  1710. pass_1 := hp;
  1711. exit;
  1712. end;
  1713. end;
  1714. { otherwise, let addstring convert everything }
  1715. result := first_addstring;
  1716. exit;
  1717. end
  1718. { is one a real float ? }
  1719. else if (rd.deftype=floatdef) or (ld.deftype=floatdef) then
  1720. begin
  1721. {$ifdef cpufpemu}
  1722. result := first_addfloat;
  1723. if assigned(result) then
  1724. exit;
  1725. {$endif cpufpemu}
  1726. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1727. expectloc:=LOC_FPUREGISTER
  1728. else
  1729. expectloc:=LOC_FLAGS;
  1730. calcregisters(self,0,1,0);
  1731. { an add node always first loads both the left and the }
  1732. { right in the fpu before doing the calculation. However, }
  1733. { calcregisters(0,2,0) will overestimate the number of }
  1734. { necessary registers (it will make it 3 in case one of }
  1735. { the operands is already in the fpu) (JM) }
  1736. if ((left.expectloc<>LOC_FPUREGISTER) or
  1737. (right.expectloc<>LOC_FPUREGISTER)) and
  1738. (registersfpu < 2) then
  1739. inc(registersfpu);
  1740. end
  1741. { pointer comperation and subtraction }
  1742. else if (ld.deftype=pointerdef) then
  1743. begin
  1744. if nodetype in [addn,subn,muln,andn,orn,xorn] then
  1745. expectloc:=LOC_REGISTER
  1746. else
  1747. expectloc:=LOC_FLAGS;
  1748. calcregisters(self,1,0,0);
  1749. end
  1750. else if is_class_or_interface(ld) then
  1751. begin
  1752. expectloc:=LOC_FLAGS;
  1753. calcregisters(self,1,0,0);
  1754. end
  1755. else if (ld.deftype=classrefdef) then
  1756. begin
  1757. expectloc:=LOC_FLAGS;
  1758. calcregisters(self,1,0,0);
  1759. end
  1760. { support procvar=nil,procvar<>nil }
  1761. else if ((ld.deftype=procvardef) and (rt=niln)) or
  1762. ((rd.deftype=procvardef) and (lt=niln)) then
  1763. begin
  1764. expectloc:=LOC_FLAGS;
  1765. calcregisters(self,1,0,0);
  1766. end
  1767. {$ifdef SUPPORT_MMX}
  1768. { mmx support, this must be before the zero based array
  1769. check }
  1770. else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(ld) and
  1771. is_mmx_able_array(rd) then
  1772. begin
  1773. expectloc:=LOC_MMXREGISTER;
  1774. calcregisters(self,0,0,1);
  1775. end
  1776. {$endif SUPPORT_MMX}
  1777. else if (rd.deftype=pointerdef) or (ld.deftype=pointerdef) then
  1778. begin
  1779. expectloc:=LOC_REGISTER;
  1780. calcregisters(self,1,0,0);
  1781. end
  1782. else if (rd.deftype=procvardef) and
  1783. (ld.deftype=procvardef) and
  1784. equal_defs(rd,ld) then
  1785. begin
  1786. expectloc:=LOC_FLAGS;
  1787. calcregisters(self,1,0,0);
  1788. end
  1789. else if (ld.deftype=enumdef) then
  1790. begin
  1791. expectloc:=LOC_FLAGS;
  1792. calcregisters(self,1,0,0);
  1793. end
  1794. {$ifdef SUPPORT_MMX}
  1795. else if (cs_mmx in aktlocalswitches) and
  1796. is_mmx_able_array(ld) and
  1797. is_mmx_able_array(rd) then
  1798. begin
  1799. expectloc:=LOC_MMXREGISTER;
  1800. calcregisters(self,0,0,1);
  1801. end
  1802. {$endif SUPPORT_MMX}
  1803. { the general solution is to convert to 32 bit int }
  1804. else
  1805. begin
  1806. expectloc:=LOC_REGISTER;
  1807. calcregisters(self,1,0,0);
  1808. end;
  1809. end;
  1810. {$ifdef state_tracking}
  1811. function Taddnode.track_state_pass(exec_known:boolean):boolean;
  1812. var factval:Tnode;
  1813. begin
  1814. track_state_pass:=false;
  1815. if left.track_state_pass(exec_known) then
  1816. begin
  1817. track_state_pass:=true;
  1818. left.resulttype.def:=nil;
  1819. do_resulttypepass(left);
  1820. end;
  1821. factval:=aktstate.find_fact(left);
  1822. if factval<>nil then
  1823. begin
  1824. track_state_pass:=true;
  1825. left.destroy;
  1826. left:=factval.getcopy;
  1827. end;
  1828. if right.track_state_pass(exec_known) then
  1829. begin
  1830. track_state_pass:=true;
  1831. right.resulttype.def:=nil;
  1832. do_resulttypepass(right);
  1833. end;
  1834. factval:=aktstate.find_fact(right);
  1835. if factval<>nil then
  1836. begin
  1837. track_state_pass:=true;
  1838. right.destroy;
  1839. right:=factval.getcopy;
  1840. end;
  1841. end;
  1842. {$endif}
  1843. begin
  1844. caddnode:=taddnode;
  1845. end.
  1846. {
  1847. $Log$
  1848. Revision 1.86 2003-04-26 09:12:55 peter
  1849. * add string returns in LOC_REFERENCE
  1850. Revision 1.85 2003/04/24 22:29:57 florian
  1851. * fixed a lot of PowerPC related stuff
  1852. Revision 1.84 2003/04/23 20:16:04 peter
  1853. + added currency support based on int64
  1854. + is_64bit for use in cg units instead of is_64bitint
  1855. * removed cgmessage from n386add, replace with internalerrors
  1856. Revision 1.83 2003/04/23 10:10:07 peter
  1857. * expectloc fixes
  1858. Revision 1.82 2003/04/22 23:50:22 peter
  1859. * firstpass uses expectloc
  1860. * checks if there are differences between the expectloc and
  1861. location.loc from secondpass in EXTDEBUG
  1862. Revision 1.81 2003/02/15 22:20:14 carl
  1863. * bugfix for generic calls to FPU emulation code
  1864. Revision 1.80 2003/02/12 22:10:07 carl
  1865. * load_frame_pointer is now generic
  1866. * change fpu emulation routine names
  1867. Revision 1.79 2003/01/02 22:19:54 peter
  1868. * support pchar-char operations converting to string first
  1869. * support chararray-nil
  1870. Revision 1.78 2002/12/11 22:41:03 peter
  1871. * stop processing assignment node when the binaryoverload generates
  1872. a codegenerror
  1873. Revision 1.77 2002/12/06 16:56:57 peter
  1874. * only compile cs_fp_emulation support when cpufpuemu is defined
  1875. * define cpufpuemu for m68k only
  1876. Revision 1.76 2002/11/30 21:32:24 carl
  1877. + Add loading of softfpu in emulation mode
  1878. + Correct routine call for softfpu
  1879. * Extended type must also be defined even with softfpu
  1880. Revision 1.75 2002/11/27 13:11:38 peter
  1881. * more currency fixes, taddcurr runs now successfull
  1882. Revision 1.74 2002/11/27 11:28:40 peter
  1883. * when both flaottypes are the same then handle the addnode using
  1884. that floattype instead of bestrealtype
  1885. Revision 1.73 2002/11/25 18:43:32 carl
  1886. - removed the invalid if <> checking (Delphi is strange on this)
  1887. + implemented abstract warning on instance creation of class with
  1888. abstract methods.
  1889. * some error message cleanups
  1890. Revision 1.72 2002/11/25 17:43:17 peter
  1891. * splitted defbase in defutil,symutil,defcmp
  1892. * merged isconvertable and is_equal into compare_defs(_ext)
  1893. * made operator search faster by walking the list only once
  1894. Revision 1.71 2002/11/23 22:50:06 carl
  1895. * some small speed optimizations
  1896. + added several new warnings/hints
  1897. Revision 1.70 2002/11/16 14:20:22 peter
  1898. * fix tbs0417
  1899. Revision 1.69 2002/11/15 01:58:50 peter
  1900. * merged changes from 1.0.7 up to 04-11
  1901. - -V option for generating bug report tracing
  1902. - more tracing for option parsing
  1903. - errors for cdecl and high()
  1904. - win32 import stabs
  1905. - win32 records<=8 are returned in eax:edx (turned off by default)
  1906. - heaptrc update
  1907. - more info for temp management in .s file with EXTDEBUG
  1908. Revision 1.68 2002/10/08 16:50:43 jonas
  1909. * fixed web bug 2136
  1910. Revision 1.67 2002/10/05 00:47:03 peter
  1911. * support dynamicarray<>nil
  1912. Revision 1.66 2002/10/04 21:19:28 jonas
  1913. * fixed web bug 2139: checking for division by zero fixed
  1914. Revision 1.65 2002/09/07 15:25:02 peter
  1915. * old logs removed and tabs fixed
  1916. Revision 1.64 2002/09/07 12:16:05 carl
  1917. * second part bug report 1996 fix, testrange in cordconstnode
  1918. only called if option is set (also make parsing a tiny faster)
  1919. Revision 1.63 2002/09/04 19:32:56 jonas
  1920. * changed some ctypeconvnode/toggleflag(nf_explizit) combo's to
  1921. ctypeconvnode.create_explicit() statements
  1922. Revision 1.62 2002/08/17 09:23:34 florian
  1923. * first part of procinfo rewrite
  1924. Revision 1.61 2002/08/15 15:15:55 carl
  1925. * jmpbuf size allocation for exceptions is now cpu specific (as it should)
  1926. * more generic nodes for maths
  1927. * several fixes for better m68k support
  1928. Revision 1.60 2002/08/12 15:08:39 carl
  1929. + stab register indexes for powerpc (moved from gdb to cpubase)
  1930. + tprocessor enumeration moved to cpuinfo
  1931. + linker in target_info is now a class
  1932. * many many updates for m68k (will soon start to compile)
  1933. - removed some ifdef or correct them for correct cpu
  1934. Revision 1.59 2002/08/02 07:44:30 jonas
  1935. * made assigned() handling generic
  1936. * add nodes now can also evaluate constant expressions at compile time
  1937. that contain nil nodes
  1938. Revision 1.58 2002/07/26 11:17:52 jonas
  1939. * the optimization of converting a multiplication with a power of two to
  1940. a shl is moved from n386add/secondpass to nadd/resulttypepass
  1941. Revision 1.57 2002/07/23 13:08:16 jonas
  1942. * fixed constant set evaluation of new set handling for non-commutative
  1943. operators
  1944. Revision 1.56 2002/07/23 12:34:29 daniel
  1945. * Readded old set code. To use it define 'oldset'. Activated by default
  1946. for ppc.
  1947. Revision 1.55 2002/07/22 11:48:04 daniel
  1948. * Sets are now internally sets.
  1949. Revision 1.54 2002/07/20 11:57:53 florian
  1950. * types.pas renamed to defbase.pas because D6 contains a types
  1951. unit so this would conflicts if D6 programms are compiled
  1952. + Willamette/SSE2 instructions to assembler added
  1953. Revision 1.53 2002/07/19 11:41:34 daniel
  1954. * State tracker work
  1955. * The whilen and repeatn are now completely unified into whilerepeatn. This
  1956. allows the state tracker to change while nodes automatically into
  1957. repeat nodes.
  1958. * Resulttypepass improvements to the notn. 'not not a' is optimized away and
  1959. 'not(a>b)' is optimized into 'a<=b'.
  1960. * Resulttypepass improvements to the whilerepeatn. 'while not a' is optimized
  1961. by removing the notn and later switchting the true and falselabels. The
  1962. same is done with 'repeat until not a'.
  1963. Revision 1.52 2002/07/14 18:00:43 daniel
  1964. + Added the beginning of a state tracker. This will track the values of
  1965. variables through procedures and optimize things away.
  1966. Revision 1.51 2002/05/18 13:34:08 peter
  1967. * readded missing revisions
  1968. Revision 1.50 2002/05/16 19:46:37 carl
  1969. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  1970. + try to fix temp allocation (still in ifdef)
  1971. + generic constructor calls
  1972. + start of tassembler / tmodulebase class cleanup
  1973. Revision 1.48 2002/05/13 19:54:36 peter
  1974. * removed n386ld and n386util units
  1975. * maybe_save/maybe_restore added instead of the old maybe_push
  1976. Revision 1.47 2002/05/12 16:53:06 peter
  1977. * moved entry and exitcode to ncgutil and cgobj
  1978. * foreach gets extra argument for passing local data to the
  1979. iterator function
  1980. * -CR checks also class typecasts at runtime by changing them
  1981. into as
  1982. * fixed compiler to cycle with the -CR option
  1983. * fixed stabs with elf writer, finally the global variables can
  1984. be watched
  1985. * removed a lot of routines from cga unit and replaced them by
  1986. calls to cgobj
  1987. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  1988. u32bit then the other is typecasted also to u32bit without giving
  1989. a rangecheck warning/error.
  1990. * fixed pascal calling method with reversing also the high tree in
  1991. the parast, detected by tcalcst3 test
  1992. Revision 1.46 2002/04/23 19:16:34 peter
  1993. * add pinline unit that inserts compiler supported functions using
  1994. one or more statements
  1995. * moved finalize and setlength from ninl to pinline
  1996. Revision 1.45 2002/04/04 19:05:56 peter
  1997. * removed unused units
  1998. * use tlocation.size in cg.a_*loc*() routines
  1999. Revision 1.44 2002/04/02 17:11:28 peter
  2000. * tlocation,treference update
  2001. * LOC_CONSTANT added for better constant handling
  2002. * secondadd splitted in multiple routines
  2003. * location_force_reg added for loading a location to a register
  2004. of a specified size
  2005. * secondassignment parses now first the right and then the left node
  2006. (this is compatible with Kylix). This saves a lot of push/pop especially
  2007. with string operations
  2008. * adapted some routines to use the new cg methods
  2009. }