mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 05:29:30 +02:00
* fixed 'not not boolean', the location was not set to register
This commit is contained in:
parent
309ac0b4cb
commit
887c29f7a2
@ -420,140 +420,120 @@ implementation
|
|||||||
hl : plabel;
|
hl : plabel;
|
||||||
opsize : topsize;
|
opsize : topsize;
|
||||||
begin
|
begin
|
||||||
if (p^.resulttype^.deftype=orddef) and
|
if is_boolean(p^.resulttype) then
|
||||||
(porddef(p^.resulttype)^.typ in [bool8bit,bool16bit,bool32bit]) then
|
begin
|
||||||
begin
|
opsize:=def_opsize(p^.resulttype);
|
||||||
case porddef(p^.resulttype)^.typ of
|
case p^.left^.location.loc of
|
||||||
bool8bit : opsize:=S_B;
|
LOC_JUMP :
|
||||||
bool16bit : opsize:=S_W;
|
begin
|
||||||
bool32bit : opsize:=S_L;
|
hl:=truelabel;
|
||||||
end;
|
truelabel:=falselabel;
|
||||||
case p^.location.loc of
|
falselabel:=hl;
|
||||||
LOC_JUMP : begin
|
secondpass(p^.left);
|
||||||
hl:=truelabel;
|
maketojumpbool(p^.left);
|
||||||
truelabel:=falselabel;
|
hl:=truelabel;
|
||||||
falselabel:=hl;
|
truelabel:=falselabel;
|
||||||
secondpass(p^.left);
|
falselabel:=hl;
|
||||||
maketojumpbool(p^.left);
|
|
||||||
hl:=truelabel;
|
|
||||||
truelabel:=falselabel;
|
|
||||||
falselabel:=hl;
|
|
||||||
end;
|
|
||||||
LOC_FLAGS : begin
|
|
||||||
secondpass(p^.left);
|
|
||||||
p^.location.resflags:=flagsinvers[p^.left^.location.resflags];
|
|
||||||
end;
|
|
||||||
LOC_REGISTER : begin
|
|
||||||
secondpass(p^.left);
|
|
||||||
p^.location.register:=p^.left^.location.register;
|
|
||||||
exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));
|
|
||||||
end;
|
|
||||||
LOC_CREGISTER : begin
|
|
||||||
secondpass(p^.left);
|
|
||||||
p^.location.loc:=LOC_REGISTER;
|
|
||||||
case porddef(p^.resulttype)^.typ of
|
|
||||||
bool8bit : p^.location.register:=reg32toreg8(getregister32);
|
|
||||||
bool16bit : p^.location.register:=reg32toreg16(getregister32);
|
|
||||||
bool32bit : p^.location.register:=getregister32;
|
|
||||||
end;
|
|
||||||
emit_reg_reg(A_MOV,opsize,p^.left^.location.register,p^.location.register);
|
|
||||||
exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));
|
|
||||||
end;
|
|
||||||
LOC_REFERENCE,
|
|
||||||
LOC_MEM : begin
|
|
||||||
secondpass(p^.left);
|
|
||||||
del_reference(p^.left^.location.reference);
|
|
||||||
p^.location.loc:=LOC_REGISTER;
|
|
||||||
case porddef(p^.resulttype)^.typ of
|
|
||||||
bool8bit : p^.location.register:=reg32toreg8(getregister32);
|
|
||||||
bool16bit : p^.location.register:=reg32toreg16(getregister32);
|
|
||||||
bool32bit : p^.location.register:=getregister32;
|
|
||||||
end;
|
|
||||||
if p^.left^.location.loc=LOC_CREGISTER then
|
|
||||||
emit_reg_reg(A_MOV,opsize,p^.left^.location.register,p^.location.register)
|
|
||||||
else
|
|
||||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
|
|
||||||
newreference(p^.left^.location.reference),p^.location.register)));
|
|
||||||
exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
{$ifdef SUPPORT_MMX}
|
|
||||||
else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(p^.left^.resulttype) then
|
|
||||||
begin
|
|
||||||
secondpass(p^.left);
|
|
||||||
p^.location.loc:=LOC_MMXREGISTER;
|
|
||||||
{ prepare EDI }
|
|
||||||
exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,$ffffffff,R_EDI)));
|
|
||||||
{ load operand }
|
|
||||||
case p^.left^.location.loc of
|
|
||||||
LOC_MMXREGISTER:
|
|
||||||
set_location(p^.location,p^.left^.location);
|
|
||||||
LOC_CMMXREGISTER:
|
|
||||||
begin
|
|
||||||
p^.location.register:=getregistermmx;
|
|
||||||
emit_reg_reg(A_MOVQ,S_NO,p^.left^.location.register,
|
|
||||||
p^.location.register);
|
|
||||||
end;
|
|
||||||
LOC_REFERENCE,LOC_MEM:
|
|
||||||
begin
|
|
||||||
del_reference(p^.left^.location.reference);
|
|
||||||
p^.location.register:=getregistermmx;
|
|
||||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
|
|
||||||
newreference(p^.left^.location.reference),
|
|
||||||
p^.location.register)));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
{ load mask }
|
|
||||||
emit_reg_reg(A_MOV,S_D,R_EDI,R_MM7);
|
|
||||||
{ lower 32 bit }
|
|
||||||
emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
|
|
||||||
{ shift mask }
|
|
||||||
exprasmlist^.concat(new(pai386,op_const_reg(A_PSLLQ,S_NO,
|
|
||||||
32,R_MM7)));
|
|
||||||
{ higher 32 bit }
|
|
||||||
emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
|
|
||||||
end
|
|
||||||
{$endif SUPPORT_MMX}
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
secondpass(p^.left);
|
|
||||||
p^.location.loc:=LOC_REGISTER;
|
|
||||||
|
|
||||||
case p^.left^.location.loc of
|
|
||||||
LOC_REGISTER : begin
|
|
||||||
p^.location.register:=p^.left^.location.register;
|
|
||||||
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
|
|
||||||
end;
|
|
||||||
LOC_CREGISTER : begin
|
|
||||||
p^.location.register:=getregister32;
|
|
||||||
emit_reg_reg(A_MOV,S_L,p^.left^.location.register,
|
|
||||||
p^.location.register);
|
|
||||||
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
|
|
||||||
end;
|
|
||||||
LOC_REFERENCE,LOC_MEM :
|
|
||||||
begin
|
|
||||||
del_reference(p^.left^.location.reference);
|
|
||||||
p^.location.register:=getregister32;
|
|
||||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
|
||||||
newreference(p^.left^.location.reference),
|
|
||||||
p^.location.register)));
|
|
||||||
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
{if p^.left^.location.loc=loc_register then
|
LOC_FLAGS :
|
||||||
p^.location.register:=p^.left^.location.register
|
begin
|
||||||
else
|
secondpass(p^.left);
|
||||||
begin
|
p^.location.resflags:=flagsinvers[p^.left^.location.resflags];
|
||||||
del_locref(p^.left^.location);
|
end;
|
||||||
p^.location.register:=getregister32;
|
LOC_REGISTER :
|
||||||
exprasmlist^.concat(new(pai386,op_loc_reg(A_MOV,S_L,
|
begin
|
||||||
p^.left^.location,
|
secondpass(p^.left);
|
||||||
p^.location.register)));
|
p^.location.register:=p^.left^.location.register;
|
||||||
end;
|
exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));
|
||||||
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));}
|
end;
|
||||||
|
LOC_CREGISTER :
|
||||||
|
begin
|
||||||
|
secondpass(p^.left);
|
||||||
|
clear_location(p^.location);
|
||||||
|
p^.location.loc:=LOC_REGISTER;
|
||||||
|
p^.location.register:=def_getreg(p^.resulttype);
|
||||||
|
emit_reg_reg(A_MOV,opsize,p^.left^.location.register,p^.location.register);
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));
|
||||||
|
end;
|
||||||
|
LOC_REFERENCE,
|
||||||
|
LOC_MEM :
|
||||||
|
begin
|
||||||
|
secondpass(p^.left);
|
||||||
|
clear_location(p^.location);
|
||||||
|
p^.location.loc:=LOC_REGISTER;
|
||||||
|
p^.location.register:=def_getreg(p^.resulttype);
|
||||||
|
del_reference(p^.left^.location.reference);
|
||||||
|
if p^.left^.location.loc=LOC_CREGISTER then
|
||||||
|
emit_reg_reg(A_MOV,opsize,p^.left^.location.register,p^.location.register)
|
||||||
|
else
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
|
||||||
|
newreference(p^.left^.location.reference),p^.location.register)));
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
{$ifdef SUPPORT_MMX}
|
||||||
|
else
|
||||||
|
if (cs_mmx in aktlocalswitches) and is_mmx_able_array(p^.left^.resulttype) then
|
||||||
|
begin
|
||||||
|
secondpass(p^.left);
|
||||||
|
p^.location.loc:=LOC_MMXREGISTER;
|
||||||
|
{ prepare EDI }
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,$ffffffff,R_EDI)));
|
||||||
|
{ load operand }
|
||||||
|
case p^.left^.location.loc of
|
||||||
|
LOC_MMXREGISTER:
|
||||||
|
set_location(p^.location,p^.left^.location);
|
||||||
|
LOC_CMMXREGISTER:
|
||||||
|
begin
|
||||||
|
p^.location.register:=getregistermmx;
|
||||||
|
emit_reg_reg(A_MOVQ,S_NO,p^.left^.location.register,p^.location.register);
|
||||||
|
end;
|
||||||
|
LOC_REFERENCE,LOC_MEM:
|
||||||
|
begin
|
||||||
|
del_reference(p^.left^.location.reference);
|
||||||
|
p^.location.register:=getregistermmx;
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
|
||||||
|
newreference(p^.left^.location.reference),p^.location.register)));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
{ load mask }
|
||||||
|
emit_reg_reg(A_MOV,S_D,R_EDI,R_MM7);
|
||||||
|
{ lower 32 bit }
|
||||||
|
emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
|
||||||
|
{ shift mask }
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_PSLLQ,S_NO,32,R_MM7)));
|
||||||
|
{ higher 32 bit }
|
||||||
|
emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
|
||||||
|
end
|
||||||
|
{$endif SUPPORT_MMX}
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
secondpass(p^.left);
|
||||||
|
clear_location(p^.location);
|
||||||
|
p^.location.loc:=LOC_REGISTER;
|
||||||
|
case p^.left^.location.loc of
|
||||||
|
LOC_REGISTER :
|
||||||
|
begin
|
||||||
|
p^.location.register:=p^.left^.location.register;
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
|
||||||
|
end;
|
||||||
|
LOC_CREGISTER :
|
||||||
|
begin
|
||||||
|
p^.location.register:=getregister32;
|
||||||
|
emit_reg_reg(A_MOV,S_L,p^.left^.location.register,p^.location.register);
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
|
||||||
|
end;
|
||||||
|
LOC_REFERENCE,LOC_MEM :
|
||||||
|
begin
|
||||||
|
del_reference(p^.left^.location.reference);
|
||||||
|
p^.location.register:=getregister32;
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
||||||
|
newreference(p^.left^.location.reference),p^.location.register)));
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -561,7 +541,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.9 1998-10-20 08:06:42 pierre
|
Revision 1.10 1998-10-20 13:12:38 peter
|
||||||
|
* fixed 'not not boolean', the location was not set to register
|
||||||
|
|
||||||
|
Revision 1.9 1998/10/20 08:06:42 pierre
|
||||||
* several memory corruptions due to double freemem solved
|
* several memory corruptions due to double freemem solved
|
||||||
=> never use p^.loc.location:=p^.left^.loc.location;
|
=> never use p^.loc.location:=p^.left^.loc.location;
|
||||||
+ finally I added now by default
|
+ finally I added now by default
|
||||||
|
@ -278,13 +278,15 @@ implementation
|
|||||||
{$ifdef SUPPORT_MMX}
|
{$ifdef SUPPORT_MMX}
|
||||||
p^.registersmmx:=p^.left^.registersmmx;
|
p^.registersmmx:=p^.left^.registersmmx;
|
||||||
{$endif SUPPORT_MMX}
|
{$endif SUPPORT_MMX}
|
||||||
if is_equal(p^.resulttype,booldef) then
|
if is_boolean(p^.resulttype) then
|
||||||
begin
|
begin
|
||||||
p^.registers32:=p^.left^.registers32;
|
p^.registers32:=p^.left^.registers32;
|
||||||
if ((p^.location.loc=LOC_REFERENCE) or
|
if (p^.location.loc in [LOC_REFERENCE,LOC_MEM,LOC_CREGISTER]) then
|
||||||
(p^.location.loc=LOC_CREGISTER)) and
|
begin
|
||||||
(p^.registers32<1) then
|
p^.location.loc:=LOC_REGISTER;
|
||||||
p^.registers32:=1;
|
if (p^.registers32<1) then
|
||||||
|
p^.registers32:=1;
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{$ifdef SUPPORT_MMX}
|
{$ifdef SUPPORT_MMX}
|
||||||
@ -300,7 +302,6 @@ implementation
|
|||||||
begin
|
begin
|
||||||
p^.left:=gentypeconvnode(p^.left,s32bitdef);
|
p^.left:=gentypeconvnode(p^.left,s32bitdef);
|
||||||
firstpass(p^.left);
|
firstpass(p^.left);
|
||||||
|
|
||||||
if codegenerror then
|
if codegenerror then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
@ -311,7 +312,7 @@ implementation
|
|||||||
{$endif SUPPORT_MMX}
|
{$endif SUPPORT_MMX}
|
||||||
|
|
||||||
if (p^.left^.location.loc<>LOC_REGISTER) and
|
if (p^.left^.location.loc<>LOC_REGISTER) and
|
||||||
(p^.registers32<1) then
|
(p^.registers32<1) then
|
||||||
p^.registers32:=1;
|
p^.registers32:=1;
|
||||||
p^.location.loc:=LOC_REGISTER;
|
p^.location.loc:=LOC_REGISTER;
|
||||||
end;
|
end;
|
||||||
@ -322,7 +323,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.4 1998-10-13 16:50:25 pierre
|
Revision 1.5 1998-10-20 13:12:39 peter
|
||||||
|
* fixed 'not not boolean', the location was not set to register
|
||||||
|
|
||||||
|
Revision 1.4 1998/10/13 16:50:25 pierre
|
||||||
* undid some changes of Peter that made the compiler wrong
|
* undid some changes of Peter that made the compiler wrong
|
||||||
for m68k (I had to reinsert some ifdefs)
|
for m68k (I had to reinsert some ifdefs)
|
||||||
* removed several memory leaks under m68k
|
* removed several memory leaks under m68k
|
||||||
|
Loading…
Reference in New Issue
Block a user