mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 08:09:33 +02:00
* possible bug with too few registers in first/secondin fixed
This commit is contained in:
parent
b74af9c243
commit
58027e2792
@ -331,12 +331,13 @@ implementation
|
||||
begin
|
||||
p^.location.resflags:=F_NE;
|
||||
case p^.right^.location.loc of
|
||||
LOC_REGISTER,
|
||||
LOC_CREGISTER : begin
|
||||
exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
|
||||
1 shl (p^.left^.value and 31),p^.right^.location.register)));
|
||||
ungetregister32(p^.right^.location.register);
|
||||
end
|
||||
LOC_REGISTER,
|
||||
LOC_CREGISTER:
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
|
||||
1 shl (p^.left^.value and 31),p^.right^.location.register)));
|
||||
ungetregister32(p^.right^.location.register);
|
||||
end
|
||||
else
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
|
||||
@ -348,11 +349,12 @@ implementation
|
||||
else
|
||||
begin
|
||||
case p^.left^.location.loc of
|
||||
LOC_REGISTER,
|
||||
LOC_CREGISTER : begin
|
||||
hr:=p^.left^.location.register;
|
||||
emit_to_reg32(hr);
|
||||
end;
|
||||
LOC_REGISTER,
|
||||
LOC_CREGISTER:
|
||||
begin
|
||||
hr:=p^.left^.location.register;
|
||||
emit_to_reg32(hr);
|
||||
end;
|
||||
else
|
||||
begin
|
||||
{ the set element isn't never samller than a byte }
|
||||
@ -371,6 +373,7 @@ implementation
|
||||
p^.right^.location.register)));
|
||||
else
|
||||
begin
|
||||
del_reference(p^.right^.location.reference);
|
||||
if p^.right^.location.reference.isintvalue then
|
||||
begin
|
||||
{ We have to load the value into a register because
|
||||
@ -384,8 +387,6 @@ implementation
|
||||
else
|
||||
exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr,
|
||||
newreference(p^.right^.location.reference))));
|
||||
|
||||
del_reference(p^.right^.location.reference);
|
||||
end;
|
||||
end;
|
||||
ungetregister32(hr);
|
||||
@ -557,20 +558,7 @@ implementation
|
||||
genitem(t^.greater);
|
||||
end;
|
||||
|
||||
var
|
||||
hr : tregister;
|
||||
|
||||
begin
|
||||
{ case register is modified by the list evalution }
|
||||
if (p^.left^.location.loc=LOC_CREGISTER) then
|
||||
begin
|
||||
hr:=getregister32;
|
||||
case opsize of
|
||||
S_B : hregister:=reg32toreg8(hr);
|
||||
S_W : hregister:=reg32toreg16(hr);
|
||||
S_L : hregister:=hr;
|
||||
end;
|
||||
end;
|
||||
begin
|
||||
last:=0;
|
||||
first:=true;
|
||||
genitem(hp);
|
||||
@ -677,12 +665,21 @@ implementation
|
||||
opsize:=bytes2Sxx[p^.left^.resulttype^.size];
|
||||
{ copy the case expression to a register }
|
||||
case p^.left^.location.loc of
|
||||
LOC_REGISTER,
|
||||
LOC_CREGISTER:
|
||||
LOC_REGISTER:
|
||||
hregister:=p^.left^.location.register;
|
||||
LOC_CREGISTER:
|
||||
begin
|
||||
hregister:=getregister32;
|
||||
case opsize of
|
||||
S_B : hregister:=reg32toreg8(hregister);
|
||||
S_W : hregister:=reg32toreg16(hregister);
|
||||
end;
|
||||
exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
|
||||
p^.left^.location.register,hregister)));
|
||||
end;
|
||||
LOC_MEM,LOC_REFERENCE : begin
|
||||
del_reference(p^.left^.location.reference);
|
||||
hregister:=getregister32;
|
||||
hregister:=getregister32;
|
||||
case opsize of
|
||||
S_B : hregister:=reg32toreg8(hregister);
|
||||
S_W : hregister:=reg32toreg16(hregister);
|
||||
@ -778,7 +775,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.11 1998-09-04 08:41:41 peter
|
||||
Revision 1.12 1998-09-05 23:51:05 florian
|
||||
* possible bug with too few registers in first/secondin fixed
|
||||
|
||||
Revision 1.11 1998/09/04 08:41:41 peter
|
||||
* updated some error messages
|
||||
|
||||
Revision 1.10 1998/09/03 17:08:40 pierre
|
||||
|
@ -617,7 +617,7 @@ unit pass_1;
|
||||
is_open_array(pvarsym(p^.symtableentry)^.definition) then
|
||||
p^.registers32:=1;
|
||||
if p^.symtable^.symtabletype=withsymtable then
|
||||
p^.registers32:=1;
|
||||
inc(p^.registers32);
|
||||
|
||||
{ a class variable is a pointer !!!
|
||||
yes, but we have to resolve the reference in an
|
||||
@ -4555,7 +4555,15 @@ unit pass_1;
|
||||
{ this is not allways true due to optimization }
|
||||
{ but if we don't set this we get problems with optimizing self code }
|
||||
if psetdef(p^.right^.resulttype)^.settype<>smallset then
|
||||
procinfo.flags:=procinfo.flags or pi_do_call;
|
||||
procinfo.flags:=procinfo.flags or pi_do_call
|
||||
else
|
||||
begin
|
||||
{ a smallset needs maybe an misc. register }
|
||||
if (p^.left^.treetype<>ordconstn) and
|
||||
not(p^.right^.location.loc in [LOC_CREGISTER,LOC_REGISTER]) and
|
||||
(p^.right^.registers32<1) then
|
||||
inc(p^.registers32);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure firststatement(var p : ptree);
|
||||
@ -5448,7 +5456,10 @@ unit pass_1;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.74 1998-09-05 23:04:00 florian
|
||||
Revision 1.75 1998-09-05 23:51:06 florian
|
||||
* possible bug with too few registers in first/secondin fixed
|
||||
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user