regvars.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl and Jonas Maebe
  4. This unit handles register variable allocation
  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 regvars;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. aasmbase,aasmtai,aasmcpu,
  23. node,
  24. symsym,
  25. cpubase, cgbase, tgobj;
  26. {$ifdef OLDREGVARS}
  27. procedure assign_regvars(p: tnode);
  28. procedure load_regvars(asml: TAAsmoutput; p: tnode);
  29. procedure cleanup_regvars(asml: TAAsmoutput);
  30. procedure store_regvar(asml: TAAsmoutput; reg: tregister);
  31. procedure load_regvar(asml: TAAsmoutput; vsym: tvarsym);
  32. procedure load_regvar_reg(asml: TAAsmoutput; reg: tregister);
  33. procedure load_all_regvars(asml: TAAsmoutput);
  34. procedure free_regvars(list: taasmoutput);
  35. { procedure translate_regvars(list: taasmoutput); }
  36. {$endif OLDREGVARS}
  37. {$ifdef i386}
  38. (*
  39. procedure sync_regvars_other(list1, list2: taasmoutput; const regvarsloaded1,
  40. regvarsloaded2: regvarother_booleanarray);
  41. procedure sync_regvars_int(list1, list2: taasmoutput; const regvarsloaded1,
  42. regvarsloaded2: Tsuperregisterset);
  43. *)
  44. {$endif i386}
  45. implementation
  46. uses
  47. globtype,systems,comphook,
  48. cutils,cclasses,verbose,globals,
  49. psub,
  50. symconst,symbase,symtype,symdef,paramgr,defutil,
  51. cpuinfo,cgobj,procinfo;
  52. {$ifdef OLDREGVARS}
  53. procedure searchregvars(p : tnamedindexitem;arg:pointer);
  54. var
  55. i,j,k : longint;
  56. parasym : boolean;
  57. begin
  58. parasym:=pboolean(arg)^;
  59. if (tsym(p).typ=varsym) and ((tvarsym(p).varregable <> vr_none) or
  60. ((tvarsym(p).varspez in [vs_var,vs_const,vs_out]) and
  61. paramanager.push_addr_param(tvarsym(p).varspez,tvarsym(p).vartype.def,current_procinfo.procdef.proccalloption))) and
  62. not tvarsym(p).vartype.def.needs_inittable then
  63. begin
  64. j:=tvarsym(p).refs;
  65. { walk through all momentary register variables }
  66. for i:=1 to maxvarregs do
  67. begin
  68. with pregvarinfo(current_procinfo.procdef.regvarinfo)^ do
  69. if ((regvars[i]=nil) or (j>regvars_refs[i])) and (j>0) then
  70. begin
  71. for k:=maxvarregs-1 downto i do
  72. begin
  73. regvars[k+1]:=regvars[k];
  74. regvars_para[k+1]:=regvars_para[k];
  75. regvars_refs[k+1]:=regvars_refs[k];
  76. end;
  77. { calc the new refs
  78. tvarsym(p).refs:=j; }
  79. regvars[i]:=tsym(p);
  80. regvars_para[i]:=parasym;
  81. regvars_refs[i]:=j;
  82. break;
  83. end;
  84. end;
  85. end;
  86. end;
  87. procedure searchfpuregvars(p : tnamedindexitem;arg:pointer);
  88. var
  89. i,j,k : longint;
  90. parasym : boolean;
  91. begin
  92. parasym:=pboolean(arg)^;
  93. if (tsym(p).typ=varsym) and (tvarsym(p).varregable <> vr_none) then
  94. begin
  95. j:=tvarsym(p).refs;
  96. { parameter get a less value }
  97. { walk through all momentary register variables }
  98. for i:=1 to maxfpuvarregs do
  99. begin
  100. with pregvarinfo(current_procinfo.procdef.regvarinfo)^ do
  101. if ((fpuregvars[i]=nil) or (j>fpuregvars_refs[i])) and (j>0) then
  102. begin
  103. for k:=maxfpuvarregs-1 downto i do
  104. begin
  105. fpuregvars[k+1]:=fpuregvars[k];
  106. fpuregvars_para[k+1]:=fpuregvars_para[k];
  107. fpuregvars_refs[k+1]:=fpuregvars_refs[k];
  108. end;
  109. { calc the new refs
  110. tvarsym(p).refs:=j; }
  111. fpuregvars[i]:=tsym(p);
  112. fpuregvars_para[i]:=parasym;
  113. fpuregvars_refs[i]:=j;
  114. break;
  115. end;
  116. end;
  117. end;
  118. end;
  119. procedure assign_regvars(p: tnode);
  120. { register variables }
  121. var
  122. {$ifndef i386}
  123. hp: tparaitem;
  124. {$endif i386}
  125. regvarinfo: pregvarinfo;
  126. i: longint;
  127. parasym : boolean;
  128. siz : tcgsize;
  129. begin
  130. { max. optimizations }
  131. { only if no asm is used }
  132. { and no try statement }
  133. if (cs_regvars in aktglobalswitches) and
  134. { we have to store regvars back to memory in this case (the nested }
  135. { procedures can access the variables of the parent) }
  136. (tcgprocinfo(current_procinfo).nestedprocs.count = 0) and
  137. not(pi_has_assembler_block in current_procinfo.flags) and
  138. not(pi_uses_exceptions in current_procinfo.flags) then
  139. begin
  140. new(regvarinfo);
  141. fillchar(regvarinfo^,sizeof(regvarinfo^),0);
  142. current_procinfo.procdef.regvarinfo := regvarinfo;
  143. if (p.registersint<maxvarregs) then
  144. begin
  145. parasym:=false;
  146. symtablestack.foreach_static(searchregvars,@parasym);
  147. { copy parameter into a register ? }
  148. parasym:=true;
  149. symtablestack.next.foreach_static(searchregvars,@parasym);
  150. { hold needed registers free }
  151. for i:=maxvarregs downto maxvarregs-p.registersint+1 do
  152. begin
  153. regvarinfo^.regvars[i]:=nil;
  154. regvarinfo^.regvars_para[i] := false;
  155. end;
  156. { now assign register }
  157. for i:=1 to maxvarregs-p.registersint do
  158. begin
  159. if assigned(regvarinfo^.regvars[i]) and
  160. { currently we assume we can use registers for all }
  161. { regvars if procedure does no call }
  162. (not(pi_do_call in current_procinfo.flags) or
  163. { otherwise, demand some (arbitrary) minimum usage }
  164. (tvarsym(regvarinfo^.regvars[i]).refs > 100)) then
  165. begin
  166. { register is no longer available for }
  167. { expressions }
  168. { search the register which is the most }
  169. { unused }
  170. { call by reference/const ? }
  171. if paramanager.push_addr_param(tvarsym(regvarinfo^.regvars[i]).varspez,tvarsym(regvarinfo^.regvars[i]).vartype.def,current_procinfo.procdef.proccalloption) then
  172. siz:=OS_32
  173. else
  174. if (tvarsym(regvarinfo^.regvars[i]).vartype.def.deftype in [orddef,enumdef]) and
  175. (tvarsym(regvarinfo^.regvars[i]).vartype.def.size=1) then
  176. siz:=OS_8
  177. else
  178. if (tvarsym(regvarinfo^.regvars[i]).vartype.def.deftype in [orddef,enumdef]) and
  179. (tvarsym(regvarinfo^.regvars[i]).vartype.def.size=2) then
  180. siz:=OS_16
  181. else
  182. siz:=OS_32;
  183. { allocate a register for this regvar }
  184. tvarsym(regvarinfo^.regvars[i]).localloc.register:=cg.getintregister(exprasmlist,siz);
  185. tvarsym(regvarinfo^.regvars[i]).localloc.loc:=LOC_REGISTER;
  186. { and make sure it can't be freed }
  187. { rg.makeregvarint(getsupreg(regvarinfo^.regvars[i].localloc.register));}
  188. end
  189. else
  190. begin
  191. regvarinfo^.regvars[i] := nil;
  192. regvarinfo^.regvars_para[i] := false;
  193. end;
  194. end;
  195. end;
  196. if ((p.registersfpu+1)<maxfpuvarregs) then
  197. begin
  198. parasym:=false;
  199. symtablestack.foreach_static(searchfpuregvars,@parasym);
  200. {$ifndef i386}
  201. { this code should be never enabled because }
  202. { 1. the caller loads parameters into registers }
  203. { 2. (later) the CSE loads a parameter into a }
  204. { register, if necessary }
  205. { (FK) }
  206. { copy parameter into a register ? }
  207. parasym:=true;
  208. symtablestack.next.foreach_static(searchregvars,@parasym);
  209. {$endif i386}
  210. { hold needed registers free }
  211. { in non leaf procedures we must be very careful }
  212. { with assigning registers }
  213. {$ifdef i386}
  214. if aktmaxfpuregisters=-1 then
  215. begin
  216. if (pi_do_call in current_procinfo.flags) then
  217. begin
  218. for i:=maxfpuvarregs downto 2 do
  219. regvarinfo^.fpuregvars[i]:=nil;
  220. end
  221. else
  222. {$endif i386}
  223. begin
  224. for i:=maxfpuvarregs downto maxfpuvarregs-p.registersfpu do
  225. regvarinfo^.fpuregvars[i]:=nil;
  226. end;
  227. {$ifdef i386}
  228. end
  229. else
  230. begin
  231. for i:=aktmaxfpuregisters+1 to maxfpuvarregs do
  232. regvarinfo^.fpuregvars[i]:=nil;
  233. end;
  234. {$endif i386}
  235. { now assign register }
  236. for i:=1 to maxfpuvarregs do
  237. begin
  238. if assigned(regvarinfo^.fpuregvars[i]) then
  239. begin
  240. {$ifdef i386}
  241. { reserve place on the FPU stack }
  242. {$error fixme x86 fpuregvars}
  243. { regvarinfo^.fpuregvars[i].localloc.register:=trgcpu(rg).correct_fpuregister(NR_ST0,i);}
  244. {$else i386}
  245. {$ifdef x86_64}
  246. {$endif x86_64}
  247. begin
  248. tvarsym(regvarinfo^.fpuregvars[i]).localloc.register:=cg.getfpuregister(exprasmlist,OS_F64);
  249. tvarsym(regvarinfo^.fpuregvars[i]).localloc.loc:=LOC_FPUREGISTER;
  250. { rg.makeregvarother(regvarinfo^.fpuregvars[i].localloc.register);}
  251. end;
  252. {$endif i386}
  253. end;
  254. end;
  255. end;
  256. end;
  257. end;
  258. procedure store_regvar(asml: TAAsmoutput; reg: tregister);
  259. var
  260. i: longint;
  261. cgsize : tcgsize;
  262. r : tregister;
  263. hr: treference;
  264. regvarinfo: pregvarinfo;
  265. vsym: tvarsym;
  266. regidx : tregisterindex;
  267. supreg : tsuperregister;
  268. begin
  269. {$ifdef i386}
  270. regvarinfo := pregvarinfo(current_procinfo.procdef.regvarinfo);
  271. if not assigned(regvarinfo) then
  272. exit;
  273. if getregtype(reg)=R_INTREGISTER then
  274. begin
  275. supreg:=getsupreg(reg);
  276. for i := 1 to maxvarregs do
  277. if assigned(regvarinfo^.regvars[i]) and
  278. (getsupreg(tvarsym(regvarinfo^.regvars[i]).localloc.register)=supreg) then
  279. begin
  280. {$warning fixme regvar_loaded_int}
  281. (* if supreg in rg.regvar_loaded_int then
  282. begin
  283. vsym := tvarsym(regvarinfo^.regvars[i]);
  284. { we only have to store the regvar back to memory if it's }
  285. { possible that it's been modified (JM) }
  286. if not(vsym.varspez in [vs_const,vs_var,vs_out]) then
  287. begin
  288. {$warning FIXME Check vsym.localloc for regvars}
  289. // reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
  290. cgsize:=def_cgsize(vsym.vartype.def);
  291. cg.a_load_reg_ref(asml,cgsize,cgsize,vsym.localloc.register,hr);
  292. end;
  293. asml.concat(tai_regalloc.dealloc(vsym.localloc.register));
  294. exclude(rg.regvar_loaded_int,supreg);
  295. end;
  296. *)
  297. break;
  298. end;
  299. end
  300. else
  301. begin
  302. for i := 1 to maxvarregs do
  303. if assigned(regvarinfo^.regvars[i]) then
  304. begin
  305. {$warning fixme regvars}
  306. (*
  307. r:=rg.makeregsize(regvarinfo^.regvars[i].localloc.register,OS_INT);
  308. if (r = reg) then
  309. begin
  310. regidx:=findreg_by_number(r);
  311. if rg.regvar_loaded_other[regidx] then
  312. begin
  313. vsym := tvarsym(regvarinfo^.regvars[i]);
  314. { we only have to store the regvar back to memory if it's }
  315. { possible that it's been modified (JM) }
  316. if not(vsym.varspez in [vs_const,vs_var,vs_out]) then
  317. begin
  318. {$warning FIXME Check vsym.localloc for regvars}
  319. // reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
  320. cgsize:=def_cgsize(vsym.vartype.def);
  321. cg.a_load_reg_ref(asml,cgsize,cgsize,vsym.localloc.register,hr);
  322. end;
  323. asml.concat(tai_regalloc.dealloc(vsym.localloc.register));
  324. rg.regvar_loaded_other[regidx] := false;
  325. end;
  326. break;
  327. end;
  328. *)
  329. end;
  330. end;
  331. {$endif i386}
  332. end;
  333. procedure load_regvar(asml: TAAsmoutput; vsym: tvarsym);
  334. var
  335. hr: treference;
  336. opsize: tcgsize;
  337. r,
  338. reg : tregister;
  339. regidx : tregisterindex;
  340. begin
  341. {$ifndef i386}
  342. exit;
  343. {$endif i386}
  344. reg:=vsym.localloc.register;
  345. {$warning fixme regvars}
  346. (*
  347. if getregtype(reg)=R_INTREGISTER then
  348. begin
  349. if not(getsupreg(reg) in rg.regvar_loaded_int) then
  350. begin
  351. asml.concat(tai_regalloc.alloc(reg));
  352. {$warning FIXME Check vsym.localloc for regvars}
  353. // reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
  354. if paramanager.push_addr_param(vsym.varspez,vsym.vartype.def,current_procinfo.procdef.proccalloption) then
  355. opsize := OS_ADDR
  356. else
  357. opsize := def_cgsize(vsym.vartype.def);
  358. cg.a_load_ref_reg(asml,opsize,opsize,hr,reg);
  359. include(rg.regvar_loaded_int,getsupreg(reg));
  360. end;
  361. end
  362. else
  363. begin
  364. r:=rg.makeregsize(reg,OS_INT);
  365. regidx:=findreg_by_number(r);
  366. if not rg.regvar_loaded_other[regidx] then
  367. begin
  368. asml.concat(tai_regalloc.alloc(reg));
  369. {$warning FIXME Check vsym.localloc for regvars}
  370. // reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
  371. if paramanager.push_addr_param(vsym.varspez,vsym.vartype.def,current_procinfo.procdef.proccalloption) then
  372. opsize := OS_ADDR
  373. else
  374. opsize := def_cgsize(vsym.vartype.def);
  375. cg.a_load_ref_reg(asml,opsize,opsize,hr,reg);
  376. rg.regvar_loaded_other[regidx] := true;
  377. end;
  378. end;
  379. *)
  380. end;
  381. procedure load_regvar_reg(asml: TAAsmoutput; reg: tregister);
  382. var
  383. i: longint;
  384. regvarinfo: pregvarinfo;
  385. reg_spare : tregister;
  386. supreg : tsuperregister;
  387. begin
  388. {
  389. regvarinfo := pregvarinfo(current_procinfo.procdef.regvarinfo);
  390. if not assigned(regvarinfo) then
  391. exit;
  392. if getregtype(reg)=R_INTREGISTER then
  393. begin
  394. supreg:=getsupreg(reg);
  395. for i := 1 to maxvarregs do
  396. if assigned(regvarinfo^.regvars[i]) and
  397. (getsupreg(regvarinfo^.regvars[i].localloc.register) = supreg) then
  398. load_regvar(asml,tvarsym(regvarinfo^.regvars[i]))
  399. end
  400. else
  401. begin
  402. reg_spare := cg.makeregsize(reg,OS_INT);
  403. for i := 1 to maxvarregs do
  404. if assigned(regvarinfo^.regvars[i]) and
  405. (cg.makeregsize(regvarinfo^.regvars[i].localloc.register,OS_INT) = reg_spare) then
  406. load_regvar(asml,tvarsym(regvarinfo^.regvars[i]))
  407. end;
  408. }
  409. end;
  410. procedure load_all_regvars(asml: TAAsmoutput);
  411. {
  412. var
  413. i: longint;
  414. regvarinfo: pregvarinfo;
  415. }
  416. begin
  417. {
  418. regvarinfo := pregvarinfo(current_procinfo.procdef.regvarinfo);
  419. if not assigned(regvarinfo) then
  420. exit;
  421. for i := 1 to maxvarregs do
  422. if assigned(regvarinfo^.regvars[i]) then
  423. load_regvar(asml,tvarsym(regvarinfo^.regvars[i]))
  424. }
  425. end;
  426. procedure load_regvars(asml: TAAsmoutput; p: tnode);
  427. var
  428. i: longint;
  429. regvarinfo: pregvarinfo;
  430. begin
  431. if (cs_regvars in aktglobalswitches) and
  432. not(pi_has_assembler_block in current_procinfo.flags) and
  433. not(pi_uses_exceptions in current_procinfo.flags) then
  434. begin
  435. regvarinfo := pregvarinfo(current_procinfo.procdef.regvarinfo);
  436. { can happen when inlining assembler procedures (JM) }
  437. if not assigned(regvarinfo) then
  438. exit;
  439. for i:=1 to maxfpuvarregs do
  440. begin
  441. if assigned(regvarinfo^.fpuregvars[i]) then
  442. begin
  443. {$ifdef i386}
  444. { reserve place on the FPU stack }
  445. {$warning fixme fpustack}
  446. (*
  447. regvarinfo^.fpuregvars[i].localloc.register:=trgcpu(rg).correct_fpuregister(NR_ST0,i-1);
  448. *)
  449. asml.concat(Taicpu.op_none(A_FLDZ,S_NO));
  450. {$endif i386}
  451. end;
  452. end;
  453. {$ifdef i386}
  454. if assigned(p) then
  455. if cs_asm_source in aktglobalswitches then
  456. asml.insert(tai_comment.Create(strpnew(tostr(p.registersfpu)+
  457. ' registers on FPU stack used by temp. expressions')));
  458. {$endif i386}
  459. {
  460. for i:=1 to maxfpuvarregs do
  461. begin
  462. if assigned(regvarinfo^.fpuregvars[i]) then
  463. begin
  464. if cs_asm_source in aktglobalswitches then
  465. asml.insert(tai_comment.Create(strpnew(regvarinfo^.fpuregvars[i].name+
  466. ' with weight '+tostr(regvarinfo^.fpuregvars[i].refs)+' assigned to register '+
  467. std_regname(regvarinfo^.fpuregvars[i].localloc.register))));
  468. if (status.verbosity and v_debug)=v_debug then
  469. Message3(cg_d_register_weight,std_regname(regvarinfo^.fpuregvars[i].localloc.register),
  470. tostr(regvarinfo^.fpuregvars[i].refs),regvarinfo^.fpuregvars[i].name);
  471. end;
  472. end;
  473. if cs_asm_source in aktglobalswitches then
  474. asml.insert(tai_comment.Create(strpnew('Register variable assignment:')));
  475. }
  476. end;
  477. end;
  478. {$ifdef i386}
  479. (*
  480. procedure sync_regvars_other(list1, list2: taasmoutput; const regvarsloaded1,
  481. regvarsloaded2: regvarother_booleanarray);
  482. var
  483. counter: tregisterindex;
  484. begin
  485. for counter := low(rg.regvar_loaded_other) to high(rg.regvar_loaded_other) do
  486. begin
  487. rg.regvar_loaded_other[counter] := regvarsloaded1[counter] and
  488. regvarsloaded2[counter];
  489. if regvarsloaded1[counter] xor regvarsloaded2[counter] then
  490. if regvarsloaded1[counter] then
  491. load_regvar_reg(list2,counter)
  492. else
  493. load_regvar_reg(list1,counter);
  494. end;
  495. end;
  496. procedure sync_regvars_int(list1, list2: taasmoutput; const regvarsloaded1,
  497. regvarsloaded2: Tsuperregisterset);
  498. var
  499. i : longint;
  500. r : tregister;
  501. begin
  502. for i:=1 to maxvarregs do
  503. begin
  504. r:=newreg(R_INTREGISTER,varregs[i],R_SUBWHOLE);
  505. if (varregs[i] in regvarsloaded1) and
  506. not(varregs[i] in regvarsloaded2) then
  507. load_regvar_reg(list2,r)
  508. else
  509. if (varregs[i] in regvarsloaded2) and
  510. not(varregs[i] in regvarsloaded1) then
  511. load_regvar_reg(list1,r);
  512. end;
  513. end;
  514. *)
  515. {$endif i386}
  516. procedure cleanup_regvars(asml: TAAsmoutput);
  517. var
  518. i: longint;
  519. reg : tregister;
  520. regidx : tregisterindex;
  521. begin
  522. { can happen when inlining assembler procedures (JM) }
  523. if not assigned(current_procinfo.procdef.regvarinfo) then
  524. exit;
  525. if (cs_regvars in aktglobalswitches) and
  526. not(pi_has_assembler_block in current_procinfo.flags) and
  527. not(pi_uses_exceptions in current_procinfo.flags) then
  528. with pregvarinfo(current_procinfo.procdef.regvarinfo)^ do
  529. begin
  530. {$ifdef i386}
  531. for i:=1 to maxfpuvarregs do
  532. if assigned(fpuregvars[i]) then
  533. { ... and clean it up }
  534. asml.concat(Taicpu.op_reg(A_FSTP,S_NO,NR_ST0));
  535. {$endif i386}
  536. (*
  537. for i := 1 to maxvarregs do
  538. begin
  539. if assigned(regvars[i]) then
  540. begin
  541. reg:=regvars[i].localloc.register;
  542. if getregtype(reg)=R_INTREGISTER then
  543. begin
  544. end
  545. else
  546. begin
  547. reg:=cg.makeregsize(reg,OS_INT);
  548. regidx:=findreg_by_number(reg);
  549. {$warning fixme regvar dealloc}
  550. {
  551. if (rg.regvar_loaded_other[regidx]) then
  552. asml.concat(tai_regalloc.dealloc(reg));
  553. }
  554. end;
  555. end;
  556. end;
  557. *)
  558. end;
  559. end;
  560. {
  561. Note: this one can't really be "fixed": register colouring happens after
  562. stabs generation. It could still be useful to generate the "var X is
  563. assigned to register Y with weight ZZZ" messages though
  564. procedure translate_regvars(list: taasmoutput);
  565. var
  566. i: longint;
  567. r: tregister;
  568. begin
  569. if not assigned(current_procinfo.procdef.regvarinfo) then
  570. exit;
  571. with pregvarinfo(current_procinfo.procdef.regvarinfo)^ do
  572. begin
  573. for i := 1 to maxvarregs do
  574. if assigned(regvars[i]) then
  575. begin
  576. cg.rg[R_INTREGISTER].translate_register(tvarsym(regvars[i]).localloc.register);
  577. r:=tvarsym(regvars[i]).localloc.register;
  578. if cs_asm_source in aktglobalswitches then
  579. list.insert(tai_comment.Create(strpnew(tvarsym(regvars[i]).name+
  580. ' with weight '+tostr(tvarsym(regvars[i]).refs)+' assigned to register '+
  581. std_regname(r))));
  582. Message3(cg_d_register_weight,std_regname(r),
  583. tostr(tvarsym(regvars[i]).refs),tvarsym(regvars[i]).name);
  584. end;
  585. for i := 1 to maxfpuvarregs do
  586. if assigned(fpuregvars[i]) then
  587. begin
  588. cg.rg[R_FPUREGISTER].translate_register(tvarsym(regvars[i]).localloc.register);
  589. r:=tvarsym(fpuregvars[i]).localloc.register;
  590. if cs_asm_source in aktglobalswitches then
  591. list.insert(tai_comment.Create(strpnew(tvarsym(fpuregvars[i]).name+
  592. ' with weight '+tostr(tvarsym(fpuregvars[i]).refs)+' assigned to register '+
  593. std_regname(r))));
  594. Message3(cg_d_register_weight,std_regname(r),
  595. tostr(tvarsym(fpuregvars[i]).refs),tvarsym(fpuregvars[i]).name);
  596. end;
  597. end;
  598. end;
  599. }
  600. procedure free_regvars(list: taasmoutput);
  601. var
  602. i: longint;
  603. reg: tregister;
  604. size: tcgsize;
  605. begin
  606. if not assigned(current_procinfo.procdef.regvarinfo) then
  607. exit;
  608. with pregvarinfo(current_procinfo.procdef.regvarinfo)^ do
  609. begin
  610. for i := 1 to maxvarregs do
  611. if assigned(regvars[i]) then
  612. begin
  613. reg:=cg.makeregsize(list,tvarsym(regvars[i]).localloc.register,OS_INT);
  614. cg.a_load_reg_reg(list,OS_INT,OS_INT,reg,reg);
  615. end;
  616. for i := 1 to maxfpuvarregs do
  617. if assigned(fpuregvars[i]) then
  618. begin
  619. reg:=tvarsym(fpuregvars[i]).localloc.register;
  620. size:=reg_cgsize(reg);
  621. cg.a_loadfpu_reg_reg(list,size,reg,reg);
  622. end;
  623. end;
  624. end;
  625. {$endif OLDREGVARS}
  626. end.
  627. {
  628. $Log$
  629. Revision 1.83 2005-02-14 17:13:07 peter
  630. * truncate log
  631. }