From 30fae40c2941bc38daf1dc0663b8958b43b6d964 Mon Sep 17 00:00:00 2001 From: florian Date: Thu, 25 Jul 2002 22:58:30 +0000 Subject: [PATCH] no message --- compiler/ncginl.pas | 146 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 117 insertions(+), 29 deletions(-) diff --git a/compiler/ncginl.pas b/compiler/ncginl.pas index 8e550a8695..8bf5df0c56 100644 --- a/compiler/ncginl.pas +++ b/compiler/ncginl.pas @@ -116,7 +116,7 @@ implementation end; in_pi: begin - second_pi; + second_pi; end; in_sin_extended: begin @@ -210,17 +210,17 @@ implementation truelabel:=otlabel; falselabel:=oflabel; end; - + {***************************************************************************** SIZEOF / TYPEOF GENERIC HANDLING *****************************************************************************} - + { second_handle_ the sizeof and typeof routines } procedure tcginlinenode.second_SizeOfTypeOf; var href : treference; - hregister : tregister; + hregister : tregister; begin location_reset(location,LOC_REGISTER,OS_ADDR); { for both cases load vmt } @@ -249,9 +249,9 @@ implementation end; location.register:=hregister; end; - - - + + + {***************************************************************************** LENGTH GENERIC HANDLING *****************************************************************************} @@ -292,7 +292,7 @@ implementation procedure tcginlinenode.second_PredSucc; var cgsize : TCGSize; - cgop : topcg; + cgop : topcg; begin secondpass(left); if inlinenumber=in_pred_x then @@ -393,9 +393,9 @@ implementation end; cg.g_overflowcheck(exprasmlist,tcallparanode(left).left); cg.g_rangecheck(exprasmlist,tcallparanode(left).left,tcallparanode(left).left.resulttype.def); - end; - - + end; + + {***************************************************************************** TYPEINFO GENERIC HANDLING *****************************************************************************} @@ -407,8 +407,8 @@ implementation location.register:=rg.getaddressregister(exprasmlist); reference_reset_symbol(href,tstoreddef(ttypenode(tcallparanode(left).left).resulttype.def).get_rtti_label(fullrtti),0); cg.a_loadaddr_ref_reg(exprasmlist,href,location.register); - end; - + end; + {***************************************************************************** ASSIGNED GENERIC HANDLING @@ -425,7 +425,7 @@ implementation if (tcallparanode(left).left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then begin { if pointer is non-nil, and is in register, this directly the value we can use } - cg.a_load_reg_reg(exprasmlist, OS_ADDR, tcallparanode(left).left.location.register, hreg); + cg.a_load_reg_reg(exprasmlist, OS_ADDR, tcallparanode(left).left.location.register, hreg); end else begin @@ -436,56 +436,142 @@ implementation cg.a_load_const_reg(exprasmlist, OS_INT, 0, hreg); cg.a_label(exprasmlist,ptrvalidlabel); end; + location.register := hreg; + location_reset(location,LOC_REGISTER,OS_INT); + WriteLn('Exiting assigned node!'); + end; + + +{***************************************************************************** + INCLUDE/EXCLUDE GENERIC HANDLING +*****************************************************************************} + procedure tcginlinenode.second_IncludeExclude; + var + scratch_reg : boolean; + hregister : tregister; + asmop : tasmop; + L : longint; + pushedregs : TMaybesave; + cgop : topcg; + {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!} + begin + location_copy(location,left.location); + secondpass(tcallparanode(left).left); + if tcallparanode(tcallparanode(left).right).left.nodetype=ordconstn then + begin + { calculate bit position } + l:=1 shl (tordconstnode(tcallparanode(tcallparanode(left).right).left).value mod 32); + + { determine operator } + if inlinenumber=in_include_x_y then + cgop:=OP_OR + else + begin + cgop:=OP_AND; + l:=not(l); + end; + if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then + begin + inc(tcallparanode(left).left.location.reference.offset, + (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div 32)*4); + cg.a_op_const_ref(exprasmlist,cgop,OS_INT,l,tcallparanode(left).left.location.reference); + location_release(exprasmlist,tcallparanode(left).left.location); + end + else + { LOC_CREGISTER } + begin + cg.a_op_const_reg(exprasmlist,cgop,l,tcallparanode(left).left.location.register); + end; + end + else + begin + { generate code for the element to set } + maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32, + tcallparanode(left).left.location,pushedregs); + secondpass(tcallparanode(tcallparanode(left).right).left); + maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs); + { determine asm operator } + if inlinenumber=in_include_x_y then + asmop:=A_BTS + else + asmop:=A_BTR; + + if tcallparanode(tcallparanode(left).right).left.location.loc in [LOC_CREGISTER,LOC_REGISTER] then + { we don't need a mod 32 because this is done automatically } + { by the bts instruction. For proper checking we would } + + { note: bts doesn't do any mod'ing, that's why we can also use } + { it for normalsets! (JM) } + + { need a cmp and jmp, but this should be done by the } + { type cast code which does range checking if necessary (FK) } + begin + scratch_reg := FALSE; + WriteLn('HELLO!'); + hregister := rg.makeregsize(tcallparanode(tcallparanode(left).right).left.location.register,OS_INT); + end + else + begin + scratch_reg := TRUE; + hregister:=cg.get_scratch_reg_int(exprasmlist); + end; + cg.a_load_loc_reg(exprasmlist,tcallparanode(tcallparanode(left).right).left.location,hregister); + if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then + emit_reg_ref(asmop,S_L,hregister,tcallparanode(left).left.location.reference) + else + emit_reg_reg(asmop,S_L,hregister,tcallparanode(left).left.location.register); + if scratch_reg then + cg.free_scratch_reg(exprasmlist,hregister); + end; location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def)); location.register := rg.makeregsize(hreg,def_cgsize(resulttype.def)); end; -*) {***************************************************************************** FLOAT GENERIC HANDLING *****************************************************************************} -{ - These routines all call internal RTL routines, so if they are +{ + These routines all call internal RTL routines, so if they are called here, they give an internal error -} +} procedure tcginlinenode.second_pi; begin internalerror(20020718); end; - + procedure tcginlinenode.second_arctan_real; begin internalerror(20020718); end; - + procedure tcginlinenode.second_abs_real; begin internalerror(20020718); end; - - + + procedure tcginlinenode.second_sqr_real; begin internalerror(20020718); end; - + procedure tcginlinenode.second_sqrt_real; begin internalerror(20020718); end; - + procedure tcginlinenode.second_ln_real; begin internalerror(20020718); end; - + procedure tcginlinenode.second_cos_real; begin internalerror(20020718); end; - + procedure tcginlinenode.second_sin_real; begin internalerror(20020718); @@ -497,10 +583,12 @@ end. { $Log$ - Revision 1.2 2002-07-25 17:55:41 carl + Revision 1.3 2002-07-25 22:58:30 florian + no message + + Revision 1.2 2002/07/25 17:55:41 carl + First working revision Revision 1.1 2002/07/24 04:07:49 carl + first revision (incomplete) - -} +} \ No newline at end of file