ncgflw.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. Generate assembler for nodes that influence the flow which are
  5. the same for all (most?) processors
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ****************************************************************************
  18. }
  19. unit ncgflw;
  20. {$i defines.inc}
  21. interface
  22. uses
  23. node,nflw;
  24. type
  25. tcgwhilerepeatnode = class(twhilerepeatnode)
  26. procedure pass_2;override;
  27. end;
  28. tcgifnode = class(tifnode)
  29. procedure pass_2;override;
  30. end;
  31. tcgfornode = class(tfornode)
  32. procedure pass_2;override;
  33. end;
  34. tcgexitnode = class(texitnode)
  35. procedure pass_2;override;
  36. end;
  37. tcgbreaknode = class(tbreaknode)
  38. procedure pass_2;override;
  39. end;
  40. tcgcontinuenode = class(tcontinuenode)
  41. procedure pass_2;override;
  42. end;
  43. tcggotonode = class(tgotonode)
  44. procedure pass_2;override;
  45. end;
  46. tcglabelnode = class(tlabelnode)
  47. procedure pass_2;override;
  48. end;
  49. implementation
  50. uses
  51. verbose,globals,systems,globtype,
  52. symconst,symdef,symsym,aasm,types,
  53. cgbase,temp_gen,pass_2,
  54. cpubase,cpuasm,cpuinfo,
  55. nld,ncon,
  56. cga,tgcpu,
  57. ncgutil,
  58. tainst,regvars,cgobj,cgcpu;
  59. {*****************************************************************************
  60. Second_While_RepeatN
  61. *****************************************************************************}
  62. procedure tcgwhilerepeatnode.pass_2;
  63. var
  64. lcont,lbreak,lloop,
  65. oldclabel,oldblabel : tasmlabel;
  66. otlabel,oflabel : tasmlabel;
  67. begin
  68. getlabel(lloop);
  69. getlabel(lcont);
  70. getlabel(lbreak);
  71. { arrange continue and breaklabels: }
  72. oldclabel:=aktcontinuelabel;
  73. oldblabel:=aktbreaklabel;
  74. load_all_regvars(exprasmlist);
  75. { handling code at the end as it is much more efficient, and makes
  76. while equal to repeat loop, only the end true/false is swapped (PFV) }
  77. if nodetype=whilen then
  78. cg.a_jmp_cond(exprasmlist,OC_None,lcont);
  79. { align loop target }
  80. exprasmList.concat(Tai_align.Create(aktalignment.loopalign));
  81. cg.a_label(exprasmlist,lloop);
  82. aktcontinuelabel:=lcont;
  83. aktbreaklabel:=lbreak;
  84. cleartempgen;
  85. if assigned(right) then
  86. secondpass(right);
  87. load_all_regvars(exprasmlist);
  88. cg.a_label(exprasmlist,lcont);
  89. otlabel:=truelabel;
  90. oflabel:=falselabel;
  91. if nodetype=whilen then
  92. begin
  93. truelabel:=lloop;
  94. falselabel:=lbreak;
  95. end
  96. { repeatn }
  97. else
  98. begin
  99. truelabel:=lbreak;
  100. falselabel:=lloop;
  101. end;
  102. cleartempgen;
  103. secondpass(left);
  104. maketojumpbool(left,lr_load_regvars);
  105. cg.a_label(exprasmlist,lbreak);
  106. truelabel:=otlabel;
  107. falselabel:=oflabel;
  108. aktcontinuelabel:=oldclabel;
  109. aktbreaklabel:=oldblabel;
  110. { a break/continue in a while/repeat block can't be seen outside }
  111. flowcontrol:=flowcontrol-[fc_break,fc_continue];
  112. end;
  113. {*****************************************************************************
  114. tcgIFNODE
  115. *****************************************************************************}
  116. procedure tcgifnode.pass_2;
  117. var
  118. hl,otlabel,oflabel : tasmlabel;
  119. org_regvar_loaded,
  120. then_regvar_loaded,
  121. else_regvar_loaded : regvar_booleanarray;
  122. org_list,
  123. then_list,
  124. else_list : taasmoutput;
  125. begin
  126. otlabel:=truelabel;
  127. oflabel:=falselabel;
  128. getlabel(truelabel);
  129. getlabel(falselabel);
  130. cleartempgen;
  131. secondpass(left);
  132. { save regvars loaded in the beginning so that we can restore them }
  133. { when processing the else-block }
  134. if cs_regalloc in aktglobalswitches then
  135. begin
  136. org_list := exprasmlist;
  137. exprasmlist := taasmoutput.create;
  138. end;
  139. maketojumpbool(left,lr_dont_load_regvars);
  140. if cs_regalloc in aktglobalswitches then
  141. org_regvar_loaded := regvar_loaded;
  142. if assigned(right) then
  143. begin
  144. cg.a_label(exprasmlist,truelabel);
  145. cleartempgen;
  146. secondpass(right);
  147. end;
  148. { save current asmlist (previous instructions + then-block) and }
  149. { loaded regvar state and create new clean ones }
  150. if cs_regalloc in aktglobalswitches then
  151. begin
  152. then_regvar_loaded := regvar_loaded;
  153. regvar_loaded := org_regvar_loaded;
  154. then_list := exprasmlist;
  155. exprasmlist := taasmoutput.create;
  156. end;
  157. if assigned(t1) then
  158. begin
  159. if assigned(right) then
  160. begin
  161. getlabel(hl);
  162. { do go back to if line !! }
  163. if not(cs_regalloc in aktglobalswitches) then
  164. aktfilepos:=exprasmList.getlasttaifilepos^
  165. else
  166. aktfilepos:=then_list.getlasttaifilepos^;
  167. cg.a_jmp_cond(exprasmlist,OC_None,hl);
  168. end;
  169. cg.a_label(exprasmlist,falselabel);
  170. cleartempgen;
  171. secondpass(t1);
  172. { save current asmlist (previous instructions + else-block) }
  173. { and loaded regvar state and create a new clean list }
  174. if cs_regalloc in aktglobalswitches then
  175. begin
  176. else_regvar_loaded := regvar_loaded;
  177. else_list := exprasmlist;
  178. exprasmlist := taasmoutput.create;
  179. end;
  180. if assigned(right) then
  181. cg.a_label(exprasmlist,hl);
  182. end
  183. else
  184. begin
  185. if cs_regalloc in aktglobalswitches then
  186. begin
  187. else_regvar_loaded := regvar_loaded;
  188. else_list := exprasmlist;
  189. exprasmlist := taasmoutput.create;
  190. end;
  191. cg.a_label(exprasmlist,falselabel);
  192. end;
  193. if not(assigned(right)) then
  194. begin
  195. cg.a_label(exprasmlist,truelabel);
  196. end;
  197. if cs_regalloc in aktglobalswitches then
  198. begin
  199. { add loads of regvars at the end of the then- and else-blocks }
  200. { so that at the end of both blocks the same regvars are loaded }
  201. { no else block? }
  202. if not assigned(t1) then
  203. sync_regvars(org_list,then_list,org_regvar_loaded,
  204. then_regvar_loaded)
  205. { no then block? }
  206. else if not assigned(right) then
  207. sync_regvars(org_list,else_list,org_regvar_loaded,
  208. else_regvar_loaded)
  209. { both else and then blocks }
  210. else
  211. sync_regvars(then_list,else_list,then_regvar_loaded,
  212. else_regvar_loaded);
  213. { add all lists together }
  214. org_list.concatlist(then_list);
  215. then_list.free;
  216. org_list.concatlist(else_list);
  217. else_list.free;
  218. org_list.concatlist(exprasmlist);
  219. exprasmlist.free;
  220. exprasmlist := org_list;
  221. end;
  222. truelabel:=otlabel;
  223. falselabel:=oflabel;
  224. end;
  225. {*****************************************************************************
  226. SecondFor
  227. *****************************************************************************}
  228. procedure tcgfornode.pass_2;
  229. var
  230. l3,oldclabel,oldblabel : tasmlabel;
  231. omitfirstcomp,temptovalue : boolean;
  232. hs : byte;
  233. temp1 : treference;
  234. hop : topcg;
  235. hcond : topcmp;
  236. opsize : tcgsize;
  237. count_var_is_signed : boolean;
  238. begin
  239. oldclabel:=aktcontinuelabel;
  240. oldblabel:=aktbreaklabel;
  241. getlabel(aktcontinuelabel);
  242. getlabel(aktbreaklabel);
  243. getlabel(l3);
  244. { could we spare the first comparison ? }
  245. omitfirstcomp:=false;
  246. if right.nodetype=ordconstn then
  247. if tassignmentnode(left).right.nodetype=ordconstn then
  248. omitfirstcomp:=((nf_backward in flags) and
  249. (tordconstnode(tassignmentnode(left).right).value>=tordconstnode(right).value))
  250. or (not(nf_backward in flags) and
  251. (tordconstnode(tassignmentnode(left).right).value<=tordconstnode(right).value));
  252. { only calculate reference }
  253. cleartempgen;
  254. secondpass(t2);
  255. hs := t2.resulttype.def.size;
  256. opsize := def_cgsize(t2.resulttype.def);
  257. { first set the to value
  258. because the count var can be in the expression !! }
  259. cleartempgen;
  260. secondpass(right);
  261. { calculate pointer value and check if changeable and if so }
  262. { load into temporary variable }
  263. if right.nodetype<>ordconstn then
  264. begin
  265. temp1.symbol:=nil;
  266. gettempofsizereference(hs,temp1);
  267. temptovalue:=true;
  268. if (right.location.loc=LOC_REGISTER) or
  269. (right.location.loc=LOC_CREGISTER) then
  270. begin
  271. cg.a_load_reg_ref(exprasmlist,opsize,
  272. right.location.register,temp1);
  273. ungetregister(right.location.register);
  274. end
  275. else
  276. cg.g_concatcopy(exprasmlist,right.location.reference,temp1,
  277. hs,true,false);
  278. end
  279. else
  280. temptovalue:=false;
  281. { produce start assignment }
  282. cleartempgen;
  283. secondpass(left);
  284. count_var_is_signed:=is_signed(torddef(t2.resulttype.def));
  285. if nf_backward in flags then
  286. if count_var_is_signed then
  287. hcond:=OC_LT
  288. else
  289. hcond:=OC_B
  290. else
  291. if count_var_is_signed then
  292. hcond:=OC_GT
  293. else
  294. hcond:=OC_A;
  295. load_all_regvars(exprasmlist);
  296. if temptovalue then
  297. begin
  298. cg.a_cmp_ref_loc_label(exprasmlist,opsize,hcond,
  299. temp1,t2.location,aktbreaklabel);
  300. end
  301. else
  302. begin
  303. if not(omitfirstcomp) then
  304. begin
  305. cg.a_cmp_const_loc_label(exprasmlist,opsize,hcond,
  306. aword(tordconstnode(right).value),
  307. t2.location,aktbreaklabel);
  308. end;
  309. end;
  310. { align loop target }
  311. exprasmList.concat(Tai_align.Create(aktalignment.loopalign));
  312. cg.a_label(exprasmlist,l3);
  313. { help register must not be in instruction block }
  314. cleartempgen;
  315. if assigned(t1) then
  316. begin
  317. secondpass(t1);
  318. load_all_regvars(exprasmlist);
  319. end;
  320. cg.a_label(exprasmlist,aktcontinuelabel);
  321. { makes no problems there }
  322. cleartempgen;
  323. if nf_backward in flags then
  324. if count_var_is_signed then
  325. hcond:=OC_LTE
  326. else
  327. hcond:=OC_BE
  328. else
  329. if count_var_is_signed then
  330. hcond:=OC_GTE
  331. else
  332. hcond:=OC_AE;
  333. load_all_regvars(exprasmlist);
  334. { produce comparison and the corresponding }
  335. { jump }
  336. if temptovalue then
  337. begin
  338. cg.a_cmp_ref_loc_label(exprasmlist,opsize,hcond,temp1,
  339. t2.location,aktbreaklabel);
  340. end
  341. else
  342. begin
  343. cg.a_cmp_const_loc_label(exprasmlist,opsize,hcond,
  344. aword(tordconstnode(right).value),t2.location,aktbreaklabel);
  345. end;
  346. { according to count direction DEC or INC... }
  347. { must be after the test because of 0 to 255 for bytes !! }
  348. if nf_backward in flags then
  349. hop:=OP_SUB
  350. else
  351. hop:=OP_ADD;
  352. cg.a_op_const_loc(exprasmlist,hop,opsize,1,t2.location);
  353. cg.a_jmp_cond(exprasmlist,OC_None,l3);
  354. if temptovalue then
  355. ungetiftemp(temp1);
  356. { this is the break label: }
  357. cg.a_label(exprasmlist,aktbreaklabel);
  358. aktcontinuelabel:=oldclabel;
  359. aktbreaklabel:=oldblabel;
  360. { a break/continue in a for block can't be seen outside }
  361. flowcontrol:=flowcontrol-[fc_break,fc_continue];
  362. end;
  363. {*****************************************************************************
  364. SecondExitN
  365. *****************************************************************************}
  366. procedure tcgexitnode.pass_2;
  367. var
  368. {op : tasmop;
  369. s : topsize;}
  370. otlabel,oflabel : tasmlabel;
  371. r : treference;
  372. is_mem,
  373. allocated_acc,
  374. allocated_acchigh: boolean;
  375. procedure cleanleft;
  376. begin
  377. if is_mem then
  378. begin
  379. del_reference(left.location.reference);
  380. ungetiftemp(left.location.reference);
  381. end
  382. else
  383. begin
  384. ungetregister(left.location.register);
  385. if left.location.registerhigh <> R_NO then
  386. ungetregister(left.location.registerhigh);
  387. end;
  388. end;
  389. label
  390. do_jmp;
  391. begin
  392. { load_all_regvars(exprasmlist); }
  393. include(flowcontrol,fc_exit);
  394. if assigned(left) then
  395. if left.nodetype=assignn then
  396. begin
  397. { just do a normal assignment followed by exit }
  398. secondpass(left);
  399. cg.a_jmp_cond(exprasmlist,OC_NONE,aktexitlabel);
  400. end
  401. else
  402. begin
  403. allocated_acc := false;
  404. allocated_acchigh := false;
  405. otlabel:=truelabel;
  406. oflabel:=falselabel;
  407. getlabel(truelabel);
  408. getlabel(falselabel);
  409. secondpass(left);
  410. case left.location.loc of
  411. LOC_FPU : goto do_jmp;
  412. LOC_MEM,
  413. LOC_REFERENCE : is_mem:=true;
  414. LOC_CREGISTER,
  415. LOC_REGISTER : is_mem:=false;
  416. LOC_FLAGS : begin
  417. cg.a_reg_alloc(exprasmlist,accumulator);
  418. allocated_acc := true;
  419. cg.g_flags2reg(exprasmlist,left.location.resflags,accumulator);
  420. goto do_jmp;
  421. end;
  422. LOC_JUMP : begin
  423. exprasmlist.concat(tairegalloc.alloc(accumulator));
  424. allocated_acc := true;
  425. cg.a_label(exprasmlist,truelabel);
  426. cg.a_load_const_reg(exprasmlist,OS_8,1,
  427. makereg8(accumulator));
  428. cg.a_jmp_cond(exprasmlist,OC_NONE,aktexit2label);
  429. cg.a_label(exprasmlist,falselabel);
  430. cg.a_load_const_reg(exprasmlist,OS_8,0,
  431. makereg8(accumulator));
  432. goto do_jmp;
  433. end;
  434. else
  435. internalerror(2001);
  436. end;
  437. case aktprocdef.rettype.def.deftype of
  438. pointerdef,
  439. procvardef : begin
  440. cleanleft;
  441. cg.a_reg_alloc(exprasmlist,accumulator);
  442. allocated_acc := true;
  443. if is_mem then
  444. cg.a_load_ref_reg(exprasmlist,OS_ADDR,
  445. left.location.reference,accumulator)
  446. else
  447. cg.a_load_reg_reg(exprasmlist,OS_ADDR,
  448. left.location.register,accumulator);
  449. end;
  450. floatdef : begin
  451. cleanleft;
  452. if is_mem then
  453. floatload(tfloatdef(aktprocdef.rettype.def).typ,left.location.reference);
  454. end;
  455. { orddef,
  456. enumdef : }
  457. else
  458. { it can be anything shorter than 4 bytes PM
  459. this caused form bug 711 }
  460. begin
  461. cleanleft;
  462. cg.a_reg_alloc(exprasmlist,accumulator);
  463. allocated_acc := true;
  464. case aktprocdef.rettype.def.size of
  465. { it can be a qword/int64 too ... }
  466. 8 :
  467. if is_mem then
  468. begin
  469. cg.a_load_ref_reg(exprasmlist,OS_32,
  470. left.location.reference,accumulator);
  471. r:=left.location.reference;
  472. inc(r.offset,4);
  473. cg.a_reg_alloc(exprasmlist,accumulatorhigh);
  474. allocated_acchigh := true;
  475. cg.a_load_ref_reg(exprasmlist,OS_32,r,accumulatorhigh);
  476. end
  477. else
  478. begin
  479. cg.a_load_reg_reg(exprasmlist,OS_32,left.location.registerlow,accumulator);
  480. cg.a_reg_alloc(exprasmlist,accumulatorhigh);
  481. allocated_acchigh := true;
  482. cg.a_load_reg_reg(exprasmlist,OS_32,left.location.registerhigh,accumulatorhigh);
  483. end;
  484. { if its 3 bytes only we can still
  485. copy one of garbage ! PM }
  486. 4,3 :
  487. cg.a_load_loc_reg(exprasmlist,OS_32,left.location,
  488. accumulator);
  489. 2 :
  490. cg.a_load_loc_reg(exprasmlist,OS_16,left.location,
  491. makereg16(accumulator));
  492. 1 :
  493. cg.a_load_loc_reg(exprasmlist,OS_8,left.location,
  494. makereg8(accumulator));
  495. else internalerror(605001);
  496. end;
  497. end;
  498. end;
  499. do_jmp:
  500. truelabel:=otlabel;
  501. falselabel:=oflabel;
  502. cg.a_jmp_cond(exprasmlist,OC_None,aktexit2label);
  503. if allocated_acc then
  504. cg.a_reg_dealloc(exprasmlist,accumulator);
  505. if allocated_acchigh then
  506. cg.a_reg_dealloc(exprasmlist,accumulator);
  507. end
  508. else
  509. cg.a_jmp_cond(exprasmlist,OC_None,aktexitlabel);
  510. end;
  511. {*****************************************************************************
  512. SecondBreakN
  513. *****************************************************************************}
  514. procedure tcgbreaknode.pass_2;
  515. begin
  516. include(flowcontrol,fc_break);
  517. if aktbreaklabel<>nil then
  518. begin
  519. load_all_regvars(exprasmlist);
  520. cg.a_jmp_cond(exprasmlist,OC_None,aktbreaklabel)
  521. end
  522. else
  523. CGMessage(cg_e_break_not_allowed);
  524. end;
  525. {*****************************************************************************
  526. SecondContinueN
  527. *****************************************************************************}
  528. procedure tcgcontinuenode.pass_2;
  529. begin
  530. include(flowcontrol,fc_continue);
  531. if aktcontinuelabel<>nil then
  532. begin
  533. load_all_regvars(exprasmlist);
  534. cg.a_jmp_cond(exprasmlist,OC_None,aktcontinuelabel)
  535. end
  536. else
  537. CGMessage(cg_e_continue_not_allowed);
  538. end;
  539. {*****************************************************************************
  540. SecondGoto
  541. *****************************************************************************}
  542. procedure tcggotonode.pass_2;
  543. begin
  544. load_all_regvars(exprasmlist);
  545. cg.a_jmp_cond(exprasmlist,OC_None,labelnr)
  546. end;
  547. {*****************************************************************************
  548. SecondLabel
  549. *****************************************************************************}
  550. procedure tcglabelnode.pass_2;
  551. begin
  552. load_all_regvars(exprasmlist);
  553. cg.a_label(exprasmlist,labelnr);
  554. cleartempgen;
  555. secondpass(left);
  556. end;
  557. begin
  558. cwhilerepeatnode:=tcgwhilerepeatnode;
  559. cifnode:=tcgifnode;
  560. cfornode:=tcgfornode;
  561. cexitnode:=tcgexitnode;
  562. cbreaknode:=tcgbreaknode;
  563. ccontinuenode:=tcgcontinuenode;
  564. cgotonode:=tcggotonode;
  565. clabelnode:=tcglabelnode;
  566. end.
  567. {
  568. $Log$
  569. Revision 1.8 2002-03-04 19:10:11 peter
  570. * removed compiler warnings
  571. Revision 1.7 2001/12/30 17:24:48 jonas
  572. * range checking is now processor independent (part in cgobj,
  573. part in cg64f32) and should work correctly again (it needed
  574. some changes after the changes of the low and high of
  575. tordef's to int64)
  576. * maketojumpbool() is now processor independent (in ncgutil)
  577. * getregister32 is now called getregisterint
  578. Revision 1.6 2001/12/29 15:28:57 jonas
  579. * powerpc/cgcpu.pas compiles :)
  580. * several powerpc-related fixes
  581. * cpuasm unit is now based on common tainst unit
  582. + nppcmat unit for powerpc (almost complete)
  583. Revision 1.4 2001/11/02 22:58:01 peter
  584. * procsym definition rewrite
  585. Revision 1.3 2001/10/04 14:33:28 jonas
  586. * fixed range check errors
  587. Revision 1.2 2001/09/30 16:19:58 jonas
  588. - removed unused units
  589. Revision 1.1 2001/09/28 20:39:33 jonas
  590. * changed all flow control structures (except for exception handling
  591. related things) to processor independent code (in new ncgflw unit)
  592. + generic cgobj unit which contains lots of code generator helpers with
  593. global "cg" class instance variable
  594. + cgcpu unit for i386 (implements processor specific routines of the above
  595. unit)
  596. * updated cgbase and cpubase for the new code generator units
  597. * include ncgflw unit in cpunode unit
  598. Revision 1.4 2001/09/09 17:10:25 jonas
  599. * some more things implemented
  600. Revision 1.3 2001/09/06 15:25:55 jonas
  601. * changed type of tcg from object to class -> abstract methods are now
  602. a lot cleaner :)
  603. + more updates: load_*_loc methods, op_*_* methods, g_flags2reg method
  604. (if possible with geenric implementation and necessary ppc
  605. implementations)
  606. * worked a bit further on cgflw, now working on exitnode
  607. Revision 1.2 2001/09/05 20:21:03 jonas
  608. * new cgflow based on n386flw with all nodes until forn "translated"
  609. + a_cmp_*_loc_label methods for tcg
  610. + base implementatino for a_cmp_ref_*_label methods
  611. * small bugfixes to powerpc cg
  612. }