mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 21:29:26 +02:00
* correct bugs for ts010026 and ts010029 in win32 mode
in copyvaluparas + use SHL instead of IMUL if constant is a power of 2 in copyvalueparas
This commit is contained in:
parent
3174b39bcc
commit
477eacdff2
@ -2865,7 +2865,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
||||
var
|
||||
href1,href2 : treference;
|
||||
r : preference;
|
||||
len : longint;
|
||||
power,len : longint;
|
||||
opsize : topsize;
|
||||
again,ok : pasmlabel;
|
||||
begin
|
||||
@ -2890,9 +2890,17 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_reg(A_INC,S_L,R_EDI)));
|
||||
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_IMUL,S_L,
|
||||
parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
|
||||
if (parraydef(pvarsym(p)^.vartype.def)^.elesize<>1) then
|
||||
begin
|
||||
if ispowerof2(parraydef(pvarsym(p)^.vartype.def)^.elesize, power) then
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_SHL,S_L,
|
||||
power,R_EDI)))
|
||||
else
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_IMUL,S_L,
|
||||
parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
|
||||
end;
|
||||
{$ifndef NOTARGETWIN32}
|
||||
{ windows guards only a few pages for stack growing, }
|
||||
{ so we have to access every page first }
|
||||
@ -2932,13 +2940,22 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_reg(A_INC,S_L,R_EDI)));
|
||||
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_IMUL,S_L,
|
||||
parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
|
||||
if (parraydef(pvarsym(p)^.vartype.def)^.elesize<>1) then
|
||||
begin
|
||||
if ispowerof2(parraydef(pvarsym(p)^.vartype.def)^.elesize, power) then
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_SHL,S_L,
|
||||
power,R_EDI)))
|
||||
else
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_IMUL,S_L,
|
||||
parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
|
||||
end;
|
||||
end;
|
||||
{$endif NOTARGETWIN32}
|
||||
{$else not NOTARGETWIN32}
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_reg_reg(A_SUB,S_L,R_EDI,R_ESP)));
|
||||
{$endif NOTARGETWIN32}
|
||||
{ load destination }
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_reg_reg(A_MOV,S_L,R_ESP,R_EDI)));
|
||||
@ -2984,7 +3001,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
||||
len:=len shr 1;
|
||||
end;
|
||||
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
if ispowerof2(len, power) then
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_SHL,S_L,
|
||||
power,R_ECX)))
|
||||
else
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_const_reg(A_IMUL,S_L,len,R_ECX)));
|
||||
exprasmlist^.concat(new(paicpu,
|
||||
op_none(A_REP,S_NO)));
|
||||
@ -3897,7 +3919,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.97 2000-04-24 12:48:37 peter
|
||||
Revision 1.98 2000-04-26 10:03:45 pierre
|
||||
* correct bugs for ts010026 and ts010029 in win32 mode
|
||||
in copyvaluparas
|
||||
+ use SHL instead of IMUL if constant is a power of 2 in copyvalueparas
|
||||
|
||||
Revision 1.97 2000/04/24 12:48:37 peter
|
||||
* removed unused vars
|
||||
|
||||
Revision 1.96 2000/04/10 12:23:18 jonas
|
||||
@ -4048,4 +4075,4 @@ end.
|
||||
|
||||
Revision 1.59 1999/11/15 14:04:00 pierre
|
||||
* self pointer stabs for local function was wrong
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user