* fix register leaks

This commit is contained in:
peter 2003-09-28 21:48:20 +00:00
parent 2693582200
commit 47d211aa2e
5 changed files with 78 additions and 74 deletions

View File

@ -290,9 +290,9 @@ interface
begin begin
objectlibrary.getlabel(hl4); objectlibrary.getlabel(hl4);
if unsigned then if unsigned then
emitjmp(C_NB,hl4) cg.a_jmp_flags(exprasmlist,F_AE,hl4)
else else
emitjmp(C_NO,hl4); cg.a_jmp_flags(exprasmlist,F_GE,hl4);
cg.a_call_name(exprasmlist,'FPC_OVERFLOW'); cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
cg.a_label(exprasmlist,hl4); cg.a_label(exprasmlist,hl4);
end; end;
@ -815,10 +815,10 @@ interface
case nodetype of case nodetype of
ltn,gtn: ltn,gtn:
begin begin
emitjmp(flags_to_cond(getresflags(unsigned)),truelabel); cg.a_jmp_flags(exprasmlist,getresflags(unsigned),truelabel);
{ cheat a little bit for the negative test } { cheat a little bit for the negative test }
toggleflag(nf_swaped); toggleflag(nf_swaped);
emitjmp(flags_to_cond(getresflags(unsigned)),falselabel); cg.a_jmp_flags(exprasmlist,getresflags(unsigned),falselabel);
toggleflag(nf_swaped); toggleflag(nf_swaped);
end; end;
lten,gten: lten,gten:
@ -828,19 +828,19 @@ interface
nodetype:=ltn nodetype:=ltn
else else
nodetype:=gtn; nodetype:=gtn;
emitjmp(flags_to_cond(getresflags(unsigned)),truelabel); cg.a_jmp_flags(exprasmlist,getresflags(unsigned),truelabel);
{ cheat for the negative test } { cheat for the negative test }
if nodetype=ltn then if nodetype=ltn then
nodetype:=gtn nodetype:=gtn
else else
nodetype:=ltn; nodetype:=ltn;
emitjmp(flags_to_cond(getresflags(unsigned)),falselabel); cg.a_jmp_flags(exprasmlist,getresflags(unsigned),falselabel);
nodetype:=oldnodetype; nodetype:=oldnodetype;
end; end;
equaln: equaln:
emitjmp(C_NE,falselabel); cg.a_jmp_flags(exprasmlist,F_NE,falselabel);
unequaln: unequaln:
emitjmp(C_NE,truelabel); cg.a_jmp_flags(exprasmlist,F_NE,truelabel);
end; end;
end; end;
@ -853,17 +853,17 @@ interface
begin begin
{ the comparisaion of the low dword have to be } { the comparisaion of the low dword have to be }
{ always unsigned! } { always unsigned! }
emitjmp(flags_to_cond(getresflags(true)),truelabel); cg.a_jmp_flags(exprasmlist,getresflags(true),truelabel);
cg.a_jmp_always(exprasmlist,falselabel); cg.a_jmp_always(exprasmlist,falselabel);
end; end;
equaln: equaln:
begin begin
emitjmp(C_NE,falselabel); cg.a_jmp_flags(exprasmlist,F_NE,falselabel);
cg.a_jmp_always(exprasmlist,truelabel); cg.a_jmp_always(exprasmlist,truelabel);
end; end;
unequaln: unequaln:
begin begin
emitjmp(C_NE,truelabel); cg.a_jmp_flags(exprasmlist,F_NE,truelabel);
cg.a_jmp_always(exprasmlist,falselabel); cg.a_jmp_always(exprasmlist,falselabel);
end; end;
end; end;
@ -1051,9 +1051,9 @@ interface
begin begin
objectlibrary.getlabel(hl4); objectlibrary.getlabel(hl4);
if unsigned then if unsigned then
emitjmp(C_NB,hl4) cg.a_jmp_flags(exprasmlist,F_AE,hl4)
else else
emitjmp(C_NO,hl4); cg.a_jmp_flags(exprasmlist,F_GE,hl4);
cg.a_call_name(exprasmlist,'FPC_OVERFLOW'); cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
cg.a_label(exprasmlist,hl4); cg.a_label(exprasmlist,hl4);
end; end;
@ -1485,7 +1485,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.78 2003-09-28 13:35:40 peter Revision 1.79 2003-09-28 21:48:20 peter
* fix register leaks
Revision 1.78 2003/09/28 13:35:40 peter
* shortstr compare updated for different calling conventions * shortstr compare updated for different calling conventions
Revision 1.77 2003/09/10 08:31:48 marco Revision 1.77 2003/09/10 08:31:48 marco

