~ chicken-core (master) /c-platform.scm
Trap1;;;; c-platform.scm - Platform specific parameters and definitions
2;
3; Copyright (c) 2008-2022, The CHICKEN Team
4; Copyright (c) 2000-2007, Felix L. Winkelmann
5; All rights reserved.
6;
7; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
8; conditions are met:
9;
10; Redistributions of source code must retain the above copyright notice, this list of conditions and the following
11; disclaimer.
12; Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
13; disclaimer in the documentation and/or other materials provided with the distribution.
14; Neither the name of the author nor the names of its contributors may be used to endorse or promote
15; products derived from this software without specific prior written permission.
16;
17; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
18; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
20; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25; POSSIBILITY OF SUCH DAMAGE.
26
27
28(declare
29 (unit c-platform)
30 (uses internal optimizer support compiler))
31
32(module chicken.compiler.c-platform
33 (;; Batch compilation defaults
34 default-declarations default-profiling-declarations default-units
35
36 ;; Compiler flags
37 valid-compiler-options valid-compiler-options-with-argument
38
39 ;; For consumption by c-backend *only*
40 target-include-file words-per-flonum)
41
42(import scheme
43 chicken.base
44 chicken.compiler.optimizer
45 chicken.compiler.support
46 chicken.compiler.core
47 chicken.fixnum
48 chicken.internal)
49(import (only (scheme base) port?))
50
51(include "tweaks")
52(include "mini-srfi-1.scm")
53
54;;; Parameters:
55
56(default-optimization-passes 3)
57
58(define default-declarations
59 '((always-bound
60 ##sys#standard-input ##sys#standard-output ##sys#standard-error
61 ##sys#undefined-value)
62 (bound-to-procedure
63 ##sys#for-each ##sys#map ##sys#print ##sys#setter
64 ##sys#setslot ##sys#dynamic-wind ##sys#call-with-values
65 ##sys#start-timer ##sys#stop-timer ##sys#gcd ##sys#lcm ##sys#structure? ##sys#slot
66 ##sys#allocate-vector ##sys#allocate-bytevector ##sys#list->vector ##sys#block-ref ##sys#block-set!
67 ##sys#list ##sys#cons ##sys#append ##sys#vector ##sys#foreign-char-argument ##sys#foreign-fixnum-argument
68 ##sys#foreign-flonum-argument ##sys#error ##sys#peek-c-string ##sys#peek-nonnull-c-string
69 ##sys#peek-and-free-c-string ##sys#peek-and-free-nonnull-c-string
70 ##sys#foreign-block-argument ##sys#foreign-string-argument
71 ##sys#foreign-symbol-argument
72 ##sys#foreign-pointer-argument ##sys#call-with-current-continuation)))
73
74(define default-profiling-declarations
75 '((##core#declare
76 (uses profiler)
77 (bound-to-procedure ##sys#profile-entry
78 ##sys#profile-exit
79 ##sys#register-profile-info
80 ##sys#set-profile-info-vector!))))
81
82(define default-units '(library eval))
83
84(define words-per-flonum 4)
85(define min-words-per-bignum 5)
86
87(eq-inline-operator "C_eqp")
88(membership-test-operators
89 '(("C_i_memq" . "C_eqp") ("C_u_i_memq" . "C_eqp") ("C_i_member" . "C_i_equalp")
90 ("C_i_memv" . "C_i_eqvp") ) )
91(membership-unfold-limit 20)
92(define target-include-file "chicken.h")
93
94(define valid-compiler-options
95 '(-help
96 h help version verbose explicit-use
97 no-trace no-warnings unsafe block
98 check-syntax to-stdout no-usual-integrations case-insensitive no-lambda-info
99 profile inline keep-shadowed-macros ignore-repository
100 fixnum-arithmetic disable-interrupts optimize-leaf-routines
101 compile-syntax tag-pointers accumulate-profile
102 disable-stack-overflow-checks raw specialize
103 emit-external-prototypes-first release local inline-global
104 analyze-only dynamic static
105 no-argc-checks no-procedure-checks no-parentheses-synonyms
106 no-procedure-checks-for-toplevel-bindings
107 no-bound-checks no-procedure-checks-for-usual-bindings no-compiler-syntax
108 no-parentheses-synonyms r7rs-syntax emit-all-import-libraries
109 strict-types clustering lfa2 debug-info
110 regenerate-import-libraries setup-mode
111 module-registration no-module-registration))
112
113(define valid-compiler-options-with-argument
114 '(debug link emit-link-file
115 output-file include-path heap-size stack-size unit uses module
116 keyword-style require-extension inline-limit profile-name
117 prelude postlude prologue epilogue nursery extend feature no-feature
118 unroll-limit
119 emit-inline-file consult-inline-file
120 emit-types-file consult-types-file
121 emit-import-library))
122
123
124;;; Standard and extended bindings:
125
126(set! default-standard-bindings
127 (map (lambda (x) (symbol-append 'scheme# x))
128 '(not boolean? apply call-with-current-continuation eq? eqv? equal? pair? cons car cdr caar cadr
129 cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar
130 cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr set-car! set-cdr!
131 null? list list? length zero? * - + / - > < >= <= = current-output-port current-input-port
132 write-char newline write display append symbol->string for-each map char? char->integer
133 integer->char eof-object? vector-length string-length string-ref string-set! vector-ref
134 vector-set! char=? char<? char>? char>=? char<=? gcd lcm reverse symbol? string->symbol
135 number? complex? real? integer? rational? odd? even? positive? negative? exact? inexact?
136 max min quotient remainder modulo floor ceiling truncate round rationalize
137 exact->inexact inexact->exact
138 exp log sin expt sqrt cos tan asin acos atan number->string string->number char-ci=?
139 char-ci<? char-ci>? char-ci>=? char-ci<=? char-alphabetic? char-whitespace? char-numeric?
140 char-lower-case? char-upper-case? char-upcase char-downcase string? string=? string>? string<?
141 string>=? string<=? string-ci=? string-ci<? string-ci>? string-ci<=? string-ci>=?
142 string-append string->list list->string vector? vector->list list->vector string read
143 read-char substring string-fill! vector-copy! vector-fill! make-string make-vector open-input-file
144 open-output-file call-with-input-file call-with-output-file close-input-port close-output-port
145 values call-with-values vector procedure? memq memv member assq assv assoc list-tail
146 list-ref abs char-ready? peek-char list->string string->list
147 current-input-port current-output-port call/cc
148 make-polar make-rectangular real-part imag-part
149 load eval interaction-environment null-environment
150 scheme-report-environment)))
151
152(define-constant +flonum-bindings+
153 (map (lambda (x) (symbol-append 'chicken.flonum# x))
154 '(fp/? fp+ fp- fp* fp/ fp> fp< fp= fp>= fp<= fpmin fpmax fpneg fpgcd fp*+
155 fpfloor fpceiling fptruncate fpround fpsin fpcos fptan fpasin fpacos
156 fpatan fpatan2 fpexp fpexpt fplog fpsqrt fpabs fpinteger?)))
157
158(define-constant +fixnum-bindings+
159 (map (lambda (x) (symbol-append 'chicken.fixnum# x))
160 '(fx* fx*? fx+ fx+? fx- fx-? fx/ fx/? fx< fx<= fx= fx> fx>= fxand
161 fxeven? fxgcd fxior fxlen fxmax fxmin fxmod fxneg fxnot fxodd?
162 fxrem fxshl fxshr fxxor)))
163
164(define-constant +extended-bindings+
165 '(chicken.base#bignum? chicken.base#cplxnum? chicken.base#fixnum?
166 chicken.base#flonum? chicken.base#ratnum?
167 chicken.base#add1 chicken.base#sub1
168 chicken.base#nan? chicken.base#finite? chicken.base#infinite?
169 chicken.base#gensym
170 chicken.base#void chicken.base#print chicken.base#print*
171 chicken.base#error chicken.base#char-name
172 chicken.base#current-error-port
173 chicken.base#symbol-append chicken.base#foldl chicken.base#foldr
174 chicken.base#setter chicken.base#getter-with-setter
175 chicken.base#equal=? chicken.base#exact-integer?
176 chicken.base#flush-output
177
178 chicken.base#weak-cons chicken.base#weak-pair? chicken.base#bwp-object?
179
180 chicken.base#identity chicken.base#o chicken.base#atom?
181 chicken.base#alist-ref chicken.base#rassoc
182
183 chicken.bitwise#integer-length
184 chicken.bitwise#bitwise-and chicken.bitwise#bitwise-not
185 chicken.bitwise#bitwise-ior chicken.bitwise#bitwise-xor
186 chicken.bitwise#arithmetic-shift chicken.bitwise#bit->boolean
187
188 chicken.bytevector#bytevector-length chicken.bytevector#bytevector=?
189
190 chicken.keyword#get-keyword
191
192 chicken.number-vectoru8vector? chicken.number-vectors8vector?
193 chicken.number-vectoru16vector? chicken.number-vectors16vector?
194 chicken.number-vectoru32vector? chicken.number-vectoru64vector?
195 chicken.number-vectors32vector? chicken.number-vectors64vector?
196 chicken.number-vectorf32vector? chicken.number-vectorf64vector?
197 chicken.number-vectorc64vector? chicken.number-vectorf128vector?
198
199 chicken.number-vectoru8vector-length chicken.number-vectors8vector-length
200 chicken.number-vectoru16vector-length chicken.number-vectors16vector-length
201 chicken.number-vectoru32vector-length chicken.number-vectoru64vector-length
202 chicken.number-vectors32vector-length chicken.number-vectors64vector-length
203 chicken.number-vectorf32vector-length chicken.number-vectorf64vector-length
204 chicken.number-vectorc64vector-length chicken.number-vectorc128vector-length
205
206 chicken.number-vectoru8vector-ref chicken.number-vectors8vector-ref
207 chicken.number-vectoru16vector-ref chicken.number-vectors16vector-ref
208 chicken.number-vectoru32vector-ref chicken.number-vectoru64vector-ref
209 chicken.number-vectors32vector-ref chicken.number-vectors64vector-ref
210 chicken.number-vectorf32vector-ref chicken.number-vectorf64vector-ref
211 chicken.number-vectorc64vector-ref chicken.number-vectorc128vector-ref
212
213 chicken.number-vectoru8vector-set! chicken.number-vectors8vector-set!
214 chicken.number-vectoru16vector-set! chicken.number-vectors16vector-set!
215 chicken.number-vectoru32vector-set! chicken.number-vectoru64vector-set!
216 chicken.number-vectors32vector-set! chicken.number-vectors64vector-set!
217 chicken.number-vectorf32vector-set! chicken.number-vectorf64vector-set!
218 chicken.number-vectorc64vector-set! chicken.number-vectorc128vector-set!
219
220 chicken.number-vectoru16vector->bytevector/shared chicken.number-vectors16vector->bytevector/shared
221 chicken.number-vectoru32vector->bytevector/shared chicken.number-vectors32vector->bytevector/shared
222 chicken.number-vectoru64vector->bytevector/shared chicken.number-vectors64vector->bytevector/shared
223 chicken.number-vectorf32vector->bytevector/shared chicken.number-vectorf64vector->bytevector/shared
224 chicken.number-vectorbytevector->u16vector/shared chicken.number-vectorbytevector->s16vector/shared
225 chicken.number-vectorbytevector->u32vector/shared chicken.number-vectorbytevector->s32vector/shared
226 chicken.number-vectorbytevector->u64vector/shared chicken.number-vectorbytevector->s64vector/shared
227 chicken.number-vectorbytevector->f32vector/shared chicken.number-vectorbytevector->f64vector/shared
228 chicken.number-vectorbytevector->c64vector/shared chicken.number-vectorbytevector->c128vector/shared
229
230 chicken.memory.representation#number-of-slots
231 chicken.memory.representation#make-record-instance
232 chicken.memory.representation#block-ref
233 chicken.memory.representation#block-set!
234
235 chicken.locative#locative-ref chicken.locative#locative-set!
236 chicken.locative#locative->object chicken.locative#locative?
237 chicken.locative#locative-index
238
239 chicken.memory#pointer+ chicken.memory#pointer=?
240 chicken.memory#address->pointer chicken.memory#pointer->address
241 chicken.memory#pointer->object chicken.memory#object->pointer
242 chicken.memory#pointer-u8-ref chicken.memory#pointer-s8-ref
243 chicken.memory#pointer-u16-ref chicken.memory#pointer-s16-ref
244 chicken.memory#pointer-u32-ref chicken.memory#pointer-s32-ref
245 chicken.memory#pointer-f32-ref chicken.memory#pointer-f64-ref
246 chicken.memory#pointer-u8-set! chicken.memory#pointer-s8-set!
247 chicken.memory#pointer-u16-set! chicken.memory#pointer-s16-set!
248 chicken.memory#pointer-u32-set! chicken.memory#pointer-s32-set!
249 chicken.memory#pointer-f32-set! chicken.memory#pointer-f64-set!
250
251 chicken.string#substring-index chicken.string#substring-index-ci
252 chicken.string#substring=? chicken.string#substring-ci=?
253
254 chicken.io#read-string
255
256 chicken.format#format
257 chicken.format#printf chicken.format#sprintf chicken.format#fprintf))
258
259(set! default-extended-bindings
260 (append +fixnum-bindings+ +flonum-bindings+ +extended-bindings+))
261
262(set! internal-bindings
263 '(##sys#slot ##sys#setslot ##sys#block-ref ##sys#block-set! ##sys#/-2
264 ##sys#call-with-current-continuation ##sys#size ##sys#byte
265 ##sys#pointer? ##sys#generic-structure? ##sys#structure? ##sys#check-structure
266 ##sys#check-number ##sys#check-list ##sys#check-pair ##sys#check-string
267 ##sys#check-symbol ##sys#check-boolean ##sys#check-locative
268 ##sys#check-fixnum ##sys#check-range ##sys#check-range/internal
269 ##sys#check-port ##sys#check-input-port ##sys#check-output-port
270 ##sys#check-open-port ##sys#check-bytevector ##sys#signal-hook
271 ##sys#check-char ##sys#check-vector ##sys#check-bytevector ##sys#list ##sys#cons
272 ##sys#call-with-values ##sys#flonum-in-fixnum-range?
273 ##sys#immediate? ##sys#context-switch
274 ##sys#make-structure ##sys#apply ##sys#apply-values
275 chicken.continuation#continuation-graft
276 ##sys#bytevector? ##sys#make-vector ##sys#setter ##sys#car ##sys#cdr ##sys#pair?
277 ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? ##sys#get-keyword
278 ##sys#foreign-char-argument ##sys#foreign-fixnum-argument ##sys#foreign-flonum-argument
279 ##sys#foreign-block-argument ##sys#foreign-struct-wrapper-argument
280 ##sys#foreign-string-argument ##sys#foreign-pointer-argument ##sys#void
281 ##sys#foreign-ranged-integer-argument ##sys#foreign-unsigned-ranged-integer-argument
282 ##sys#peek-fixnum ##sys#setislot ##sys#poke-integer ##sys#permanent? ##sys#values ##sys#poke-double
283 ##sys#intern-symbol ##sys#intern-keyword ##sys#null-pointer? ##sys#peek-byte
284 ##sys#foreign-symbol-argument
285 ##sys#symbol->string/shared ##sys#buffer->string ##sys#string->symbol-name
286 ##sys#bytevector->list ##sys#list->bytevector ##sys#make-bytevector
287 ##sys#file-exists? ##sys#substring-index ##sys#substring-index-ci ##sys#lcm ##sys#gcd))
288
289(for-each
290 (cut mark-variable <> '##compiler#pure '#t)
291 '(##sys#slot ##sys#block-ref ##sys#size ##sys#byte
292 ##sys#pointer? ##sys#generic-structure? ##sys#immediate?
293 ##sys#bytevector? ##sys#pair? ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv?
294 ##sys#get-keyword ; ok it isn't, but this is only used for ext. llists
295 ##sys#void ##sys#permanent?))
296
297
298;;; Rewriting-definitions for this platform:
299
300(let ()
301 ;; (add1 <x>) -> (##core#inline "C_fixnum_increase" <x>) [fixnum-mode]
302 ;; (add1 <x>) -> (##core#inline "C_u_fixnum_increase" <x>) [fixnum-mode + unsafe]
303 ;; (add1 <x>) -> (##core#inline_allocate ("C_s_a_i_plus" 36) <x> 1)
304 ;; (sub1 <x>) -> (##core#inline "C_fixnum_decrease" <x>) [fixnum-mode]
305 ;; (sub1 <x>) -> (##core#inline "C_u_fixnum_decrease" <x>) [fixnum-mode + unsafe]
306 ;; (sub1 <x>) -> (##core#inline_allocate ("C_s_a_i_minus" 36) <x> 1)
307 (define ((op1 fiop ufiop aiop) db classargs cont callargs)
308 (and (= (length callargs) 1)
309 (make-node
310 '##core#call (list #t)
311 (list
312 cont
313 (if (eq? 'fixnum number-type)
314 (make-node '##core#inline (list (if unsafe ufiop fiop)) callargs)
315 (make-node
316 '##core#inline_allocate (list aiop 36)
317 (list (car callargs) (qnode 1))))))))
318 (rewrite 'chicken.base#add1 8 (op1 "C_fixnum_increase" "C_u_fixnum_increase" "C_s_a_i_plus"))
319 (rewrite 'chicken.base#sub1 8 (op1 "C_fixnum_decrease" "C_u_fixnum_decrease" "C_s_a_i_minus")))
320
321(let ()
322 (define (eqv?-id db classargs cont callargs)
323 ;; (eqv? <var> <var>) -> (quote #t) [two identical objects]
324 ;; (eqv? ...) -> (##core#inline "C_eqp" ...)
325 ;; [one argument is a constant and either immediate or not a number]
326 (and (= (length callargs) 2)
327 (let ((arg1 (first callargs))
328 (arg2 (second callargs)) )
329 (or (and (eq? '##core#variable (node-class arg1))
330 (eq? '##core#variable (node-class arg2))
331 (equal? (node-parameters arg1) (node-parameters arg2))
332 (make-node '##core#call (list #t) (list cont (qnode #t))) )
333 (and (or (and (eq? 'quote (node-class arg1))
334 (let ((p1 (first (node-parameters arg1))))
335 (or (immediate? p1) (not (number? p1)))) )
336 (and (eq? 'quote (node-class arg2))
337 (let ((p2 (first (node-parameters arg2))))
338 (or (immediate? p2) (not (number? p2)))) ) )
339 (make-node
340 '##core#call (list #t)
341 (list cont (make-node '##core#inline '("C_eqp") callargs)) ) ) ) ) ) )
342 (rewrite 'scheme#eqv? 8 eqv?-id)
343 (rewrite '##sys#eqv? 8 eqv?-id))
344
345(rewrite
346 'scheme#equal? 8
347 (lambda (db classargs cont callargs)
348 ;; (equal? <var> <var>) -> (quote #t)
349 ;; (equal? ...) -> (##core#inline "C_eqp" ...) [one argument is a constant and immediate or a symbol]
350 ;; (equal? ...) -> (##core#inline "C_i_equalp" ...)
351 (and (= (length callargs) 2)
352 (let ([arg1 (first callargs)]
353 [arg2 (second callargs)] )
354 (or (and (eq? '##core#variable (node-class arg1))
355 (eq? '##core#variable (node-class arg2))
356 (equal? (node-parameters arg1) (node-parameters arg2))
357 (make-node '##core#call (list #t) (list cont (qnode #t))) )
358 (and (or (and (eq? 'quote (node-class arg1))
359 (let ([f (first (node-parameters arg1))])
360 (or (immediate? f) (symbol? f)) ) )
361 (and (eq? 'quote (node-class arg2))
362 (let ([f (first (node-parameters arg2))])
363 (or (immediate? f) (symbol? f)) ) ) )
364 (make-node
365 '##core#call (list #t)
366 (list cont (make-node '##core#inline '("C_eqp") callargs)) ) )
367 (make-node
368 '##core#call (list #t)
369 (list cont (make-node '##core#inline '("C_i_equalp") callargs)) ) ) ) ) ) )
370
371(let ()
372 (define (rewrite-apply db classargs cont callargs)
373 ;; (apply <fn> <x1> ... '(<y1> ...)) -> (<fn> <x1> ... '<y1> ...)
374 ;; (apply ...) -> ((##core#proc "C_apply") ...)
375 ;; (apply values <lst>) -> ((##core#proc "C_apply_values") lst)
376 ;; (apply ##sys#values <lst>) -> ((##core#proc "C_apply_values") lst)
377 (and (pair? callargs)
378 (let ([lastarg (last callargs)]
379 [proc (car callargs)] )
380 (if (eq? 'quote (node-class lastarg))
381 (make-node
382 '##core#call (list #f)
383 (cons* (first callargs)
384 cont
385 (append (cdr (butlast callargs)) (map qnode (first (node-parameters lastarg)))) ) )
386 (or (and (eq? '##core#variable (node-class proc))
387 (= 2 (length callargs))
388 (let ([name (car (node-parameters proc))])
389 (and (memq name '(values ##sys#values))
390 (intrinsic? name)
391 (make-node
392 '##core#call (list #t)
393 (list (make-node '##core#proc '("C_apply_values" #t) '())
394 cont
395 (cadr callargs) ) ) ) ) )
396 (make-node
397 '##core#call (list #t)
398 (cons* (make-node '##core#proc '("C_apply" #t) '())
399 cont callargs) ) ) ) ) ) )
400 (rewrite 'scheme#apply 8 rewrite-apply)
401 (rewrite '##sys#apply 8 rewrite-apply) )
402
403(let ()
404 (define (rewrite-c..r op iop1 iop2)
405 (rewrite
406 op 8
407 (lambda (db classargs cont callargs)
408 ;; (<op> <x>) -> (##core#inline <iop1> <x>) [safe]
409 ;; (<op> <x>) -> (##core#inline <iop2> <x>) [unsafe]
410 (and (= (length callargs) 1)
411 (call-with-current-continuation
412 (lambda (return)
413 (let ((arg (first callargs)))
414 (make-node
415 '##core#call (list #t)
416 (list
417 cont
418 (cond [(and unsafe iop2) (make-node '##core#inline (list iop2) callargs)]
419 [iop1 (make-node '##core#inline (list iop1) callargs)]
420 [else (return #f)] ) ) ) ) ) ) ) ) ) )
421
422 (rewrite-c..r 'scheme#car "C_i_car" "C_u_i_car")
423 (rewrite-c..r '##sys#car "C_i_car" "C_u_i_car")
424 (rewrite-c..r '##sys#cdr "C_i_cdr" "C_u_i_cdr")
425 (rewrite-c..r 'scheme#cadr "C_i_cadr" "C_u_i_cadr")
426 (rewrite-c..r 'scheme#caddr "C_i_caddr" "C_u_i_caddr")
427 (rewrite-c..r 'scheme#cadddr "C_i_cadddr" "C_u_i_cadddr") )
428
429(let ((rvalues
430 (lambda (db classargs cont callargs)
431 ;; (values <x>) -> <x>
432 (and (= (length callargs) 1)
433 (make-node '##core#call (list #t) (cons cont callargs) ) ) ) ) )
434 (rewrite 'scheme#values 8 rvalues)
435 (rewrite '##sys#values 8 rvalues) )
436
437(let ()
438 (define (rewrite-c-w-v db classargs cont callargs)
439 ;; (call-with-values <var1> <var2>) -> (let ((k (lambda (r) [<var2> <k0> r]))) [<var1> k])
440 ;; - if <var2> is a known lambda of a single argument
441 (and (= 2 (length callargs))
442 (let ((arg1 (car callargs))
443 (arg2 (cadr callargs)) )
444 (and (eq? '##core#variable (node-class arg1)) ; probably not needed
445 (eq? '##core#variable (node-class arg2))
446 (and-let* ((sym (car (node-parameters arg2)))
447 (val (db-get db sym 'value)) )
448 (and (eq? '##core#lambda (node-class val))
449 (let ((llist (third (node-parameters val))))
450 (and (list? llist)
451 (= 2 (length llist))
452 (let ((tmp (gensym))
453 (tmpk (gensym 'r)) )
454 (debugging 'o "removing single-valued `call-with-values'" (node-parameters val))
455 (make-node
456 'let (list tmp)
457 (list (make-node
458 '##core#lambda
459 (list (gensym 'f_) #f (list tmpk) 0)
460 (list (make-node
461 '##core#call (list #t)
462 (list arg2 cont (varnode tmpk)) ) ) )
463 (make-node
464 '##core#call (list #t)
465 (list arg1 (varnode tmp)) ) ) ) ) ) ) ) ) ) ) ) )
466 (rewrite 'scheme#call-with-values 8 rewrite-c-w-v)
467 (rewrite '##sys#call-with-values 8 rewrite-c-w-v) )
468
469(rewrite 'scheme#values 13 #f "C_values" #t)
470(rewrite '##sys#values 13 #f "C_values" #t)
471(rewrite 'scheme#call-with-values 13 2 "C_u_call_with_values" #f)
472(rewrite 'scheme#call-with-values 13 2 "C_call_with_values" #t)
473(rewrite '##sys#call-with-values 13 2 "C_u_call_with_values" #f)
474(rewrite '##sys#call-with-values 13 2 "C_call_with_values" #t)
475(rewrite 'chicken.continuation#continuation-graft 13 2 "C_continuation_graft" #t)
476
477(rewrite 'scheme#caar 2 1 "C_u_i_caar" #f)
478(rewrite 'scheme#cdar 2 1 "C_u_i_cdar" #f)
479(rewrite 'scheme#cddr 2 1 "C_u_i_cddr" #f)
480(rewrite 'scheme#caaar 2 1 "C_u_i_caaar" #f)
481(rewrite 'scheme#cadar 2 1 "C_u_i_cadar" #f)
482(rewrite 'scheme#caddr 2 1 "C_u_i_caddr" #f)
483(rewrite 'scheme#cdaar 2 1 "C_u_i_cdaar" #f)
484(rewrite 'scheme#cdadr 2 1 "C_u_i_cdadr" #f)
485(rewrite 'scheme#cddar 2 1 "C_u_i_cddar" #f)
486(rewrite 'scheme#cdddr 2 1 "C_u_i_cdddr" #f)
487(rewrite 'scheme#caaaar 2 1 "C_u_i_caaaar" #f)
488(rewrite 'scheme#caadar 2 1 "C_u_i_caadar" #f)
489(rewrite 'scheme#caaddr 2 1 "C_u_i_caaddr" #f)
490(rewrite 'scheme#cadaar 2 1 "C_u_i_cadaar" #f)
491(rewrite 'scheme#cadadr 2 1 "C_u_i_cadadr" #f)
492(rewrite 'scheme#caddar 2 1 "C_u_i_caddar" #f)
493(rewrite 'scheme#cadddr 2 1 "C_u_i_cadddr" #f)
494(rewrite 'scheme#cdaaar 2 1 "C_u_i_cdaaar" #f)
495(rewrite 'scheme#cdaadr 2 1 "C_u_i_cdaadr" #f)
496(rewrite 'scheme#cdadar 2 1 "C_u_i_cdadar" #f)
497(rewrite 'scheme#cdaddr 2 1 "C_u_i_cdaddr" #f)
498(rewrite 'scheme#cddaar 2 1 "C_u_i_cddaar" #f)
499(rewrite 'scheme#cddadr 2 1 "C_u_i_cddadr" #f)
500(rewrite 'scheme#cdddar 2 1 "C_u_i_cdddar" #f)
501(rewrite 'scheme#cddddr 2 1 "C_u_i_cddddr" #f)
502
503(rewrite 'scheme#caar 2 1 "C_i_caar" #t)
504(rewrite 'scheme#cdar 2 1 "C_i_cdar" #t)
505(rewrite 'scheme#cddr 2 1 "C_i_cddr" #t)
506(rewrite 'scheme#cdddr 2 1 "C_i_cdddr" #t)
507(rewrite 'scheme#cddddr 2 1 "C_i_cddddr" #t)
508
509(rewrite 'scheme#cdr 2 1 "C_u_i_cdr" #f)
510(rewrite 'scheme#cdr 2 1 "C_i_cdr" #t)
511
512(rewrite 'scheme#eq? 1 2 "C_eqp")
513(rewrite '##sys#eq? 1 2 "C_eqp")
514(rewrite 'scheme#eqv? 1 2 "C_i_eqvp")
515(rewrite '##sys#eqv? 1 2 "C_i_eqvp")
516
517(rewrite 'scheme#list-ref 2 2 "C_u_i_list_ref" #f)
518(rewrite 'scheme#list-ref 2 2 "C_i_list_ref" #t)
519(rewrite 'scheme#null? 2 1 "C_i_nullp" #t)
520(rewrite '##sys#null? 2 1 "C_i_nullp" #t)
521(rewrite 'scheme#length 2 1 "C_i_length" #t)
522(rewrite 'scheme#not 2 1 "C_i_not"#t )
523(rewrite 'scheme#char? 2 1 "C_charp" #t)
524(rewrite 'scheme#string? 2 1 "C_i_stringp" #t)
525(rewrite 'chicken.locative#locative? 2 1 "C_i_locativep" #t)
526(rewrite 'scheme#symbol? 2 1 "C_i_symbolp" #t)
527(rewrite 'scheme#vector? 2 1 "C_i_vectorp" #t)
528(rewrite '##sys#vector? 2 1 "C_i_vectorp" #t)
529(rewrite 'chicken.number-vectoru8vector? 2 1 "C_bytevectorp" #t)
530(rewrite 'chicken.number-vectors8vector? 2 1 "C_i_s8vectorp" #t)
531(rewrite 'chicken.number-vectoru16vector? 2 1 "C_i_u16vectorp" #t)
532(rewrite 'chicken.number-vectors16vector? 2 1 "C_i_s16vectorp" #t)
533(rewrite 'chicken.number-vectoru32vector? 2 1 "C_i_u32vectorp" #t)
534(rewrite 'chicken.number-vectors32vector? 2 1 "C_i_s32vectorp" #t)
535(rewrite 'chicken.number-vectoru64vector? 2 1 "C_i_u64vectorp" #t)
536(rewrite 'chicken.number-vectors64vector? 2 1 "C_i_s64vectorp" #t)
537(rewrite 'chicken.number-vectorf32vector? 2 1 "C_i_f32vectorp" #t)
538(rewrite 'chicken.number-vectorf64vector? 2 1 "C_i_f64vectorp" #t)
539(rewrite 'scheme#pair? 2 1 "C_i_pairp" #t)
540(rewrite '##sys#pair? 2 1 "C_i_pairp" #t)
541(rewrite 'chicken.base#weak-pair? 2 1 "C_i_weak_pairp" #t)
542(rewrite 'scheme#procedure? 2 1 "C_i_closurep" #t)
543(rewrite 'scheme#port? 2 1 "C_i_portp" #t)
544(rewrite 'scheme#boolean? 2 1 "C_booleanp" #t)
545(rewrite 'scheme#number? 2 1 "C_i_numberp" #t)
546(rewrite 'scheme#complex? 2 1 "C_i_numberp" #t)
547(rewrite 'scheme#rational? 2 1 "C_i_rationalp" #t)
548(rewrite 'scheme#real? 2 1 "C_i_realp" #t)
549(rewrite 'scheme#integer? 2 1 "C_i_integerp" #t)
550(rewrite 'chicken.base#exact-integer? 2 1 "C_i_exact_integerp" #t)
551(rewrite 'chicken.base#flonum? 2 1 "C_i_flonump" #t)
552(rewrite 'chicken.base#fixnum? 2 1 "C_fixnump" #t)
553(rewrite 'chicken.base#bignum? 2 1 "C_i_bignump" #t)
554(rewrite 'chicken.base#cplxnum? 2 1 "C_i_cplxnump" #t)
555(rewrite 'chicken.base#ratnum? 2 1 "C_i_ratnump" #t)
556(rewrite 'chicken.base#nan? 2 1 "C_i_nanp" #f)
557(rewrite 'chicken.base#finite? 2 1 "C_i_finitep" #f)
558(rewrite 'chicken.base#infinite? 2 1 "C_i_infinitep" #f)
559(rewrite 'chicken.flonum#fpinteger? 2 1 "C_u_i_fpintegerp" #f)
560(rewrite '##sys#pointer? 2 1 "C_anypointerp" #t)
561(rewrite 'pointer? 2 1 "C_i_safe_pointerp" #t)
562(rewrite '##sys#generic-structure? 2 1 "C_structurep" #t)
563(rewrite 'scheme#exact? 2 1 "C_i_exactp" #t)
564(rewrite 'scheme#exact? 2 1 "C_u_i_exactp" #f)
565(rewrite 'scheme#inexact? 2 1 "C_i_inexactp" #t)
566(rewrite 'scheme#inexact? 2 1 "C_u_i_inexactp" #f)
567(rewrite 'scheme#list? 2 1 "C_i_listp" #t)
568(rewrite 'scheme#eof-object? 2 1 "C_eofp" #t)
569(rewrite 'scheme#string-ref 2 2 "C_utf_subchar" #f)
570(rewrite 'chicken.base#bwp-object? 2 1 "C_bwpp" #t)
571(rewrite 'scheme#string-ref 2 2 "C_i_string_ref" #t)
572(rewrite 'scheme#string-set! 2 3 "C_utf_setsubchar" #f)
573(rewrite 'scheme#string-set! 2 3 "C_i_string_set" #t)
574(rewrite 'scheme#vector-ref 2 2 "C_slot" #f)
575(rewrite 'scheme#vector-ref 2 2 "C_i_vector_ref" #t)
576(rewrite 'scheme#char=? 2 2 "C_u_i_char_equalp" #f)
577(rewrite 'scheme#char=? 2 2 "C_i_char_equalp" #t)
578(rewrite 'scheme#char>? 2 2 "C_u_i_char_greaterp" #f)
579(rewrite 'scheme#char>? 2 2 "C_i_char_greaterp" #t)
580(rewrite 'scheme#char<? 2 2 "C_u_i_char_lessp" #f)
581(rewrite 'scheme#char<? 2 2 "C_i_char_lessp" #t)
582(rewrite 'scheme#char>=? 2 2 "C_u_i_char_greater_or_equal_p" #f)
583(rewrite 'scheme#char>=? 2 2 "C_i_char_greater_or_equal_p" #t)
584(rewrite 'scheme#char<=? 2 2 "C_u_i_char_less_or_equal_p" #f)
585(rewrite 'scheme#char<=? 2 2 "C_i_char_less_or_equal_p" #t)
586(rewrite '##sys#slot 2 2 "C_slot" #t) ; consider as safe, the primitive is unsafe anyway.
587(rewrite '##sys#block-ref 2 2 "C_i_block_ref" #t) ;XXX must be safe for pattern matcher (anymore?)
588(rewrite '##sys#size 2 1 "C_block_size" #t)
589(rewrite 'chicken.fixnum#fxnot 2 1 "C_fixnum_not" #t)
590(rewrite 'chicken.fixnum#fx* 2 2 "C_fixnum_times" #t)
591(rewrite 'chicken.fixnum#fx+? 2 2 "C_i_o_fixnum_plus" #t)
592(rewrite 'chicken.fixnum#fx-? 2 2 "C_i_o_fixnum_difference" #t)
593(rewrite 'chicken.fixnum#fx*? 2 2 "C_i_o_fixnum_times" #t)
594(rewrite 'chicken.fixnum#fx/? 2 2 "C_i_o_fixnum_quotient" #t)
595(rewrite 'chicken.fixnum#fx= 2 2 "C_eqp" #t)
596(rewrite 'chicken.fixnum#fx> 2 2 "C_fixnum_greaterp" #t)
597(rewrite 'chicken.fixnum#fx< 2 2 "C_fixnum_lessp" #t)
598(rewrite 'chicken.fixnum#fx>= 2 2 "C_fixnum_greater_or_equal_p" #t)
599(rewrite 'chicken.fixnum#fx<= 2 2 "C_fixnum_less_or_equal_p" #t)
600(rewrite 'chicken.flonum#fp= 2 2 "C_flonum_equalp" #f)
601(rewrite 'chicken.flonum#fp> 2 2 "C_flonum_greaterp" #f)
602(rewrite 'chicken.flonum#fp< 2 2 "C_flonum_lessp" #f)
603(rewrite 'chicken.flonum#fp>= 2 2 "C_flonum_greater_or_equal_p" #f)
604(rewrite 'chicken.flonum#fp<= 2 2 "C_flonum_less_or_equal_p" #f)
605(rewrite 'chicken.fixnum#fxmax 2 2 "C_i_fixnum_max" #t)
606(rewrite 'chicken.fixnum#fxmin 2 2 "C_i_fixnum_min" #t)
607(rewrite 'chicken.flonum#fpmax 2 2 "C_i_flonum_max" #f)
608(rewrite 'chicken.flonum#fpmin 2 2 "C_i_flonum_min" #f)
609(rewrite 'chicken.fixnum#fxgcd 2 2 "C_i_fixnum_gcd" #t)
610(rewrite 'chicken.fixnum#fxlen 2 1 "C_i_fixnum_length" #t)
611(rewrite 'scheme#char-numeric? 2 1 "C_u_i_char_numericp" #t)
612(rewrite 'scheme#char-alphabetic? 2 1 "C_u_i_char_alphabeticp" #t)
613(rewrite 'scheme#char-whitespace? 2 1 "C_u_i_char_whitespacep" #t)
614(rewrite 'scheme#char-upper-case? 2 1 "C_u_i_char_upper_casep" #t)
615(rewrite 'scheme#char-lower-case? 2 1 "C_u_i_char_lower_casep" #t)
616(rewrite 'scheme#char-upcase 2 1 "C_u_i_char_upcase" #t)
617(rewrite 'scheme#char-downcase 2 1 "C_u_i_char_downcase" #t)
618(rewrite 'scheme#list-tail 2 2 "C_i_list_tail" #t)
619(rewrite '##sys#structure? 2 2 "C_i_structurep" #t)
620(rewrite '##sys#bytevector? 2 2 "C_bytevectorp" #t)
621(rewrite 'chicken.memory.representation#block-ref 2 2 "C_slot" #f) ; ok to be unsafe, lolevel is anyway
622(rewrite 'chicken.memory.representation#number-of-slots 2 1 "C_block_size" #f)
623
624(rewrite 'scheme#assv 14 'fixnum 2 "C_i_assq" "C_u_i_assq")
625(rewrite 'scheme#assv 2 2 "C_i_assv" #t)
626(rewrite 'scheme#memv 14 'fixnum 2 "C_i_memq" "C_u_i_memq")
627(rewrite 'scheme#memv 2 2 "C_i_memv" #t)
628(rewrite 'scheme#assq 17 2 "C_i_assq" "C_u_i_assq")
629(rewrite 'scheme#memq 17 2 "C_i_memq" "C_u_i_memq")
630(rewrite 'scheme#assoc 2 2 "C_i_assoc" #t)
631(rewrite 'scheme#member 2 2 "C_i_member" #t)
632
633(rewrite 'scheme#set-car! 4 '##sys#setslot 0)
634(rewrite 'scheme#set-cdr! 4 '##sys#setslot 1)
635(rewrite 'scheme#set-car! 17 2 "C_i_set_car" "C_u_i_set_car")
636(rewrite 'scheme#set-cdr! 17 2 "C_i_set_cdr" "C_u_i_set_cdr")
637
638(rewrite 'scheme#abs 14 'fixnum 1 "C_fixnum_abs" "C_fixnum_abs")
639
640(rewrite 'chicken.bitwise#bitwise-and 19)
641(rewrite 'chicken.bitwise#bitwise-xor 19)
642(rewrite 'chicken.bitwise#bitwise-ior 19)
643
644(rewrite 'chicken.bitwise#bitwise-and 21 -1 "C_fixnum_and" "C_u_fixnum_and" "C_s_a_i_bitwise_and" 5)
645(rewrite 'chicken.bitwise#bitwise-xor 21 0 "C_fixnum_xor" "C_fixnum_xor" "C_s_a_i_bitwise_xor" 5)
646(rewrite 'chicken.bitwise#bitwise-ior 21 0 "C_fixnum_or" "C_u_fixnum_or" "C_s_a_i_bitwise_ior" 5)
647
648(rewrite 'chicken.bitwise#bitwise-not 22 1 "C_s_a_i_bitwise_not" #t 5 "C_fixnum_not")
649
650(rewrite 'chicken.flonum#fp+ 16 2 "C_a_i_flonum_plus" #f words-per-flonum)
651(rewrite 'chicken.flonum#fp- 16 2 "C_a_i_flonum_difference" #f words-per-flonum)
652(rewrite 'chicken.flonum#fp* 16 2 "C_a_i_flonum_times" #f words-per-flonum)
653(rewrite 'chicken.flonum#fp/ 16 2 "C_a_i_flonum_quotient" #f words-per-flonum)
654(rewrite 'chicken.flonum#fp/? 16 2 "C_a_i_flonum_quotient_checked" #f words-per-flonum)
655(rewrite 'chicken.flonum#fpneg 16 1 "C_a_i_flonum_negate" #f words-per-flonum)
656(rewrite 'chicken.flonum#fpgcd 16 2 "C_a_i_flonum_gcd" #f words-per-flonum)
657(rewrite 'chicken.flonum#fp*+ 16 3 "C_a_i_flonum_multiply_add" #f words-per-flonum)
658
659(rewrite 'scheme#zero? 5 "C_eqp" 0 'fixnum)
660(rewrite 'scheme#zero? 2 1 "C_u_i_zerop2" #f)
661(rewrite 'scheme#zero? 2 1 "C_i_zerop" #t)
662(rewrite 'scheme#positive? 5 "C_fixnum_greaterp" 0 'fixnum)
663(rewrite 'scheme#positive? 5 "C_flonum_greaterp" 0 'flonum)
664(rewrite 'scheme#positive? 2 1 "C_i_positivep" #t)
665(rewrite 'scheme#negative? 5 "C_fixnum_lessp" 0 'fixnum)
666(rewrite 'scheme#negative? 5 "C_flonum_lessp" 0 'flonum)
667(rewrite 'scheme#negative? 2 1 "C_i_negativep" #t)
668
669(rewrite 'scheme#vector-length 6 "C_fix" "C_header_size" #f)
670(rewrite 'scheme#char->integer 6 "C_fix" "C_character_code" #t)
671(rewrite 'scheme#integer->char 6 "C_make_character" "C_unfix" #t)
672
673(rewrite 'scheme#vector-length 2 1 "C_i_vector_length" #t)
674(rewrite '##sys#vector-length 2 1 "C_i_vector_length" #t)
675(rewrite 'scheme#string-length 2 1 "C_i_string_length" #t)
676
677(rewrite '##sys#check-fixnum 2 1 "C_i_check_fixnum" #t)
678(rewrite '##sys#check-number 2 1 "C_i_check_number" #t)
679(rewrite '##sys#check-list 2 1 "C_i_check_list" #t)
680(rewrite '##sys#check-pair 2 1 "C_i_check_pair" #t)
681(rewrite '##sys#check-boolean 2 1 "C_i_check_boolean" #t)
682(rewrite '##sys#check-locative 2 1 "C_i_check_locative" #t)
683(rewrite '##sys#check-symbol 2 1 "C_i_check_symbol" #t)
684(rewrite '##sys#check-string 2 1 "C_i_check_string" #t)
685(rewrite '##sys#check-bytevector 2 1 "C_i_check_bytevector" #t)
686(rewrite '##sys#check-vector 2 1 "C_i_check_vector" #t)
687(rewrite '##sys#check-structure 2 2 "C_i_check_structure" #t)
688(rewrite '##sys#check-char 2 1 "C_i_check_char" #t)
689(rewrite '##sys#check-fixnum 2 2 "C_i_check_fixnum_2" #t)
690(rewrite '##sys#check-number 2 2 "C_i_check_number_2" #t)
691(rewrite '##sys#check-list 2 2 "C_i_check_list_2" #t)
692(rewrite '##sys#check-pair 2 2 "C_i_check_pair_2" #t)
693(rewrite '##sys#check-boolean 2 2 "C_i_check_boolean_2" #t)
694(rewrite '##sys#check-locative 2 2 "C_i_check_locative_2" #t)
695(rewrite '##sys#check-symbol 2 2 "C_i_check_symbol_2" #t)
696(rewrite '##sys#check-string 2 2 "C_i_check_string_2" #t)
697(rewrite '##sys#check-bytevector 2 2 "C_i_check_bytevector_2" #t)
698(rewrite '##sys#check-vector 2 2 "C_i_check_vector_2" #t)
699(rewrite '##sys#check-structure 2 3 "C_i_check_structure_2" #t)
700(rewrite '##sys#check-char 2 2 "C_i_check_char_2" #t)
701(rewrite '##sys#check-range 2 3 "C_i_check_range" #t)
702(rewrite '##sys#check-range 2 4 "C_i_check_range_2" #t)
703(rewrite '##sys#check-range/including 2 3 "C_i_check_range_including" #t)
704(rewrite '##sys#check-range/including 2 4 "C_i_check_range_including_2" #t)
705
706(rewrite 'scheme#= 9 "C_eqp" "C_i_equalp" #t #t)
707(rewrite 'scheme#> 9 "C_fixnum_greaterp" "C_flonum_greaterp" #t #f)
708(rewrite 'scheme#< 9 "C_fixnum_lessp" "C_flonum_lessp" #t #f)
709(rewrite 'scheme#>= 9 "C_fixnum_greater_or_equal_p" "C_flonum_greater_or_equal_p" #t #f)
710(rewrite 'scheme#<= 9 "C_fixnum_less_or_equal_p" "C_flonum_less_or_equal_p" #t #f)
711
712(rewrite 'setter 11 1 '##sys#setter #t)
713(rewrite 'scheme#for-each 11 2 '##sys#for-each #t)
714(rewrite 'scheme#map 11 2 '##sys#map #t)
715(rewrite 'chicken.memory.representation#block-set! 11 3 '##sys#setslot #t)
716(rewrite '##sys#block-set! 11 3 '##sys#setslot #f)
717(rewrite 'chicken.memory.representation#make-record-instance 11 #f '##sys#make-structure #f)
718(rewrite 'scheme#substring 11 3 '##sys#substring #f)
719(rewrite 'scheme#string-append 11 2 '##sys#string-append #f)
720(rewrite 'scheme#string->list 11 1 '##sys#string->list #t)
721(rewrite 'scheme#list->string 11 1 '##sys#list->string #t)
722
723(rewrite 'scheme#vector-set! 11 3 '##sys#setslot #f)
724(rewrite 'scheme#vector-set! 2 3 "C_i_vector_set" #t)
725
726(rewrite 'scheme#gcd 12 '##sys#gcd #t 2)
727(rewrite 'scheme#lcm 12 '##sys#lcm #t 2)
728(rewrite 'chicken.base#identity 12 #f #t 1)
729
730(rewrite 'scheme#gcd 19)
731(rewrite 'scheme#lcm 19)
732
733(rewrite 'scheme#gcd 18 0)
734(rewrite 'scheme#lcm 18 1)
735(rewrite 'scheme#list 18 '())
736
737(rewrite
738 'scheme#* 8
739 (lambda (db classargs cont callargs)
740 ;; (*) -> 1
741 ;; (* <x>) -> <x>
742 ;; (* <x1> ...) -> (##core#inline "C_fixnum_times" <x1> (##core#inline "C_fixnum_times" ...)) [fixnum-mode]
743 ;; - Remove "1" from arguments.
744 ;; - Replace multiplications with 2 by shift left. [fixnum-mode]
745 (let ((callargs
746 (filter
747 (lambda (x)
748 (not (and (eq? 'quote (node-class x))
749 (eq? 1 (first (node-parameters x))) ) ) )
750 callargs) ) )
751 (cond ((null? callargs) (make-node '##core#call (list #t) (list cont (qnode 0))))
752 ((null? (cdr callargs))
753 (make-node '##core#call (list #t) (list cont (first callargs))) )
754 ((eq? number-type 'fixnum)
755 (make-node
756 '##core#call (list #t)
757 (list
758 cont
759 (fold-inner
760 (lambda (x y)
761 (if (and (eq? 'quote (node-class y)) (eq? 2 (first (node-parameters y))))
762 (make-node '##core#inline '("C_fixnum_shift_left") (list x (qnode 1)))
763 (make-node '##core#inline '("C_fixnum_times") (list x y)) ) )
764 callargs) ) ) )
765 (else #f) ) ) ) )
766
767(rewrite
768 'scheme#+ 8
769 (lambda (db classargs cont callargs)
770 ;; (+ <x>) -> <x>
771 ;; (+ <x1> ...) -> (##core#inline "C_fixnum_plus" <x1> (##core#inline "C_fixnum_plus" ...)) [fixnum-mode]
772 ;; (+ <x1> ...) -> (##core#inline "C_u_fixnum_plus" <x1> (##core#inline "C_u_fixnum_plus" ...))
773 ;; [fixnum-mode + unsafe]
774 ;; - Remove "0" from arguments, if more than 1.
775 (cond ((or (null? callargs) (not (eq? number-type 'fixnum))) #f)
776 ((null? (cdr callargs))
777 (make-node
778 '##core#call (list #t)
779 (list cont
780 (make-node '##core#inline
781 (if unsafe '("C_u_fixnum_plus") '("C_fixnum_plus"))
782 callargs)) ) )
783 (else
784 (let ((callargs
785 (cons (car callargs)
786 (filter
787 (lambda (x)
788 (not (and (eq? 'quote (node-class x))
789 (zero? (first (node-parameters x))) ) ) )
790 (cdr callargs) ) ) ) )
791 (and (>= (length callargs) 2)
792 (make-node
793 '##core#call (list #t)
794 (list
795 cont
796 (fold-inner
797 (lambda (x y)
798 (make-node '##core#inline
799 (if unsafe '("C_u_fixnum_plus") '("C_fixnum_plus"))
800 (list x y) ) )
801 callargs) ) ) ) ) ) ) ) )
802
803(rewrite
804 'scheme#- 8
805 (lambda (db classargs cont callargs)
806 ;; (- <x>) -> (##core#inline "C_fixnum_negate" <x>) [fixnum-mode]
807 ;; (- <x>) -> (##core#inline "C_u_fixnum_negate" <x>) [fixnum-mode + unsafe]
808 ;; (- <x1> ...) -> (##core#inline "C_fixnum_difference" <x1> (##core#inline "C_fixnum_difference" ...)) [fixnum-mode]
809 ;; (- <x1> ...) -> (##core#inline "C_u_fixnum_difference" <x1> (##core#inline "C_u_fixnum_difference" ...))
810 ;; [fixnum-mode + unsafe]
811 ;; - Remove "0" from arguments, if more than 1.
812 (cond ((or (null? callargs) (not (eq? number-type 'fixnum))) #f)
813 ((null? (cdr callargs))
814 (make-node
815 '##core#call (list #t)
816 (list cont
817 (make-node '##core#inline
818 (if unsafe '("C_u_fixnum_negate") '("C_fixnum_negate"))
819 callargs)) ) )
820 (else
821 (let ((callargs
822 (cons (car callargs)
823 (filter
824 (lambda (x)
825 (not (and (eq? 'quote (node-class x))
826 (zero? (first (node-parameters x))) ) ) )
827 (cdr callargs) ) ) ) )
828 (and (>= (length callargs) 2)
829 (make-node
830 '##core#call (list #t)
831 (list
832 cont
833 (fold-inner
834 (lambda (x y)
835 (make-node '##core#inline
836 (if unsafe '("C_u_fixnum_difference") '("C_fixnum_difference"))
837 (list x y) ) )
838 callargs) ) ) ) ) ) ) ) )
839
840(let ()
841 (define (rewrite-div db classargs cont callargs)
842 ;; (/ <x1> ...) -> (##core#inline "C_fixnum_divide" <x1> (##core#inline "C_fixnum_divide" ...)) [fixnum-mode]
843 ;; - Remove "1" from arguments, if more than 1.
844 ;; - Replace divisions by 2 with shift right. [fixnum-mode]
845 (and (eq? number-type 'fixnum)
846 (>= (length callargs) 2)
847 (let ((callargs
848 (cons (car callargs)
849 (filter
850 (lambda (x)
851 (not (and (eq? 'quote (node-class x))
852 (eq? 1 (first (node-parameters x))) ) ) )
853 (cdr callargs) ) ) ) )
854 (and (>= (length callargs) 2)
855 (make-node
856 '##core#call (list #t)
857 (list
858 cont
859 (fold-inner
860 (lambda (x y)
861 (if (and (eq? 'quote (node-class y)) (eq? 2 (first (node-parameters y))))
862 (make-node '##core#inline '("C_fixnum_shift_right") (list x (qnode 1)))
863 (make-node '##core#inline '("C_fixnum_divide") (list x y)) ) )
864 callargs) ) ) ) ) ) )
865 (rewrite 'scheme#/ 8 rewrite-div)
866 (rewrite '##sys#/-2 8 rewrite-div))
867
868(rewrite
869 'scheme#quotient 8
870 (lambda (db classargs cont callargs)
871 ;; (quotient <x> 2) -> (##core#inline "C_fixnum_shift_right" <x> 1) [fixnum-mode]
872 ;; (quotient <x> <y>) -> (##core#inline "C_fixnum_divide" <x> <y>) [fixnum-mode]
873 (and (eq? 'fixnum number-type)
874 (= (length callargs) 2)
875 (make-node
876 '##core#call (list #t)
877 (let ([arg2 (second callargs)])
878 (list cont
879 (if (and (eq? 'quote (node-class arg2))
880 (eq? 2 (first (node-parameters arg2))) )
881 (make-node
882 '##core#inline '("C_fixnum_shift_right")
883 (list (first callargs) (qnode 1)) )
884 (make-node '##core#inline '("C_fixnum_divide") callargs) ) ) ) ) ) ) )
885
886(rewrite 'scheme#+ 19)
887(rewrite 'scheme#- 19)
888(rewrite 'scheme#* 19)
889(rewrite 'scheme#/ 19)
890
891(rewrite 'scheme#+ 16 2 "C_s_a_i_plus" #t 29)
892(rewrite 'scheme#- 16 2 "C_s_a_i_minus" #t 29)
893(rewrite 'scheme#* 16 2 "C_s_a_i_times" #t 33)
894(rewrite 'scheme#quotient 16 2 "C_s_a_i_quotient" #t 5)
895(rewrite 'scheme#remainder 16 2 "C_s_a_i_remainder" #t 5)
896(rewrite 'scheme#modulo 16 2 "C_s_a_i_modulo" #t 5)
897
898(rewrite 'scheme#= 17 2 "C_i_nequalp")
899(rewrite 'scheme#> 17 2 "C_i_greaterp")
900(rewrite 'scheme#< 17 2 "C_i_lessp")
901(rewrite 'scheme#>= 17 2 "C_i_greater_or_equalp")
902(rewrite 'scheme#<= 17 2 "C_i_less_or_equalp")
903
904(rewrite 'scheme#= 13 #f "C_nequalp" #t)
905(rewrite 'scheme#> 13 #f "C_greaterp" #t)
906(rewrite 'scheme#< 13 #f "C_lessp" #t)
907(rewrite 'scheme#>= 13 #f "C_greater_or_equal_p" #t)
908(rewrite 'scheme#<= 13 #f "C_less_or_equal_p" #t)
909
910(rewrite 'scheme#* 13 #f "C_times" #t)
911(rewrite 'scheme#+ 13 #f "C_plus" #t)
912(rewrite 'scheme#- 13 '(1 . #f) "C_minus" #t)
913
914(rewrite 'scheme#number->string 13 '(1 . 2) "C_number_to_string" #t)
915(rewrite '##sys#call-with-current-continuation 13 1 "C_call_cc" #t)
916(rewrite '##sys#allocate-vector 13 4 "C_allocate_vector" #t)
917(rewrite '##sys#allocate-bytevector 13 4 "C_allocate_bytevector" #t)
918(rewrite '##sys#ensure-heap-reserve 13 1 "C_ensure_heap_reserve" #t)
919(rewrite 'chicken.platform#return-to-host 13 0 "C_return_to_host" #t)
920(rewrite '##sys#context-switch 13 1 "C_context_switch" #t)
921
922(rewrite 'scheme#even? 14 'fixnum 1 "C_i_fixnumevenp" "C_i_fixnumevenp")
923(rewrite 'scheme#odd? 14 'fixnum 1 "C_i_fixnumoddp" "C_i_fixnumoddp")
924(rewrite 'scheme#remainder 14 'fixnum 2 "C_fixnum_modulo" "C_fixnum_modulo")
925
926(rewrite 'scheme#even? 17 1 "C_i_evenp")
927(rewrite 'scheme#odd? 17 1 "C_i_oddp")
928
929(rewrite 'chicken.fixnum#fxodd? 2 1 "C_i_fixnumoddp" #t)
930(rewrite 'chicken.fixnum#fxeven? 2 1 "C_i_fixnumevenp" #t)
931
932(rewrite 'scheme#floor 15 'flonum 'fixnum 'chicken.flonum#fpfloor #f)
933(rewrite 'scheme#ceiling 15 'flonum 'fixnum 'chicken.flonum#fpceiling #f)
934(rewrite 'scheme#truncate 15 'flonum 'fixnum 'chicken.flonum#fptruncate #f)
935
936(rewrite 'chicken.flonum#fpsin 16 1 "C_a_i_flonum_sin" #f words-per-flonum)
937(rewrite 'chicken.flonum#fpcos 16 1 "C_a_i_flonum_cos" #f words-per-flonum)
938(rewrite 'chicken.flonum#fptan 16 1 "C_a_i_flonum_tan" #f words-per-flonum)
939(rewrite 'chicken.flonum#fpasin 16 1 "C_a_i_flonum_asin" #f words-per-flonum)
940(rewrite 'chicken.flonum#fpacos 16 1 "C_a_i_flonum_acos" #f words-per-flonum)
941(rewrite 'chicken.flonum#fpatan 16 1 "C_a_i_flonum_atan" #f words-per-flonum)
942(rewrite 'chicken.flonum#fpatan2 16 2 "C_a_i_flonum_atan2" #f words-per-flonum)
943(rewrite 'chicken.flonum#fpexp 16 1 "C_a_i_flonum_exp" #f words-per-flonum)
944(rewrite 'chicken.flonum#fpexpt 16 2 "C_a_i_flonum_expt" #f words-per-flonum)
945(rewrite 'chicken.flonum#fplog 16 1 "C_a_i_flonum_log" #f words-per-flonum)
946(rewrite 'chicken.flonum#fpsqrt 16 1 "C_a_i_flonum_sqrt" #f words-per-flonum)
947(rewrite 'chicken.flonum#fpabs 16 1 "C_a_i_flonum_abs" #f words-per-flonum)
948(rewrite 'chicken.flonum#fptruncate 16 1 "C_a_i_flonum_truncate" #f words-per-flonum)
949(rewrite 'chicken.flonum#fpround 16 1 "C_a_i_flonum_round" #f words-per-flonum)
950(rewrite 'chicken.flonum#fpceiling 16 1 "C_a_i_flonum_ceiling" #f words-per-flonum)
951(rewrite 'chicken.flonum#fpround 16 1 "C_a_i_flonum_floor" #f words-per-flonum)
952
953(rewrite 'scheme#cons 16 2 "C_a_i_cons" #t 3)
954(rewrite '##sys#cons 16 2 "C_a_i_cons" #t 3)
955(rewrite 'chicken.base#weak-cons 16 2 "C_a_i_weak_cons" #t 3)
956(rewrite 'scheme#list 16 #f "C_a_i_list" #t '(0 3) #t)
957(rewrite '##sys#list 16 #f "C_a_i_list" #t '(0 3))
958(rewrite 'scheme#vector 16 #f "C_a_i_vector" #t #t #t)
959(rewrite '##sys#vector 16 #f "C_a_i_vector" #t #t)
960(rewrite '##sys#make-structure 16 #f "C_a_i_record" #t #t #t)
961(rewrite 'scheme#string 16 #f "C_a_i_string" #t '(7 1))
962(rewrite 'chicken.memory#address->pointer 16 1 "C_a_i_address_to_pointer" #f 2)
963(rewrite 'chicken.memory#pointer->address 16 1 "C_a_i_pointer_to_address" #f words-per-flonum)
964(rewrite 'chicken.memory#pointer+ 16 2 "C_a_u_i_pointer_inc" #f 2)
965(rewrite 'chicken.locative#locative-ref 16 1 "C_a_i_locative_ref" #t 6)
966
967(rewrite 'chicken.memory#pointer-u8-ref 2 1 "C_u_i_pointer_u8_ref" #f)
968(rewrite 'chicken.memory#pointer-s8-ref 2 1 "C_u_i_pointer_s8_ref" #f)
969(rewrite 'chicken.memory#pointer-u16-ref 2 1 "C_u_i_pointer_u16_ref" #f)
970(rewrite 'chicken.memory#pointer-s16-ref 2 1 "C_u_i_pointer_s16_ref" #f)
971(rewrite 'chicken.memory#pointer-u8-set! 2 2 "C_u_i_pointer_u8_set" #f)
972(rewrite 'chicken.memory#pointer-s8-set! 2 2 "C_u_i_pointer_s8_set" #f)
973(rewrite 'chicken.memory#pointer-u16-set! 2 2 "C_u_i_pointer_u16_set" #f)
974(rewrite 'chicken.memory#pointer-s16-set! 2 2 "C_u_i_pointer_s16_set" #f)
975(rewrite 'chicken.memory#pointer-u32-set! 2 2 "C_u_i_pointer_u32_set" #f)
976(rewrite 'chicken.memory#pointer-s32-set! 2 2 "C_u_i_pointer_s32_set" #f)
977(rewrite 'chicken.memory#pointer-f32-set! 2 2 "C_u_i_pointer_f32_set" #f)
978(rewrite 'chicken.memory#pointer-f64-set! 2 2 "C_u_i_pointer_f64_set" #f)
979
980;; on 32-bit platforms, 32-bit integers do not always fit in a word,
981;; bignum1 and bignum wrapper (5 words) may be used instead
982(rewrite 'chicken.memory#pointer-u32-ref 16 1 "C_a_u_i_pointer_u32_ref" #f min-words-per-bignum)
983(rewrite 'chicken.memory#pointer-s32-ref 16 1 "C_a_u_i_pointer_s32_ref" #f min-words-per-bignum)
984
985(rewrite 'chicken.memory#pointer-f32-ref 16 1 "C_a_u_i_pointer_f32_ref" #f words-per-flonum)
986(rewrite 'chicken.memory#pointer-f64-ref 16 1 "C_a_u_i_pointer_f64_ref" #f words-per-flonum)
987
988(rewrite
989 '##sys#setslot 8
990 (lambda (db classargs cont callargs)
991 ;; (##sys#setslot <x> <y> <immediate>) -> (##core#inline "C_i_set_i_slot" <x> <y> <i>)
992 ;; (##sys#setslot <x> <y> <z>) -> (##core#inline "C_i_setslot" <x> <y> <z>)
993 (and (= (length callargs) 3)
994 (make-node
995 '##core#call (list #t)
996 (list cont
997 (make-node
998 '##core#inline
999 (let ([val (third callargs)])
1000 (if (and (eq? 'quote (node-class val))
1001 (immediate? (first (node-parameters val))) )
1002 '("C_i_set_i_slot")
1003 '("C_i_setslot") ) )
1004 callargs) ) ) ) ) )
1005
1006(rewrite 'chicken.fixnum#fx+ 17 2 "C_fixnum_plus" "C_u_fixnum_plus")
1007(rewrite 'chicken.fixnum#fx- 17 2 "C_fixnum_difference" "C_u_fixnum_difference")
1008(rewrite 'chicken.fixnum#fxshl 17 2 "C_fixnum_shift_left")
1009(rewrite 'chicken.fixnum#fxshr 17 2 "C_fixnum_shift_right")
1010(rewrite 'chicken.fixnum#fxneg 17 1 "C_fixnum_negate" "C_u_fixnum_negate")
1011(rewrite 'chicken.fixnum#fxxor 17 2 "C_fixnum_xor" "C_fixnum_xor")
1012(rewrite 'chicken.fixnum#fxand 17 2 "C_fixnum_and" "C_u_fixnum_and")
1013(rewrite 'chicken.fixnum#fxior 17 2 "C_fixnum_or" "C_u_fixnum_or")
1014(rewrite 'chicken.fixnum#fx/ 17 2 "C_fixnum_divide" "C_u_fixnum_divide")
1015(rewrite 'chicken.fixnum#fxmod 17 2 "C_fixnum_modulo" "C_u_fixnum_modulo")
1016(rewrite 'chicken.fixnum#fxrem 17 2 "C_i_fixnum_remainder_checked")
1017
1018(rewrite
1019 'chicken.bitwise#arithmetic-shift 8
1020 (lambda (db classargs cont callargs)
1021 ;; (arithmetic-shift <x> <-int>)
1022 ;; -> (##core#inline "C_fixnum_shift_right" <x> -<int>)
1023 ;; (arithmetic-shift <x> <+int>)
1024 ;; -> (##core#inline "C_fixnum_shift_left" <x> <int>)
1025 ;; _ -> (##core#inline "C_i_fixnum_arithmetic_shift" <x> <y>)
1026 ;;
1027 ;; not in fixnum-mode:
1028 ;; _ -> (##core#inline_allocate ("C_s_a_i_arithmetic_shift" 6) <x> <y>)
1029 (and (= 2 (length callargs))
1030 (let ((val (second callargs)))
1031 (make-node
1032 '##core#call (list #t)
1033 (list cont
1034 (or (and-let* (((eq? 'quote (node-class val)))
1035 ((eq? number-type 'fixnum))
1036 (n (first (node-parameters val)))
1037 ((and (fixnum? n) (not (big-fixnum? n)))) )
1038 (if (negative? n)
1039 (make-node
1040 '##core#inline '("C_fixnum_shift_right")
1041 (list (first callargs) (qnode (- n))) )
1042 (make-node
1043 '##core#inline '("C_fixnum_shift_left")
1044 (list (first callargs) val) ) ) )
1045 (if (eq? number-type 'fixnum)
1046 (make-node '##core#inline
1047 '("C_i_fixnum_arithmetic_shift") callargs)
1048 (make-node '##core#inline_allocate
1049 (list "C_s_a_i_arithmetic_shift" 5)
1050 callargs) ) ) ) ) ) ) ) )
1051
1052(rewrite '##sys#byte 17 2 "C_subbyte")
1053(rewrite '##sys#peek-fixnum 17 2 "C_peek_fixnum")
1054(rewrite '##sys#peek-byte 17 2 "C_peek_byte")
1055(rewrite 'chicken.memory#pointer->object 17 2 "C_pointer_to_object")
1056(rewrite '##sys#setislot 17 3 "C_i_set_i_slot")
1057(rewrite '##sys#poke-integer 17 3 "C_poke_integer")
1058(rewrite '##sys#poke-double 17 3 "C_poke_double")
1059(rewrite 'scheme#string=? 17 2 "C_i_string_equal_p" "C_u_i_string_equal_p")
1060(rewrite 'scheme#string-ci=? 17 2 "C_i_string_ci_equal_p")
1061(rewrite '##sys#permanent? 17 1 "C_permanentp")
1062(rewrite '##sys#null-pointer? 17 1 "C_null_pointerp" "C_null_pointerp")
1063(rewrite '##sys#immediate? 17 1 "C_immp")
1064(rewrite 'chicken.locative#locative->object 17 1 "C_i_locative_to_object")
1065(rewrite 'chicken.locative#locative->object 17 1 "C_i_locative_to_object")
1066(rewrite 'chicken.locative#locative-index 17 1 "C_i_locative_index")
1067(rewrite 'chicken.locative#locative-set! 17 2 "C_i_locative_set")
1068(rewrite '##sys#foreign-fixnum-argument 17 1 "C_i_foreign_fixnum_argumentp")
1069(rewrite '##sys#foreign-char-argument 17 1 "C_i_foreign_char_argumentp")
1070(rewrite '##sys#foreign-flonum-argument 17 1 "C_i_foreign_flonum_argumentp")
1071(rewrite '##sys#foreign-block-argument 17 1 "C_i_foreign_block_argumentp")
1072(rewrite '##sys#foreign-symbol-argument 17 1 "C_i_foreign_symbol_argumentp")
1073(rewrite '##sys#foreign-struct-wrapper-argument 17 2 "C_i_foreign_struct_wrapper_argumentp")
1074(rewrite '##sys#foreign-string-argument 17 1 "C_i_foreign_string_argumentp")
1075(rewrite '##sys#foreign-pointer-argument 17 1 "C_i_foreign_pointer_argumentp")
1076(rewrite '##sys#foreign-ranged-integer-argument 17 2 "C_i_foreign_ranged_integer_argumentp")
1077(rewrite '##sys#foreign-unsigned-ranged-integer-argument 17 2 "C_i_foreign_unsigned_ranged_integer_argumentp")
1078
1079(rewrite 'chicken.bytevector#bytevector-length 2 1 "C_block_size" #f)
1080
1081;; TODO: Move this stuff to types.db
1082(rewrite 'chicken.number-vectors8vector-ref 2 2 "C_u_i_s8vector_ref" #f)
1083(rewrite 'chicken.number-vectors8vector-ref 2 2 "C_i_s8vector_ref" #t)
1084(rewrite 'chicken.number-vectoru16vector-ref 2 2 "C_u_i_u16vector_ref" #f)
1085(rewrite 'chicken.number-vectoru16vector-ref 2 2 "C_i_u16vector_ref" #t)
1086(rewrite 'chicken.number-vectors16vector-ref 2 2 "C_u_i_s16vector_ref" #f)
1087(rewrite 'chicken.number-vectors16vector-ref 2 2 "C_i_s16vector_ref" #t)
1088
1089(rewrite 'chicken.number-vectoru32vector-ref 16 2 "C_a_i_u32vector_ref" #t min-words-per-bignum)
1090(rewrite 'chicken.number-vectors32vector-ref 16 2 "C_a_i_s32vector_ref" #t min-words-per-bignum)
1091
1092(rewrite 'chicken.number-vectorf32vector-ref 16 2 "C_a_u_i_f32vector_ref" #f words-per-flonum)
1093(rewrite 'chicken.number-vectorf32vector-ref 16 2 "C_a_i_f32vector_ref" #t words-per-flonum)
1094(rewrite 'chicken.number-vectorf64vector-ref 16 2 "C_a_u_i_f64vector_ref" #f words-per-flonum)
1095(rewrite 'chicken.number-vectorf64vector-ref 16 2 "C_a_i_f64vector_ref" #t words-per-flonum)
1096
1097(rewrite 'chicken.number-vectoru8vector-set! 2 3 "C_u_i_u8vector_set" #f)
1098(rewrite 'chicken.number-vectoru8vector-set! 2 3 "C_i_u8vector_set" #t)
1099(rewrite 'chicken.number-vectors8vector-set! 2 3 "C_u_i_s8vector_set" #f)
1100(rewrite 'chicken.number-vectors8vector-set! 2 3 "C_i_s8vector_set" #t)
1101(rewrite 'chicken.number-vectoru16vector-set! 2 3 "C_u_i_u16vector_set" #f)
1102(rewrite 'chicken.number-vectoru16vector-set! 2 3 "C_i_u16vector_set" #t)
1103(rewrite 'chicken.number-vectors16vector-set! 2 3 "C_u_i_s16vector_set" #f)
1104(rewrite 'chicken.number-vectors16vector-set! 2 3 "C_i_s16vector_set" #t)
1105(rewrite 'chicken.number-vectoru32vector-set! 2 3 "C_u_i_u32vector_set" #f)
1106(rewrite 'chicken.number-vectoru32vector-set! 2 3 "C_i_u32vector_set" #t)
1107(rewrite 'chicken.number-vectors32vector-set! 2 3 "C_u_i_s32vector_set" #f)
1108(rewrite 'chicken.number-vectors32vector-set! 2 3 "C_i_s32vector_set" #t)
1109(rewrite 'chicken.number-vectoru64vector-set! 2 3 "C_u_i_u64vector_set" #f)
1110(rewrite 'chicken.number-vectoru64vector-set! 2 3 "C_i_u64vector_set" #t)
1111(rewrite 'chicken.number-vectors64vector-set! 2 3 "C_u_i_s64vector_set" #f)
1112(rewrite 'chicken.number-vectors64vector-set! 2 3 "C_i_s64vector_set" #t)
1113(rewrite 'chicken.number-vectorf32vector-set! 2 3 "C_u_i_f32vector_set" #f)
1114(rewrite 'chicken.number-vectorf32vector-set! 2 3 "C_i_f32vector_set" #t)
1115(rewrite 'chicken.number-vectorf64vector-set! 2 3 "C_u_i_f64vector_set" #f)
1116(rewrite 'chicken.number-vectorf64vector-set! 2 3 "C_i_f64vector_set" #t)
1117
1118(rewrite 'chicken.number-vectoru8vector-length 2 1 "C_u_i_bytevector_length" #f)
1119(rewrite 'chicken.number-vectoru8vector-length 2 1 "C_i_bytevector_length" #t)
1120(rewrite 'chicken.number-vectors8vector-length 2 1 "C_u_i_s8vector_length" #f)
1121(rewrite 'chicken.number-vectors8vector-length 2 1 "C_i_s8vector_length" #t)
1122(rewrite 'chicken.number-vectoru16vector-length 2 1 "C_u_i_u16vector_length" #f)
1123(rewrite 'chicken.number-vectoru16vector-length 2 1 "C_i_u16vector_length" #t)
1124(rewrite 'chicken.number-vectors16vector-length 2 1 "C_u_i_s16vector_length" #f)
1125(rewrite 'chicken.number-vectors16vector-length 2 1 "C_i_s16vector_length" #t)
1126(rewrite 'chicken.number-vectoru32vector-length 2 1 "C_u_i_u32vector_length" #f)
1127(rewrite 'chicken.number-vectoru32vector-length 2 1 "C_i_u32vector_length" #t)
1128(rewrite 'chicken.number-vectors32vector-length 2 1 "C_u_i_s32vector_length" #f)
1129(rewrite 'chicken.number-vectors32vector-length 2 1 "C_i_s32vector_length" #t)
1130(rewrite 'chicken.number-vectoru64vector-length 2 1 "C_u_i_u64vector_length" #f)
1131(rewrite 'chicken.number-vectoru64vector-length 2 1 "C_i_u64vector_length" #t)
1132(rewrite 'chicken.number-vectors64vector-length 2 1 "C_u_i_s64vector_length" #f)
1133(rewrite 'chicken.number-vectors64vector-length 2 1 "C_i_s64vector_length" #t)
1134(rewrite 'chicken.number-vectorf32vector-length 2 1 "C_u_i_f32vector_length" #f)
1135(rewrite 'chicken.number-vectorf32vector-length 2 1 "C_i_f32vector_length" #t)
1136(rewrite 'chicken.number-vectorf64vector-length 2 1 "C_u_i_f64vector_length" #f)
1137(rewrite 'chicken.number-vectorf64vector-length 2 1 "C_i_f64vector_length" #t)
1138
1139(rewrite 'chicken.base#atom? 17 1 "C_i_not_pair_p")
1140
1141(rewrite 'chicken.number-vectors8vector->bytevector/shared 7 1 "C_slot" 1 #f)
1142(rewrite 'chicken.number-vectoru16vector->bytevector/shared 7 1 "C_slot" 1 #f)
1143(rewrite 'chicken.number-vectors16vector->bytevector/shared 7 1 "C_slot" 1 #f)
1144(rewrite 'chicken.number-vectoru32vector->bytevector/shared 7 1 "C_slot" 1 #f)
1145(rewrite 'chicken.number-vectors32vector->bytevector/shared 7 1 "C_slot" 1 #f)
1146(rewrite 'chicken.number-vectoru64vector->bytevector/shared 7 1 "C_slot" 1 #f)
1147(rewrite 'chicken.number-vectors64vector->bytevector/shared 7 1 "C_slot" 1 #f)
1148(rewrite 'chicken.number-vectorf32vector->bytevector/shared 7 1 "C_slot" 1 #f)
1149(rewrite 'chicken.number-vectorf64vector->bytevector/shared 7 1 "C_slot" 1 #f)
1150(rewrite 'chicken.number-vectorc64vector->bytevector/shared 7 1 "C_slot" 1 #f)
1151(rewrite 'chicken.number-vectorc128vector->bytevector/shared 7 1 "C_slot" 1 #f)
1152
1153(let ()
1154 (define (rewrite-make-vector db classargs cont callargs)
1155 ;; (make-vector '<n> [<x>]) -> (let ((<tmp> <x>)) (##core#inline_allocate ("C_a_i_vector" <n>+1) '<n> <tmp>))
1156 ;; - <n> should be less or equal to 32.
1157 (let ([argc (length callargs)])
1158 (and (pair? callargs)
1159 (let ([n (first callargs)])
1160 (and (eq? 'quote (node-class n))
1161 (let ([tmp (gensym)]
1162 [c (first (node-parameters n))] )
1163 (and (fixnum? c)
1164 (<= 0 c 32)
1165 (let ([val (if (pair? (cdr callargs))
1166 (second callargs)
1167 (make-node '##core#undefined '() '()) ) ] )
1168 (make-node
1169 'let
1170 (list tmp)
1171 (list val
1172 (make-node
1173 '##core#call (list #t)
1174 (list cont
1175 (make-node
1176 '##core#inline_allocate
1177 (list "C_a_i_vector" (add1 c))
1178 (list-tabulate c (lambda (i) (varnode tmp)) ) ) ) ) ) ) ) ) ) ) ) ) ) )
1179 (rewrite 'scheme#make-vector 8 rewrite-make-vector)
1180 (rewrite '##sys#make-vector 8 rewrite-make-vector) )
1181
1182(let ()
1183 (define (rewrite-call/cc db classargs cont callargs)
1184 ;; (call/cc <var>), <var> = (lambda (kont k) ... k is never used ...) -> (<var> #f)
1185 (and (= 1 (length callargs))
1186 (let ((val (first callargs)))
1187 (and (eq? '##core#variable (node-class val))
1188 (and-let* ((proc (db-get db (first (node-parameters val)) 'value))
1189 ((eq? '##core#lambda (node-class proc))) )
1190 (let ((llist (third (node-parameters proc))))
1191 (##sys#decompose-lambda-list
1192 llist
1193 (lambda (vars argc rest)
1194 (and (= argc 2)
1195 (let ((var (or rest (second llist))))
1196 (and (not (db-get db var 'references))
1197 (not (db-get db var 'assigned))
1198 (not (db-get db var 'inline-transient))
1199 (make-node
1200 '##core#call (list #t)
1201 (list val cont (qnode #f)) ) ) ) ) ) ) ) ) ) ) ) )
1202 (rewrite 'scheme#call-with-current-continuation 8 rewrite-call/cc)
1203 (rewrite 'scheme#call/cc 8 rewrite-call/cc))
1204
1205(define setter-map
1206 '((scheme#car . scheme#set-car!)
1207 (scheme#cdr . scheme#set-cdr!)
1208 (scheme#string-ref . scheme#string-set!)
1209 (scheme#vector-ref . scheme#vector-set!)
1210 (chicken.number-vectoru8vector-ref . chicken.number-vectoru8vector-set!)
1211 (chicken.number-vectors8vector-ref . chicken.number-vectors8vector-set!)
1212 (chicken.number-vectoru16vector-ref . chicken.number-vectoru16vector-set!)
1213 (chicken.number-vectors16vector-ref . chicken.number-vectors16vector-set!)
1214 (chicken.number-vectoru32vector-ref . chicken.number-vectoru32vector-set!)
1215 (chicken.number-vectors32vector-ref . chicken.number-vectors32vector-set!)
1216 (chicken.number-vectoru64vector-ref . chicken.number-vectoru64vector-set!)
1217 (chicken.number-vectors64vector-ref . chicken.number-vectors64vector-set!)
1218 (chicken.number-vectorf32vector-ref . chicken.number-vectorf32vector-set!)
1219 (chicken.number-vectorf64vector-ref . chicken.number-vectorf64vector-set!)
1220 (chicken.number-vectorc64vector-ref . chicken.number-vectorc64vector-set!)
1221 (chicken.number-vectorc128vector-ref . chicken.number-vectorc128vector-set!)
1222 (chicken.locative#locative-ref . chicken.locative#locative-set!)
1223 (chicken.memory#pointer-u8-ref . chicken.memory#pointer-u8-set!)
1224 (chicken.memory#pointer-s8-ref . chicken.memory#pointer-s8-set!)
1225 (chicken.memory#pointer-u16-ref . chicken.memory#pointer-u16-set!)
1226 (chicken.memory#pointer-s16-ref . chicken.memory#pointer-s16-set!)
1227 (chicken.memory#pointer-u32-ref . chicken.memory#pointer-u32-set!)
1228 (chicken.memory#pointer-s32-ref . chicken.memory#pointer-s32-set!)
1229 (chicken.memory#pointer-f32-ref . chicken.memory#pointer-f32-set!)
1230 (chicken.memory#pointer-f64-ref . chicken.memory#pointer-f64-set!)
1231 (chicken.memory.representation#block-ref . chicken.memory.representation#block-set!) ))
1232
1233(rewrite
1234 '##sys#setter 8
1235 (lambda (db classargs cont callargs)
1236 ;; (setter <known-getter>) -> <known-setter>
1237 (and (= 1 (length callargs))
1238 (let ((arg (car callargs)))
1239 (and (eq? '##core#variable (node-class arg))
1240 (let ((sym (car (node-parameters arg))))
1241 (and (intrinsic? sym)
1242 (and-let* ((a (assq sym setter-map)))
1243 (make-node
1244 '##core#call (list #t)
1245 (list cont (varnode (cdr a))) ) ) ) ) ) ) ) ) )
1246
1247(rewrite 'chicken.base#void 3 '##sys#undefined-value 0)
1248(rewrite '##sys#void 3 '##sys#undefined-value #f)
1249(rewrite 'scheme#current-input-port 3 '##sys#standard-input 0)
1250(rewrite 'scheme#current-output-port 3 '##sys#standard-output 0)
1251(rewrite 'chicken.base#current-error-port 3 '##sys#standard-error 0)
1252
1253(rewrite
1254 'chicken.bitwise#bit->boolean 8
1255 (lambda (db classargs cont callargs)
1256 (and (= 2 (length callargs))
1257 (make-node
1258 '##core#call (list #t)
1259 (list cont
1260 (make-node
1261 '##core#inline
1262 (list (if (eq? number-type 'fixnum) "C_u_i_bit_to_bool" "C_i_bit_to_bool"))
1263 callargs) ) ) ) ) )
1264
1265(rewrite
1266 'chicken.bitwise#integer-length 8
1267 (lambda (db classargs cont callargs)
1268 (and (= 1 (length callargs))
1269 (make-node
1270 '##core#call (list #t)
1271 (list cont
1272 (make-node
1273 '##core#inline
1274 (list (if (eq? number-type 'fixnum) "C_i_fixnum_length" "C_i_integer_length"))
1275 callargs) ) ) ) ) )
1276
1277(rewrite 'scheme#read-char 23 0 '##sys#read-char/port '##sys#standard-input)
1278(rewrite 'scheme#write-char 23 1 '##sys#write-char/port '##sys#standard-output)
1279(rewrite 'chicken.string#substring=? 23 2 '##sys#substring=? 0 0 #f)
1280(rewrite 'chicken.string#substring-ci=? 23 2 '##sys#substring-ci=? 0 0 #f)
1281(rewrite 'chicken.string#substring-index 23 2 '##sys#substring-index 0)
1282(rewrite 'chicken.string#substring-index-ci 23 2 '##sys#substring-index-ci 0)
1283
1284(rewrite 'chicken.keyword#get-keyword 7 2 "C_i_get_keyword" #f #t)
1285(rewrite '##sys#get-keyword 7 2 "C_i_get_keyword" #f #t)
1286
1287)