|
|
1.1 root 1: ;----------- macros for the compiler -------------
2:
3: (setq RCS-cmacros
4: "$Header: cmacros.l,v 1.13 83/11/22 10:12:22 jkf 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 #+for-vax "$" #+for-68k "#" x))))
125:
126: ; Indicate that this file has been loaded, before
127: (putprop 'cmacros t 'version)
128:
129: ;-------- Instruction Macros
130:
131: #+for-vax
132: (defmacro e-add (src dst)
133: `(e-write3 'addl2 ,src ,dst))
134:
135: #+for-vax
136: (defmacro e-sub (src dst)
137: `(e-write3 'subl2 ,src ,dst))
138:
139: #+for-vax
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: (defmacro e-quick-call (what)
147: `(e-write2 #+for-vax "jsb" #+for-68k "jbsr" ,what))
148:
149: ;--- e-add3 :: add from two sources and store in the dest
150: ;--- e-sub3 :: subtract from two sources and store in the dest
151:
152: ; WARNING: if the destination is an autoincrement addressing mode, then
153: ; this will not work for the 68000, because multiple instructions
154: ; are generated:
155: ; (e-add3 a b "sp@+")
156: ; is
157: ; movl b,sp@+
158: ; addl a,sp@+ (or addql)
159: #+for-vax
160: (defmacro e-add3 (s1 s2 dest)
161: `(e-write4 'addl3 ,s1 ,s2 ,dest))
162:
163: #+for-68k
164: (defmacro e-add3 (s1 s2 dest)
165: `(progn
166: (e-write3 'movl ,s2 ,dest)
167: (e-add ,s1 ,dest)))
168:
169: #+for-vax
170: (defmacro e-sub3 (s1 s2 dest)
171: `(e-write4 'subl3 ,s1 ,s2 ,dest))
172:
173: #+for-68k
174: (defmacro e-sub3 (s1 s2 dest)
175: `(progn
176: (e-write3 'movl ,s2 ,dest)
177: (e-sub ,s1 ,dest)))
178:
179: (defmacro d-cmp (arg1 arg2)
180: `(e-cmp (e-cvt ,arg1) (e-cvt ,arg2)))
181:
182: (defmacro d-tst (arg)
183: `(e-tst (e-cvt ,arg)))
184:
185: ;--- d-cmpnil :: compare an IADR to nil
186: ;
187: (defmacro d-cmpnil (iadr)
188: #+for-vax `(d-tst ,iadr)
189: #+for-68k `(d-cmp 'Nil ,iadr))
190:
191: (defmacro e-cmpnil (eiadr)
192: #+for-vax `(break 'e-cmpnil)
193: #+for-68k `(e-cmp (e-cvt 'Nil) ,eiadr))
194:
195: (defmacro e-call-qnewint ()
196: `(e-quick-call '_qnewint))
197:
198: (defmacro C-push (src)
199: #+for-68k `(e-move ,src '#.Cstack)
200: #+for-vax `(e-write2 'pushl ,src))
201:
202: (defmacro L-push (src)
203: `(e-move ,src '#.np-plus))
204:
205: (defmacro C-pop (dst)
206: `(e-move '#.unCstack ,dst))
207:
208: (defmacro L-pop (dst)
209: `(e-move '#.np-minus ,dst))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.