Messages in this thread |  | | Subject | Re: TCP/IP Checksumming | From | Tom May <> | Date | 25 Nov 1996 18:41:41 -0800 |
| |
"Richard B. Johnson" <root@analogic.com> writes:
>This is intended to be a definitive statement about the TCP/IP >checksumming.
I appreciate the work you have done, but you have made a large mistake. Read on.
[...]
>My attempts to bring this to the attention of some developers was met >with responses that are more emotional than factual.
I hope you are not including my response(s) in that group.
>This will operate under MS-DOS if you remove your memory manager. >This code does not enter protected mode so you can readily use >MS-DOS facilities to record results and modify code. The 32-bit >instructions work in real mode just as they do in protected mode >as long as you don't attempt to use memory offsets greater than 64k.
No, they don't. Did you read the comment on the code I sent you, which said to run it from a 32-bit segment? I at least do you the courtesy of reading what you have to say. Using 32-bit instructions in 16-bit DOS requires one or more prefixes to specify they are using 32-bit addressing and/or operands. These prefixes require one extra cycle each and prevent the instruction from running in the V-pipe which means no parallelism is obtained. No parallelism gives a factor of two performance hit for this code. The extra cycles for the prefixes give even more performance hit. Take away those performance hits and you will see the 10:1 ratio.
>Yes, there still IS a reason for DOS. It's a good test bench.
For some things, yes, but not for 32-bit code. Any chance you could redo this in a 32-bit segment? Also, go ahead and use the code I sent you.
Also, try this one (in 16-bit mode) to see how bad lodsw/loop really are. This is how SIMPLE_NOLODSW should have been written, and is a fair comparison with SIMPLE_CHKSUM since it uses the same size operands and addresses:
SPUD_CHKSUM PROC NEAR MOV ECX, (PACKET_LEN SHR 1) ; Get packet length MOV ESI, OFFSET IP_PACKET ; Point to packet XOR EDX, EDX ; Clear CY, zero ; SPUD: MOV AX, [SI] LEA SI,[SI+2] ADC DX,AX ; Sum words only with previous CY DEC CX JNZ SPUD ADC DX,0 ; Possible last CY MOV EAX,EDX ; Return in EAX to be fair RET SPUD_CHKSUM ENDP
Tom.
|  |