From da6811ed5864d0946e1cf70786953842cb5091d7 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Tue, 9 Dec 2003 19:14:50 +0000 Subject: [PATCH] * fixed and optimized in-node with constant smallset * some register usage optimisations. --- compiler/ncgset.pas | 95 +++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/compiler/ncgset.pas b/compiler/ncgset.pas index cf6f14ae52..372bd20cc2 100644 --- a/compiler/ncgset.pas +++ b/compiler/ncgset.pas @@ -251,11 +251,11 @@ implementation { location is always LOC_JUMP } location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def)); - { allocate a register for the result } - location.register := cg.getintregister(exprasmlist,location.size); if genjumps then begin + { allocate a register for the result } + location.register := cg.getintregister(exprasmlist,location.size); { Get a label to jump to the end } objectlibrary.getlabel(l); @@ -385,10 +385,12 @@ implementation if left.nodetype=ordconstn then begin location_force_reg(exprasmlist,right.location,OS_32,true); + cg.ungetregister(exprasmlist,right.location.register); + { allocate a register for the result } + location.register := cg.getintregister(exprasmlist,location.size); { then SHR the register } cg.a_op_const_reg_reg(exprasmlist,OP_SHR,OS_INT, tordconstnode(left).value and 31,right.location.register,location.register); - cg.ungetregister(exprasmlist,right.location.register); { then extract the lowest bit } cg.a_op_const_reg(exprasmlist,OP_AND,OS_INT,1,location.register); end @@ -413,10 +415,12 @@ implementation end; location_force_reg(exprasmlist,right.location,OS_32,true); - { emit bit test operation } - emit_bit_test_reg_reg(exprasmlist,hr,right.location.register,location.register); { free the resources } cg.ungetregister(exprasmlist,right.location.register); + { allocate a register for the result } + location.register := cg.getintregister(exprasmlist,location.size); + { emit bit test operation } + emit_bit_test_reg_reg(exprasmlist,hr,right.location.register,location.register); { free bitnumber register } cg.ungetregister(exprasmlist,hr); end; @@ -426,50 +430,40 @@ implementation begin if right.location.loc=LOC_CONSTANT then begin - { this section has not been tested! } { can it actually occur currently? CEC } { yes: "if bytevar in [1,3,5,7,9,11,13,15]" (JM) } - objectlibrary.getlabel(l); - objectlibrary.getlabel(l2); - case left.location.loc of - LOC_REGISTER, - LOC_CREGISTER: - begin - hr:=cg.makeregsize(left.location.register,OS_INT); - cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr); - cg.a_cmp_const_reg_label(exprasmlist,OS_INT,OC_BE,31,hr,l); - { reset of result register is done in routine entry } - cg.a_jmp_always(exprasmlist,l2); - cg.a_label(exprasmlist,l); - { We have to load the value into a register because - btl does not accept values only refs or regs (PFV) } - hr2:=cg.getintregister(exprasmlist,OS_INT); - cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2); - end; - LOC_REFERENCE, - LOC_CREFERENCE: - begin - cg.a_cmp_const_ref_label(exprasmlist,OS_8,OC_BE,31,left.location.reference,l); - cg.a_jmp_always(exprasmlist,l2); - cg.a_label(exprasmlist,l); - location_release(exprasmlist,left.location); - hr:=cg.getintregister(exprasmlist,OS_INT); - cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,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:=cg.getintregister(exprasmlist,OS_INT); - cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2); - end; - else - internalerror(2002081002); - end; + { note: this code assumes that left in [0..255], which is a valid } + { assumption (other cases will be caught by range checking) (JM) } + + { load left in register } + location_force_reg(exprasmlist,left.location,OS_INT,true); + if left.location.loc = LOC_CREGISTER then + hr := cg.getintregister(exprasmlist,OS_INT) + else + hr := left.location.register; + { load right in register } + hr2:=cg.getintregister(exprasmlist,OS_INT); + cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2); + { emit bit test operation } - emit_bit_test_reg_reg(exprasmlist,hr,hr2,location.register); + emit_bit_test_reg_reg(exprasmlist,left.location.register,hr2,hr2); + + { if left > 31 then hr := 0 else hr := $ffffffff } + cg.a_op_const_reg_reg(exprasmlist,OP_SUB,OS_INT,32,left.location.register,hr); + cg.a_op_const_reg(exprasmlist,OP_SAR,OS_INT,31,hr); + + { free registers } cg.ungetregister(exprasmlist,hr2); - if not (left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then - cg.ungetregister(exprasmlist,hr); - cg.a_label(exprasmlist,l2); + if (left.location.loc in [LOC_CREGISTER]) then + cg.ungetregister(exprasmlist,hr) + else + cg.ungetregister(exprasmlist,left.location.register); + + { allocate a register for the result } + location.register := cg.getintregister(exprasmlist,location.size); + { if left > 31, then result := 0 else result := result of bit test } + cg.a_op_reg_reg_reg(exprasmlist,OP_AND,OS_INT,hr,hr2,location.register); end { of right.location.loc=LOC_CONSTANT } { do search in a normal set which could have >32 elementsm but also used if the left side contains higher values > 32 } @@ -481,8 +475,10 @@ implementation else { adjust for endianess differences } inc(right.location.reference.offset,(tordconstnode(left).value shr 3) xor 3); - cg.a_load_ref_reg(exprasmlist,OS_8,location.size,right.location.reference, location.register); location_release(exprasmlist,right.location); + { allocate a register for the result } + location.register := cg.getintregister(exprasmlist,location.size); + cg.a_load_ref_reg(exprasmlist,OS_8,location.size,right.location.reference, location.register); cg.a_op_const_reg(exprasmlist,OP_SHR,location.size,tordconstnode(left).value and 7, location.register); cg.a_op_const_reg(exprasmlist,OP_AND,location.size,1,location.register); @@ -511,7 +507,10 @@ implementation href.index := hr; end; reference_release(exprasmlist,href); + { allocate a register for the result } + location.register := cg.getintregister(exprasmlist,location.size); cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,location.register); + cg.ungetregister(exprasmlist,pleftreg); hr := cg.getintregister(exprasmlist,OS_32); cg.a_op_const_reg_reg(exprasmlist,OP_AND,OS_32,31,pleftreg,hr); @@ -1011,7 +1010,11 @@ begin end. { $Log$ - Revision 1.53 2003-11-10 19:10:31 peter + Revision 1.54 2003-12-09 19:14:50 jonas + * fixed and optimized in-node with constant smallset + * some register usage optimisations. + + Revision 1.53 2003/11/10 19:10:31 peter * fixed range compare when the last value was an equal compare. The compare for the lower range was skipped