|
|
1.1 root 1: ;----------- macros for the compiler -------------
2:
3: (setq RCS-cmacros
4: "$Header: cmacros.l,v 1.12 83/08/24 17:15:44 layer 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 (cond (fl-warn
40: (comp-msg "%Warning: " v-ifile ": " g-fname ": "
41: ,@(cdr l)))))))
42:
43: (def comp-note
44: (macro (l)
45: `(progn (cond (fl-verb
46: (comp-msg "%Note: " v-ifile ": " ,@(cdr l)))))))
47:
48: (def comp-gerr
49: (macro (l)
50: `(progn (comp-msg
51: "?Error: " v-ifile ": " g-fname ": ",@(cdr l))
52: (setq er-fatal (1+ er-fatal)))))
53:
54: ;--- comp-msg - port
55: ; - lst
56: ; prints the lst to the given port. The lst is printed in the manner
57: ; described above, that is atoms are patomed, and lists are evaluated
58: ; and printed, and N prints a newline. The output is always drained.
59: ;
60: (def comp-msg
61: (macro (lis)
62: (do ((xx (cdr lis) (cdr xx))
63: (res nil))
64: ((null xx)
65: `(progn ,@(nreverse (cons '(terpri) res))))
66: (setq res
67: (cons (cond ((atom (car xx))
68: (cond ((eq (car xx) 'N) '(terpr))
69: ((stringp (car xx)) `(patom ,(car xx)))
70: (t `(niceprint ,(car xx)))))
71: (t `(niceprint ,(car xx))))
72: res)))))
73:
74: (def niceprint
75: (macro (l)
76: `((lambda (float-format) (patom ,(cadr l))) "%.2f")))
77:
78: ;--- standard push macro
79: ; (Push stackname valuetoadd)
80:
81: (defmacro Push (atm val)
82: `(setq ,atm (cons ,val ,atm)))
83:
84: ;--- unpush macro - like pop except top value is thrown away
85: (defmacro unpush (atm)
86: `(setq ,atm (cdr ,atm)))
87:
88: ;--- and an increment macro
89: (defmacro incr (atm)
90: `(setq ,atm (1+ ,atm)))
91:
92: (defmacro decr (atm)
93: `(setq ,atm (1- ,atm)))
94:
95: ;--- add a comment
96: (defmacro makecomment (arg)
97: `(cond (fl-comments (setq g-comments (cons ,arg g-comments)))))
98:
99: ;--- add a comment irregardless of the fl-comments flag
100: (defmacro forcecomment (arg)
101: `(setq g-comments (cons ,arg g-comments)))
102:
103: ;--- write to the .s file
104: (defmacro sfilewrite (arg)
105: `(patom ,arg vp-sfile))
106:
107: (defmacro sfilewriteln (arg)
108: `(msg (P vp-sfile) ,arg N))
109:
110: ;--- Liszt-file :: keep track of rcs info regarding part of Liszt
111: ; This is put at the beginning of a file which makes up the lisp compiler.
112: ; The form used is (Liszt-file name rcs-string)
113: ; where name is the name of this file (without the .l) and rcs-string.
114: ;
115: (defmacro Liszt-file (name rcs-string)
116: `(cond ((not (boundp 'Liszt-file-names))
117: (setq Liszt-file-names (ncons ,rcs-string)))
118: (t (setq Liszt-file-names
119: (append1 Liszt-file-names ,rcs-string)))))
120:
121: (eval-when (compile eval load)
122: (defun immed-const (x)
123: (get_pname (concat #+for-vax "$" #+for-68k "#" x))))
124:
125: ; Indicate that this file has been loaded, before
126: (putprop 'cmacros t 'version)
127:
128: ;-------- Instruction Macros
129:
130: #+for-vax
131: (defmacro e-add (src dst)
132: `(e-write3 'addl2 ,src ,dst))
133:
134: #+for-vax
135: (defmacro e-sub (src dst)
136: `(e-write3 'subl2 ,src ,dst))
137:
138: #+for-vax
139: (defmacro e-cmp (src dst)
140: `(e-write3 'cmpl ,src ,dst))
141:
142: (defmacro e-tst (src)
143: `(e-write2 'tstl ,src))
144:
145: (defmacro e-quick-call (what)
146: `(e-write2 #+for-vax "jsb" #+for-68k "jbsr" ,what))
147:
148: ;--- e-add3 :: add from two sources and store in the dest
149: ;--- e-sub3 :: subtract from two sources and store in the dest
150:
151: ; WARNING: if the destination is an autoincrement addressing mode, then
152: ; this will not work for the 68000, because multiple instructions
153: ; are generated:
154: ; (e-add3 a b "sp@+")
155: ; is
156: ; movl b,sp@+
157: ; addl a,sp@+ (or addql)
158: #+for-vax
159: (defmacro e-add3 (s1 s2 dest)
160: `(e-write4 'addl3 ,s1 ,s2 ,dest))
161:
162: #+for-68k
163: (defmacro e-add3 (s1 s2 dest)
164: `(progn
165: (e-write3 'movl ,s2 ,dest)
166: (e-add ,s1 ,dest)))
167:
168: #+for-vax
169: (defmacro e-sub3 (s1 s2 dest)
170: `(e-write4 'subl3 ,s1 ,s2 ,dest))
171:
172: #+for-68k
173: (defmacro e-sub3 (s1 s2 dest)
174: `(progn
175: (e-write3 'movl ,s2 ,dest)
176: (e-sub ,s1 ,dest)))
177:
178: (defmacro d-cmp (arg1 arg2)
179: `(e-cmp (e-cvt ,arg1) (e-cvt ,arg2)))
180:
181: (defmacro d-tst (arg)
182: `(e-tst (e-cvt ,arg)))
183:
184: ;--- d-cmpnil :: compare an IADR to nil
185: ;
186: (defmacro d-cmpnil (iadr)
187: #+for-vax `(d-tst ,iadr)
188: #+for-68k `(d-cmp 'Nil ,iadr))
189:
190: (defmacro e-cmpnil (eiadr)
191: #+for-vax `(break 'e-cmpnil)
192: #+for-68k `(e-cmp (e-cvt 'Nil) ,eiadr))
193:
194: (defmacro e-call-qnewint ()
195: `(e-quick-call '_qnewint))
196:
197: (defmacro C-push (src)
198: #+for-68k `(e-move ,src '#.Cstack)
199: #+for-vax `(e-write2 'pushl ,src))
200:
201: (defmacro L-push (src)
202: `(e-move ,src '#.np-plus))
203:
204: (defmacro C-pop (dst)
205: `(e-move '#.unCstack ,dst))
206:
207: (defmacro L-pop (dst)
208: `(e-move '#.np-minus ,dst))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.