+ ansistring operator +

+ $h and string[n] for n>255 added
  * small problem with TP fixed
This commit is contained in:
florian 1998-10-21 08:39:56 +00:00
parent b70ee498ad
commit d666ac848e
4 changed files with 96 additions and 28 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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