+ MIPS: implemented direct 32x32 to 64 bit multiplication.

git-svn-id: trunk@24436 -
This commit is contained in:
sergei 2013-05-04 20:35:24 +00:00
parent 28f45559a9
commit a0d3750b81

View File

@ -44,8 +44,10 @@ type
procedure second_cmpsmallset; override;
procedure second_cmp64bit; override;
procedure second_cmpordinal; override;
procedure second_addordinal; override;
public
function pass_1: tnode; override;
function use_generic_mul32to64: boolean; override;
end;
implementation
@ -397,6 +399,37 @@ begin
second_generic_cmp32(unsigned);
end;
const
multops: array[boolean] of TAsmOp = (A_MULT, A_MULTU);
procedure tmipsaddnode.second_addordinal;
var
unsigned: boolean;
begin
unsigned:=not(is_signed(left.resultdef)) or
not(is_signed(right.resultdef));
if (nodetype=muln) and is_64bit(resultdef) then
begin
pass_left_right;
force_reg_left_right(true,false);
location_reset(location,LOC_REGISTER,def_cgsize(resultdef));
location.register64.reglo:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT);
location.register64.reghi:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT);
current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg(multops[unsigned],left.location.register,right.location.register));
current_asmdata.CurrAsmList.Concat(taicpu.op_reg(A_MFLO,location.register64.reglo));
current_asmdata.CurrAsmList.Concat(taicpu.op_reg(A_MFHI,location.register64.reghi));
end
else
inherited second_addordinal;
end;
function tmipsaddnode.use_generic_mul32to64: boolean;
begin
result:=false;
end;
begin
caddnode := tmipsaddnode;
end.