mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-16 06:42:37 +02:00
* fix for bug0258
This commit is contained in:
parent
4fe0f4f1a2
commit
3921a5be23
@ -90,6 +90,9 @@ implementation
|
|||||||
i,numparts : byte;
|
i,numparts : byte;
|
||||||
{href,href2 : Treference;}
|
{href,href2 : Treference;}
|
||||||
l,l2 : pasmlabel;
|
l,l2 : pasmlabel;
|
||||||
|
{$ifdef CORRECT_SET_IN_FPC}
|
||||||
|
AM : tasmop;
|
||||||
|
{$endif CORRECT_SET_IN_FPC}
|
||||||
|
|
||||||
function analizeset(Aset:pconstset;is_small:boolean):boolean;
|
function analizeset(Aset:pconstset;is_small:boolean):boolean;
|
||||||
type
|
type
|
||||||
@ -296,7 +299,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
{ Emit the jump over label }
|
{ Emit the jump over label }
|
||||||
exprasmlist^.concat(new(pai_label,init(l2)));
|
emitlab(l2);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -320,7 +323,7 @@ implementation
|
|||||||
{ To compensate for not doing a second pass }
|
{ To compensate for not doing a second pass }
|
||||||
p^.right^.location.reference.symbol:=nil;
|
p^.right^.location.reference.symbol:=nil;
|
||||||
{ Now place the end label }
|
{ Now place the end label }
|
||||||
exprasmlist^.concat(new(pai_label,init(l)));
|
emitlab(l);
|
||||||
case p^.left^.location.loc of
|
case p^.left^.location.loc of
|
||||||
LOC_REGISTER,
|
LOC_REGISTER,
|
||||||
LOC_CREGISTER : ungetregister32(pleftreg);
|
LOC_CREGISTER : ungetregister32(pleftreg);
|
||||||
@ -403,9 +406,100 @@ implementation
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
if p^.right^.location.reference.is_immediate then
|
||||||
|
begin
|
||||||
|
p^.location.resflags:=F_C;
|
||||||
|
getlabel(l);
|
||||||
|
getlabel(l2);
|
||||||
|
|
||||||
|
{ Is this treated in firstpass ?? }
|
||||||
|
if p^.left^.treetype=ordconstn then
|
||||||
|
begin
|
||||||
|
hr:=getregister32;
|
||||||
|
p^.left^.location.loc:=LOC_REGISTER;
|
||||||
|
p^.left^.location.register:=hr;
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
|
||||||
|
p^.left^.value,hr)));
|
||||||
|
end;
|
||||||
|
case p^.left^.location.loc of
|
||||||
|
LOC_REGISTER,
|
||||||
|
LOC_CREGISTER:
|
||||||
|
begin
|
||||||
|
hr:=regtoreg32(p^.left^.location.register);
|
||||||
|
{$ifdef CORRECT_SET_IN_FPC}
|
||||||
|
if m_tp in aktmodeswitches then
|
||||||
|
begin
|
||||||
|
if is_signed(p^.left^.resulttype) then
|
||||||
|
AM:=A_MOVSX
|
||||||
|
else
|
||||||
|
AM:=A_MOVZX;
|
||||||
|
if p^.left^.location.register in [R_AX,R_DI] then
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg_reg(AM,S_WL,
|
||||||
|
p^.left^.location.register,hr)))
|
||||||
|
else if p^.left^.location.register in [R_AL,R_DH] then
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg_reg(AM,S_BL,
|
||||||
|
p^.left^.location.register,hr)));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{$endif CORRECT_SET_IN_FPC}
|
||||||
|
begin
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_L,
|
||||||
|
255,hr)));
|
||||||
|
end;
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,
|
||||||
|
31,hr)));
|
||||||
|
emitjmp(C_NA,l);
|
||||||
|
{ reset carry flag }
|
||||||
|
exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO)));
|
||||||
|
emitjmp(C_NONE,l2);
|
||||||
|
emitlab(l);
|
||||||
|
{ We have to load the value into a register because
|
||||||
|
btl does not accept values only refs or regs (PFV) }
|
||||||
|
hr2:=getregister32;
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
|
||||||
|
p^.right^.location.reference.offset,hr2)));
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2)));
|
||||||
|
ungetregister32(hr2);
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
{$ifdef CORRECT_SET_IN_FPC}
|
||||||
|
if m_tp in aktmodeswitches then
|
||||||
|
begin
|
||||||
|
{***WARNING only correct if
|
||||||
|
reference is 32 bits (PM) *****}
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_L,
|
||||||
|
31,newreference(p^.left^.location.reference))));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{$endif CORRECT_SET_IN_FPC}
|
||||||
|
begin
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
|
||||||
|
31,newreference(p^.left^.location.reference))));
|
||||||
|
end;
|
||||||
|
emitjmp(C_NA,l);
|
||||||
|
{ reset carry flag }
|
||||||
|
exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO)));
|
||||||
|
emitjmp(C_NONE,l2);
|
||||||
|
emitlab(l);
|
||||||
|
hr:=getregister32;
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
||||||
|
newreference(p^.left^.location.reference),hr)));
|
||||||
|
{ We have to load the value into a register because
|
||||||
|
btl does not accept values only refs or regs (PFV) }
|
||||||
|
hr2:=getregister32;
|
||||||
|
exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
|
||||||
|
p^.right^.location.reference.offset,hr2)));
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2)));
|
||||||
|
ungetregister32(hr2);
|
||||||
|
del_reference(p^.left^.location.reference);
|
||||||
|
end;
|
||||||
|
emitlab(l2);
|
||||||
|
end;
|
||||||
|
end { of p^.right^.location.reference.is_immediate }
|
||||||
{ do search in a normal set which could have >32 elementsm
|
{ do search in a normal set which could have >32 elementsm
|
||||||
but also used if the left side contains higher values > 32 }
|
but also used if the left side contains higher values > 32 }
|
||||||
if p^.left^.treetype=ordconstn then
|
else if p^.left^.treetype=ordconstn then
|
||||||
begin
|
begin
|
||||||
p^.location.resflags:=F_NE;
|
p^.location.resflags:=F_NE;
|
||||||
inc(p^.right^.location.reference.offset,p^.left^.value shr 3);
|
inc(p^.right^.location.reference.offset,p^.left^.value shr 3);
|
||||||
@ -816,7 +910,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.33 1999-06-02 10:11:48 florian
|
Revision 1.34 1999-06-08 15:27:24 pierre
|
||||||
|
* fix for bug0258
|
||||||
|
|
||||||
|
Revision 1.33 1999/06/02 10:11:48 florian
|
||||||
* make cycle fixed i.e. compilation with 0.99.10
|
* make cycle fixed i.e. compilation with 0.99.10
|
||||||
* some fixes for qword
|
* some fixes for qword
|
||||||
* start of register calling conventions
|
* start of register calling conventions
|
||||||
|
Loading…
Reference in New Issue
Block a user