mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-25 19:49:07 +02:00
* optimized the code generated by the a_op_const_* and a_op64_const
methods
This commit is contained in:
parent
1a6c7fc693
commit
36699776ee
@ -20,6 +20,7 @@
|
||||
|
||||
****************************************************************************
|
||||
}
|
||||
|
||||
unit cgcpu;
|
||||
|
||||
{$i defines.inc}
|
||||
@ -455,6 +456,18 @@ unit cgcpu;
|
||||
exit
|
||||
else
|
||||
list.concat(taicpu.op_const_reg(A_MOV,regsize(reg),0,reg))
|
||||
else if (a = high(aword)) and
|
||||
(op in [OP_AND,OP_OR,OP_XOR]) then
|
||||
begin
|
||||
case op of
|
||||
OP_AND:
|
||||
exit;
|
||||
OP_OR:
|
||||
list.concat(taicpu.op_const_reg(A_MOV,regsize(reg),high(aword),reg));
|
||||
OP_XOR:
|
||||
list.concat(taicpu.op_reg(A_NOT,regsize(reg),reg));
|
||||
end
|
||||
end
|
||||
else
|
||||
list.concat(taicpu.op_const_reg(TOpCG2AsmOp[op],regsize(reg),
|
||||
a,reg));
|
||||
@ -527,6 +540,18 @@ unit cgcpu;
|
||||
exit
|
||||
else
|
||||
a_load_const_ref(list,size,0,ref)
|
||||
else if (a = high(aword)) and
|
||||
(op in [OP_AND,OP_OR,OP_XOR]) then
|
||||
begin
|
||||
case op of
|
||||
OP_AND:
|
||||
exit;
|
||||
OP_OR:
|
||||
list.concat(taicpu.op_const_ref(A_MOV,TCgSize2OpSize[size],high(aword),ref));
|
||||
OP_XOR:
|
||||
list.concat(taicpu.op_ref(A_NOT,TCgSize2OpSize[size],ref));
|
||||
end
|
||||
end
|
||||
else
|
||||
list.concat(taicpu.op_const_ref(TOpCG2AsmOp[op],
|
||||
TCgSize2OpSize[size],a,ref));
|
||||
@ -763,8 +788,7 @@ unit cgcpu;
|
||||
l : tasmlabel);
|
||||
|
||||
begin
|
||||
if (a = 0) and
|
||||
(cmp_op in [OC_EQ,OC_NE]) then
|
||||
if (a = 0) then
|
||||
list.concat(taicpu.op_reg_reg(A_TEST,regsize(reg),reg,reg))
|
||||
else
|
||||
list.concat(taicpu.op_const_reg(A_CMP,regsize(reg),a,reg));
|
||||
@ -989,9 +1013,22 @@ unit cgcpu;
|
||||
var
|
||||
op1,op2 : TAsmOp;
|
||||
begin
|
||||
get_64bit_ops(op,op1,op2);
|
||||
list.concat(taicpu.op_const_reg(op1,S_L,valuelosrc,reglodst));
|
||||
list.concat(taicpu.op_const_reg(op2,S_L,valuehisrc,reghidst));
|
||||
case op of
|
||||
OP_AND,OP_OR,OP_XOR:
|
||||
begin
|
||||
a_op_const_reg(list,op,valuelosrc,reglodst);
|
||||
a_op_const_reg(list,op,valuehisrc,reghidst);
|
||||
end;
|
||||
OP_ADD, OP_SUB:
|
||||
begin
|
||||
// can't use a_op_const_ref because this may use dec/inc
|
||||
get_64bit_ops(op,op1,op2);
|
||||
list.concat(taicpu.op_const_reg(op1,S_L,valuelosrc,reglodst));
|
||||
list.concat(taicpu.op_const_reg(op2,S_L,valuehisrc,reghidst));
|
||||
end;
|
||||
else
|
||||
internalerror(200204021);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -1000,11 +1037,26 @@ unit cgcpu;
|
||||
op1,op2 : TAsmOp;
|
||||
tempref : treference;
|
||||
begin
|
||||
get_64bit_ops(op,op1,op2);
|
||||
list.concat(taicpu.op_const_ref(op1,S_L,valuelosrc,ref));
|
||||
tempref:=ref;
|
||||
inc(tempref.offset,4);
|
||||
list.concat(taicpu.op_const_ref(op2,S_L,valuehisrc,tempref));
|
||||
case op of
|
||||
OP_AND,OP_OR,OP_XOR:
|
||||
begin
|
||||
a_op_const_ref(list,op,OS_32,valuelosrc,ref);
|
||||
tempref:=ref;
|
||||
inc(tempref.offset,4);
|
||||
a_op_const_ref(list,op,OS_32,valuehisrc,tempref);
|
||||
end;
|
||||
OP_ADD, OP_SUB:
|
||||
begin
|
||||
get_64bit_ops(op,op1,op2);
|
||||
// can't use a_op_const_ref because this may use dec/inc
|
||||
list.concat(taicpu.op_const_ref(op1,S_L,valuelosrc,ref));
|
||||
tempref:=ref;
|
||||
inc(tempref.offset,4);
|
||||
list.concat(taicpu.op_const_ref(op2,S_L,valuehisrc,tempref));
|
||||
end;
|
||||
else
|
||||
internalerror(200204022);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -1159,7 +1211,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.9 2002-04-02 17:11:33 peter
|
||||
Revision 1.10 2002-04-02 20:29:02 jonas
|
||||
* optimized the code generated by the a_op_const_* and a_op64_const
|
||||
methods
|
||||
|
||||
Revision 1.9 2002/04/02 17:11:33 peter
|
||||
* tlocation,treference update
|
||||
* LOC_CONSTANT added for better constant handling
|
||||
* secondadd splitted in multiple routines
|
||||
|
Loading…
Reference in New Issue
Block a user