[comp.lang.pascal] Proposal: short pointers in Turbo Pascal

dmurdoch@watstat.waterloo.edu (Duncan Murdoch) (08/15/89)

I've recently spent a few hours writing assembly language routines to
speed up a TP5 program, and found that most of the time was being wasted
calculating array references in loops like
  for i:=1 to 100 do
     sum := sum + array[i];

My assembly language version used the 8086 string instructions to go
much faster.

I'd much prefer to have done the optimization in Pascal, as the program
would be easier to maintain, but TP offers no easy access to fast string-like
operations.  Something close to what I had in mind might have been
  ptr := addr(array[1]);
  for i:=1 to 100 do
  begin
    inc(sum,ptr^);
    inc(longint(ptr),sizeof(arrayelement));
  end;

but dereferencing 32 bit pointers is really slow.  Wouldn't it be nice if
there was a short pointer type, that always referenced the ES segment?
Then I could write
  short_seg := seg(array[1]);
  short_ptr := ofs(array[1]);
  for i:=1 to 100 do
  begin
    inc(sum,short_ptr^);
    inc(word(short_ptr),sizeof(arrayelement));
  end;

or even
  ...
  for word(short_ptr) := ofs(array[1]) to ofs(array[100]) do
    inc(sum,short_ptr^);

if it was an array of bytes.

Implementing this would require that routines preserve ES, but that wouldn't
be too onerous, I don't think.  It would even allow backwards compatibility
if the library didn't assume that the user preserved ES.

What do people think?

Duncan Murdoch