mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-10 22:26:00 +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_MEM,
|
||||
LOC_REFERENCE : begin
|
||||
del_reference(p^.left^.right^.left^.location.reference);
|
||||
hregister:=getregister32;
|
||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
||||
newreference(p^.left^.right^.left^.location.reference),hregister)));
|
||||
@ -785,16 +786,32 @@ implementation
|
||||
if addconstant then
|
||||
begin
|
||||
if (addvalue=1) and not(cs_check_overflow in aktlocalswitches) then
|
||||
exprasmlist^.concat(new(pai386,op_ref(incdecop[p^.inlinenumber],opsize,
|
||||
newreference(p^.left^.left^.location.reference))))
|
||||
begin
|
||||
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
|
||||
exprasmlist^.concat(new(pai386,op_const_ref(addsubop[p^.inlinenumber],opsize,
|
||||
addvalue,newreference(p^.left^.left^.location.reference))));
|
||||
begin
|
||||
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
|
||||
else
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_reg_ref(addsubop[p^.inlinenumber],opsize,
|
||||
hregister,newreference(p^.left^.left^.location.reference))));
|
||||
if p^.left^.left^.location.loc=LOC_CREGISTER then
|
||||
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);
|
||||
end;
|
||||
emitoverflowcheck(p^.left^.left);
|
||||
@ -913,7 +930,14 @@ implementation
|
||||
end.
|
||||
{
|
||||
$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
|
||||
|
||||
Revision 1.1 1998/08/31 12:22:14 peter
|
||||
|
@ -434,14 +434,24 @@ implementation
|
||||
dec(c_usableregs);
|
||||
|
||||
{ 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
|
||||
begin
|
||||
regvars[i]^.reg:=reg32toreg8(varregs[i]);
|
||||
regsize:=S_B;
|
||||
end
|
||||
else if (regvars[i]^.definition^.deftype=orddef) and
|
||||
(porddef(regvars[i]^.definition)^.typ in [bool16bit,u16bit,s16bit]) then
|
||||
else if (regvars[i]^.definition^.deftype=orddef) and
|
||||
(porddef(regvars[i]^.definition)^.typ in [bool16bit,u16bit,s16bit]) then
|
||||
begin
|
||||
regvars[i]^.reg:=reg32toreg16(varregs[i]);
|
||||
regsize:=S_W;
|
||||
@ -506,7 +516,14 @@ implementation
|
||||
end.
|
||||
{
|
||||
$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
|
||||
|
||||
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
|
||||
goto failed
|
||||
:success
|
||||
|
@ -4032,6 +4032,13 @@ unit pass_1;
|
||||
p^.left^.right^.left:=gentypeconvnode(p^.left^.right^.left,s32bitdef);
|
||||
{ check the type conversion }
|
||||
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
|
||||
Message(cg_e_illegal_expression);
|
||||
end;
|
||||
@ -5441,7 +5448,14 @@ unit pass_1;
|
||||
end.
|
||||
{
|
||||
$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,
|
||||
(a=1 was compiled to cmp 1,a now it is compiled to cmp 0,a)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user