mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 23:29:13 +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
|
var
|
||||||
href1,href2 : treference;
|
href1,href2 : treference;
|
||||||
r : preference;
|
r : preference;
|
||||||
len : longint;
|
power,len : longint;
|
||||||
opsize : topsize;
|
opsize : topsize;
|
||||||
again,ok : pasmlabel;
|
again,ok : pasmlabel;
|
||||||
begin
|
begin
|
||||||
@ -2890,9 +2890,17 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
|||||||
exprasmlist^.concat(new(paicpu,
|
exprasmlist^.concat(new(paicpu,
|
||||||
op_reg(A_INC,S_L,R_EDI)));
|
op_reg(A_INC,S_L,R_EDI)));
|
||||||
|
|
||||||
exprasmlist^.concat(new(paicpu,
|
if (parraydef(pvarsym(p)^.vartype.def)^.elesize<>1) then
|
||||||
op_const_reg(A_IMUL,S_L,
|
begin
|
||||||
parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
|
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}
|
{$ifndef NOTARGETWIN32}
|
||||||
{ windows guards only a few pages for stack growing, }
|
{ windows guards only a few pages for stack growing, }
|
||||||
{ so we have to access every page first }
|
{ 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,
|
exprasmlist^.concat(new(paicpu,
|
||||||
op_reg(A_INC,S_L,R_EDI)));
|
op_reg(A_INC,S_L,R_EDI)));
|
||||||
|
|
||||||
exprasmlist^.concat(new(paicpu,
|
if (parraydef(pvarsym(p)^.vartype.def)^.elesize<>1) then
|
||||||
op_const_reg(A_IMUL,S_L,
|
begin
|
||||||
parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
|
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;
|
end;
|
||||||
{$endif NOTARGETWIN32}
|
{$else not NOTARGETWIN32}
|
||||||
exprasmlist^.concat(new(paicpu,
|
exprasmlist^.concat(new(paicpu,
|
||||||
op_reg_reg(A_SUB,S_L,R_EDI,R_ESP)));
|
op_reg_reg(A_SUB,S_L,R_EDI,R_ESP)));
|
||||||
|
{$endif NOTARGETWIN32}
|
||||||
{ load destination }
|
{ load destination }
|
||||||
exprasmlist^.concat(new(paicpu,
|
exprasmlist^.concat(new(paicpu,
|
||||||
op_reg_reg(A_MOV,S_L,R_ESP,R_EDI)));
|
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;
|
len:=len shr 1;
|
||||||
end;
|
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)));
|
op_const_reg(A_IMUL,S_L,len,R_ECX)));
|
||||||
exprasmlist^.concat(new(paicpu,
|
exprasmlist^.concat(new(paicpu,
|
||||||
op_none(A_REP,S_NO)));
|
op_none(A_REP,S_NO)));
|
||||||
@ -3897,7 +3919,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* removed unused vars
|
||||||
|
|
||||||
Revision 1.96 2000/04/10 12:23:18 jonas
|
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
|
Revision 1.59 1999/11/15 14:04:00 pierre
|
||||||
* self pointer stabs for local function was wrong
|
* self pointer stabs for local function was wrong
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user