Am 15.04.2019 um 03:35 schrieb wkitt...@windstream.net:
On 4/14/19 7:28 AM, Rainer Stratmann wrote:
On Samstag, 13. April 2019 22:30:55 CEST Alexey Tor. wrote:
E.g. i have a loop which test each s[i] char for several cases: 'a',
'b', 'c'.
for i:= 1 to length(s) do
if (s[i]='a') or (s[i]='b') or (s[i]='c') then ...
Can FPC optimize it so it only reads s[i] once (to register), not 3
times?
You can optimise by yourself.
var
c : char;
l : longint;
begin
l := length( s );
for i := 1 to l do
c := s[ i ];
if ( c = 'a' ) or ( c = 'b' ) or ( c = 'c' ) then ...
this looks like it will read three times like the original instead of
once like using the IN set operation... it is still stepping through
each one of the comparison steps instead of just doing a set match...
True for New Stanford Pascal:
23 1N 1) for I := 1 to LENGTH ( S ) do
24 2N 1) begin
25 2N 1) C := S [ I ] ;
26 2N 1) if ( C = 'a' ) or ( C = 'b' ) or ( C = 'c'
) then
27 2N 1) WRITELN ( I , '-tes Zeichen ist a, b
oder c' ) ;
28 2N 1) end (* for *)
Lines without @@ = P-Code
Lines with @@ = IBM 370 Machine Code (Assembler notation)
as documented by Stage 2 (PASCAL2.PAS) when the A+ switch is set
-------------------- LOC 26 --------------------------------
0250: LOD C,1,424
0250: LDC C,'a'
0250: EQU C
@@ 0250: CLI 424(13),97 --- compare storage location with 'a'
0254: LOD C,1,424
@@ 0254: LA 2,1
@@ 0258: BC 8,*+6
@@ 025C: SR 2,2
025E: LDC C,'b'
025E: EQU C
@@ 025E: CLI 424(13),98 --- compare storage location with 'b'
0262: IOR B
@@ 0262: LA 3,1
@@ 0266: BC 8,*+6
@@ 026A: SR 3,3
@@ 026C: OR 2,3
026E: LOD C,1,424
026E: LDC C,'c'
026E: EQU C
@@ 026E: CLI 424(13),99 --- compare storage location with 'c'
0272: IOR B
@@ 0272: LA 3,1
@@ 0276: BC 8,*+6
@@ 027A: SR 3,3
@@ 027C: OR 2,3
027E: FJP L16
@@ 027E: BC 8,L16
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal