From 17950502e1989974722178cb5f4edbb2c689a141 Mon Sep 17 00:00:00 2001 From: florian Date: Thu, 2 Dec 1999 12:38:45 +0000 Subject: [PATCH] + added support for succ/pred() --- compiler/cg386inl.pas | 95 ++++++++++++++++++++++++++++++++----------- compiler/tcinl.pas | 16 +++++++- 2 files changed, 86 insertions(+), 25 deletions(-) diff --git a/compiler/cg386inl.pas b/compiler/cg386inl.pas index f9c55f3afb..d58ba1d9d4 100644 --- a/compiler/cg386inl.pas +++ b/compiler/cg386inl.pas @@ -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() + + Revision 1.82 1999/12/01 12:42:31 peter * fixed bug 698 * removed some notes about unused vars diff --git a/compiler/tcinl.pas b/compiler/tcinl.pas index d175474c5f..66a17fd07c 100644 --- a/compiler/tcinl.pas +++ b/compiler/tcinl.pas @@ -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() + + Revision 1.61 1999/11/30 10:40:58 peter + ttype, tsymlist Revision 1.60 1999/11/18 15:34:49 pierre