mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 20:49:49 +02:00
+ added support for succ/pred(<qword/int64>)
This commit is contained in:
parent
53e197de2d
commit
17950502e1
@ -1077,34 +1077,80 @@ implementation
|
||||
internalerror(10080);
|
||||
end;
|
||||
p^.location.loc:=LOC_REGISTER;
|
||||
if p^.left^.location.loc<>LOC_REGISTER then
|
||||
if p^.resulttype^.size=8 then
|
||||
begin
|
||||
p^.location.register:=getregister32;
|
||||
if (p^.resulttype^.size=2) then
|
||||
p^.location.register:=reg32toreg16(p^.location.register);
|
||||
if (p^.resulttype^.size=1) then
|
||||
p^.location.register:=reg32toreg8(p^.location.register);
|
||||
if p^.left^.location.loc=LOC_CREGISTER then
|
||||
emit_reg_reg(A_MOV,opsize,p^.left^.location.register,
|
||||
p^.location.register)
|
||||
else
|
||||
if p^.left^.location.loc=LOC_FLAGS then
|
||||
emit_flag2reg(p^.left^.location.resflags,p^.location.register)
|
||||
if p^.left^.location.loc<>LOC_REGISTER then
|
||||
begin
|
||||
p^.location.registerlow:=getregister32;
|
||||
p^.location.registerhigh:=getregister32;
|
||||
if p^.left^.location.loc=LOC_CREGISTER then
|
||||
begin
|
||||
emit_reg_reg(A_MOV,opsize,p^.left^.location.registerlow,
|
||||
p^.location.registerlow);
|
||||
emit_reg_reg(A_MOV,opsize,p^.left^.location.registerhigh,
|
||||
p^.location.registerhigh);
|
||||
end
|
||||
else
|
||||
begin
|
||||
del_reference(p^.left^.location.reference);
|
||||
emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
|
||||
p^.location.registerlow);
|
||||
r:=newreference(p^.left^.location.reference);
|
||||
inc(r^.offset,4);
|
||||
emit_ref_reg(A_MOV,opsize,r,
|
||||
p^.location.registerhigh);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
del_reference(p^.left^.location.reference);
|
||||
emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
|
||||
p^.location.register);
|
||||
p^.location.registerhigh:=p^.left^.location.registerhigh;
|
||||
p^.location.registerlow:=p^.left^.location.registerlow;
|
||||
end;
|
||||
if p^.inlinenumber=in_succ_x then
|
||||
begin
|
||||
emit_const_reg(A_ADD,opsize,1,
|
||||
p^.location.registerlow);
|
||||
emit_const_reg(A_ADC,opsize,0,
|
||||
p^.location.registerhigh);
|
||||
end
|
||||
else
|
||||
begin
|
||||
emit_const_reg(A_SUB,opsize,1,
|
||||
p^.location.registerlow);
|
||||
emit_const_reg(A_SBB,opsize,0,
|
||||
p^.location.registerhigh);
|
||||
end;
|
||||
end
|
||||
else p^.location.register:=p^.left^.location.register;
|
||||
|
||||
if not (cs_check_overflow in aktlocalswitches) then
|
||||
emit_reg(asmop,opsize,
|
||||
p^.location.register)
|
||||
else
|
||||
emit_const_reg(asmop,opsize,1,
|
||||
p^.location.register);
|
||||
begin
|
||||
if p^.left^.location.loc<>LOC_REGISTER then
|
||||
begin
|
||||
p^.location.register:=getregister32;
|
||||
if (p^.resulttype^.size=2) then
|
||||
p^.location.register:=reg32toreg16(p^.location.register);
|
||||
if (p^.resulttype^.size=1) then
|
||||
p^.location.register:=reg32toreg8(p^.location.register);
|
||||
if p^.left^.location.loc=LOC_CREGISTER then
|
||||
emit_reg_reg(A_MOV,opsize,p^.left^.location.register,
|
||||
p^.location.register)
|
||||
else
|
||||
if p^.left^.location.loc=LOC_FLAGS then
|
||||
emit_flag2reg(p^.left^.location.resflags,p^.location.register)
|
||||
else
|
||||
begin
|
||||
del_reference(p^.left^.location.reference);
|
||||
emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
|
||||
p^.location.register);
|
||||
end;
|
||||
end
|
||||
else p^.location.register:=p^.left^.location.register;
|
||||
if not (cs_check_overflow in aktlocalswitches) then
|
||||
emit_reg(asmop,opsize,
|
||||
p^.location.register)
|
||||
else
|
||||
emit_const_reg(asmop,opsize,1,
|
||||
p^.location.register);
|
||||
end;
|
||||
emitoverflowcheck(p);
|
||||
emitrangecheck(p,p^.resulttype);
|
||||
end;
|
||||
@ -1435,7 +1481,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.82 1999-12-01 12:42:31 peter
|
||||
Revision 1.83 1999-12-02 12:38:45 florian
|
||||
+ added support for succ/pred(<qword/int64>)
|
||||
|
||||
Revision 1.82 1999/12/01 12:42:31 peter
|
||||
* fixed bug 698
|
||||
* removed some notes about unused vars
|
||||
|
||||
|
@ -550,8 +550,17 @@ implementation
|
||||
in_pred_x,
|
||||
in_succ_x:
|
||||
begin
|
||||
inc(p^.registers32);
|
||||
p^.resulttype:=p^.left^.resulttype;
|
||||
if is_64bitint(p^.resulttype) then
|
||||
begin
|
||||
if (p^.registers32<2) then
|
||||
p^.registers32:=2
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (p^.registers32<1) then
|
||||
p^.registers32:=1;
|
||||
end;
|
||||
p^.location.loc:=LOC_REGISTER;
|
||||
set_varstate(p^.left,true);
|
||||
if not is_ordinal(p^.resulttype) then
|
||||
@ -1272,7 +1281,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.61 1999-11-30 10:40:58 peter
|
||||
Revision 1.62 1999-12-02 12:38:45 florian
|
||||
+ added support for succ/pred(<qword/int64>)
|
||||
|
||||
Revision 1.61 1999/11/30 10:40:58 peter
|
||||
+ ttype, tsymlist
|
||||
|
||||
Revision 1.60 1999/11/18 15:34:49 pierre
|
||||
|
Loading…
Reference in New Issue
Block a user