diff options
Diffstat (limited to 'compiler/mips/ncpuadd.pas')
-rw-r--r-- | compiler/mips/ncpuadd.pas | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/compiler/mips/ncpuadd.pas b/compiler/mips/ncpuadd.pas index 0554620030..0edbf04d8a 100644 --- a/compiler/mips/ncpuadd.pas +++ b/compiler/mips/ncpuadd.pas @@ -36,7 +36,7 @@ type private procedure cmp64_lt(left_reg, right_reg: TRegister64;unsigned:boolean); procedure cmp64_le(left_reg, right_reg: TRegister64;unsigned:boolean); - procedure second_generic_cmp32(unsigned: boolean); + procedure second_generic_cmp32(unsigned,is_smallset: boolean); procedure second_mul64bit; protected procedure second_addfloat; override; @@ -72,18 +72,31 @@ uses tmipsaddnode *****************************************************************************} -procedure tmipsaddnode.second_generic_cmp32(unsigned: boolean); +procedure tmipsaddnode.second_generic_cmp32(unsigned,is_smallset: boolean); var cond: TOpCmp; + allow_constant : boolean; + dreg : tregister; begin pass_left_right; - force_reg_left_right(True, True); + allow_constant:=(not is_smallset) or not (nodetype in [lten,gten]); + force_reg_left_right(True, allow_constant); location_reset(location,LOC_FLAGS,OS_NO); cond:=cmpnode2topcmp(unsigned); if nf_swapped in flags then cond:=swap_opcmp(cond); + if is_smallset and (nodetype in [lten,gten]) then + begin + if ((nodetype=lten) and not (nf_swapped in flags)) or + ((nodetype=gten) and (nf_swapped in flags)) then + dreg:=right.location.register + else + dreg:=left.location.register; + current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(A_AND,dreg,right.location.register,left.location.register)); + cond:=OC_EQ; + end; location.resflags.cond:=cond; location.resflags.reg1:=left.location.register; location.resflags.use_const:=(right.location.loc=LOC_CONSTANT); @@ -304,13 +317,13 @@ end; procedure tmipsaddnode.second_cmpboolean; begin - second_generic_cmp32(true); + second_generic_cmp32(true,false); end; procedure tmipsaddnode.second_cmpsmallset; begin - second_generic_cmp32(true); + second_generic_cmp32(true,true); end; @@ -319,7 +332,7 @@ var unsigned: boolean; begin unsigned := not (is_signed(left.resultdef)) or not (is_signed(right.resultdef)); - second_generic_cmp32(unsigned); + second_generic_cmp32(unsigned,false); end; |