* 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:
florian 1998-09-05 23:03:57 +00:00
parent 0d3b28fdbe
commit b74af9c243
4 changed files with 68 additions and 13 deletions

View File

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

View File

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

View File

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

View File

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