View File

@ -165,7 +165,7 @@ implementation
{ as double } { as double }
inc(href.offset,4); inc(href.offset,4);
hregister:=rg.getregisterint(exprasmlist,OS_32); hregister:=rg.getregisterint(exprasmlist,OS_32);
emit_ref_reg(A_MOV,S_L,href,hregister); cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,href,hregister);
reference_reset_base(href,NR_ESP,4); reference_reset_base(href,NR_ESP,4);
emit_const_ref(A_AND,S_L,$7fffffff,href); emit_const_ref(A_AND,S_L,$7fffffff,href);
emit_const_reg(A_TEST,S_L,longint($80000000),hregister); emit_const_reg(A_TEST,S_L,longint($80000000),hregister);
@ -174,7 +174,7 @@ implementation
emit_ref(A_FILD,S_IQ,href); emit_ref(A_FILD,S_IQ,href);
objectlibrary.getdatalabel(l1); objectlibrary.getdatalabel(l1);
objectlibrary.getlabel(l2); objectlibrary.getlabel(l2);
emitjmp(C_Z,l2); cg.a_jmp_flags(exprasmlist,F_E,l2);
Consts.concat(Tai_label.Create(l1)); Consts.concat(Tai_label.Create(l1));
{ I got this constant from a test progtram (FK) } { I got this constant from a test progtram (FK) }
Consts.concat(Tai_const.Create_32bit(0)); Consts.concat(Tai_const.Create_32bit(0));
@ -217,7 +217,7 @@ implementation
emit_reg_reg(A_OR,S_L,r^.base,r^.base); emit_reg_reg(A_OR,S_L,r^.base,r^.base);
rg.ungetregisterint(exprasmlist,R_EDI); rg.ungetregisterint(exprasmlist,R_EDI);
objectlibrary.getlabel(nillabel); objectlibrary.getlabel(nillabel);
emitjmp(C_E,nillabel); cg.a_jmp_flags(exprasmlist,F_E,nillabel);
{ this is one point where we need vmt_offset (PM) } { this is one point where we need vmt_offset (PM) }
r^.offset:= tobjectdef(tpointerdef(p^.resulttype.def).definition).vmt_offset; r^.offset:= tobjectdef(tpointerdef(p^.resulttype.def).definition).vmt_offset;
rg.getexplicitregisterint(exprasmlist,R_EDI); rg.getexplicitregisterint(exprasmlist,R_EDI);
@ -332,7 +332,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.63 2003-09-03 15:55:01 peter Revision 1.64 2003-09-28 21:48:20 peter
* fix register leaks
Revision 1.63 2003/09/03 15:55:01 peter
* NEWRA branch merged * NEWRA branch merged
Revision 1.62.2.2 2003/08/31 15:46:26 peter Revision 1.62.2.2 2003/08/31 15:46:26 peter

View File

@ -306,6 +306,7 @@ implementation
begin begin
hregister:=rg.getregisterint(exprasmlist,OS_INT); hregister:=rg.getregisterint(exprasmlist,OS_INT);
end; end;
location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
cg.a_load_loc_reg(exprasmlist,OS_INT,tcallparanode(tcallparanode(left).right).left.location,hregister); cg.a_load_loc_reg(exprasmlist,OS_INT,tcallparanode(tcallparanode(left).right).left.location,hregister);
if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
emit_reg_ref(asmop,S_L,hregister,tcallparanode(left).left.location.reference) emit_reg_ref(asmop,S_L,hregister,tcallparanode(left).left.location.reference)
@ -322,7 +323,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.66 2003-09-07 22:09:35 peter Revision 1.67 2003-09-28 21:48:20 peter
* fix register leaks
Revision 1.66 2003/09/07 22:09:35 peter
* preparations for different default calling conventions * preparations for different default calling conventions
* various RA fixes * various RA fixes

View File

@ -126,7 +126,7 @@ implementation
{ a jump, but less operations } { a jump, but less operations }
emit_reg_reg(A_TEST,S_L,hreg1,hreg1); emit_reg_reg(A_TEST,S_L,hreg1,hreg1);
objectlibrary.getlabel(hl); objectlibrary.getlabel(hl);
emitjmp(C_NS,hl); cg.a_jmp_flags(exprasmlist,F_NS,hl);
if power=1 then if power=1 then
emit_reg(A_INC,S_L,hreg1) emit_reg(A_INC,S_L,hreg1)
else else
@ -287,13 +287,13 @@ implementation
objectlibrary.getlabel(l2); objectlibrary.getlabel(l2);
objectlibrary.getlabel(l3); objectlibrary.getlabel(l3);
emit_const_reg(A_CMP,S_L,64,hregister2); emit_const_reg(A_CMP,S_L,64,hregister2);
emitjmp(C_L,l1); cg.a_jmp_flags(exprasmlist,F_L,l1);
emit_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow); emit_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow);
emit_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh); emit_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh);
cg.a_jmp_always(exprasmlist,l3); cg.a_jmp_always(exprasmlist,l3);
cg.a_label(exprasmlist,l1); cg.a_label(exprasmlist,l1);
emit_const_reg(A_CMP,S_L,32,hregister2); emit_const_reg(A_CMP,S_L,32,hregister2);
emitjmp(C_L,l2); cg.a_jmp_flags(exprasmlist,F_L,l2);
emit_const_reg(A_SUB,S_L,32,hregister2); emit_const_reg(A_SUB,S_L,32,hregister2);
if nodetype=shln then if nodetype=shln then
begin begin
@ -569,7 +569,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.60 2003-09-03 15:55:01 peter Revision 1.61 2003-09-28 21:48:20 peter
* fix register leaks
Revision 1.60 2003/09/03 15:55:01 peter
* NEWRA branch merged * NEWRA branch merged
Revision 1.59.2.2 2003/08/31 13:50:16 daniel Revision 1.59.2.2 2003/08/31 13:50:16 daniel

View File

