* fixed 'not not boolean', the location was not set to register

This commit is contained in:
peter 1998-10-20 13:12:38 +00:00
parent 309ac0b4cb
commit 887c29f7a2
2 changed files with 129 additions and 142 deletions

View File

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

View File

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