mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 02:49:21 +02:00
* some fixes to get -Or work:
- inc/dec didn't take care of CREGISTER - register calculcation of inc/dec was wrong - var/const parameters get now assigned 32 bit register, but const parameters only if they are passed by reference !
This commit is contained in:
parent
0d3b28fdbe
commit
b74af9c243
@ -767,6 +767,7 @@ implementation
|
|||||||
LOC_CREGISTER : hregister:=p^.left^.right^.left^.location.register;
|
LOC_CREGISTER : hregister:=p^.left^.right^.left^.location.register;
|
||||||
LOC_MEM,
|
LOC_MEM,
|
||||||
LOC_REFERENCE : begin
|
LOC_REFERENCE : begin
|
||||||
|
del_reference(p^.left^.right^.left^.location.reference);
|
||||||
hregister:=getregister32;
|
hregister:=getregister32;
|
||||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
||||||
newreference(p^.left^.right^.left^.location.reference),hregister)));
|
newreference(p^.left^.right^.left^.location.reference),hregister)));
|
||||||
@ -785,16 +786,32 @@ implementation
|
|||||||
if addconstant then
|
if addconstant then
|
||||||
begin
|
begin
|
||||||
if (addvalue=1) and not(cs_check_overflow in aktlocalswitches) then
|
if (addvalue=1) and not(cs_check_overflow in aktlocalswitches) then
|
||||||
exprasmlist^.concat(new(pai386,op_ref(incdecop[p^.inlinenumber],opsize,
|
begin
|
||||||
newreference(p^.left^.left^.location.reference))))
|
if p^.left^.left^.location.loc=LOC_CREGISTER then
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg(incdecop[p^.inlinenumber],opsize,
|
||||||
|
p^.left^.left^.location.register)))
|
||||||
|
else
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref(incdecop[p^.inlinenumber],opsize,
|
||||||
|
newreference(p^.left^.left^.location.reference))))
|
||||||
|
end
|
||||||
else
|
else
|
||||||
exprasmlist^.concat(new(pai386,op_const_ref(addsubop[p^.inlinenumber],opsize,
|
begin
|
||||||
addvalue,newreference(p^.left^.left^.location.reference))));
|
if p^.left^.left^.location.loc=LOC_CREGISTER then
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(addsubop[p^.inlinenumber],opsize,
|
||||||
|
addvalue,p^.left^.left^.location.register)))
|
||||||
|
else
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_ref(addsubop[p^.inlinenumber],opsize,
|
||||||
|
addvalue,newreference(p^.left^.left^.location.reference))));
|
||||||
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
exprasmlist^.concat(new(pai386,op_reg_ref(addsubop[p^.inlinenumber],opsize,
|
if p^.left^.left^.location.loc=LOC_CREGISTER then
|
||||||
hregister,newreference(p^.left^.left^.location.reference))));
|
exprasmlist^.concat(new(pai386,op_reg_reg(addsubop[p^.inlinenumber],opsize,
|
||||||
|
hregister,p^.left^.left^.location.register)))
|
||||||
|
else
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg_ref(addsubop[p^.inlinenumber],opsize,
|
||||||
|
hregister,newreference(p^.left^.left^.location.reference))));
|
||||||
ungetregister32(hregister);
|
ungetregister32(hregister);
|
||||||
end;
|
end;
|
||||||
emitoverflowcheck(p^.left^.left);
|
emitoverflowcheck(p^.left^.left);
|
||||||
@ -913,7 +930,14 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1998-09-04 08:41:40 peter
|
Revision 1.3 1998-09-05 23:03:57 florian
|
||||||
|
* some fixes to get -Or work:
|
||||||
|
- inc/dec didn't take care of CREGISTER
|
||||||
|
- register calculcation of inc/dec was wrong
|
||||||
|
- var/const parameters get now assigned 32 bit register, but
|
||||||
|
const parameters only if they are passed by reference !
|
||||||
|
|
||||||
|
Revision 1.2 1998/09/04 08:41:40 peter
|
||||||
* updated some error messages
|
* updated some error messages
|
||||||
|
|
||||||
Revision 1.1 1998/08/31 12:22:14 peter
|
Revision 1.1 1998/08/31 12:22:14 peter
|
||||||
|
@ -434,14 +434,24 @@ implementation
|
|||||||
dec(c_usableregs);
|
dec(c_usableregs);
|
||||||
|
|
||||||
{ possibly no 32 bit register are needed }
|
{ possibly no 32 bit register are needed }
|
||||||
if (regvars[i]^.definition^.deftype=orddef) and
|
|
||||||
|
{ call by reference/const ? }
|
||||||
|
if (regvars[i]^.varspez=vs_var) or
|
||||||
|
((regvars[i]^.varspez=vs_const) and
|
||||||
|
dont_copy_const_param(regvars[i]^.definition)
|
||||||
|
) then
|
||||||
|
begin
|
||||||
|
regvars[i]^.reg:=varregs[i];
|
||||||
|
regsize:=S_L;
|
||||||
|
end
|
||||||
|
else if (regvars[i]^.definition^.deftype=orddef) and
|
||||||
(porddef(regvars[i]^.definition)^.typ in [bool8bit,uchar,u8bit,s8bit]) then
|
(porddef(regvars[i]^.definition)^.typ in [bool8bit,uchar,u8bit,s8bit]) then
|
||||||
begin
|
begin
|
||||||
regvars[i]^.reg:=reg32toreg8(varregs[i]);
|
regvars[i]^.reg:=reg32toreg8(varregs[i]);
|
||||||
regsize:=S_B;
|
regsize:=S_B;
|
||||||
end
|
end
|
||||||
else if (regvars[i]^.definition^.deftype=orddef) and
|
else if (regvars[i]^.definition^.deftype=orddef) and
|
||||||
(porddef(regvars[i]^.definition)^.typ in [bool16bit,u16bit,s16bit]) then
|
(porddef(regvars[i]^.definition)^.typ in [bool16bit,u16bit,s16bit]) then
|
||||||
begin
|
begin
|
||||||
regvars[i]^.reg:=reg32toreg16(varregs[i]);
|
regvars[i]^.reg:=reg32toreg16(varregs[i]);
|
||||||
regsize:=S_W;
|
regsize:=S_W;
|
||||||
@ -506,7 +516,14 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.51 1998-08-31 12:22:14 peter
|
Revision 1.52 1998-09-05 23:03:58 florian
|
||||||
|
* some fixes to get -Or work:
|
||||||
|
- inc/dec didn't take care of CREGISTER
|
||||||
|
- register calculcation of inc/dec was wrong
|
||||||
|
- var/const parameters get now assigned 32 bit register, but
|
||||||
|
const parameters only if they are passed by reference !
|
||||||
|
|
||||||
|
Revision 1.51 1998/08/31 12:22:14 peter
|
||||||
* secondinline moved to cg386inl
|
* secondinline moved to cg386inl
|
||||||
|
|
||||||
Revision 1.50 1998/08/28 10:54:20 peter
|
Revision 1.50 1998/08/28 10:54:20 peter
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
ppc386 -OGp22 -Ch8000000 -dI386 -dGDB -a -Sg pp.pas %1 %2 %3 %4 %5 %6 %7 %8 %9
|
ppc386 -al -OGp22 -Ch8000000 -dI386 -dGDB -a -Sg pp.pas %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||||
if errorlevel 0 goto success
|
if errorlevel 0 goto success
|
||||||
goto failed
|
goto failed
|
||||||
:success
|
:success
|
||||||
|
@ -4032,6 +4032,13 @@ unit pass_1;
|
|||||||
p^.left^.right^.left:=gentypeconvnode(p^.left^.right^.left,s32bitdef);
|
p^.left^.right^.left:=gentypeconvnode(p^.left^.right^.left,s32bitdef);
|
||||||
{ check the type conversion }
|
{ check the type conversion }
|
||||||
firstpass(p^.left^.right^.left);
|
firstpass(p^.left^.right^.left);
|
||||||
|
|
||||||
|
{ need we an additional register ? }
|
||||||
|
if not(is_constintnode(p^.left^.right^.left)) and
|
||||||
|
(p^.left^.right^.left^.location.loc in [LOC_MEM,LOC_REFERENCE]) and
|
||||||
|
(p^.left^.right^.left^.registers32<1) then
|
||||||
|
inc(p^.registers32);
|
||||||
|
|
||||||
if assigned(p^.left^.right^.right) then
|
if assigned(p^.left^.right^.right) then
|
||||||
Message(cg_e_illegal_expression);
|
Message(cg_e_illegal_expression);
|
||||||
end;
|
end;
|
||||||
@ -5441,7 +5448,14 @@ unit pass_1;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.73 1998-09-05 22:29:57 florian
|
Revision 1.74 1998-09-05 23:04:00 florian
|
||||||
|
* some fixes to get -Or work:
|
||||||
|
- inc/dec didn't take care of CREGISTER
|
||||||
|
- register calculcation of inc/dec was wrong
|
||||||
|
- var/const parameters get now assigned 32 bit register, but
|
||||||
|
const parameters only if they are passed by reference !
|
||||||
|
|
||||||
|
Revision 1.73 1998/09/05 22:29:57 florian
|
||||||
+ the boolean comparision a=true generates now the same code as only a,
|
+ the boolean comparision a=true generates now the same code as only a,
|
||||||
(a=1 was compiled to cmp 1,a now it is compiled to cmp 0,a)
|
(a=1 was compiled to cmp 1,a now it is compiled to cmp 0,a)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user