mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 21:09:24 +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_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
|
||||
@ -438,7 +449,7 @@ unit cgobj;
|
||||
uses
|
||||
globals,globtype,options,systems,cgbase,
|
||||
verbose,defbase,tgobj,symdef,paramgr,
|
||||
rgobj;
|
||||
rgobj,cutils;
|
||||
|
||||
const
|
||||
max_scratch_regs = high(scratch_regs) - low(scratch_regs) + 1;
|
||||
@ -726,6 +737,59 @@ unit cgobj;
|
||||
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);
|
||||
|
||||
begin
|
||||
@ -1470,7 +1534,10 @@ finalization
|
||||
end.
|
||||
{
|
||||
$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
|
||||
|
||||
Revision 1.46 2002/08/11 13:24:11 peter
|
||||
|
Loading…
Reference in New Issue
Block a user