From ee79ff3635b19edd05fca6f3c66b37cf6dc94ed4 Mon Sep 17 00:00:00 2001 From: nickysn Date: Fri, 4 Aug 2017 16:20:50 +0000 Subject: [PATCH] * improved the optimization of signed modulus by power-of-2, so it uses less operations. Previously generated code: sign:=sar(left,sizeof(left)*8-1); result:=((((left xor sign)-sign) and right) xor sign)-sign; New code: mask:=sar(left,sizeof(left)*8-1) and ((1 shl power)-1); result:=((left+mask) and right)-mask; git-svn-id: trunk@36847 - --- compiler/nmat.pas | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/compiler/nmat.pas b/compiler/nmat.pas index 5c24d106e5..80a262593b 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -582,28 +582,33 @@ implementation addstatement(statements,resulttemp); addstatement(statements,temp); addstatement(statements,cassignmentnode.create(ctemprefnode.create(temp),left)); - { sign:=sar(left,sizeof(left)*8-1); } - addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp), - cinlinenode.create(in_sar_x_y,false, - ccallparanode.create(cordconstnode.create(shiftval,u8inttype,false), - ccallparanode.create(ctemprefnode.create(temp),nil) - ) - ))); + { mask:=sar(left,sizeof(left)*8-1) and ((1 shl power)-1); } + if power=1 then + masknode:= + cshlshrnode.create(shrn, + ctemprefnode.create(temp), + cordconstnode.create(shiftval,u8inttype,false) + ) + else + masknode:= + caddnode.create(andn, + cinlinenode.create(in_sar_x_y,false, + ccallparanode.create(cordconstnode.create(shiftval,u8inttype,false), + ccallparanode.create(ctemprefnode.create(temp),nil)) + ), + cordconstnode.create(tcgint((qword(1) shl power)-1), + right.resultdef,false) + ); + addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp),masknode)); - { result:=((((left xor sign)-sign) and right) xor sign)-sign; } + { result:=((left+mask) and right)-mask; } addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp), caddnode.create(subn, - caddnode.create(xorn, - caddnode.create(andn, - right, - caddnode.create(subn, - caddnode.create(xorn, - ctemprefnode.create(resulttemp), - ctemprefnode.create(temp)), - ctemprefnode.create(resulttemp)) - ), - ctemprefnode.create(resulttemp) - ), + caddnode.create(andn, + right, + caddnode.create(addn, + ctemprefnode.create(temp), + ctemprefnode.create(resulttemp))), ctemprefnode.create(resulttemp)) ));