3
$Id: machin.scm,v 4.13 1999/01/02 06:06:43 cph Exp $
5
Copyright (c) 1987-1999 Massachusetts Institute of Technology
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or (at
10
your option) any later version.
12
This program is distributed in the hope that it will be useful, but
13
WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
General Public License for more details.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
22
;;;; Machine Model for DEC Vax
23
;;; package: (compiler)
25
(declare (usual-integrations))
27
;;;; Architecture Parameters
29
(define use-pre/post-increment? true)
30
(define-integrable endianness 'LITTLE)
31
(define-integrable addressing-granularity 8)
32
(define-integrable scheme-object-width 32)
33
(define-integrable scheme-type-width 6) ;or 8
35
;; NOTE: expt is not being constant-folded now.
36
;; For the time being, some of the parameters below are
37
;; pre-computed and marked with ***
38
;; There are similar parameters in lapgen.scm
39
;; Change them if any of the parameters above change.
41
(define-integrable scheme-datum-width
42
(- scheme-object-width scheme-type-width))
44
(define-integrable float-width 64)
45
(define-integrable float-alignment 32)
47
(define-integrable address-units-per-float
48
(quotient float-width addressing-granularity))
50
;;; It is currently required that both packed characters and objects
51
;;; be integrable numbers of address units. Furthermore, the number
52
;;; of address units per object must be an integral multiple of the
53
;;; number of address units per character. This will cause problems
54
;;; on a machine that is word addressed: we will have to rethink the
55
;;; character addressing strategy.
57
(define-integrable address-units-per-object
58
(quotient scheme-object-width addressing-granularity))
60
(define-integrable address-units-per-packed-char 1)
62
(define-integrable signed-fixnum/upper-limit
63
;; (expt 2 (-1+ scheme-datum-width)) ***
66
(define-integrable signed-fixnum/lower-limit
67
(- signed-fixnum/upper-limit))
69
(define-integrable unsigned-fixnum/upper-limit
70
(* 2 signed-fixnum/upper-limit))
72
(define-integrable (stack->memory-offset offset) offset)
73
(define-integrable ic-block-first-parameter-offset 2)
75
;; This must return a word based offset.
76
;; On the VAX, to save space, entries can be at 2 mod 4 addresses,
77
;; which makes it impossible if the closure object used for
78
;; referencing points to arbitrary entries. Instead, all closure
79
;; entry points bump to the canonical entry point, which is always
81
;; On other machines (word aligned), it may be easier to bump back
82
;; to each entry point, and the entry number `entry' would be part
83
;; of the computation.
85
(define (closure-first-offset nentries entry)
89
(quotient (+ (+ 3 1) (* 5 (- nentries 1))) 2)))
91
;; This is from the start of the complete closure object,
92
;; viewed as a vector, and including the header word.
94
(define (closure-object-first-offset nentries)
99
(quotient (+ 5 (* 5 nentries)) 2))))
101
;; Bump from one entry point to another.
103
(define (closure-entry-distance nentries entry entry*)
105
(* 10 (- entry* entry)))
107
;; Bump to the canonical entry point.
109
(define (closure-environment-adjustment nentries entry)
110
(declare (integrate-operator closure-entry-distance))
111
(closure-entry-distance nentries entry 0))
113
(define-integrable r0 0) ; return value
114
(define-integrable r1 1)
115
(define-integrable r2 2)
116
(define-integrable r3 3)
117
(define-integrable r4 4)
118
(define-integrable r5 5)
119
(define-integrable r6 6)
120
(define-integrable r7 7)
121
(define-integrable r8 8)
122
(define-integrable r9 9)
123
(define-integrable r10 10)
124
(define-integrable r11 11)
125
(define-integrable r12 12) ; AP
126
(define-integrable r13 13) ; FP
127
(define-integrable r14 14) ; SP
128
(define-integrable r15 15) ; PC, not really useable.
130
(define number-of-machine-registers 16)
131
(define number-of-temporary-registers 256)
133
(define-integrable regnum:return-value r9)
134
(define-integrable regnum:regs-pointer r10)
135
(define-integrable regnum:pointer-mask r11)
136
(define-integrable regnum:free-pointer r12)
137
(define-integrable regnum:dynamic-link r13)
138
(define-integrable regnum:stack-pointer r14)
139
(define-integrable (machine-register-known-value register) register false)
141
(define (machine-register-value-class register)
142
(cond ((<= 0 register 9) value-class=object)
143
((= 11 register) value-class=immediate)
144
((<= 10 register 15) value-class=address)
145
(else (error "illegal machine register" register))))
147
;;;; RTL Generator Interface
149
(define (interpreter-register:access)
150
(rtl:make-machine-register r0))
152
(define (interpreter-register:cache-reference)
153
(rtl:make-machine-register r0))
155
(define (interpreter-register:cache-unassigned?)
156
(rtl:make-machine-register r0))
158
(define (interpreter-register:lookup)
159
(rtl:make-machine-register r0))
161
(define (interpreter-register:unassigned?)
162
(rtl:make-machine-register r0))
164
(define (interpreter-register:unbound?)
165
(rtl:make-machine-register r0))
167
(define-integrable (interpreter-value-register)
168
(rtl:make-machine-register regnum:return-value))
170
(define (interpreter-value-register? expression)
171
(and (rtl:register? expression)
172
(= (rtl:register-number expression) regnum:return-value)))
174
(define (interpreter-environment-register)
175
(rtl:make-offset (interpreter-regs-pointer) 3))
177
(define (interpreter-environment-register? expression)
178
(and (rtl:offset? expression)
179
(interpreter-regs-pointer? (rtl:offset-base expression))
180
(= 3 (rtl:offset-number expression))))
182
(define (interpreter-free-pointer)
183
(rtl:make-machine-register regnum:free-pointer))
185
(define (interpreter-free-pointer? expression)
186
(and (rtl:register? expression)
187
(= (rtl:register-number expression) regnum:free-pointer)))
189
(define (interpreter-regs-pointer)
190
(rtl:make-machine-register regnum:regs-pointer))
192
(define (interpreter-regs-pointer? expression)
193
(and (rtl:register? expression)
194
(= (rtl:register-number expression) regnum:regs-pointer)))
196
(define (interpreter-stack-pointer)
197
(rtl:make-machine-register regnum:stack-pointer))
199
(define (interpreter-stack-pointer? expression)
200
(and (rtl:register? expression)
201
(= (rtl:register-number expression) regnum:stack-pointer)))
203
(define (interpreter-dynamic-link)
204
(rtl:make-machine-register regnum:dynamic-link))
206
(define (interpreter-dynamic-link? expression)
207
(and (rtl:register? expression)
208
(= (rtl:register-number expression) regnum:dynamic-link)))
210
(define (rtl:machine-register? rtl-register)
213
(interpreter-stack-pointer))
215
(interpreter-dynamic-link))
217
(interpreter-value-register))
219
(interpreter-free-pointer))
220
((INTERPRETER-CALL-RESULT:ACCESS)
221
(interpreter-register:access))
222
((INTERPRETER-CALL-RESULT:CACHE-REFERENCE)
223
(interpreter-register:cache-reference))
224
((INTERPRETER-CALL-RESULT:CACHE-UNASSIGNED?)
225
(interpreter-register:cache-unassigned?))
226
((INTERPRETER-CALL-RESULT:LOOKUP)
227
(interpreter-register:lookup))
228
((INTERPRETER-CALL-RESULT:UNASSIGNED?)
229
(interpreter-register:unassigned?))
230
((INTERPRETER-CALL-RESULT:UNBOUND?)
231
(interpreter-register:unbound?))
235
(define (rtl:interpreter-register? rtl-register)
244
(define (rtl:interpreter-register->offset locative)
245
(or (rtl:interpreter-register? locative)
246
(error "Unknown register type" locative)))
248
(define (rtl:constant-cost expression)
250
;; number of bytes for the instruction to construct/fetch into register.
253
(cond ((zero? value) 2)
258
(let ((if-synthesized-constant
260
(if-integer (make-non-pointer-literal type datum)))))
261
(case (rtl:expression-type expression)
263
(let ((value (rtl:constant-value expression)))
264
(if (non-pointer-object? value)
265
(if-synthesized-constant (object-type value)
266
(careful-object-datum value))
269
(if-integer (rtl:machine-constant-value expression)))
276
4) ; assuming word offset
278
(and (rtl:machine-constant? (rtl:cons-pointer-type expression))
279
(rtl:machine-constant? (rtl:cons-pointer-datum expression))
280
(if-synthesized-constant
281
(rtl:machine-constant-value (rtl:cons-pointer-type expression))
282
(rtl:machine-constant-value
283
(rtl:cons-pointer-datum expression)))))
286
;;; Floating-point open-coding not implemented for VAXen.
288
(define compiler:open-code-floating-point-arithmetic?
291
(define compiler:primitives-with-no-open-coding
292
'(DIVIDE-FIXNUM GCD-FIXNUM &/
293
VECTOR-CONS STRING-ALLOCATE FLOATING-VECTOR-CONS
294
FLOATING-VECTOR-REF FLOATING-VECTOR-SET!))
b'\\ No newline at end of file'