mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-10 20:06:07 +02:00
+ MIPS: implemented direct 32x32 to 64 bit multiplication.
git-svn-id: trunk@24436 -
This commit is contained in:
parent
28f45559a9
commit
a0d3750b81
@ -44,8 +44,10 @@ type
|
|||||||
procedure second_cmpsmallset; override;
|
procedure second_cmpsmallset; override;
|
||||||
procedure second_cmp64bit; override;
|
procedure second_cmp64bit; override;
|
||||||
procedure second_cmpordinal; override;
|
procedure second_cmpordinal; override;
|
||||||
|
procedure second_addordinal; override;
|
||||||
public
|
public
|
||||||
function pass_1: tnode; override;
|
function pass_1: tnode; override;
|
||||||
|
function use_generic_mul32to64: boolean; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -397,6 +399,37 @@ begin
|
|||||||
second_generic_cmp32(unsigned);
|
second_generic_cmp32(unsigned);
|
||||||
end;
|
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
|
begin
|
||||||
caddnode := tmipsaddnode;
|
caddnode := tmipsaddnode;
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user