diff --git a/CGI.Comments b/CGI.Comments index 37b9bef..8640597 100644 --- a/CGI.Comments +++ b/CGI.Comments @@ -90,10 +90,12 @@ { } { pc_adi - integer addition } { pc_adl - long addition } +{ pc_adq - long long addition } { pc_adr - real addition } { } { Gen0(pc_adi) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_adl) cgLong,cgULong } +{ Gen0(pc_adq) cgQuad,cgUQuad } { Gen0(pc_adr) cgReal,cgDouble,cgComp,cgExtended } { } { The two values on the top of the evaluation stack are } @@ -547,10 +549,12 @@ { } { pc_sbi - integer subtraction } { pc_sbl - long subtraction } +{ pc_sbq - long long subtraction } { pc_sbr - real subtraction } { } { Gen0(pc_sbi) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_sbl) cgLong,cgULong } +{ Gen0(pc_sbq) cgQuad,cgUQuad } { Gen0(pc_sbr) cgReal,cgDouble,cgComp,cgExtended } { } { The two values on the top of the evaluation stack are } diff --git a/CGI.pas b/CGI.pas index ac6f87d..fa81c44 100644 --- a/CGI.pas +++ b/CGI.pas @@ -229,7 +229,7 @@ type dc_sym,pc_lnd,pc_lor,pc_vsr,pc_uml,pc_udl,pc_ulm,pc_pop,pc_gil, pc_gli,pc_gdl,pc_gld,pc_cpi,pc_tri,pc_lbu,pc_lbf,pc_sbf,pc_cbf,dc_cns, dc_prm,pc_nat,pc_bno,pc_nop,pc_psh,pc_ili,pc_iil,pc_ild,pc_idl, - pc_bqr,pc_bqx,pc_baq,pc_bnq,pc_ngq); + pc_bqr,pc_bqx,pc_baq,pc_bnq,pc_ngq,pc_adq,pc_sbq); {intermediate code} {-----------------} diff --git a/DAG.pas b/DAG.pas index d59bcf0..fe777da 100644 --- a/DAG.pas +++ b/DAG.pas @@ -110,7 +110,7 @@ function CodesMatch (op1, op2: icptr; exact: boolean): boolean; pc_adi, pc_adl, pc_adr, pc_and, pc_lnd, pc_bnd, pc_bal, pc_bor, pc_blr, pc_bxr, pc_blx, pc_equ, pc_neq, pc_ior, pc_lor, pc_mpi, - pc_umi, pc_mpl, pc_uml, pc_mpr, pc_bqr, pc_bqx, pc_baq: begin + pc_umi, pc_mpl, pc_uml, pc_mpr, pc_bqr, pc_bqx, pc_baq, pc_adq: begin if op1^.left = op2^.left then if op1^.right = op2^.right then result := true; @@ -2266,7 +2266,7 @@ case op^.opcode of pc_udl, pc_ulm, pc_uml, pc_vsr: TypeOf := cgULong; - pc_bnq, pc_ngq, pc_bqr, pc_bqx, pc_baq: + pc_bnq, pc_ngq, pc_bqr, pc_bqx, pc_baq, pc_adq, pc_sbq: TypeOf := cgQuad; pc_ngr, pc_adr, pc_dvr, pc_mpr, pc_sbr: @@ -4062,7 +4062,7 @@ var pc_mdl,pc_ulm,pc_mpi,pc_umi,pc_mpl,pc_uml,pc_mpr,pc_ngi, pc_ngl,pc_ngr,pc_not,pc_pop,pc_sbi,pc_sbl,pc_sbr, pc_shl,pc_sll,pc_shr,pc_usr,pc_slr,pc_vsr,pc_tri, - pc_bqr,pc_bqx,pc_baq,pc_bnq,pc_ngq] + pc_bqr,pc_bqx,pc_baq,pc_bnq,pc_ngq,pc_adq,pc_sbq] then begin op^.parents := icount; icount := icount+1; @@ -4942,7 +4942,8 @@ case code^.opcode of pc_les, pc_neq, pc_ior, pc_lor, pc_ixa, pc_mod, pc_uim, pc_mdl, pc_ulm, pc_mpi, pc_umi, pc_mpl, pc_uml, pc_mpr, pc_psh, pc_sbi, pc_sbl, pc_sbr, pc_shl, pc_sll, pc_shr, pc_usr, pc_slr, pc_vsr, - pc_tri, pc_sbf, pc_sto, pc_cui, pc_bqr, pc_bqx, pc_baq: + pc_tri, pc_sbf, pc_sto, pc_cui, pc_bqr, pc_bqx, pc_baq, pc_adq, + pc_sbq: begin code^.right := Pop; code^.left := Pop; diff --git a/Expression.pas b/Expression.pas index 053f79e..e07067d 100644 --- a/Expression.pas +++ b/Expression.pas @@ -3063,6 +3063,8 @@ case tree^.token.kind of Gen0(pc_adi) else if et in [cgLong,cgULong] then Gen0(pc_adl) + else if et in [cgQuad,cgUQuad] then + Gen0(pc_adq) else if et = cgExtended then Gen0(pc_adr) else @@ -3077,6 +3079,8 @@ case tree^.token.kind of Gen0(pc_sbi) else if et in [cgLong,cgULong] then Gen0(pc_sbl) + else if et in [cgQuad,cgUQuad] then + Gen0(pc_sbq) else if et = cgExtended then Gen0(pc_sbr) else @@ -3422,6 +3426,8 @@ case tree^.token.kind of Gen0(pc_adi); cgLong,cgULong: Gen0(pc_adl); + cgQuad,cgUQuad: + Gen0(pc_adq); cgExtended: Gen0(pc_adr); otherwise: @@ -3478,6 +3484,8 @@ case tree^.token.kind of Gen0(pc_sbi); cgLong,cgULong: Gen0(pc_sbl); + cgQuad,cgUQuad: + Gen0(pc_sbq); cgExtended: Gen0(pc_sbr); otherwise: diff --git a/Gen.pas b/Gen.pas index 8cfef46..eee616e 100644 --- a/Gen.pas +++ b/Gen.pas @@ -679,6 +679,49 @@ else begin end; {GenAdlSbl} +procedure GenAdqSbq (op: icptr); + +{ generate code for pc_adq, pc_sbq } +{ } +{ parameters: } +{ op - pc_adq or pc_sbq operation } + +begin {GenAdqSbq} +GenTree(op^.right); +GenTree(op^.left); +if op^.opcode = pc_adq then begin + GenImplied(m_clc); + GenImplied(m_pla); + GenNative(m_adc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + GenImplied(m_pla); + GenNative(m_adc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + GenImplied(m_pla); + GenNative(m_adc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + GenImplied(m_pla); + GenNative(m_adc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + end {else} +else {if op^.opcode = pc_sbq then} begin + GenImplied(m_sec); + GenImplied(m_pla); + GenNative(m_sbc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + GenImplied(m_pla); + GenNative(m_sbc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + GenImplied(m_pla); + GenNative(m_sbc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + GenImplied(m_pla); + GenNative(m_sbc_s, direct, 7, nil, 0); + GenNative(m_sta_s, direct, 7, nil, 0); + end; {else} +end; {GenAdqSbq} + + procedure GenCmp (op: icptr; rOpcode: pcodes; lb: integer); { generate code for pc_les, pc_leq, pc_grt or pc_geq } @@ -5755,6 +5798,7 @@ case op^.opcode of pc_add: GenNative(d_add, genaddress, op^.q, nil, 0); pc_adi: GenAdi(op); pc_adl,pc_sbl: GenAdlSbl(op, nil); + pc_adq,pc_sbq: GenAdqSbq(op); pc_adr,pc_dvr,pc_mpr,pc_sbr: GenRealBinOp(op); pc_and,pc_bnd,pc_bor,pc_bxr,pc_ior: GenLogic(op); pc_blr,pc_blx,pc_bal,pc_dvl,pc_mdl,pc_mpl,pc_sll,pc_slr,pc_udl,pc_ulm,