From 477eacdff29b427f4f9a3788c447c52828c8f22f Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 26 Apr 2000 10:03:45 +0000 Subject: [PATCH] * 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 --- compiler/cgai386.pas | 49 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/compiler/cgai386.pas b/compiler/cgai386.pas index 284902f3d7..0829b2b056 100644 --- a/compiler/cgai386.pas +++ b/compiler/cgai386.pas @@ -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 -} +} \ No newline at end of file