summaryrefslogtreecommitdiff
path: root/compiler/mips/ncpuadd.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/mips/ncpuadd.pas')
-rw-r--r--compiler/mips/ncpuadd.pas25
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;