Pointer Autodecrement

Merlin
Administrator
Avatar
Geschlecht:
Alter: 25
Beiträge: 1474
Dabei seit: 03 / 2005
Betreff:

Pointer Autodecrement

 · 
Gepostet: 26.05.2011 - 18:23 Uhr  ·  #1
The opertors ^++ and ++ are useful in speed sensitive applications. It would be good to have the decrement counterpart ^-- and -- too.

Regards

Merlin.
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Pointer Autodecrement

 · 
Gepostet: 26.05.2011 - 18:37 Uhr  ·  #2
Hello Merlin,

nice to have. But there is a small problem.
The auto-increment of pointer accesses is build-in with some AVR opcodes. It uses post-increment.
The auto-decrement feature is somewhat more difficult to handle because it uses pre-decrement.
If this is implemented with AVRco then the user must do some precautions:
Code
var
  ar      : array[0..10] of byte;
  p       : pointer;
  bb     : byte;
...
  p:= @ar + size(ar); // +1 ???
  bb:= p^--;

rolf
Merlin
Administrator
Avatar
Geschlecht:
Alter: 25
Beiträge: 1474
Dabei seit: 03 / 2005
Betreff:

Re: Pointer Autodecrement

 · 
Gepostet: 27.05.2011 - 12:46 Uhr  ·  #3
Hi Rolf.

A good point. The intention (at pascal level) was post-decrement, not pre-decrement. So this is what I would want to do (and nearly can). (I know it is buggy - it is just to give an idea...)
Code

var
  ar : array[1..10] of byte;
  pa, pb : pointer to byte;
  br : array[1..9] of byte;
  carry : boolean;

...
  pa := @ar[10];
  pb := @br[9];
  carry := FALSE;
  for i := 1 to 9 
    if carry then
      dec( pa^);
   endif;
   carry := pb^ > pa^;
   pa^-- := pa^ - pb^--;  // not pa^ := pa^-- - pb^--; !!!
  endfor;


But yes, at assembler level efficiency will be reduced because of pre-decrement, so maybe the produced code would be no more efficient than I already have...

Code

var
  ar : array[1..10] of byte;
  pa, pb : pointer to byte;
  br : array[1..9] of byte;
  carry : boolean;

...
  pa := @ar[10];
  pb := @br[9];
  carry := FALSE;
  for i := 1 to 9 
    if carry then
      dec( pa^);
    endif;
    carry := pb^ > pa^;
    dec( pa^, pb^ );
    dec( pa );
    dec( pb );
  endfor;


Thanks for insight.

Regards

Merlin.
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   64   78 · Page-Gen-Time: 0.035845s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI