Annotation of 43BSDTahoe/ucb/lisp/liszt/cmacros.l, revision 1.1.1.1

1.1       root        1: ;----------- macros for the compiler -------------
                      2: 
                      3: (setq RCS-cmacros
                      4:    "$Header: cmacros.l,v 1.14 87/12/15 16:55:07 sklower Exp $")
                      5: 
                      6: (declare (macros t))                   ; compile and save macros
                      7: 
                      8: ; If we are making an interpreted version, then const.l hasn't been
                      9: ; loaded yet...
                     10: (eval-when (compile eval)
                     11:    (or (get 'const 'loaded) (load '../const.l)))
                     12: 
                     13: ;--- comp-err
                     14: ;    comp-warn
                     15: ;    comp-note
                     16: ;    comp-gerr
                     17: ; these are the compiler message producing macros.  The form is
                     18: ; (comp-xxxx val1 val2 val3 ... valn) , all values are printed according
                     19: ;  to this scheme. If vali is an atom, it is patomed, if vali is a
                     20: ;  list, it is evaluated and printed. If vali is N a newline is printed
                     21: ; 
                     22: ; furthermore
                     23: ;    the name of the current function is printed first
                     24: ;    after comp-err prints the message, it does a throw to Comp-err .
                     25: ;    errors are preceeded by Error: 
                     26: ;      warnings by %Warning: and
                     27: ;      notes by %Note:
                     28: ;     The message is sent to the message file
                     29: ;
                     30: (def comp-err
                     31:    (macro (l)
                     32:          `(progn (comp-msg "?Error: " v-ifile ": " g-fname ": "
                     33:                            ,@(cdr l) )
                     34:                  (setq er-fatal (1+ er-fatal))
                     35:                  (throw nil Comp-error))))
                     36: 
                     37: (def comp-warn
                     38:    (macro (l)
                     39:          `(progn (setq er-warn (1+ er-warn))
                     40:                  (cond (fl-warn
                     41:                            (comp-msg "%Warning: " v-ifile ": "  g-fname ": "
                     42:                                      ,@(cdr l)))))))
                     43: 
                     44: (def comp-note
                     45:    (macro (l)
                     46:          `(progn (cond (fl-verb
                     47:                            (comp-msg "%Note: " v-ifile ": "  ,@(cdr l)))))))
                     48: 
                     49: (def comp-gerr
                     50:    (macro (l)
                     51:          `(progn (comp-msg
                     52:                      "?Error: " v-ifile ": " g-fname ": ",@(cdr l))
                     53:                  (setq er-fatal (1+ er-fatal)))))
                     54: 
                     55: ;--- comp-msg - port
                     56: ;            - lst
                     57: ;  prints the lst to the given port.  The lst is printed in the manner
                     58: ; described above, that is atoms are patomed, and lists are evaluated
                     59: ; and printed, and N prints a newline.   The output is always drained.
                     60: ;
                     61: (def comp-msg
                     62:    (macro (lis)
                     63:          (do ((xx (cdr lis) (cdr xx))
                     64:               (res nil))
                     65:              ((null xx)
                     66:               `(progn ,@(nreverse (cons '(terpri) res))))
                     67:              (setq res
                     68:                    (cons (cond ((atom (car xx))
                     69:                                 (cond ((eq (car xx) 'N) '(terpr))
                     70:                                       ((stringp (car xx)) `(patom ,(car xx)))
                     71:                                       (t `(niceprint ,(car xx)))))
                     72:                                (t `(niceprint ,(car xx))))
                     73:                          res)))))
                     74: 
                     75: (def niceprint
                     76:    (macro (l)
                     77:          `((lambda (float-format) (patom ,(cadr l))) "%.2f")))
                     78: 
                     79: ;--- standard push macro
                     80: ; (Push stackname valuetoadd)
                     81: 
                     82: (defmacro Push (atm val)
                     83:   `(setq ,atm (cons ,val ,atm)))
                     84: 
                     85: ;--- unpush macro - like pop except top value is thrown away
                     86: (defmacro unpush (atm)
                     87:   `(setq ,atm (cdr ,atm)))
                     88: 
                     89: ;--- and an increment macro
                     90: (defmacro incr (atm)
                     91:   `(setq ,atm (1+ ,atm)))
                     92: 
                     93: (defmacro decr (atm)
                     94:   `(setq ,atm (1- ,atm)))
                     95: 
                     96: ;--- add a comment
                     97: (defmacro makecomment (arg)
                     98:   `(cond (fl-comments (setq g-comments (cons ,arg g-comments)))))
                     99: 
                    100: ;--- add a comment irregardless of the fl-comments flag
                    101: (defmacro forcecomment (arg)
                    102:   `(setq g-comments (cons ,arg g-comments)))
                    103: 
                    104: ;--- write to the .s file
                    105: (defmacro sfilewrite (arg)
                    106:   `(patom ,arg vp-sfile))
                    107: 
                    108: (defmacro sfilewriteln (arg)
                    109:   `(msg (P vp-sfile) ,arg N))
                    110: 
                    111: ;--- Liszt-file  :: keep track of rcs info regarding part of Liszt
                    112: ;  This is put at the beginning of a file which makes up the lisp compiler.
                    113: ; The form used is   (Liszt-file name rcs-string)
                    114: ; where name is the name of this file (without the .l) and rcs-string.
                    115: ;
                    116: (defmacro Liszt-file (name rcs-string)
                    117:    `(cond ((not (boundp 'Liszt-file-names))
                    118:           (setq Liszt-file-names (ncons ,rcs-string)))
                    119:          (t (setq Liszt-file-names
                    120:                   (append1 Liszt-file-names ,rcs-string)))))
                    121: 
                    122: (eval-when (compile eval load)
                    123:    (defun immed-const (x)
                    124:          (get_pname (concat #+(or for-vax for-tahoe) "$" #+for-68k "#" x))))
                    125: 
                    126: ; Indicate that this file has been loaded, before
                    127: (putprop 'cmacros t 'version)
                    128: 
                    129: ;-------- Instruction Macros
                    130: 
                    131: #+(or for-vax for-tahoe)
                    132: (defmacro e-add (src dst)
                    133:    `(e-write3 'addl2 ,src ,dst))
                    134: 
                    135: #+(or for-vax for-tahoe)
                    136: (defmacro e-sub (src dst)
                    137:    `(e-write3 'subl2 ,src ,dst))
                    138: 
                    139: #+(or for-vax for-tahoe)
                    140: (defmacro e-cmp (src dst)
                    141:    `(e-write3 'cmpl ,src ,dst))
                    142: 
                    143: (defmacro e-tst (src)
                    144:    `(e-write2 'tstl ,src))
                    145: 
                    146: #+for-vax
                    147: (defmacro e-quick-call (what)
                    148:    `(e-write2 "jsb" ,what))
                    149: 
                    150: #+for-tahoe
                    151: (defmacro e-quick-call (what)
                    152:    `(e-write3 "calls" "$4" ,what))
                    153: 
                    154: #+for-68k
                    155: (defmacro e-quick-call (what)
                    156:   `(e-write2 "jsbr" ,what))
                    157: 
                    158: 
                    159: ;--- e-add3 :: add from two sources and store in the dest
                    160: ;--- e-sub3 :: subtract from two sources and store in the dest
                    161: 
                    162: ; WARNING:  if the destination is an autoincrement addressing mode, then
                    163: ;      this will not work for the 68000, because multiple instructions
                    164: ;      are generated:
                    165: ;              (e-add3 a b "sp@+")
                    166: ;      is
                    167: ;              movl b,sp@+
                    168: ;              addl a,sp@+     (or addql)
                    169: #+(or for-vax for-tahoe)
                    170: (defmacro e-add3 (s1 s2 dest)
                    171:    `(e-write4 'addl3 ,s1 ,s2 ,dest))
                    172: 
                    173: #+for-68k
                    174: (defmacro e-add3 (s1 s2 dest)
                    175:    `(progn
                    176:        (e-write3 'movl ,s2 ,dest)
                    177:        (e-add ,s1 ,dest)))
                    178: 
                    179: #+(or for-vax for-tahoe)
                    180: (defmacro e-sub3 (s1 s2 dest)
                    181:    `(e-write4 'subl3 ,s1 ,s2 ,dest))
                    182: 
                    183: #+for-68k
                    184: (defmacro e-sub3 (s1 s2 dest)
                    185:    `(progn
                    186:        (e-write3 'movl ,s2 ,dest)
                    187:        (e-sub ,s1 ,dest)))
                    188: 
                    189: (defmacro d-cmp (arg1 arg2)
                    190:   `(e-cmp (e-cvt ,arg1) (e-cvt ,arg2)))
                    191: 
                    192: (defmacro d-tst (arg)
                    193:   `(e-tst (e-cvt ,arg)))
                    194: 
                    195: ;--- d-cmpnil :: compare an IADR to nil
                    196: ;
                    197: (defmacro d-cmpnil (iadr)
                    198:    #+(or for-vax for-tahoe) `(d-tst ,iadr)
                    199:    #+for-68k `(d-cmp 'Nil ,iadr))
                    200: 
                    201: (defmacro e-cmpnil (eiadr)
                    202:    #+(or for-vax for-tahoe) `(break 'e-cmpnil)
                    203:    #+for-68k `(e-cmp (e-cvt 'Nil) ,eiadr))
                    204: 
                    205: (defmacro e-call-qnewint ()
                    206:    `(e-quick-call '_qnewint))
                    207: 
                    208: (defmacro C-push (src)
                    209:    #+for-68k `(e-move ,src '#.Cstack)
                    210:    #+(or for-vax for-tahoe) `(e-write2 'pushl ,src))
                    211: 
                    212: (defmacro L-push (src)
                    213:    `(e-move ,src '#.np-plus))
                    214: 
                    215: (defmacro C-pop (dst)
                    216:    `(e-move '#.unCstack ,dst))
                    217: 
                    218: #+(or for-vax for-68k)
                    219: (defmacro L-pop (dst)
                    220:    `(e-move '#.np-minus ,dst))
                    221: 
                    222: #+for-tahoe
                    223: (defmacro L-pop (dst)
                    224:    `(progn (e-sub '($ 4) '#.np-reg)
                    225:           (e-move '(0 #.np-reg) ,dst)))
                    226: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.