mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 10:49:07 +02:00
+ ansistring operator +
+ $h and string[n] for n>255 added * small problem with TP fixed
This commit is contained in:
parent
b70ee498ad
commit
d666ac848e
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user