n386add.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. {
  2. $Id$
  3. Copyright (c) 2000-2002 by Florian Klaempfl
  4. Code generation for add nodes on the i386
  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 n386add;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. node,nadd,cpubase,nx86add;
  23. type
  24. ti386addnode = class(tx86addnode)
  25. {$ifdef SUPPORT_MMX}
  26. procedure second_addmmxset;override;
  27. procedure second_addmmx;override;
  28. {$endif SUPPORT_MMX}
  29. procedure second_add64bit;override;
  30. procedure second_cmp64bit;override;
  31. procedure second_mul;override;
  32. end;
  33. implementation
  34. uses
  35. globtype,systems,
  36. cutils,verbose,globals,
  37. symconst,symdef,paramgr,
  38. aasmbase,aasmtai,aasmcpu,
  39. cgbase,
  40. ncon,nset,cgutils,tgobj,
  41. cga,ncgutil,cgobj,cg64f32;
  42. {*****************************************************************************
  43. addmmxset
  44. *****************************************************************************}
  45. {$ifdef SUPPORT_MMX}
  46. procedure ti386addnode.second_addmmxset;
  47. var opsize : TCGSize;
  48. op : TAsmOp;
  49. cmpop,
  50. pushedfpu,
  51. noswap : boolean;
  52. begin
  53. pass_left_and_right(pushedfpu);
  54. cmpop:=false;
  55. noswap:=false;
  56. opsize:=OS_32;
  57. case nodetype of
  58. addn:
  59. begin
  60. { are we adding set elements ? }
  61. if right.nodetype=setelementn then
  62. begin
  63. { adding elements is not commutative }
  64. { if nf_swaped in flags then
  65. swapleftright;}
  66. { bts requires both elements to be registers }
  67. { location_force_reg(exprasmlist,left.location,opsize_2_cgsize[opsize],false);
  68. location_force_reg(exprasmlist,right.location,opsize_2_cgsize[opsize],true);
  69. op:=A_BTS;
  70. noswap:=true;}
  71. end
  72. else
  73. op:=A_POR;
  74. end;
  75. symdifn :
  76. op:=A_PXOR;
  77. muln:
  78. op:=A_PAND;
  79. subn:
  80. op:=A_PANDN;
  81. equaln,
  82. unequaln :
  83. begin
  84. op:=A_PCMPEQD;
  85. cmpop:=true;
  86. end;
  87. lten,gten:
  88. begin
  89. if (not(nf_swaped in flags) and (nodetype = lten)) or
  90. ((nf_swaped in flags) and (nodetype = gten)) then
  91. swapleftright;
  92. location_force_reg(exprasmlist,left.location,opsize,true);
  93. emit_op_right_left(A_AND,TCGSize2Opsize[opsize]);
  94. op:=A_PCMPEQD;
  95. cmpop:=true;
  96. { warning: ugly hack, we need a JE so change the node to equaln }
  97. nodetype:=equaln;
  98. end;
  99. xorn :
  100. op:=A_PXOR;
  101. orn :
  102. op:=A_POR;
  103. andn :
  104. op:=A_PAND;
  105. else
  106. internalerror(2003042215);
  107. end;
  108. { left must be a register }
  109. left_must_be_reg(opsize,noswap);
  110. { emit_generic_code(op,opsize,true,extra_not,false);}
  111. location_freetemp(exprasmlist,right.location);
  112. if cmpop then
  113. location_freetemp(exprasmlist,left.location);
  114. set_result_location(cmpop,true);
  115. end;
  116. {$endif SUPPORT_MMX}
  117. {*****************************************************************************
  118. Add64bit
  119. *****************************************************************************}
  120. procedure ti386addnode.second_add64bit;
  121. var
  122. op : TOpCG;
  123. op1,op2 : TAsmOp;
  124. opsize : TOpSize;
  125. hregister,
  126. hregister2 : tregister;
  127. hl4 : tasmlabel;
  128. mboverflow,
  129. unsigned:boolean;
  130. r:Tregister;
  131. begin
  132. firstcomplex(self);
  133. pass_left_right;
  134. op1:=A_NONE;
  135. op2:=A_NONE;
  136. mboverflow:=false;
  137. opsize:=S_L;
  138. unsigned:=((left.resulttype.def.deftype=orddef) and
  139. (torddef(left.resulttype.def).typ=u64bit)) or
  140. ((right.resulttype.def.deftype=orddef) and
  141. (torddef(right.resulttype.def).typ=u64bit));
  142. case nodetype of
  143. addn :
  144. begin
  145. op:=OP_ADD;
  146. mboverflow:=true;
  147. end;
  148. subn :
  149. begin
  150. op:=OP_SUB;
  151. op1:=A_SUB;
  152. op2:=A_SBB;
  153. mboverflow:=true;
  154. end;
  155. xorn:
  156. op:=OP_XOR;
  157. orn:
  158. op:=OP_OR;
  159. andn:
  160. op:=OP_AND;
  161. else
  162. begin
  163. { everything should be handled in pass_1 (JM) }
  164. internalerror(200109051);
  165. end;
  166. end;
  167. { left and right no register? }
  168. { then one must be demanded }
  169. if (left.location.loc<>LOC_REGISTER) then
  170. begin
  171. if (right.location.loc<>LOC_REGISTER) then
  172. begin
  173. hregister:=cg.getintregister(exprasmlist,OS_INT);
  174. hregister2:=cg.getintregister(exprasmlist,OS_INT);
  175. cg64.a_load64_loc_reg(exprasmlist,left.location,joinreg64(hregister,hregister2));
  176. location_reset(left.location,LOC_REGISTER,OS_64);
  177. left.location.register64.reglo:=hregister;
  178. left.location.register64.reghi:=hregister2;
  179. end
  180. else
  181. begin
  182. location_swap(left.location,right.location);
  183. toggleflag(nf_swaped);
  184. end;
  185. end;
  186. { at this point, left.location.loc should be LOC_REGISTER }
  187. if right.location.loc=LOC_REGISTER then
  188. begin
  189. { when swapped another result register }
  190. if (nodetype=subn) and (nf_swaped in flags) then
  191. begin
  192. cg64.a_op64_reg_reg(exprasmlist,op,
  193. left.location.register64,
  194. right.location.register64);
  195. location_swap(left.location,right.location);
  196. toggleflag(nf_swaped);
  197. end
  198. else
  199. begin
  200. cg64.a_op64_reg_reg(exprasmlist,op,
  201. right.location.register64,
  202. left.location.register64);
  203. end;
  204. end
  205. else
  206. begin
  207. { right.location<>LOC_REGISTER }
  208. if (nodetype=subn) and (nf_swaped in flags) then
  209. begin
  210. r:=cg.getintregister(exprasmlist,OS_INT);
  211. cg64.a_load64low_loc_reg(exprasmlist,right.location,r);
  212. emit_reg_reg(op1,opsize,left.location.register64.reglo,r);
  213. emit_reg_reg(A_MOV,opsize,r,left.location.register64.reglo);
  214. cg64.a_load64high_loc_reg(exprasmlist,right.location,r);
  215. { the carry flag is still ok }
  216. emit_reg_reg(op2,opsize,left.location.register64.reghi,r);
  217. emit_reg_reg(A_MOV,opsize,r,left.location.register64.reghi);
  218. end
  219. else
  220. begin
  221. cg64.a_op64_loc_reg(exprasmlist,op,right.location,
  222. left.location.register64);
  223. end;
  224. location_freetemp(exprasmlist,right.location);
  225. end;
  226. { only in case of overflow operations }
  227. { produce overflow code }
  228. { we must put it here directly, because sign of operation }
  229. { is in unsigned VAR!! }
  230. if mboverflow then
  231. begin
  232. if cs_check_overflow in aktlocalswitches then
  233. begin
  234. objectlibrary.getlabel(hl4);
  235. if unsigned then
  236. cg.a_jmp_flags(exprasmlist,F_AE,hl4)
  237. else
  238. cg.a_jmp_flags(exprasmlist,F_NO,hl4);
  239. cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
  240. cg.a_label(exprasmlist,hl4);
  241. end;
  242. end;
  243. location_copy(location,left.location);
  244. end;
  245. procedure ti386addnode.second_cmp64bit;
  246. var
  247. hregister,
  248. hregister2 : tregister;
  249. href : treference;
  250. unsigned : boolean;
  251. procedure firstjmp64bitcmp;
  252. var
  253. oldnodetype : tnodetype;
  254. begin
  255. {$ifdef OLDREGVARS}
  256. load_all_regvars(exprasmlist);
  257. {$endif OLDREGVARS}
  258. { the jump the sequence is a little bit hairy }
  259. case nodetype of
  260. ltn,gtn:
  261. begin
  262. cg.a_jmp_flags(exprasmlist,getresflags(unsigned),truelabel);
  263. { cheat a little bit for the negative test }
  264. toggleflag(nf_swaped);
  265. cg.a_jmp_flags(exprasmlist,getresflags(unsigned),falselabel);
  266. toggleflag(nf_swaped);
  267. end;
  268. lten,gten:
  269. begin
  270. oldnodetype:=nodetype;
  271. if nodetype=lten then
  272. nodetype:=ltn
  273. else
  274. nodetype:=gtn;
  275. cg.a_jmp_flags(exprasmlist,getresflags(unsigned),truelabel);
  276. { cheat for the negative test }
  277. if nodetype=ltn then
  278. nodetype:=gtn
  279. else
  280. nodetype:=ltn;
  281. cg.a_jmp_flags(exprasmlist,getresflags(unsigned),falselabel);
  282. nodetype:=oldnodetype;
  283. end;
  284. equaln:
  285. cg.a_jmp_flags(exprasmlist,F_NE,falselabel);
  286. unequaln:
  287. cg.a_jmp_flags(exprasmlist,F_NE,truelabel);
  288. end;
  289. end;
  290. procedure secondjmp64bitcmp;
  291. begin
  292. { the jump the sequence is a little bit hairy }
  293. case nodetype of
  294. ltn,gtn,lten,gten:
  295. begin
  296. { the comparisaion of the low dword have to be }
  297. { always unsigned! }
  298. cg.a_jmp_flags(exprasmlist,getresflags(true),truelabel);
  299. cg.a_jmp_always(exprasmlist,falselabel);
  300. end;
  301. equaln:
  302. begin
  303. cg.a_jmp_flags(exprasmlist,F_NE,falselabel);
  304. cg.a_jmp_always(exprasmlist,truelabel);
  305. end;
  306. unequaln:
  307. begin
  308. cg.a_jmp_flags(exprasmlist,F_NE,truelabel);
  309. cg.a_jmp_always(exprasmlist,falselabel);
  310. end;
  311. end;
  312. end;
  313. begin
  314. firstcomplex(self);
  315. pass_left_right;
  316. unsigned:=((left.resulttype.def.deftype=orddef) and
  317. (torddef(left.resulttype.def).typ=u64bit)) or
  318. ((right.resulttype.def.deftype=orddef) and
  319. (torddef(right.resulttype.def).typ=u64bit));
  320. { left and right no register? }
  321. { then one must be demanded }
  322. if (left.location.loc<>LOC_REGISTER) then
  323. begin
  324. if (right.location.loc<>LOC_REGISTER) then
  325. begin
  326. { we can reuse a CREGISTER for comparison }
  327. if (left.location.loc<>LOC_CREGISTER) then
  328. begin
  329. hregister:=cg.getintregister(exprasmlist,OS_INT);
  330. hregister2:=cg.getintregister(exprasmlist,OS_INT);
  331. cg64.a_load64_loc_reg(exprasmlist,left.location,joinreg64(hregister,hregister2));
  332. location_reset(left.location,LOC_REGISTER,OS_64);
  333. left.location.register64.reglo:=hregister;
  334. left.location.register64.reghi:=hregister2;
  335. end;
  336. end
  337. else
  338. begin
  339. location_swap(left.location,right.location);
  340. toggleflag(nf_swaped);
  341. end;
  342. end;
  343. { at this point, left.location.loc should be LOC_REGISTER }
  344. if right.location.loc=LOC_REGISTER then
  345. begin
  346. emit_reg_reg(A_CMP,S_L,right.location.register64.reghi,left.location.register64.reghi);
  347. firstjmp64bitcmp;
  348. emit_reg_reg(A_CMP,S_L,right.location.register64.reglo,left.location.register64.reglo);
  349. secondjmp64bitcmp;
  350. end
  351. else
  352. begin
  353. case right.location.loc of
  354. LOC_CREGISTER :
  355. begin
  356. emit_reg_reg(A_CMP,S_L,right.location.register64.reghi,left.location.register64.reghi);
  357. firstjmp64bitcmp;
  358. emit_reg_reg(A_CMP,S_L,right.location.register64.reglo,left.location.register64.reglo);
  359. secondjmp64bitcmp;
  360. end;
  361. LOC_CREFERENCE,
  362. LOC_REFERENCE :
  363. begin
  364. href:=right.location.reference;
  365. inc(href.offset,4);
  366. emit_ref_reg(A_CMP,S_L,href,left.location.register64.reghi);
  367. firstjmp64bitcmp;
  368. emit_ref_reg(A_CMP,S_L,right.location.reference,left.location.register64.reglo);
  369. secondjmp64bitcmp;
  370. cg.a_jmp_always(exprasmlist,falselabel);
  371. location_freetemp(exprasmlist,right.location);
  372. end;
  373. LOC_CONSTANT :
  374. begin
  375. exprasmlist.concat(taicpu.op_const_reg(A_CMP,S_L,aint(hi(right.location.value64)),left.location.register64.reghi));
  376. firstjmp64bitcmp;
  377. exprasmlist.concat(taicpu.op_const_reg(A_CMP,S_L,aint(lo(right.location.value64)),left.location.register64.reglo));
  378. secondjmp64bitcmp;
  379. end;
  380. else
  381. internalerror(200203282);
  382. end;
  383. end;
  384. location_freetemp(exprasmlist,left.location);
  385. { we have LOC_JUMP as result }
  386. location_reset(location,LOC_JUMP,OS_NO)
  387. end;
  388. {*****************************************************************************
  389. AddMMX
  390. *****************************************************************************}
  391. {$ifdef SUPPORT_MMX}
  392. procedure ti386addnode.second_addmmx;
  393. var
  394. op : TAsmOp;
  395. pushedfpu,
  396. cmpop : boolean;
  397. mmxbase : tmmxtype;
  398. hreg,
  399. hregister : tregister;
  400. begin
  401. pass_left_and_right(pushedfpu);
  402. cmpop:=false;
  403. mmxbase:=mmx_type(left.resulttype.def);
  404. case nodetype of
  405. addn :
  406. begin
  407. if (cs_mmx_saturation in aktlocalswitches) then
  408. begin
  409. case mmxbase of
  410. mmxs8bit:
  411. op:=A_PADDSB;
  412. mmxu8bit:
  413. op:=A_PADDUSB;
  414. mmxs16bit,mmxfixed16:
  415. op:=A_PADDSB;
  416. mmxu16bit:
  417. op:=A_PADDUSW;
  418. end;
  419. end
  420. else
  421. begin
  422. case mmxbase of
  423. mmxs8bit,mmxu8bit:
  424. op:=A_PADDB;
  425. mmxs16bit,mmxu16bit,mmxfixed16:
  426. op:=A_PADDW;
  427. mmxs32bit,mmxu32bit:
  428. op:=A_PADDD;
  429. end;
  430. end;
  431. end;
  432. muln :
  433. begin
  434. case mmxbase of
  435. mmxs16bit,mmxu16bit:
  436. op:=A_PMULLW;
  437. mmxfixed16:
  438. op:=A_PMULHW;
  439. end;
  440. end;
  441. subn :
  442. begin
  443. if (cs_mmx_saturation in aktlocalswitches) then
  444. begin
  445. case mmxbase of
  446. mmxs8bit:
  447. op:=A_PSUBSB;
  448. mmxu8bit:
  449. op:=A_PSUBUSB;
  450. mmxs16bit,mmxfixed16:
  451. op:=A_PSUBSB;
  452. mmxu16bit:
  453. op:=A_PSUBUSW;
  454. end;
  455. end
  456. else
  457. begin
  458. case mmxbase of
  459. mmxs8bit,mmxu8bit:
  460. op:=A_PSUBB;
  461. mmxs16bit,mmxu16bit,mmxfixed16:
  462. op:=A_PSUBW;
  463. mmxs32bit,mmxu32bit:
  464. op:=A_PSUBD;
  465. end;
  466. end;
  467. end;
  468. xorn:
  469. op:=A_PXOR;
  470. orn:
  471. op:=A_POR;
  472. andn:
  473. op:=A_PAND;
  474. else
  475. internalerror(2003042214);
  476. end;
  477. { left and right no register? }
  478. { then one must be demanded }
  479. if (left.location.loc<>LOC_MMXREGISTER) then
  480. begin
  481. if (right.location.loc=LOC_MMXREGISTER) then
  482. begin
  483. location_swap(left.location,right.location);
  484. toggleflag(nf_swaped);
  485. end
  486. else
  487. begin
  488. { register variable ? }
  489. if (left.location.loc=LOC_CMMXREGISTER) then
  490. begin
  491. hregister:=cg.getmmxregister(exprasmlist,OS_M64);
  492. emit_reg_reg(A_MOVQ,S_NO,left.location.register,hregister);
  493. end
  494. else
  495. begin
  496. if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
  497. internalerror(200203245);
  498. hregister:=cg.getmmxregister(exprasmlist,OS_M64);
  499. emit_ref_reg(A_MOVQ,S_NO,left.location.reference,hregister);
  500. end;
  501. location_reset(left.location,LOC_MMXREGISTER,OS_NO);
  502. left.location.register:=hregister;
  503. end;
  504. end;
  505. { at this point, left.location.loc should be LOC_MMXREGISTER }
  506. if right.location.loc<>LOC_MMXREGISTER then
  507. begin
  508. if (nodetype=subn) and (nf_swaped in flags) then
  509. begin
  510. if right.location.loc=LOC_CMMXREGISTER then
  511. begin
  512. hreg:=cg.getmmxregister(exprasmlist,OS_M64);
  513. emit_reg_reg(A_MOVQ,S_NO,right.location.register,hreg);
  514. emit_reg_reg(op,S_NO,left.location.register,hreg);
  515. cg.ungetregister(exprasmlist,hreg);
  516. emit_reg_reg(A_MOVQ,S_NO,hreg,left.location.register);
  517. end
  518. else
  519. begin
  520. if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
  521. internalerror(200203247);
  522. hreg:=cg.getmmxregister(exprasmlist,OS_M64);
  523. emit_ref_reg(A_MOVQ,S_NO,right.location.reference,hreg);
  524. emit_reg_reg(op,S_NO,left.location.register,hreg);
  525. cg.ungetregister(exprasmlist,hreg);
  526. emit_reg_reg(A_MOVQ,S_NO,hreg,left.location.register);
  527. end;
  528. end
  529. else
  530. begin
  531. if (right.location.loc=LOC_CMMXREGISTER) then
  532. emit_reg_reg(op,S_NO,right.location.register,left.location.register)
  533. else
  534. begin
  535. if not(right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
  536. internalerror(200203246);
  537. emit_ref_reg(op,S_NO,right.location.reference,left.location.register);
  538. end;
  539. end;
  540. end
  541. else
  542. begin
  543. { right.location=LOC_MMXREGISTER }
  544. if (nodetype=subn) and (nf_swaped in flags) then
  545. begin
  546. emit_reg_reg(op,S_NO,left.location.register,right.location.register);
  547. location_swap(left.location,right.location);
  548. toggleflag(nf_swaped);
  549. end
  550. else
  551. begin
  552. emit_reg_reg(op,S_NO,right.location.register,left.location.register);
  553. end;
  554. end;
  555. location_freetemp(exprasmlist,right.location);
  556. if cmpop then
  557. location_freetemp(exprasmlist,left.location);
  558. set_result_location(cmpop,true);
  559. end;
  560. {$endif SUPPORT_MMX}
  561. {*****************************************************************************
  562. x86 MUL
  563. *****************************************************************************}
  564. procedure ti386addnode.second_mul;
  565. var r:Tregister;
  566. hl4 : tasmlabel;
  567. begin
  568. {The location.register will be filled in later (JM)}
  569. location_reset(location,LOC_REGISTER,OS_INT);
  570. {Get a temp register and load the left value into it
  571. and free the location.}
  572. r:=cg.getintregister(exprasmlist,OS_INT);
  573. cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
  574. {Allocate EAX.}
  575. cg.getcpuregister(exprasmlist,NR_EAX);
  576. {Load the right value.}
  577. cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_EAX);
  578. {Also allocate EDX, since it is also modified by a mul (JM).}
  579. cg.getcpuregister(exprasmlist,NR_EDX);
  580. emit_reg(A_MUL,S_L,r);
  581. if cs_check_overflow in aktlocalswitches then
  582. begin
  583. objectlibrary.getlabel(hl4);
  584. cg.a_jmp_flags(exprasmlist,F_AE,hl4);
  585. cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
  586. cg.a_label(exprasmlist,hl4);
  587. end;
  588. {Free EAX,EDX}
  589. cg.ungetcpuregister(exprasmlist,NR_EDX);
  590. cg.ungetcpuregister(exprasmlist,NR_EAX);
  591. {Allocate a new register and store the result in EAX in it.}
  592. location.register:=cg.getintregister(exprasmlist,OS_INT);
  593. cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,NR_EAX,location.register);
  594. location_freetemp(exprasmlist,left.location);
  595. location_freetemp(exprasmlist,right.location);
  596. end;
  597. begin
  598. caddnode:=ti386addnode;
  599. end.
  600. {
  601. $Log$
  602. Revision 1.101 2004-11-01 12:43:29 peter
  603. * shortstr compare with empty string fixed
  604. * removed special i386 code
  605. Revision 1.100 2004/10/31 21:45:03 peter
  606. * generic tlocation
  607. * move tlocation to cgutils
  608. Revision 1.99 2004/09/25 14:23:54 peter
  609. * ungetregister is now only used for cpuregisters, renamed to
  610. ungetcpuregister
  611. * renamed (get|unget)explicitregister(s) to ..cpuregister
  612. * removed location-release/reference_release
  613. Revision 1.98 2004/06/20 08:55:31 florian
  614. * logs truncated
  615. Revision 1.97 2004/06/16 20:07:10 florian
  616. * dwarf branch merged
  617. Revision 1.96 2004/05/19 23:30:18 peter
  618. * extra typecast to prevent range check
  619. Revision 1.95.2.1 2004/04/29 19:07:22 peter
  620. * compile fixes
  621. Revision 1.95 2004/02/04 19:22:27 peter
  622. *** empty log message ***
  623. Revision 1.94 2004/01/20 12:59:37 florian
  624. * common addnode code for x86-64 and i386
  625. }