• Simon Marlow's avatar
    Produce new-style Cmm from the Cmm parser · a7c0387d
    Simon Marlow authored
    The main change here is that the Cmm parser now allows high-level cmm
    code with argument-passing and function calls.  For example:
    foo ( gcptr a, bits32 b )
      if (b > 0) {
         // we can make tail calls passing arguments:
         jump stg_ap_0_fast(a);
      return (x,y);
    More details on the new cmm syntax are in Note [Syntax of .cmm files]
    in CmmParse.y.
    The old syntax is still more-or-less supported for those occasional
    code fragments that really need to explicitly manipulate the stack.
    However there are a couple of differences: it is now obligatory to
    give a list of live GlobalRegs on every jump, e.g.
      jump %ENTRY_CODE(Sp(0)) [R1];
    Again, more details in Note [Syntax of .cmm files].
    I have rewritten most of the .cmm files in the RTS into the new
    syntax, except for AutoApply.cmm which is generated by the genapply
    program: this file could be generated in the new syntax instead and
    would probably be better off for it, but I ran out of enthusiasm.
    Some other changes in this batch:
     - The PrimOp calling convention is gone, primops now use the ordinary
       NativeNodeCall convention.  This means that primops and "foreign
       import prim" code must be written in high-level cmm, but they can
       now take more than 10 arguments.
     - CmmSink now does constant-folding (should fix #7219)
     - .cmm files now go through the cmmPipeline, and as a result we
       generate better code in many cases.  All the object files generated
       for the RTS .cmm files are now smaller.  Performance should be
       better too, but I haven't measured it yet.
     - RET_DYN frames are removed from the RTS, lots of code goes away
     - we now have some more canned GC points to cover unboxed-tuples with
       2-4 pointers, which will reduce code size a little.
Constants.h 10.1 KB