OK, I just hacked a Linux version of a "test-suite" using the
cycle counter. (I'm using a Pentium Pro, so I can access the rdtsc
instruction in user code.)
This way I can test the code in the 32-Bit environment it should be
tested in.
> Note that using a 32-bit segment does not eliminate the size-prefix for
> everything. In particular, you can't get a carry out of a 16-bit overflow
> into a 32-bit register. Using instructions that always access 32-bits
> forces one to accumulate carries and then fold them back at the end.
> This is shown to be inefficient even though no size prefix would
> be required.
Hmmm. The values below show quite the opposite. It is not that
difficult to fold the carries back, and what is more important, it
is done only once, not for every word accessed.
Here are the measured values for some of the functions used:
csum_partial: sum = 1a8a, min cycles 1406
csum_simple: sum = 1a8a, min cycles 6846
csum_opt: sum = 1a8a, min cycles 2455
csum_opt32: sum = 1a8a, min cycles 1434
csum_c: sum = 1a8a, min cycles 2626
csum_partial is the original Linux version.
csum_simple is the simple function using lodsw and loop, csum_opt is the
function that was best in the MS-DOS tests. csum_opt32 is csum_opt
changed to use 32-Bit memory accesses. And for comparison, there is
a C version of the checksumming algorithm in csum_c.
The results show quite clearly that the 32-bit acceses are the key to
good performance.
Appended to this mail is the source code for the test-suite.
CU
Heiko
begin 640 csum_test.c
M(VEN8VQU9&4@/'-T9&EO+F@^"@IS=&%T:6,@;&]N9R!L;VYG('0Q+"!T,CL*
M"G-T871I8R!I;FQI;F4@=F]I9"!R9'1S8RAL;VYG(&QO;F<@*G@I"GL*("`@
M87-M('9O;&%T:6QE("@B+F)Y=&4@,'@P9BP@,'@S,5QN7'0B"@D)(")M;W9L
M("4E96%X+"`E,%QN7'0B"@D)(")M;W9L("4E961X+"`E,2(*"0D@.B`B/6TB
M("@H*&QO;F<@*BEX*5LP72DL("(];2(H*"AL;VYG("HI>"E;,5TI"@D)(#HZ
M(F%X(BPB9'@B*3L*?0H*=6YS:6=N960@:6YT(&-S=6U?<&%R=&EA;"AC;VYS
M="!U;G-I9VYE9"!C:&%R("H@8G5F9BP@:6YT(&QE;BP@=6YS:6=N960@:6YT
M('-U;2D*>PH)("`O*@H)("`@*B!%>'!E<FEM96YT<R!W:71H(&5T:&5R;F5T
M(&%N9"!S;&EP(&-O;FYE8W1I;VYS('-H;W<@=&AA="!B=69F"@D@("`J(&ES
M(&%L:6=N960@;VX@96ET:&5R(&$@,BUB>71E(&]R(#0M8GET92!B;W5N9&%R
M>2X@(%=E(&=E="!A=`H)("`@*B!L96%S="!A(#)X('-P965D=7`@;VX@-#@V
M(&%N9"!096YT:75M(&EF(&ET(&ES(#0M8GET92!A;&EG;F5D+@H)("`@*B!&
M;W)T=6YA=&5L>2P@:70@:7,@96%S>2!T;R!C;VYV97)T(#(M8GET92!A;&EG
M;FUE;G0@=&\@-"UB>71E"@D@("`J(&%L:6=N;65N="!F;W(@=&AE('5N<F]L
M;&5D(&QO;W`N"@D@("`J+PH@("!R9'1S8R@F=#$I.PH)7U]A<VU?7R@B"@D@
M("`@=&5S=&P@)#(L("4E97-I"0DC($-H96-K(&%L:6=N;65N="X*"2`@("!J
M>B`R9@D)"2,@2G5M<"!I9B!A;&EG;FUE;G0@:7,@;VLN"@D@("`@<W5B;"`D
M,BP@)25E8W@)"2,@06QI9VYM96YT('5S97,@=7`@='=O(&)Y=&5S+@H)("`@
M(&IA92`Q9@D)"2,@2G5M<"!I9B!W92!H860@870@;&5A<W0@='=O(&)Y=&5S
M+@H)("`@(&%D9&P@)#(L("4E96-X"0DC(&5C>"!W87,@/"`R+B`@1&5A;"!W
M:71H(&ET+@H)("`@(&IM<"`T9@HQ.@D@("`@;6]V=R`H)25E<VDI+"`E)6)X
M"@D@("`@861D;"`D,BP@)25E<VD*"2`@("!A9&1W("4E8G@L("4E87@*"2`@
M("!A9&-L("0P+"`E)65A>`HR.@H)("`@(&UO=FP@)25E8W@L("4E961X"@D@
M("`@<VAR;"`D-2P@)25E8W@*"2`@("!J>B`R9@H)("`@('1E<W1L("4E97-I
M+"`E)65S:0HQ.@D@("`@;6]V;"`H)25E<VDI+"`E)65B>`H)("`@(&%D8VP@
M)25E8G@L("4E96%X"@D@("`@;6]V;"`T*"4E97-I*2P@)25E8G@*"2`@("!A
M9&-L("4E96)X+"`E)65A>`H)("`@(&UO=FP@."@E)65S:2DL("4E96)X"@D@
M("`@861C;"`E)65B>"P@)25E87@*"2`@("!M;W9L(#$R*"4E97-I*2P@)25E
M8G@*"2`@("!A9&-L("4E96)X+"`E)65A>`H)("`@(&UO=FP@,38H)25E<VDI
M+"`E)65B>`H)("`@(&%D8VP@)25E8G@L("4E96%X"@D@("`@;6]V;"`R,"@E
M)65S:2DL("4E96)X"@D@("`@861C;"`E)65B>"P@)25E87@*"2`@("!M;W9L
M(#(T*"4E97-I*2P@)25E8G@*"2`@("!A9&-L("4E96)X+"`E)65A>`H)("`@
M(&UO=FP@,C@H)25E<VDI+"`E)65B>`H)("`@(&%D8VP@)25E8G@L("4E96%X
M"@D@("`@;&5A(#,R*"4E97-I*2P@)25E<VD*"2`@("!D96,@)25E8W@*"2`@
M("!J;F4@,6(*"2`@("!A9&-L("0P+"`E)65A>`HR.@D@("`@;6]V;"`E)65D
M>"P@)25E8W@*"2`@("!A;F1L("0P>#%C+"`E)65D>`H)("`@(&IE(#1F"@D@
M("`@<VAR;"`D,BP@)25E9'@*"2`@("!T97-T;"`E)65S:2P@)25E<VD*,SH)
M("`@(&%D8VP@*"4E97-I*2P@)25E87@*"2`@("!L96$@-"@E)65S:2DL("4E
M97-I"@D@("`@9&5C("4E961X"@D@("`@:FYE(#-B"@D@("`@861C;"`D,"P@
M)25E87@*-#H)("`@(&%N9&P@)#,L("4E96-X"@D@("`@:GH@-V8*"2`@("!C
M;7!L("0R+"`E)65C>`H)("`@(&IB(#5F"@D@("`@;6]V=R`H)25E<VDI+"4E
M8W@*"2`@("!L96%L(#(H)25E<VDI+"4E97-I"@D@("`@:F4@-F8*"2`@("!S
M:&QL("0Q-BPE)65C>`HU.@D@("`@;6]V8B`H)25E<VDI+"4E8VP*-CH)("`@
M(&%D9&P@)25E8W@L)25E87@*"2`@("!A9&-L("0P+"`E)65A>`HW.@D@("`@
M;6]V;"`E)65A>"PE)65D>`H)("`@('-H<FP@)#$V+"4E96%X"@D@("`@861D
M=R`E)61X+"4E87@*"2`@("!A9&-W("0P+"4E87@B"@DZ("(]82(H<W5M*0H)
M.B`B,"(H<W5M*2P@(F,B*&QE;BDL(")3(BAB=69F*0H).B`B8G@B+"`B8W@B
M+"`B9'@B+"`B<VDB*3L*"7)D='-C*"9T,BD["@ER971U<FXH<W5M*3L*?0H*
M=6YS:6=N960@:6YT(&-S=6U?<VEM<&QE*&-O;G-T('5N<VEG;F5D(&-H87(@
M*F)U9F8L(&EN="!L96XL('5N<VEG;F5D(&EN="!S=6TI"GL*("`@<F1T<V,H
M)G0Q*3L*("`@7U]A<VU?7R@B"@EX;W(@)25E87@L)25E87@*"6-L9`HP.@EL
M;V1S=PH)861C=R`E)6%X+"4E9'@*"6QO;W`@,&(*"6%D8W<@)#`L)25D>"(*
M"2`@(#H@(CUD(BAS=6TI"@D@("`Z("(P(BAS=6TI+"`B8R(H;&5N(#X^(#$I
M+"`B4R(H8G5F9BD*"2`@(#H@(F%X(BPB8W@B+")D>"(L(G-I(BD["B`@(')D
M='-C*"9T,BD["B`@(')E='5R;B!S=6T["GT*"G5N<VEG;F5D(&EN="!C<W5M
M7V]P="AC;VYS="!U;G-I9VYE9"!C:&%R("IB=69F+"!I;G0@;&5N+"!U;G-I
M9VYE9"!I;G0@<W5M*0I["B`@(')D='-C*"9T,2D["B`@(&%S;2@B"@ES:')L
M("0Q+"`E)65C>`H)>&]R;"`E)65S:2P@)25E<VD*"C`Z"6-M<&P@)#,R+"`E
M)65C>`H):F%E("`Q9@H)8VUP;"`D,38L("4E96-X"@EJ864@,F8*("`@("`@
M("!C;7!L("0X+"`E)65C>`H@("`@("`@(&IA92`S9@H@("`@("`@(&-M<&P@
M)#0L("4E96-X"B`@("`@("`@:F%E(#1F"B`@("`@("`@:FUP(#9F"@HQ.@ES
M:')L("0Q+"`E)65S:0H)861C=R`@,"@E)65B>"DL("4E87@*"6%D8W<@(#(H
M)25E8G@I+"`E)6%X"@EA9&-W("`T*"4E96)X*2P@)25A>`H)861C=R`@-B@E
M)65B>"DL("4E87@*"6%D8W<@(#@H)25E8G@I+"`E)6%X"@EA9&-W(#$P*"4E
M96)X*2P@)25A>`H)861C=R`Q,B@E)65B>"DL("4E87@*"6%D8W<@,30H)25E
M8G@I+"`E)6%X"@EA9&-W(#$V*"4E96)X*2P@)25A>`H)861C=R`Q."@E)65B
M>"DL("4E87@*"6%D8W<@,C`H)25E8G@I+"`E)6%X"@EA9&-W(#(R*"4E96)X
M*2P@)25A>`H)861C=R`R-"@E)65B>"DL("4E87@*"6%D8W<@,C8H)25E8G@I
M+"`E)6%X"@EA9&-W(#(X*"4E96)X*2P@)25A>`H)861C=R`S,"@E)65B>"DL
M("4E87@*"6%D8W<@,S(H)25E8G@I+"`E)6%X"@EA9&-W(#,T*"4E96)X*2P@
M)25A>`H)861C=R`S-B@E)65B>"DL("4E87@*"6%D8W<@,S@H)25E8G@I+"`E
M)6%X"@EA9&-W(#0P*"4E96)X*2P@)25A>`H)861C=R`T,B@E)65B>"DL("4E
M87@*"6%D8W<@-#0H)25E8G@I+"`E)6%X"@EA9&-W(#0V*"4E96)X*2P@)25A
M>`H)861C=R`T."@E)65B>"DL("4E87@*"6%D8W<@-3`H)25E8G@I+"`E)6%X
M"@EA9&-W(#4R*"4E96)X*2P@)25A>`H)861C=R`U-"@E)65B>"DL("4E87@*
M"6%D8W<@-38H)25E8G@I+"`E)6%X"@EA9&-W(#4X*"4E96)X*2P@)25A>`H)
M861C=R`V,"@E)65B>"DL("4E87@*"6%D8W<@-C(H)25E8G@I+"`E)6%X"@EA
M9&-L("0P+"`E)65S:0H)861D;"`D-C0L("4E96)X"@ES=6)L("0S,BP@)25E
M8W@*"6IZ(#AF"@EJ;7`@,&(*"C(Z"7-H<FP@)#$L("4E97-I"@EA9&-W("`P
M*"4E96)X*2P@)25A>`H)861C=R`@,B@E)65B>"DL("4E87@*"6%D8W<@(#0H
M)25E8G@I+"`E)6%X"@EA9&-W("`V*"4E96)X*2P@)25A>`H)861C=R`@."@E
M)65B>"DL("4E87@*"6%D8W<@,3`H)25E8G@I+"`E)6%X"@EA9&-W(#$R*"4E
M96)X*2P@)25A>`H)861C=R`Q-"@E)65B>"DL("4E87@*"6%D8W<@,38H)25E
M8G@I+"`E)6%X"@EA9&-W(#$X*"4E96)X*2P@)25A>`H)861C=R`R,"@E)65B
M>"DL("4E87@*"6%D8W<@,C(H)25E8G@I+"`E)6%X"@EA9&-W(#(T*"4E96)X
M*2P@)25A>`H)861C=R`R-B@E)65B>"DL("4E87@*"6%D8W<@,C@H)25E8G@I
M+"`E)6%X"@EA9&-W(#,P*"4E96)X*2P@)25A>`H)861C;"`D,"P@)25E<VD*
M"6%D9&P@)#,R+"`E)65B>`H)<W5B;"`D,38L("4E96-X"@EJ>B`X9@H):FUP
M(#!B"@HS.@ES:')L("0Q+"`E)65S:0H)861C=R`@,"@E)65B>"DL("4E87@*
M"6%D8W<@(#(H)25E8G@I+"`E)6%X"@EA9&-W("`T*"4E96)X*2P@)25A>`H)
M861C=R`@-B@E)65B>"DL("4E87@*"6%D8W<@(#@H)25E8G@I+"`E)6%X"@EA
M9&-W(#$P*"4E96)X*2P@)25A>`H)861C=R`Q,B@E)65B>"DL("4E87@*"6%D
M8W<@,30H)25E8G@I+"`E)6%X"@EA9&-L("0P+"`E)65S:0H)861D;"`D,38L
M("4E96)X"@ES=6)L("0X+"`E)65C>`H):GH@.&8*"6IM<"`P8@H*-#H)<VAR
M;"`D,2P@)25E<VD*"6%D8W<@(#`H)25E8G@I+"`E)6%X"@EA9&-W("`R*"4E
M96)X*2P@)25A>`H)861C=R`@-"@E)65B>"DL("4E87@*"6%D8W<@(#8H)25E
M8G@I+"`E)6%X"@EA9&-L("0P+"`E)65S:0H)861D;"`D."P@)25E8G@*"7-U
M8FP@)#0L("4E96-X"@EJ>B`X9@H):FUP(#!B"@HU.@ES:')L("0Q+"`E)65S
M:0H)861C=R`@,"@E)65B>"DL("4E87@*"6%D8W<@(#(H)25E8G@I+"`E)6%X
M"@EA9&-L("0P+"`E)65S:0H)861D;"`D-"P@)25E8G@*"7-U8FP@)#(L("4E
M96-X"@EJ>B`X9B`O*B!D;VYE("HO"@EJ;7`@,&(*"C8Z"7-H<FP@)#$L("4E
M97-I"C<Z"6%D8W<@*"4E96)X*2P@)25A>`H)861C;"`D,BP@)25E8G@*"61E
M8VP@)25E8W@*"6IN>B`W8@H)8VUP=R`M,B@E)65B>"DL("4E87@*"6%D8VP@
M)#`L("4E97-I"C@Z"7-H<FP@)#$L("4E97-I"@EA9&-W("0P+"`E)6%X(@H@
M("`@("`@.B`B/6$B*'-U;2D*("`@("`@(#H@(C`B*'-U;2DL(")C(BAL96XI
M+"`B8B(H8G5F9BD*("`@("`@(#H@(F%X(BP@(F)X(BP@(F-X(BP@(G-I(BD[
M"B`@(')D='-C*"9T,BD["B`@(')E='5R;B!S=6T["GT*"G5N<VEG;F5D(&EN
M="!C<W5M7V]P=#,R*&-O;G-T('5N<VEG;F5D(&-H87(@*F)U9F8L(&EN="!L
M96XL('5N<VEG;F5D(&EN="!S=6TI"GL*("`@<F1T<V,H)G0Q*3L*("`@87-M
M*"(*"7-H<FP@)#$L("4E96-X"@EX;W)L("4E97-I+"`E)65S:0H*,#H)8VUP
M;"`D,S(L("4E96-X"@EJ864@(#%F"@EC;7!L("0Q-BP@)25E8W@*"6IA92`R
M9@H@("`@("`@(&-M<&P@)#@L("4E96-X"B`@("`@("`@:F%E(#-F"B`@("`@
M("`@8VUP;"`D-"P@)25E8W@*("`@("`@("!J864@-&8*("`@("`@("!J;7`@
M-F8*"C$Z"7-H<FP@)#$L("4E97-I"@EA9&-L("`P*"4E96)X*2P@)25E87@*
M"6%D8VP@(#0H)25E8G@I+"`E)65A>`H)861C;"`@."@E)65B>"DL("4E96%X
M"@EA9&-L(#$R*"4E96)X*2P@)25E87@*"6%D8VP@,38H)25E8G@I+"`E)65A
M>`H)861C;"`R,"@E)65B>"DL("4E96%X"@EA9&-L(#(T*"4E96)X*2P@)25E
M87@*"6%D8VP@,C@H)25E8G@I+"`E)65A>`H)861C;"`S,B@E)65B>"DL("4E
M96%X"@EA9&-L(#,V*"4E96)X*2P@)25E87@*"6%D8VP@-#`H)25E8G@I+"`E
M)65A>`H)861C;"`T-"@E)65B>"DL("4E96%X"@EA9&-L(#0X*"4E96)X*2P@
M)25E87@*"6%D8VP@-3(H)25E8G@I+"`E)65A>`H)861C;"`U-B@E)65B>"DL
M("4E96%X"@EA9&-L(#8P*"4E96)X*2P@)25E87@*"6%D8VP@)#`L("4E97-I
M"@EA9&1L("0V-"P@)25E8G@*"7-U8FP@)#,R+"`E)65C>`H):GH@.&8*"6IM
M<"`P8@H*,CH)<VAR;"`D,2P@)25E<VD*"6%D8VP@(#`H)25E8G@I+"`E)65A
M>`H)861C;"`@-"@E)65B>"DL("4E96%X"@EA9&-L("`X*"4E96)X*2P@)25E
M87@*"6%D8VP@,3(H)25E8G@I+"`E)65A>`H)861C;"`Q-B@E)65B>"DL("4E
M96%X"@EA9&-L(#(P*"4E96)X*2P@)25E87@*"6%D8VP@,C0H)25E8G@I+"`E
M)65A>`H)861C;"`R."@E)65B>"DL("4E96%X"@EA9&-L("0P+"`E)65S:0H)
M861D;"`D,S(L("4E96)X"@ES=6)L("0Q-BP@)25E8W@*"6IZ(#AF"@EJ;7`@
M,&(*"C,Z"7-H<FP@)#$L("4E97-I"@EA9&-L("`P*"4E96)X*2P@)25E87@*
M"6%D8VP@(#0H)25E8G@I+"`E)65A>`H)861C;"`@."@E)65B>"DL("4E96%X
M"@EA9&-L(#$R*"4E96)X*2P@)25E87@*"6%D8VP@)#`L("4E97-I"@EA9&1L
M("0Q-BP@)25E8G@*"7-U8FP@)#@L("4E96-X"@EJ>B`X9@H):FUP(#!B"@HT
M.@ES:')L("0Q+"`E)65S:0H)861C;"`@,"@E)65B>"DL("4E96%X"@EA9&-L
M("`T*"4E96)X*2P@)25E87@*"6%D8VP@)#`L("4E97-I"@EA9&1L("0X+"`E
M)65B>`H)<W5B;"`D-"P@)25E8W@*"6IZ(#AF"@EJ;7`@,&(*"C8Z"6UO=FP@
M)25E87@L("4E961X"@ES:')L("0Q-BP@)25E87@*"6%D9'<@)25D>"P@)25A
M>`H)861C=R`D,"P@)25A>`H)<VAR;"`D,2P@)25E<VD*-SH)861C=R`H)25E
M8G@I+"`E)6%X"@EA9&-L("0R+"`E)65B>`H)9&5C;"`E)65C>`H):FYZ(#=B
M"@EC;7!W("TR*"4E96)X*2P@)25A>`H)861C;"`D,"P@)25E<VD*.#H)<VAR
M;"`D,2P@)25E<VD*"6%D8VP@)#`L("4E96%X"@EM;W9L("4E96%X+"`E)65D
M>`H)<VAR;"`D,38L("4E96%X"@EA9&1W("4E9'@L("4E87@*"6%D8W<@)#`L
M("4E87@B"B`@("`@("`Z("(]82(H<W5M*0H@("`@("`@.B`B,"(H<W5M*2P@
M(F,B*&QE;BDL(")B(BAB=69F*0H@("`@("`@.B`B87@B+"`B8G@B+"`B8W@B
M+"`B9'@B+"`B<VDB*3L*("`@<F1T<V,H)G0R*3L*("`@<F5T=7)N('-U;3L*
M?0H*=6YS:6=N960@:6YT(&-S=6U?8RAC;VYS="!U;G-I9VYE9"!C:&%R("IB
M=69F+"!I;G0@;&5N+"!U;G-I9VYE9"!I;G0@<W5M*0I["B`@('5N<VEG;F5D
M(&EN="!H.PH@("!I;G0@:3L*("`@=6YS:6=N960@*F(["@H@("!R9'1S8R@F
M=#$I.PH@("!B(#T@8G5F9CL*("`@9F]R("AI/3`[(&D@/"`H;&5N/CXR*3L@
M:2LK*2!["B`@("`@(&@@/2!S=6T["B`@("`@('-U;2`K/2`J8BLK.PH@("`@
M("!I9B`H<W5M(#P@:"D*"2!S=6TK*SL*("`@?0H@("!I9B`H;&5N("8@,RD@
M>PH@("`@("!H(#T@<W5M.PH@("`@("!S=6T@*ST@*BAU;G-I9VYE9"!S:&]R
M="`J*6)U9F8["B`@("`@(&EF("AS=6T@/"!H*0H)('-U;2LK.PH@("`@("!I
M9B`H;&5N("8@,2D@>PH)(&@@/2!S=6T["@D@<W5M("L]("@H=6YS:6=N960@
M8VAA<B`J*6)U9F8I6S)=.PH)(&EF("AS=6T@/"!H*0H)("`@('-U;2LK.PH@
M("`@("!]"B`@('T*("`@:"`]('-U;2`F(#!X9F9F9CL*("`@<W5M(#X^/2`Q
M-CL*("`@<W5M("L](&@["B`@(&EF("AS=6T@/B`P>&9F9F8I"B`@("`@('-U
M;2LK.PH@("!R9'1S8R@F=#(I.PH@("!R971U<FX@<W5M("8@,'AF9F9F.PI]
M"@H*;&]N9R!D=6UM>3L*=6YS:6=N960@8VAA<B!B=69;,C`T.%T["@IV;VED
M(&UE87-U<F4H=6YS:6=N960@:6YT("@J9G5N8RDH*2P@8V]N<W0@8VAA<B`J
M9FYA;64I"GL*("`@:6YT('1D+"!M:6X["B`@(&EN="!I.PH@("!U;G-I9VYE
M9"!I;G0@<W5M.PH*("`@;6EN(#T@,3`P,#`P.PH@("!F;W(@*&D],#L@:2`\
M(#$P,#`P,#L@:2LK*2!["B`@("`@('-U;2`](&9U;F,H8G5F+"!S:7IE;V8H
M8G5F*2P@,"D["B`@("`@('1D(#T@=#(M=#$["B`@("`@(&EF("AT9"`\(&UI
M;BD*"2!M:6X@/2!T9#L*("`@?0H@("!P<FEN=&8H(B5S.B!S=6T@/2`E>"P@
M;6EN(&-Y8VQE<R`E9%QN(BP@9FYA;64L('-U;2P@;6EN*3L*?0HC9&5F:6YE
M(&UE87,H>"D@;65A<W5R92AX+"`C>"D*"FEN="!M86EN*'9O:60I"GL*("`@
M:6YT(&D["B`@(&-H87(@*G,["B`@(`H@("!S/6)U9CL*("`@9F]R("AI/3`[
M(&D\,3(X.R!I*RLI('L*("`@("`@;65M8W!Y*',L("))4"!086-K970N+BXN
M+BX@(BP@,38I.PH@("`@("!S("L](#$V.PH@("!]"B`@(&UE87,H8W-U;5]P
M87)T:6%L*3L*("`@;65A<RAC<W5M7W-I;7!L92D["B`@(&UE87,H8W-U;5]O
M<'0I.PH@("!M96%S*&-S=6U?;W!T,S(I.PH@("!M96%S*&-S=6U?8RD["B`@
4(')E='5R;B`P.PI]"@H*"2`@(`IT
`
end
-- +----------------------------------------+------------------------------------+ |Email: | Snail-mail: Heiko Schroeder | | | Lerchenweg 120 | | Heiko.Schroeder@Post.RWTH-Aachen.de | 52223 Stolberg | | | GERMANY | +----------------------------------------+------------------------------------+