Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 116,831 of 117,927    |
|    Anton Ertl to Anton Ertl    |
|    Re: Code generation for DOES> in Gforth    |
|    03 Oct 24 10:59:26    |
   
   From: anton@mips.complang.tuwien.ac.at   
      
   anton@mips.complang.tuwien.ac.at (Anton Ertl) writes:   
   >I recently noticed that Gforth still used the following COMPILE,   
   >implementation for words defined with CREATE...SET-DOES> (and   
   >consequently also for words defined with CREATE...DOES>):   
   >   
   >: does, ( xt -- ) does-check ['] does-xt peephole-compile, , ;   
   >   
   >Ignore DOES-CHECK (it has to do with stack-depth checking, still   
   >incomplete). The rest means that it compiles the primitive DOES-XT   
   >with the xt of the COMPILE,d word as immediate argument. DOES-XT   
   >pushes the body of the word and then EXECUTEs the xt that SET-DOES>   
   >has registered for this word. In most cases this is a colon   
   >definition (always if DOES> is used), so the next thing that happens   
   >is DOCOL, and then the code for the colon definition is run.   
   >   
   >I have now replaced this with   
   >   
   >: does, ( xt -- ) does-check dup >body lit, >extra @ compile, ;   
   >   
   >What this does is to compile the body as a literal, and then it   
   >COMPILE,s the xt that DOES-XT would EXECUTE. In the common case of a   
   >colon definition this compiles a call to the colon definition. This   
   >saves the overhead of accessing the doesfield and of dispatching on   
   >its contents at run-time; all that is now done during compilation.   
      
   Another benefit: Gforth used to implement special COMPILE,   
   implementations for 2VALUE and FVALUE. Here's the old implementation   
   of FVALUE:   
      
   : opt-fval ( xt -- ) >body postpone Literal postpone f@ ;   
      
   create dummy-fvalue   
   ' f@ set-does>   
   ' fvalue-to set-to   
   ' opt-fval set-optimizer   
      
   : fvalue ( r "name" -- ) \ floating-ext f-value   
    \g Define @i{name} @code{( -- r1 )} where @i{r1} initially is   
    \g @i{r}; this value can be changed with @code{to @i{name}} or   
    \g @code{->@i{name}}.   
    ['] dummy-fvalue create-from reveal f, ;   
      
   The new DOES, generates exactly the same code for FVALUEs as OPT-FVAL   
   does, so we no longer need OPT-FVAL and the use of SET-OPTIMIZER here.   
   Likewise for 2VALUE. This simplification reduces the image size by   
   927 bytes and the native-code size by 176 bytes.   
      
   The code for compiling an FVALUE looks as follows (before and after   
   the change):   
      
   5e fvalue x ok   
   : bla x ; ok   
   see-code bla   
   $7F1341F2D5A8 lit 1->2   
   $7F1341F2D5B0 x   
   7F1341A4EA63: mov r15,$08[rbx]   
   $7F1341F2D5B8 f@ 2->1   
   7F1341A4EA67: movsd [r12],xmm15   
   7F1341A4EA6D: movsd xmm15,[r15]   
   7F1341A4EA72: sub r12,$08   
   $7F1341F2D5C0 ;s 1->1   
   7F1341A4EA76: mov rbx,[r14]   
   7F1341A4EA79: add r14,$08   
   7F1341A4EA7D: mov rax,[rbx]   
   7F1341A4EA80: jmp eax   
      
   - anton   
   --   
   M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.html   
   comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html   
    New standard: https://forth-standard.org/   
    EuroForth 2024: https://euro.theforth.net   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca