[fpc-devel] Regarding issue/patch 0032637

J. Gareth Moreton gareth at moreton-family.com
Thu Nov 30 05:47:40 CET 2017


Would code like this be correct?


Procedure FillWord(var x; count: SizeInt; value: Word); assembler; nostackframe;
  asm
{ win64: rcx dest, rdx count, r8w value
  linux: rdi dest, rsi count, dx  value }
  {$ifdef win64}
    push    %rdi
.seh_pushreg %rdi
.seh_endprologue
    cmp     $0x0, %rdx

...


I recall now an assembler routine where RBX was modified midway through a procedure, but instead of pushing 
and popping it, it was written to a reserved part of the stack (configured in the prologue) and given a 
.seh_savereg hint - still trying to get my head around all of this!

Kit


On Thu 30/11/17 04:26 , "J. Gareth Moreton" gareth at moreton-family.com sent:
> Ooh right, okay.  Thanks for that Sergei.  I just put it in somewhat
> blindly because the compiler inserts it 
> for Pascal code after the normal prologue after creating a stack frame, but
> complained and threw an error if 
> I used .seh_pushreg but then neglected to use .seh_endprologue.  I agree
> that the compiler should complain 
> if it finds things out of order like I did, otherwise one may not know any
> better.
> 
> 
> I'm still learning the nuances!  I'll just fix my code.
> 
> 
> 
> Gareth aka. Kit
> 
> 
> 
> P.S. Is there any way to remove the other patches from that bug report.
> 
> 
> 
> P.P.S. Would you be able to say my advice was plain wrong on the forum post
> and correct it, just for the 
> sake of anyone else who stumbles across it.
> 
> 
> 
> P.P.P.S. Any possibility of inserting similar functionality for Intel-style
> assembler at some point?
> 
> 
> 
> 
> 
> 
> On Wed 29/11/17 14:58 , "Sergei Gorelkin via fpc-devel" fpc-devel at lists.freepascal.org sent:
> > 
> 
> > 
> 
> > 
> 
> > 
> 
> > 29.11.2017 15:12, J. Gareth Moreton wrote:
> 
> > 
> 
> > > Thanks Christo.
> 
> > 
> 
> > > 
> 
> > 
> 
> > > Apologies for 4 messages coming in at once.
>  I
> > think there were a few technical glitches with
> the mailing
> > > list.  Either way, I have submitted an
> updated
> > patch to the bug report in question that
> corrects the stack
> > > unwinding for Windows.  Any testing would
> be
> > greatly appreciated (I'm not in a position to
> rigorously test
> > > the code for Linux).
> 
> > 
> 
> > > 
> 
> > 
> 
> > > Yeah, I got a little emotional with
> Thaddy's
> > response (which has since been deleted), partly
> because he
> > > mocked me a bit for even attempting to use
> 
> > assembly language for optimisation. Granted, I
> tend to do more
> > > low-level and mathematical programming than
> 
> > higher-level components, where assembler
> optimisation can really
> > > pay dividends. Plus in a perverted way, I
> 
> > actually enjoy trying to squeeze another
> microsecond out of
> > > running time!
> 
> > 
> 
> > > 
> 
> > 
> 
> > > Gareth aka. Kit.
> 
> > 
> 
> > > 
> 
> > 
> 
> > 
> 
> > 
> 
> > I should have read and answered earlier, but
> better late than never.
> > 
> 
> > 
> 
> > 
> 
> > The x86-64 target (actually, all targets except
> i386 and m68k) use concept
> > of fixed stack. This 
> 
> > means: all changes to the stack pointer are done
> at the beginning and at
> > the end of procedure. 
> 
> > Pushing something in the middle is illegal. The
> stack pointer itself needs
> > to be aligned only at the 
> 
> > point of calling another procedure. As a
> consequence, simple procedures
> > that don't call other 
> 
> > procedures and don't use nonvolatile registers
> can have the stack pointer
> > misaligned by 8 bytes as 
> 
> > it naturally is at the first instruction (such
> procedures don't need any
> > SEH annotations at all, 
> 
> > which is a way to simplify things).
> 
> > 
> 
> > Now, several first instructions where is stack
> pointer is changed and
> > nonvolatile registers are 
> 
> > saved is called prologue. It is delimited by
> .seh_endprologue directive and
> > can be at most 255 bytes 
> 
> > in size.
> 
> > 
> 
> > The advice given at forum to insert
> .seh_endprologue at the very beginning
> > is plain wrong. 
> 
> > .seh_endprologue must be the last SEH directive
> in procedure. Compiler
> > probably needs to do more 
> 
> > checks and reject SEH directives coming after
> .seh_endprologue.
> > 
> 
> > 
> 
> > 
> 
> > Regards,
> 
> > 
> 
> > Sergei
> 
> > 
> 
> > 
> 
> > 
> 
> > _______________________________________________
> 
> > 
> 
> > fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> > http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
> > 
> 
> > 
> 
> > 
> 
> > 
> 
> 
> 
> _______________________________________________
> 
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
> 
> 
> 
> 




More information about the fpc-devel mailing list