From d666ac848e41584c69be90f4afad82466cd09806 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 21 Oct 1998 08:39:56 +0000 Subject: [PATCH] + ansistring operator + + $h and string[n] for n>255 added * small problem with TP fixed --- compiler/cg386add.pas | 59 ++++++++++++++++++++++++++++++++++++++----- compiler/cg386cal.pas | 19 +++++++++----- compiler/pdecl.pas | 22 ++++++---------- compiler/tgeni386.pas | 24 +++++++++++++++++- 4 files changed, 96 insertions(+), 28 deletions(-) diff --git a/compiler/cg386add.pas b/compiler/cg386add.pas index eace25d05d..b9f2691dd8 100644 --- a/compiler/cg386add.pas +++ b/compiler/cg386add.pas @@ -116,6 +116,8 @@ implementation href : treference; pushed, cmpop : boolean; + savedunused : tregisterset; + begin { string operations are not commutative } if p^.swaped then @@ -126,10 +128,50 @@ implementation case p^.treetype of addn: begin - { we do not need destination anymore } - del_reference(p^.left^.location.reference); - del_reference(p^.right^.location.reference); - { concatansistring(p); } + cmpop:=false; + secondpass(p^.left); + pushed:=maybe_push(p^.right^.registers32,p); + secondpass(p^.right); + if pushed then restore(p); + { release used registers } + case p^.right^.location.loc of + LOC_REFERENCE,LOC_MEM: + del_reference(p^.right^.location.reference); + LOC_REGISTER,LOC_CREGISTER: + ungetregister32(p^.right^.location.register); + end; + case p^.left^.location.loc of + LOC_REFERENCE,LOC_MEM: + del_reference(p^.left^.location.reference); + LOC_REGISTER,LOC_CREGISTER: + ungetregister32(p^.left^.location.register); + end; + { that's not nice, but how can we avoid, } + + savedunused:=unused; + { push the still used registers } + pushusedregisters(pushedregs,$ff); + { push data } + case p^.right^.location.loc of + LOC_REFERENCE,LOC_MEM: + emit_push_mem(p^.right^.location.reference); + LOC_REGISTER,LOC_CREGISTER: + exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.right^.location.register))); + end; + case p^.left^.location.loc of + LOC_REFERENCE,LOC_MEM: + emit_push_mem(p^.left^.location.reference); + LOC_REGISTER,LOC_CREGISTER: + exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.left^.location.register))); + end; + emitcall('FPC_ANSICAT',true); + unused:=savedunused; + p^.location.register:=getexplicitregister32(R_EAX); + emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.register); + popusedregisters(pushedregs); + maybe_loadesi; + ungetiftemp(p^.left^.location.reference); + ungetiftemp(p^.right^.location.reference); end; ltn,lten,gtn,gten, equaln,unequaln: @@ -302,7 +344,7 @@ implementation end; end; end; - SetResultLocation(cmpop,true,p); + SetResultLocation(cmpop,true,p); end; @@ -1324,7 +1366,12 @@ implementation end. { $Log$ - Revision 1.19 1998-10-20 15:09:21 florian + Revision 1.20 1998-10-21 08:39:56 florian + + ansistring operator + + + $h and string[n] for n>255 added + * small problem with TP fixed + + Revision 1.19 1998/10/20 15:09:21 florian + binary operators for ansi strings Revision 1.18 1998/10/20 08:06:38 pierre diff --git a/compiler/cg386cal.pas b/compiler/cg386cal.pas index d180f067c9..69d25c7a23 100644 --- a/compiler/cg386cal.pas +++ b/compiler/cg386cal.pas @@ -1257,7 +1257,7 @@ implementation else {$endif test_dest_loc} begin - hregister:=getregister32; + hregister:=getexplicitregister32(R_EAX); emit_reg_reg(A_MOV,S_L,R_EAX,hregister); p^.location.register:=hregister; end; @@ -1285,7 +1285,7 @@ implementation else {$endif test_dest_loc} begin - hregister:=getregister32; + hregister:=getexplicitregister32(R_EAX); emit_reg_reg(A_MOV,S_L,R_EAX,hregister); p^.location.register:=hregister; end; @@ -1298,7 +1298,7 @@ implementation else {$endif test_dest_loc} begin - hregister:=getregister32; + hregister:=getexplicitregister32(R_EAX); emit_reg_reg(A_MOV,S_B,R_AL,reg32toreg8(hregister)); p^.location.register:=reg32toreg8(hregister); end; @@ -1311,7 +1311,7 @@ implementation else {$endif test_dest_loc} begin - hregister:=getregister32; + hregister:=getexplicitregister32(R_EAX); emit_reg_reg(A_MOV,S_W,R_AX,reg32toreg16(hregister)); p^.location.register:=reg32toreg16(hregister); end; @@ -1330,7 +1330,7 @@ implementation else {$endif test_dest_loc} begin - hregister:=getregister32; + hregister:=getexplicitregister32(R_EAX); emit_reg_reg(A_MOV,S_L,R_EAX,hregister); p^.location.register:=hregister; end; @@ -1347,7 +1347,7 @@ implementation else {$endif test_dest_loc} begin - hregister:=getregister32; + hregister:=getexplicitregister32(R_EAX); emit_reg_reg(A_MOV,S_L,R_EAX,hregister); p^.location.register:=hregister; end; @@ -1514,7 +1514,12 @@ implementation end. { $Log$ - Revision 1.36 1998-10-20 08:06:39 pierre + Revision 1.37 1998-10-21 08:39:57 florian + + ansistring operator + + + $h and string[n] for n>255 added + * small problem with TP fixed + + Revision 1.36 1998/10/20 08:06:39 pierre * several memory corruptions due to double freemem solved => never use p^.loc.location:=p^.left^.loc.location; + finally I added now by default diff --git a/compiler/pdecl.pas b/compiler/pdecl.pas index 4a11cab62a..c756dd0fcc 100644 --- a/compiler/pdecl.pas +++ b/compiler/pdecl.pas @@ -549,23 +549,14 @@ unit pdecl; do_firstpass(p); if not is_constintnode(p) then Message(cg_e_illegal_expression); -{$ifndef UseAnsiString} - if (p^.value<1) or (p^.value>255) then + if (p^.value<0) then begin Message(parser_e_string_too_long); p^.value:=255; end; consume(RECKKLAMMER); - if p^.value<>255 then - d:=new(pstringdef,init(p^.value)) -{$ifndef GDB} - else d:=new(pstringdef,init(255)); -{$else GDB} - else d:=globaldef('STRING'); -{$endif GDB} -{$else UseAnsiString} if p^.value>255 then - d:=new(pstringdef,ansiinit(p^.value)) + d:=new(pstringdef,longinit(p^.value)) else if p^.value<>255 then d:=new(pstringdef,init(p^.value)) {$ifndef GDB} @@ -573,8 +564,6 @@ unit pdecl; {$else GDB} else d:=globaldef('STRING'); {$endif GDB} - consume(RECKKLAMMER); -{$endif UseAnsiString} disposetree(p); end { should string without suffix be an ansistring also @@ -2081,7 +2070,12 @@ unit pdecl; end. { $Log$ - Revision 1.74 1998-10-20 13:09:13 peter + Revision 1.75 1998-10-21 08:39:59 florian + + ansistring operator + + + $h and string[n] for n>255 added + * small problem with TP fixed + + Revision 1.74 1998/10/20 13:09:13 peter * fixed object(unknown) crash Revision 1.73 1998/10/19 08:54:56 pierre diff --git a/compiler/tgeni386.pas b/compiler/tgeni386.pas index 6319816a20..4833d999c3 100644 --- a/compiler/tgeni386.pas +++ b/compiler/tgeni386.pas @@ -44,6 +44,8 @@ unit tgeni386; function getregister32 : tregister; procedure ungetregister32(r : tregister); + { tries to allocate the passed register, if possible } + function getexplicitregister32(r : tregister) : tregister; {$ifdef SUPPORT_MMX} function getregistermmx : tregister; procedure ungetregistermmx(r : tregister); @@ -303,6 +305,21 @@ implementation else internalerror(10); end; + function getexplicitregister32(r : tregister) : tregister; + + begin + if r in unused then + begin + unused:=unused-[r]; + usedinproc:=usedinproc or ($80 shr byte(r)); + getexplicitregister32:=R_ECX; + exprasmlist^.concat(new(pairegalloc,init(r))); + getexplicitregister32:=r; + end + else + getexplicitregister32:=getregister32; + end; + procedure cleartempgen; begin @@ -349,7 +366,12 @@ begin end. { $Log$ - Revision 1.12 1998-09-20 17:11:24 jonas + Revision 1.13 1998-10-21 08:40:03 florian + + ansistring operator + + + $h and string[n] for n>255 added + * small problem with TP fixed + + Revision 1.12 1998/09/20 17:11:24 jonas * released REGALLOC Revision 1.11 1998/09/16 17:58:33 jonas