Annotation of gforth/xxxprim, revision 1.1

1.1     ! anton       1: \ Gforth primitives
        !             2: 
        !             3: \ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
        !             4: 
        !             5: \ This file is part of Gforth.
        !             6: 
        !             7: \ Gforth is free software; you can redistribute it and/or
        !             8: \ modify it under the terms of the GNU General Public License
        !             9: \ as published by the Free Software Foundation; either version 2
        !            10: \ of the License, or (at your option) any later version.
        !            11: 
        !            12: \ This program is distributed in the hope that it will be useful,
        !            13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: \ GNU General Public License for more details.
        !            16: 
        !            17: \ You should have received a copy of the GNU General Public License
        !            18: \ along with this program; if not, write to the Free Software
        !            19: \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
        !            20: 
        !            21: 
        !            22: \ WARNING: This file is processed by m4. Make sure your identifiers
        !            23: \ don't collide with m4's (e.g. by undefining them).
        !            24: \ 
        !            25: \ 
        !            26: \ 
        !            27: \ This file contains primitive specifications in the following format:
        !            28: \ 
        !            29: \ forth name   ( stack effect )        category        [pronunciation]
        !            30: \ [""glossary entry""]
        !            31: \ C code
        !            32: \ [:
        !            33: \ Forth code]
        !            34: \ 
        !            35: \ Note: Fields in brackets are optional.  Word specifications have to
        !            36: \ be separated by at least one empty line
        !            37: \
        !            38: \ Both pronounciation and stack items (in the stack effect) must
        !            39: \ conform to the C identifier syntax or the C compiler will complain.
        !            40: \ If you don't have a pronounciation field, the Forth name is used,
        !            41: \ and has to conform to the C identifier syntax.
        !            42: \ 
        !            43: \ These specifications are automatically translated into C-code for the
        !            44: \ interpreter and into some other files. I hope that your C compiler has
        !            45: \ decent optimization, otherwise the automatically generated code will
        !            46: \ be somewhat slow. The Forth version of the code is included for manual
        !            47: \ compilers, so they will need to compile only the important words.
        !            48: \ 
        !            49: \ Note that stack pointer adjustment is performed according to stack
        !            50: \ effect by automatically generated code and NEXT is automatically
        !            51: \ appended to the C code. Also, you can use the names in the stack
        !            52: \ effect in the C code. Stack access is automatic. One exception: if
        !            53: \ your code does not fall through, the results are not stored into the
        !            54: \ stack. Use different names on both sides of the '--', if you change a
        !            55: \ value (some stores to the stack are optimized away).
        !            56: \
        !            57: \ For superinstructions the syntax is:
        !            58: \
        !            59: \ forth-name [/ c-name] = forth-name forth-name ...
        !            60: \
        !            61: \ 
        !            62: \ The stack variables have the following types:
        !            63: \ 
        !            64: \ name matches type
        !            65: \ f.*          Bool
        !            66: \ c.*          Char
        !            67: \ [nw].*       Cell
        !            68: \ u.*          UCell
        !            69: \ d.*          DCell
        !            70: \ ud.*         UDCell
        !            71: \ r.*          Float
        !            72: \ a_.*         Cell *
        !            73: \ c_.*         Char *
        !            74: \ f_.*         Float *
        !            75: \ df_.*                DFloat *
        !            76: \ sf_.*                SFloat *
        !            77: \ xt.*         XT
        !            78: \ f83name.*    F83Name *
        !            79: 
        !            80: \E stack data-stack   sp Cell
        !            81: \E stack fp-stack     fp Float
        !            82: \E stack return-stack rp Cell
        !            83: \E
        !            84: \E get-current prefixes set-current
        !            85: \E 
        !            86: \E s" Bool"            single data-stack type-prefix f
        !            87: \E s" Char"            single data-stack type-prefix c
        !            88: \E s" Cell"            single data-stack type-prefix n
        !            89: \E s" Cell"            single data-stack type-prefix w
        !            90: \E s" UCell"           single data-stack type-prefix u
        !            91: \E s" DCell"           double data-stack type-prefix d
        !            92: \E s" UDCell"          double data-stack type-prefix ud
        !            93: \E s" Float"           single fp-stack   type-prefix r
        !            94: \E s" Cell *"          single data-stack type-prefix a_
        !            95: \E s" Char *"          single data-stack type-prefix c_
        !            96: \E s" Float *"         single data-stack type-prefix f_
        !            97: \E s" DFloat *"                single data-stack type-prefix df_
        !            98: \E s" SFloat *"                single data-stack type-prefix sf_
        !            99: \E s" Xt"              single data-stack type-prefix xt
        !           100: \E s" struct F83Name *"        single data-stack type-prefix f83name
        !           101: \E s" struct Longname *" single data-stack type-prefix longname
        !           102: \E 
        !           103: \E return-stack stack-prefix R:
        !           104: \E inst-stream  stack-prefix #
        !           105: \E 
        !           106: \E set-current
        !           107: \E store-optimization on
        !           108: \E ' noop tail-nextp2 ! \ now INST_TAIL just stores, but does not jump
        !           109: \E
        !           110: \E include-skipped-insts on \ static superinsts include cells for components
        !           111: \E                          \ useful for dynamic programming and
        !           112: \E                          \ superinsts across entry points
        !           113: 
        !           114: \ 
        !           115: \ 
        !           116: \ 
        !           117: \ In addition the following names can be used:
        !           118: \ ip   the instruction pointer
        !           119: \ sp   the data stack pointer
        !           120: \ rp   the parameter stack pointer
        !           121: \ lp   the locals stack pointer
        !           122: \ NEXT executes NEXT
        !           123: \ cfa  
        !           124: \ NEXT1        executes NEXT1
        !           125: \ FLAG(x)      makes a Forth flag from a C flag
        !           126: \ 
        !           127: \ 
        !           128: \ 
        !           129: \ Percentages in comments are from Koopmans book: average/maximum use
        !           130: \ (taken from four, not very representative benchmarks)
        !           131: \ 
        !           132: \ 
        !           133: \ 
        !           134: \ To do:
        !           135: \ 
        !           136: \ throw execute, cfa and NEXT1 out?
        !           137: \ macroize *ip, ip++, *ip++ (pipelining)?
        !           138: 
        !           139: \ set up stack caching states
        !           140: 
        !           141: \E register sp0 Cell
        !           142: \E register sp1 Cell
        !           143: \E register sp2 Cell
        !           144: \E register sp3 Cell
        !           145: 
        !           146: \E create regs sp0 , sp1 , sp2 , sp3 ,
        !           147: 
        !           148: \E regs 0 0 stack-state ss0
        !           149: \E regs 1 1 stack-state ss1
        !           150: \E regs 2 2 stack-state ss2
        !           151: \E regs 3 3 stack-state ss3
        !           152: 
        !           153: \E state S0
        !           154: \E state S1
        !           155: \E state S2
        !           156: \E state S3
        !           157: 
        !           158: \E ss0 data-stack s0 set-ss
        !           159: \E ss1 data-stack s1 set-ss
        !           160: \E ss2 data-stack s2 set-ss
        !           161: \E ss3 data-stack s3 set-ss
        !           162: 
        !           163: +      ( n1 n2 -- n )          core    plus
        !           164: n = n1+n2;
        !           165: 
        !           166: lit    ( #w -- w )             gforth
        !           167: :
        !           168:  r> dup @ swap cell+ >r ;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>