@ -96,7 +96,7 @@ implementation
hr,hr2, hr,hr2,
pleftreg : tregister; pleftreg : tregister;
href : treference; href : treference;
opsize : topsize; opsize : tcgsize;
setparts : array[1..8] of Tsetpart; setparts : array[1..8] of Tsetpart;
i,numparts : byte; i,numparts : byte;
adjustment : longint; adjustment : longint;
@ -206,7 +206,7 @@ implementation
separately instead of using the SET_IN_BYTE procedure. separately instead of using the SET_IN_BYTE procedure.
To do: Build in support for LOC_JUMP } To do: Build in support for LOC_JUMP }
opsize := def_opsize(left.resulttype.def); opsize := def_cgsize(left.resulttype.def);
{ If register is used, use only lower 8 bits } { If register is used, use only lower 8 bits }
if left.location.loc in [LOC_REGISTER,LOC_CREGISTER] then if left.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
begin begin
@ -216,24 +216,24 @@ implementation
begin begin
pleftreg:=rg.makeregsize(left.location.register,OS_INT); pleftreg:=rg.makeregsize(left.location.register,OS_INT);
cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,pleftreg); cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,pleftreg);
if opsize <> S_L then if opsize<>OS_INT then
emit_const_reg(A_AND,S_L,255,pleftreg); cg.a_op_const_reg(exprasmlist,OP_AND,OS_INT,255,pleftreg);
opsize := S_L; opsize:=OS_INT;
end end
else else
{ otherwise simply use the lower 8 bits (no "and" } { otherwise simply use the lower 8 bits (no "and" }
{ necessary this way) (JM) } { necessary this way) (JM) }
begin begin
pleftreg:=rg.makeregsize(left.location.register,OS_8); pleftreg:=rg.makeregsize(left.location.register,OS_8);
opsize := S_B; opsize := OS_8;
end; end;
end end
else else
begin begin
{ load the value in a register } { load the value in a register }
pleftreg:=rg.getregisterint(exprasmlist,OS_INT); pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
opsize := S_L; opsize:=OS_INT;
emit_ref_reg(A_MOVZX,S_BL,left.location.reference,pleftreg); cg.a_load_ref_reg(exprasmlist,OS_8,OS_INT,left.location.reference,pleftreg);
location_release(exprasmlist,left.location); location_release(exprasmlist,left.location);
end; end;
@ -272,20 +272,17 @@ implementation
rg.ungetregister(exprasmlist,pleftreg); rg.ungetregister(exprasmlist,pleftreg);
r:=rg.getregisterint(exprasmlist,OS_INT); r:=rg.getregisterint(exprasmlist,OS_INT);
reference_reset_base(href,pleftreg,-setparts[i].start); reference_reset_base(href,pleftreg,-setparts[i].start);
emit_ref_reg(A_LEA,S_L,href,r); cg.a_loadaddr_ref_reg(exprasmlist,href,r);
{ only now change pleftreg since previous value is } { only now change pleftreg since previous value is }
{ still used in previous instruction } { still used in previous instruction }
pleftreg := r; pleftreg := r;
opsize := S_L; opsize := OS_32;
end end
else else
begin begin
{ otherwise, the value is already in a register } { otherwise, the value is already in a register }
{ that can be modified } { that can be modified }
if setparts[i].start-adjustment <> 1 then cg.a_op_const_reg(exprasmlist,OP_SUB,opsize,setparts[i].start-adjustment,pleftreg);
emit_const_reg(A_SUB,opsize,
setparts[i].start-adjustment,pleftreg)
else emit_reg(A_DEC,opsize,pleftreg);
end; end;
{ new total value substracted from x: } { new total value substracted from x: }
{ adjustment + (setparts[i].start - adjustment) } { adjustment + (setparts[i].start - adjustment) }
@ -295,38 +292,32 @@ implementation
{ we need a carry in case the element is in the range } { we need a carry in case the element is in the range }
{ (this will never overflow since we check at the } { (this will never overflow since we check at the }
{ beginning whether stop-start <> 255) } { beginning whether stop-start <> 255) }
emit_const_reg(A_CMP,opsize, cg.a_cmp_const_reg_label(exprasmlist,opsize,OC_B,setparts[i].stop-setparts[i].start+1,pleftreg,l);
setparts[i].stop-setparts[i].start+1,pleftreg);
{ use C_C instead of C_B: the meaning is the same, but }
{ then the optimizer can easier trace the jump to its }
{ final destination since the resultflag of this node }
{ is set to the carryflag }
emitjmp(C_C,l);
end end
else else
{ if setparts[i].start = 0 and setparts[i].stop = 255, } { if setparts[i].start = 0 and setparts[i].stop = 255, }
{ it's always true since "in" is only allowed for bytes } { it's always true since "in" is only allowed for bytes }
begin begin
emit_none(A_STC,S_NO); exprasmlist.concat(taicpu.op_none(A_STC,S_NO));
cg.a_jmp_always(exprasmlist,l); cg.a_jmp_always(exprasmlist,l);
end; end;
end end
else else
begin begin
{ Emit code to check if left is an element } { Emit code to check if left is an element }
emit_const_reg(A_CMP,opsize,setparts[i].stop-adjustment, exprasmlist.concat(taicpu.op_const_reg(A_CMP,TCGSize2OpSize[opsize],setparts[i].stop-adjustment,
pleftreg); pleftreg));
{ Result should be in carry flag when ranges are used } { Result should be in carry flag when ranges are used }
if ranges then if ranges then
emit_none(A_STC,S_NO); exprasmlist.concat(taicpu.op_none(A_STC,S_NO));
{ If found, jump to end } { If found, jump to end }
emitjmp(C_E,l); cg.a_jmp_flags(exprasmlist,F_E,l);
end; end;
if ranges and if ranges and
{ if the last one was a range, the carry flag is already } { if the last one was a range, the carry flag is already }
{ set appropriately } { set appropriately }
not(setparts[numparts].range) then not(setparts[numparts].range) then
emit_none(A_CLC,S_NO); exprasmlist.concat(taicpu.op_none(A_CLC,S_NO));
{ To compensate for not doing a second pass } { To compensate for not doing a second pass }
right.location.reference.symbol:=nil; right.location.reference.symbol:=nil;
{ Now place the end label } { Now place the end label }
@ -379,7 +370,7 @@ implementation
{ and because it's a small set we need only 5 bits } { and because it's a small set we need only 5 bits }
{ but 8 bits are easier to load } { but 8 bits are easier to load }
hr:=rg.getregisterint(exprasmlist,OS_INT); hr:=rg.getregisterint(exprasmlist,OS_INT);
emit_ref_reg(A_MOVZX,S_BL,left.location.reference,hr); cg.a_load_ref_reg(exprasmlist,OS_8,OS_INT,left.location.reference,hr);
location_release(exprasmlist,left.location); location_release(exprasmlist,left.location);
end; end;
end; end;
@ -397,8 +388,7 @@ implementation
{ We have to load the value into a register because { We have to load the value into a register because
btl does not accept values only refs or regs (PFV) } btl does not accept values only refs or regs (PFV) }
hr2:=rg.getregisterint(exprasmlist,OS_INT); hr2:=rg.getregisterint(exprasmlist,OS_INT);
emit_const_reg(A_MOV,S_L, cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
right.location.value,hr2);
emit_reg_reg(A_BT,S_L,hr,hr2); emit_reg_reg(A_BT,S_L,hr,hr2);
rg.ungetregisterint(exprasmlist,hr2); rg.ungetregisterint(exprasmlist,hr2);
end; end;
@ -434,16 +424,15 @@ implementation
begin begin
hr:=rg.makeregsize(left.location.register,OS_INT); hr:=rg.makeregsize(left.location.register,OS_INT);
cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr); cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr);
emit_const_reg(A_CMP,S_L,31,hr); cg.a_cmp_const_reg_label(exprasmlist,OS_INT,OC_BE,31,hr,l);
emitjmp(C_NA,l);
{ reset carry flag } { reset carry flag }
emit_none(A_CLC,S_NO); exprasmlist.concat(taicpu.op_none(A_CLC,S_NO));
cg.a_jmp_always(exprasmlist,l2); cg.a_jmp_always(exprasmlist,l2);
cg.a_label(exprasmlist,l); cg.a_label(exprasmlist,l);
{ We have to load the value into a register because { We have to load the value into a register because
btl does not accept values only refs or regs (PFV) } btl does not accept values only refs or regs (PFV) }
hr2:=rg.getregisterint(exprasmlist,OS_INT); hr2:=rg.getregisterint(exprasmlist,OS_INT);
emit_const_reg(A_MOV,S_L,right.location.value,hr2); cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
emit_reg_reg(A_BT,S_L,hr,hr2); emit_reg_reg(A_BT,S_L,hr,hr2);
rg.ungetregisterint(exprasmlist,hr2); rg.ungetregisterint(exprasmlist,hr2);
end; end;
@ -461,19 +450,18 @@ implementation
begin begin
emit_const_ref(A_CMP,S_B,31,left.location.reference); emit_const_ref(A_CMP,S_B,31,left.location.reference);
end; end;
emitjmp(C_NA,l); cg.a_jmp_flags(exprasmlist,F_BE,l);
{ reset carry flag } { reset carry flag }
emit_none(A_CLC,S_NO); exprasmlist.concat(taicpu.op_none(A_CLC,S_NO));
cg.a_jmp_always(exprasmlist,l2); cg.a_jmp_always(exprasmlist,l2);
cg.a_label(exprasmlist,l); cg.a_label(exprasmlist,l);
location_release(exprasmlist,left.location); location_release(exprasmlist,left.location);
hr:=rg.getregisterint(exprasmlist,OS_INT); hr:=rg.getregisterint(exprasmlist,OS_INT);
emit_ref_reg(A_MOV,S_L,left.location.reference,hr); cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,left.location.reference,hr);
{ We have to load the value into a register because { We have to load the value into a register because
btl does not accept values only refs or regs (PFV) } btl does not accept values only refs or regs (PFV) }
hr2:=rg.getregisterint(exprasmlist,OS_INT); hr2:=rg.getregisterint(exprasmlist,OS_INT);
emit_const_reg(A_MOV,S_L, cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
right.location.value,hr2);
emit_reg_reg(A_BT,S_L,hr,hr2); emit_reg_reg(A_BT,S_L,hr,hr2);
rg.ungetregisterint(exprasmlist,hr2); rg.ungetregisterint(exprasmlist,hr2);
end; end;
@ -593,7 +581,7 @@ implementation
first : boolean; first : boolean;
lastrange : boolean; lastrange : boolean;
last : TConstExprInt; last : TConstExprInt;
cond_lt,cond_le : tasmcond; cond_lt,cond_le : tresflags;
procedure genitem(t : pcaserecord); procedure genitem(t : pcaserecord);
begin begin
@ -611,7 +599,7 @@ implementation
else else
begin begin
cg.a_op_const_reg(exprasmlist, OP_SUB, opsize, aword(t^._low-last), hregister); cg.a_op_const_reg(exprasmlist, OP_SUB, opsize, aword(t^._low-last), hregister);
emitjmp(C_Z,t^.statement); cg.a_jmp_flags(exprasmlist,F_E,t^.statement);
end; end;
last:=t^._low; last:=t^._low;
lastrange:=false; lastrange:=false;
@ -638,12 +626,12 @@ implementation
{ at the value following the previous one } { at the value following the previous one }
if ((t^._low-last) <> 1) or if ((t^._low-last) <> 1) or
(not lastrange) then (not lastrange) then
emitjmp(cond_lt,elselabel); cg.a_jmp_flags(exprasmlist,cond_lt,elselabel);
end; end;
{we need to use A_SUB, because A_DEC does not set the correct flags, therefor {we need to use A_SUB, because A_DEC does not set the correct flags, therefor
using a_op_const_reg(OP_SUB) is not possible } using a_op_const_reg(OP_SUB) is not possible }
emit_const_reg(A_SUB,TCGSize2OpSize[opsize],longint(t^._high-t^._low),hregister); emit_const_reg(A_SUB,TCGSize2OpSize[opsize],longint(t^._high-t^._low),hregister);
emitjmp(cond_le,t^.statement); cg.a_jmp_flags(exprasmlist,cond_le,t^.statement);
last:=t^._high; last:=t^._high;
lastrange:=true; lastrange:=true;
end; end;
@ -655,13 +643,13 @@ implementation
begin begin
if with_sign then if with_sign then
begin begin
cond_lt:=C_L; cond_lt:=F_L;
cond_le:=C_LE; cond_le:=F_LE;
end end
else else
begin begin
cond_lt:=C_B; cond_lt:=F_B;
cond_le:=C_BE; cond_le:=F_BE;
end; end;
{ do we need to generate cmps? } { do we need to generate cmps? }
if (with_sign and (min_label<0)) then if (with_sign and (min_label<0)) then
@ -684,7 +672,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.65 2003-09-07 22:09:35 peter Revision 1.66 2003-09-28 21:48:20 peter
* fix register leaks
Revision 1.65 2003/09/07 22:09:35 peter
* preparations for different default calling conventions * preparations for different default calling conventions
* various RA fixes * various RA fixes