nmem.pas 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. {
  2. $Id$
  3. Copyright (C) 1998-2000 by Florian Klaempfl
  4. This unit implements load nodes etc.
  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 nmem;
  19. interface
  20. uses
  21. tree,symtable;
  22. type
  23. ploadnode = ^tloadnode;
  24. tloadnode = object(tnode)
  25. symtableentry : psym;
  26. symtable : psymtable;
  27. is_absolute,is_first,is_methodpointer : boolean;
  28. constructor init(v : psym;st : psymtable);
  29. destructor done;virtual;
  30. procedure det_temp;virtual;
  31. procedure det_resulttype;virtual;
  32. procedure secondpass;virtual;
  33. end;
  34. tassigntyp = (at_normal,at_plus,at_minus,at_star,at_slash);
  35. passignmentnode = ^tassignmentnode;
  36. tassignmentnode = object(tbinarynode)
  37. assigntyp : tassigntyp;
  38. constructor init(l,r : pnode);
  39. destructor done;virtual;
  40. procedure det_temp;virtual;
  41. procedure det_resulttype;virtual;
  42. procedure secondpass;virtual;
  43. end;
  44. var
  45. { this is necessary for the const section }
  46. simple_loadn : boolean;
  47. p2_assignment : procedure(p : passignmentnode);
  48. p2_assignment_flags : procedure(p : passignmentnode);
  49. p2_assignment_string : procedure(p : passignmentnode);
  50. p2_assignment_int64_reg : procedure(p : passignmentnode);
  51. implementation
  52. uses
  53. cobjects,globals,aasm,cgbase,cgobj,types,verbose,tgobj,tgcpu,symconst,
  54. cpubase,cpuasm,ncon;
  55. {****************************************************************************
  56. TLOADNODE
  57. ****************************************************************************}
  58. constructor tloadnode.init(v : psym;st : psymtable);
  59. var
  60. p : ptree;
  61. begin
  62. inherited init;
  63. treetype:=loadn;
  64. if v^.typ=varsym then
  65. resulttype:=pvarsym(v)^.vartype.def;
  66. symtableentry:=v;
  67. symtable:=st;
  68. is_first := False;
  69. is_methodpointer:=false;
  70. { method pointer load nodes can use the left subtree }
  71. { !!!!! left:=nil; }
  72. end;
  73. destructor tloadnode.done;
  74. begin
  75. inherited done;
  76. { method pointer load nodes can use the left subtree }
  77. { !!!!! dispose(left,done); }
  78. end;
  79. procedure tloadnode.det_temp;
  80. begin
  81. end;
  82. procedure tloadnode.det_resulttype;
  83. begin
  84. end;
  85. procedure tloadnode.secondpass;
  86. var
  87. hregister : tregister;
  88. symtabletype : tsymtabletype;
  89. i : longint;
  90. hp : preference;
  91. begin
  92. simple_loadn:=true;
  93. reset_reference(location.reference);
  94. case symtableentry^.typ of
  95. { this is only for toasm and toaddr }
  96. absolutesym :
  97. begin
  98. if (pabsolutesym(symtableentry)^.abstyp=toaddr) then
  99. begin
  100. {$ifdef i386}
  101. { absseg is go32v2 target specific }
  102. if pabsolutesym(symtableentry)^.absseg then
  103. location.reference.segment:=R_FS;
  104. {$endif i386}
  105. location.reference.offset:=pabsolutesym(symtableentry)^.address;
  106. end
  107. else
  108. location.reference.symbol:=newasmsymbol(symtableentry^.mangledname);
  109. end;
  110. varsym :
  111. begin
  112. hregister:=R_NO;
  113. { C variable }
  114. if (vo_is_C_var in pvarsym(symtableentry)^.varoptions) then
  115. begin
  116. location.reference.symbol:=newasmsymbol(symtableentry^.mangledname);
  117. end
  118. {$ifdef dummy}
  119. { DLL variable, DLL variables are only available on the win32 target }
  120. { maybe we've to add this later for the alpha WinNT }
  121. else if vo_is_dll_var in pvarsym(symtableentry)^.varoptions then
  122. begin
  123. hregister:=tg.getregisterint;
  124. location.reference.symbol:=newasmsymbol(symtableentry^.mangledname);
  125. exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,newreference(location.reference),hregister)));
  126. location.reference.symbol:=nil;
  127. location.reference.base:=hregister;
  128. end
  129. {$endif dummy}
  130. else
  131. begin
  132. {$ifdef dummy}
  133. symtabletype:=symtable^.symtabletype;
  134. { in case it is a register variable: }
  135. if pvarsym(symtableentry)^.reg<>R_NO then
  136. begin
  137. if pvarsym(symtableentry)^.reg in fpuregs then
  138. begin
  139. location.loc:=LOC_CFPUREGISTER;
  140. tg.unusedregsfpu:=tg.unusedregsfpu-[pvarsym(symtableentry)^.reg];
  141. end
  142. else
  143. begin
  144. location.loc:=LOC_CREGISTER;
  145. tg.unusedregsint:=tg.unusedregsint-[pvarsym(symtableentry)^.reg];
  146. end;
  147. location.register:=pvarsym(symtableentry)^.reg;
  148. end
  149. else
  150. begin
  151. { first handle local and temporary variables }
  152. if (symtabletype in [parasymtable,inlinelocalsymtable,
  153. inlineparasymtable,localsymtable]) then
  154. begin
  155. location.reference.base:=procinfo.framepointer;
  156. location.reference.offset:=pvarsym(symtableentry)^.address;
  157. if (symtabletype in [localsymtable,inlinelocalsymtable]) and
  158. not(use_esp_stackframe) then
  159. location.reference.offset:=-location.reference.offset;
  160. if (lexlevel>(symtable^.symtablelevel)) then
  161. begin
  162. hregister:=tg.getregisterint;
  163. { make a reference }
  164. hp:=new_reference(procinfo^.framepointer,
  165. procinfo^.framepointer_offset);
  166. exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister)));
  167. simple_loadn:=false;
  168. i:=lexlevel-1;
  169. while i>(symtable^.symtablelevel) do
  170. begin
  171. { make a reference }
  172. hp:=new_reference(hregister,8);
  173. exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister)));
  174. dec(i);
  175. end;
  176. location.reference.base:=hregister;
  177. end;
  178. end
  179. else
  180. case symtabletype of
  181. unitsymtable,globalsymtable,
  182. staticsymtable : begin
  183. location.reference.symbol:=newasmsymbol(symtableentry^.mangledname);
  184. end;
  185. stt_exceptsymtable:
  186. begin
  187. location.reference.base:=procinfo^.framepointer;
  188. location.reference.offset:=pvarsym(symtableentry)^.address;
  189. end;
  190. objectsymtable:
  191. begin
  192. if sp_static in pvarsym(symtableentry)^.symoptions then
  193. begin
  194. location.reference.symbol:=newasmsymbol(symtableentry^.mangledname);
  195. end
  196. else
  197. begin
  198. location.reference.base:=self_pointer;
  199. location.reference.offset:=pvarsym(symtableentry)^.address;
  200. end;
  201. end;
  202. withsymtable:
  203. begin
  204. hregister:=tg.getregisterint;
  205. location.reference.base:=hregister;
  206. { make a reference }
  207. { symtable datasize field
  208. contains the offset of the temp
  209. stored }
  210. hp:=new_reference(procinfo^.framepointer,
  211. symtable^.datasize);
  212. exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister)));
  213. location.reference.offset:=
  214. pvarsym(symtableentry)^.address;
  215. end;
  216. end;
  217. end;
  218. { in case call by reference, then calculate: }
  219. if (pvarsym(symtableentry)^.varspez=vs_var) or
  220. is_open_array(pvarsym(symtableentry)^.definition) or
  221. is_array_of_const(pvarsym(symtableentry)^.definition) or
  222. ((pvarsym(symtableentry)^.varspez=vs_const) and
  223. push_addr_param(pvarsym(symtableentry)^.definition)) then
  224. begin
  225. simple_loadn:=false;
  226. if hregister=R_NO then
  227. hregister:=tg.getregisterint;
  228. if is_open_array(pvarsym(symtableentry)^.definition) or
  229. is_open_string(pvarsym(symtableentry)^.definition) then
  230. begin
  231. if (location.reference.base=procinfo^.framepointer) then
  232. begin
  233. highframepointer:=location.reference.base;
  234. highoffset:=location.reference.offset;
  235. end
  236. else
  237. begin
  238. highframepointer:=R_EDI;
  239. highoffset:=location.reference.offset;
  240. exprasmlist^.concat(new(paicpu,op_reg_reg(A_MOV,S_L,
  241. location.reference.base,R_EDI)));
  242. end;
  243. end;
  244. if location.loc=LOC_CREGISTER then
  245. begin
  246. exprasmlist^.concat(new(paicpu,op_reg_reg(A_MOV,S_L,
  247. location.register,hregister)));
  248. location.loc:=LOC_REFERENCE;
  249. end
  250. else
  251. begin
  252. exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,
  253. newreference(location.reference),
  254. hregister)));
  255. end;
  256. reset_reference(location.reference);
  257. location.reference.base:=hregister;
  258. end;
  259. {$endif dummy}
  260. end;
  261. end;
  262. procsym:
  263. begin
  264. {!!!!!!!!!!}
  265. end;
  266. typedconstsym :
  267. begin
  268. location.reference.symbol:=newasmsymbol(symtableentry^.mangledname);
  269. end;
  270. else internalerror(4);
  271. end;
  272. end;
  273. {****************************************************************************
  274. TASSIGNMENTNODE
  275. ****************************************************************************}
  276. constructor tassignmentnode.init(l,r : pnode);
  277. begin
  278. inherited init(l,r);
  279. concat_string:=false;
  280. assigntyp:=at_normal;
  281. end;
  282. destructor tassignmentnode.done;
  283. begin
  284. inherited done;
  285. end;
  286. procedure tassignmentnode.det_temp;
  287. begin
  288. end;
  289. procedure tassignmentnode.det_resulttype;
  290. begin
  291. inherited det_resulttype;
  292. resulttype:=voiddef;
  293. { assignements to open arrays aren't allowed }
  294. if is_open_array(left^.resulttype) then
  295. CGMessage(type_e_mismatch);
  296. end;
  297. { updated from old cg on 29.2.00 by FK }
  298. procedure generic_p2_stringassignment(p : passignmentnode);
  299. begin
  300. if is_ansistring(left^.resulttype) then
  301. begin
  302. { the source and destinations are released
  303. in loadansistring, because an ansi string can
  304. also be in a register
  305. }
  306. loadansistring;
  307. end
  308. else
  309. if is_shortstring(left^.resulttype) then
  310. begin
  311. if is_ansistring(right^.resulttype) then
  312. begin
  313. if (right^.treetype=stringconstn) and
  314. (pstringconstnode(right)^.length=0) then
  315. begin
  316. cg^.a_load_const_ref(list,OS_8,0,left^.location.reference);
  317. tg.del_reference(left^.location.reference);
  318. end
  319. else
  320. loadansi2short(right,left);
  321. end
  322. else
  323. begin
  324. { we do not need destination anymore }
  325. tg.del_reference(left^.location.reference);
  326. { tg.del_reference(right^.location.reference);
  327. done in loadshortstring }
  328. loadshortstring;
  329. tg.ungetiftemp(right^.location.reference);
  330. end;
  331. end
  332. else if is_longstring(left^.resulttype) then
  333. begin
  334. abstract;
  335. end
  336. else
  337. begin
  338. { its the only thing we have to do }
  339. tg.del_reference(right^.location.reference);
  340. end
  341. end;
  342. procedure generic_p2_assignment_int64_reg(p : passignmentnode);
  343. begin
  344. { we don't know it better here }
  345. generic_p2_assignment(p);
  346. end;
  347. { updated from old cg on 29.2.00 by FK }
  348. procedure generic_p2_assignment_flags(p : passignmentnode);
  349. begin
  350. { for example the alpha doesn't have flags }
  351. abstract;
  352. end;
  353. { updated from old cg on 29.2.00 by FK }
  354. procedure generic_p2_assignment(p : passignmentnode);
  355. var
  356. opsize : topsize;
  357. otlabel,hlabel,oflabel : pasmlabel;
  358. fputyp : tfloattype;
  359. loc : tloc;
  360. r : preference;
  361. ai : paicpu;
  362. op : tasmop;
  363. begin
  364. loc:=left^.location.loc;
  365. case right^.location.loc of
  366. LOC_REFERENCE,
  367. LOC_MEM : begin
  368. { extra handling for ordinal constants }
  369. if (p^.right^.treetype in [ordconstn,fixconstn]) or
  370. (loc=LOC_CREGISTER) then
  371. begin
  372. case p^.left^.resulttype^.size of
  373. 1 : opsize:=OS_8;
  374. 2 : opsize:=OS_16;
  375. 4 : opsize:=OS_32;
  376. 8 : opsize:=OS_64;
  377. end;
  378. if loc=LOC_CREGISTER then
  379. begin
  380. emit_ref_reg(A_MOV,opsize,
  381. newreference(p^.right^.location.reference),
  382. p^.left^.location.register);
  383. !!!!!!!!!!!! only 32 bit cpus
  384. if is_64bitint(p^.right^.resulttype) then
  385. begin
  386. r:=newreference(p^.right^.location.reference);
  387. inc(r^.offset,4);
  388. emit_ref_reg(A_MOV,opsize,r,
  389. p^.left^.location.registerhigh);
  390. end;
  391. tg.del_reference(right^.location.reference);
  392. end
  393. else
  394. begin
  395. emit_const_ref(A_MOV,opsize,
  396. p^.right^.location.reference.offset,
  397. newreference(p^.left^.location.reference));
  398. !!!!!!!!!!!! only 32 bit cpus
  399. if is_64bitint(p^.right^.resulttype) then
  400. begin
  401. r:=newreference(p^.left^.location.reference);
  402. inc(r^.offset,4);
  403. emit_const_ref(A_MOV,opsize,
  404. 0,r);
  405. end;
  406. del_reference(left^.location.reference);
  407. end;
  408. end
  409. !!!!!!!!!!!! only 386
  410. else if loc=LOC_CFPUREGISTER then
  411. begin
  412. floatloadops(pfloatdef(p^.right^.resulttype)^.typ,op,opsize);
  413. emit_ref(op,opsize,
  414. newreference(p^.right^.location.reference));
  415. emit_reg(A_FSTP,S_NO,
  416. correct_fpuregister(p^.left^.location.register,fpuvaroffset+1));
  417. end
  418. else
  419. begin
  420. if (right^.resulttype^.needs_inittable) and
  421. ((right^.resulttype^.deftype<>objectdef) or
  422. not(pobjectdef(right^.resulttype)^.is_class)) then
  423. begin
  424. { this would be a problem }
  425. if not(left^.resulttype^.needs_inittable) then
  426. internalerror(292001);
  427. { increment source reference counter }
  428. new(r);
  429. reset_reference(r^);
  430. r^.symbol:=p^.right^.resulttype^.get_inittable_label;
  431. emitpushreferenceaddr(r^);
  432. emitpushreferenceaddr(p^.right^.location.reference);
  433. emitcall('FPC_ADDREF');
  434. { decrement destination reference counter }
  435. new(r);
  436. reset_reference(r^);
  437. r^.symbol:=p^.left^.resulttype^.get_inittable_label;
  438. emitpushreferenceaddr(r^);
  439. emitpushreferenceaddr(p^.left^.location.reference);
  440. emitcall('FPC_DECREF');
  441. end;
  442. {$ifdef regallocfix}
  443. concatcopy(p^.right^.location.reference,
  444. p^.left^.location.reference,p^.left^.resulttype^.size,true,false);
  445. ungetiftemp(p^.right^.location.reference);
  446. {$Else regallocfix}
  447. concatcopy(p^.right^.location.reference,
  448. p^.left^.location.reference,p^.left^.resulttype^.size,false,false);
  449. ungetiftemp(p^.right^.location.reference);
  450. {$endif regallocfix}
  451. end;
  452. end;
  453. {$ifdef SUPPORT_MMX}
  454. LOC_CMMXREGISTER,
  455. LOC_MMXREGISTER:
  456. begin
  457. if loc=LOC_CMMXREGISTER then
  458. emit_reg_reg(A_MOVQ,S_NO,
  459. p^.right^.location.register,p^.left^.location.register)
  460. else
  461. emit_reg_ref(A_MOVQ,S_NO,
  462. p^.right^.location.register,newreference(p^.left^.location.reference));
  463. end;
  464. {$endif SUPPORT_MMX}
  465. LOC_REGISTER,
  466. LOC_CREGISTER : begin
  467. case p^.right^.resulttype^.size of
  468. 1 : opsize:=OS_8;
  469. 2 : opsize:=OS_16;
  470. 4 : opsize:=OS_32;
  471. 8 : opsize:=OS_64;
  472. end;
  473. { simplified with op_reg_loc }
  474. if loc=LOC_CREGISTER then
  475. begin
  476. emit_reg_reg(A_MOV,opsize,
  477. p^.right^.location.register,
  478. p^.left^.location.register);
  479. ungetregister(p^.right^.location.register);
  480. end
  481. else
  482. Begin
  483. emit_reg_ref(A_MOV,opsize,
  484. p^.right^.location.register,
  485. newreference(p^.left^.location.reference));
  486. ungetregister(p^.right^.location.register);
  487. del_reference(p^.left^.location.reference);
  488. end;
  489. if is_64bitint(p^.right^.resulttype) then
  490. begin
  491. { simplified with op_reg_loc }
  492. if loc=LOC_CREGISTER then
  493. emit_reg_reg(A_MOV,opsize,
  494. p^.right^.location.registerhigh,
  495. p^.left^.location.registerhigh)
  496. else
  497. begin
  498. r:=newreference(p^.left^.location.reference);
  499. inc(r^.offset,4);
  500. emit_reg_ref(A_MOV,opsize,
  501. p^.right^.location.registerhigh,r);
  502. end;
  503. end;
  504. end;
  505. LOC_FPU : begin
  506. if (p^.left^.resulttype^.deftype=floatdef) then
  507. fputyp:=pfloatdef(p^.left^.resulttype)^.typ
  508. else
  509. if (p^.right^.resulttype^.deftype=floatdef) then
  510. fputyp:=pfloatdef(p^.right^.resulttype)^.typ
  511. else
  512. if (p^.right^.treetype=typeconvn) and
  513. (p^.right^.left^.resulttype^.deftype=floatdef) then
  514. fputyp:=pfloatdef(p^.right^.left^.resulttype)^.typ
  515. else
  516. fputyp:=s32real;
  517. case loc of
  518. LOC_CFPUREGISTER:
  519. begin
  520. emit_reg(A_FSTP,S_NO,
  521. correct_fpuregister(p^.left^.location.register,fpuvaroffset));
  522. dec(fpuvaroffset);
  523. end;
  524. LOC_REFERENCE:
  525. floatstore(fputyp,p^.left^.location.reference);
  526. else
  527. internalerror(48991);
  528. end;
  529. end;
  530. !!!!!!!!!!!! only 386
  531. LOC_CFPUREGISTER: begin
  532. if (p^.left^.resulttype^.deftype=floatdef) then
  533. fputyp:=pfloatdef(p^.left^.resulttype)^.typ
  534. else
  535. if (p^.right^.resulttype^.deftype=floatdef) then
  536. fputyp:=pfloatdef(p^.right^.resulttype)^.typ
  537. else
  538. if (p^.right^.treetype=typeconvn) and
  539. (p^.right^.left^.resulttype^.deftype=floatdef) then
  540. fputyp:=pfloatdef(p^.right^.left^.resulttype)^.typ
  541. else
  542. fputyp:=s32real;
  543. emit_reg(A_FLD,S_NO,
  544. correct_fpuregister(p^.right^.location.register,fpuvaroffset));
  545. inc(fpuvaroffset);
  546. case loc of
  547. LOC_CFPUREGISTER:
  548. begin
  549. emit_reg(A_FSTP,S_NO,
  550. correct_fpuregister(p^.right^.location.register,fpuvaroffset));
  551. dec(fpuvaroffset);
  552. end;
  553. LOC_REFERENCE:
  554. floatstore(fputyp,p^.left^.location.reference);
  555. else
  556. internalerror(48992);
  557. end;
  558. end;
  559. LOC_JUMP : begin
  560. { support every type of boolean here }
  561. case p^.right^.resulttype^.size of
  562. 1 : opsize:=OS_8;
  563. 2 : opsize:=OS_16;
  564. 4 : opsize:=OS_32;
  565. { this leads to an efficiency of 1.5 }
  566. { per cent regarding memory usage .... }
  567. 8 : opsize:=OS_64;
  568. end;
  569. getlabel(hlabel);
  570. a_label(p^.list,p^.truelabel);
  571. if loc=LOC_CREGISTER then
  572. a_load_const_reg(p^.list,opsize,1,
  573. p^.left^.location.register)
  574. else
  575. a_load_const_ref(p^.list,opsize,1,
  576. newreference(p^.left^.location.reference));
  577. a_jmp_cond(p^.list,C_None,hlabel);
  578. a_label(p^.list,p^.falselabel);
  579. if loc=LOC_CREGISTER then
  580. a_load_const_reg(p^.list,opsize,0,
  581. p^.left^.location.register);
  582. else
  583. begin
  584. a_load_const_ref(p^.list,opsize,0,
  585. newreference(p^.left^.location.reference));
  586. tg.del_reference(p^.left^.location.reference);
  587. end;
  588. a_label(p^.list,hlabel);
  589. end;
  590. LOC_FLAGS:
  591. p2_assignment_flags(p);
  592. end;
  593. end;
  594. procedure tassignmentnode.secondpass;
  595. var
  596. r : treference;
  597. opsize : tcgsize;
  598. begin
  599. if not(left^.location.loc in lvaluelocations) then
  600. begin
  601. CGMessage(cg_e_illegal_expression);
  602. exit;
  603. end;
  604. if left^.resulttype^.deftype=stringdef then
  605. p2_assignment_string(@self);
  606. { if is an int64 which has to do with registers, we
  607. need to call probably a procedure for 32 bit processors
  608. }
  609. else if is_64bitint(left^.resulttype) and
  610. ((left^.location in [LOC_REGISGTER,LOC_CREGISTER) or
  611. (left^.location in [LOC_REGISGTER,LOC_CREGISTER)) then
  612. else
  613. p2_assignment_int64_reg(@self)
  614. else
  615. p2_assignment(@self);
  616. end;
  617. begin
  618. p2_assignment:=@generic_p2_assignment;
  619. p2_assignment_flags:=p2_assignment_flags;
  620. p2_assignment_string:=@generic_p2_assignment_string;
  621. p2_assignment_int64_reg:=@generic_p2_assignment_int64_reg;
  622. end.
  623. {
  624. $Log$
  625. Revision 1.17 2000-03-01 15:36:13 florian
  626. * some new stuff for the new cg
  627. Revision 1.16 2000/01/07 01:14:53 peter
  628. * updated copyright to 2000
  629. Revision 1.15 1999/12/06 18:17:10 peter
  630. * newcg compiler compiles again
  631. Revision 1.14 1999/10/12 21:20:46 florian
  632. * new codegenerator compiles again
  633. Revision 1.13 1999/09/15 20:35:46 florian
  634. * small fix to operator overloading when in MMX mode
  635. + the compiler uses now fldz and fld1 if possible
  636. + some fixes to floating point registers
  637. + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined
  638. * .... ???
  639. Revision 1.12 1999/09/14 11:16:09 florian
  640. * only small updates to work with the current compiler
  641. Revision 1.11 1999/08/25 12:00:12 jonas
  642. * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
  643. Revision 1.10 1999/08/18 17:05:56 florian
  644. + implemented initilizing of data for the new code generator
  645. so it should compile now simple programs
  646. Revision 1.9 1999/08/06 18:05:54 florian
  647. * implemented some stuff for assignments
  648. Revision 1.8 1999/08/06 15:53:51 florian
  649. * made the alpha version compilable
  650. Revision 1.7 1999/08/05 17:10:57 florian
  651. * some more additions, especially procedure
  652. exit code generation
  653. Revision 1.6 1999/08/05 14:58:13 florian
  654. * some fixes for the floating point registers
  655. * more things for the new code generator
  656. Revision 1.5 1999/08/04 00:23:56 florian
  657. * renamed i386asm and i386base to cpuasm and cpubase
  658. Revision 1.4 1999/08/03 17:09:45 florian
  659. * the alpha compiler can be compiled now
  660. Revision 1.3 1999/08/02 17:14:08 florian
  661. + changed the temp. generator to an object
  662. Revision 1.2 1999/08/01 18:22:35 florian
  663. * made it again compilable
  664. Revision 1.1 1999/01/24 22:32:36 florian
  665. * well, more changes, especially parts of secondload ported
  666. }