mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 08:29:20 +02:00
+ routine to optimize opcodes with constants
This commit is contained in:
parent
b117e6ad01
commit
e5895885fe
@ -249,6 +249,17 @@ unit cgobj;
|
|||||||
procedure g_flags2reg(list: taasmoutput; size: TCgSize; const f: tresflags; reg: TRegister); virtual; abstract;
|
procedure g_flags2reg(list: taasmoutput; size: TCgSize; const f: tresflags; reg: TRegister); virtual; abstract;
|
||||||
procedure g_flags2ref(list: taasmoutput; size: TCgSize; const f: tresflags; const ref:TReference); virtual;
|
procedure g_flags2ref(list: taasmoutput; size: TCgSize; const f: tresflags; const ref:TReference); virtual;
|
||||||
|
|
||||||
|
{
|
||||||
|
This routine tries to optimize the const_reg opcode, and should be
|
||||||
|
called at the start of a_op_const_reg. It returns the actual opcode
|
||||||
|
to emit, and the constant value to emit. If this routine returns
|
||||||
|
FALSE, no instruction should be emitted (.eg : imul reg by 1 )
|
||||||
|
|
||||||
|
@param(op The opcode to emit, returns the opcode which must be emitted)
|
||||||
|
@param(a The constant which should be emitted, returns the constant which must
|
||||||
|
be amitted)
|
||||||
|
}
|
||||||
|
function optimize_const_reg(var op: topcg; var a : aword): boolean;virtual;
|
||||||
|
|
||||||
{#
|
{#
|
||||||
This routine is used in exception management nodes. It should
|
This routine is used in exception management nodes. It should
|
||||||
@ -438,7 +449,7 @@ unit cgobj;
|
|||||||
uses
|
uses
|
||||||
globals,globtype,options,systems,cgbase,
|
globals,globtype,options,systems,cgbase,
|
||||||
verbose,defbase,tgobj,symdef,paramgr,
|
verbose,defbase,tgobj,symdef,paramgr,
|
||||||
rgobj;
|
rgobj,cutils;
|
||||||
|
|
||||||
const
|
const
|
||||||
max_scratch_regs = high(scratch_regs) - low(scratch_regs) + 1;
|
max_scratch_regs = high(scratch_regs) - low(scratch_regs) + 1;
|
||||||
@ -726,6 +737,59 @@ unit cgobj;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function tcg.optimize_const_reg(var op: topcg; var a : aword): boolean;
|
||||||
|
var
|
||||||
|
powerval : longint;
|
||||||
|
begin
|
||||||
|
optimize_const_reg := true;
|
||||||
|
case op of
|
||||||
|
{ or with zero returns same result }
|
||||||
|
OP_OR : if a = 0 then optimize_const_reg := false;
|
||||||
|
{ and with max returns same result }
|
||||||
|
OP_AND : if (a = high(a)) then optimize_const_reg := false;
|
||||||
|
{ division by 1 returns result }
|
||||||
|
OP_DIV :
|
||||||
|
begin
|
||||||
|
if a = 1 then
|
||||||
|
optimize_const_reg := false
|
||||||
|
else if ispowerof2(int64(a), powerval) then
|
||||||
|
begin
|
||||||
|
a := powerval;
|
||||||
|
op:= OP_SHR;
|
||||||
|
end;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
OP_IDIV:
|
||||||
|
begin
|
||||||
|
if a = 1 then
|
||||||
|
optimize_const_reg := false
|
||||||
|
else if ispowerof2(int64(a), powerval) then
|
||||||
|
begin
|
||||||
|
a := powerval;
|
||||||
|
op:= OP_SAR;
|
||||||
|
end;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
OP_MUL,OP_IMUL:
|
||||||
|
begin
|
||||||
|
if a = 1 then
|
||||||
|
optimize_const_reg := false
|
||||||
|
else if ispowerof2(int64(a), powerval) then
|
||||||
|
begin
|
||||||
|
a := powerval;
|
||||||
|
op:= OP_SHL;
|
||||||
|
end;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
OP_SAR,OP_SHL,OP_SHR:
|
||||||
|
begin
|
||||||
|
if a = 1 then
|
||||||
|
optimize_const_reg := false;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure tcg.a_loadfpu_loc_reg(list: taasmoutput; const loc: tlocation; const reg: tregister);
|
procedure tcg.a_loadfpu_loc_reg(list: taasmoutput; const loc: tlocation; const reg: tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -1470,7 +1534,10 @@ finalization
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.47 2002-08-11 14:32:26 peter
|
Revision 1.48 2002-08-14 19:26:02 carl
|
||||||
|
+ routine to optimize opcodes with constants
|
||||||
|
|
||||||
|
Revision 1.47 2002/08/11 14:32:26 peter
|
||||||
* renamed current_library to objectlibrary
|
* renamed current_library to objectlibrary
|
||||||
|
|
||||||
Revision 1.46 2002/08/11 13:24:11 peter
|
Revision 1.46 2002/08/11 13:24:11 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user