~ chicken-core (chicken-5) /c-platform.scm


   1;;;; 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
  50(include "tweaks")
  51(include "mini-srfi-1.scm")
  52
  53;;; Parameters:
  54
  55(default-optimization-passes 3)
  56
  57(define default-declarations
  58  '((always-bound
  59     ##sys#standard-input ##sys#standard-output ##sys#standard-error
  60     ##sys#undefined-value)
  61    (bound-to-procedure
  62     ##sys#for-each ##sys#map ##sys#print ##sys#setter
  63     ##sys#setslot ##sys#dynamic-wind ##sys#call-with-values
  64     ##sys#start-timer ##sys#stop-timer ##sys#gcd ##sys#lcm ##sys#structure? ##sys#slot
  65     ##sys#allocate-vector ##sys#list->vector ##sys#block-ref ##sys#block-set!
  66     ##sys#list ##sys#cons ##sys#append ##sys#vector ##sys#foreign-char-argument ##sys#foreign-fixnum-argument
  67     ##sys#foreign-flonum-argument ##sys#error ##sys#peek-c-string ##sys#peek-nonnull-c-string 
  68     ##sys#peek-and-free-c-string ##sys#peek-and-free-nonnull-c-string
  69     ##sys#foreign-block-argument ##sys#foreign-string-argument
  70     ##sys#foreign-pointer-argument ##sys#call-with-current-continuation)))
  71
  72(define default-profiling-declarations
  73  '((##core#declare
  74     (uses profiler)
  75     (bound-to-procedure ##sys#profile-entry
  76			 ##sys#profile-exit
  77			 ##sys#register-profile-info
  78			 ##sys#set-profile-info-vector!))))
  79
  80(define default-units '(library eval))
  81
  82(define words-per-flonum 4)
  83(define min-words-per-bignum 5)
  84
  85(eq-inline-operator "C_eqp")
  86(membership-test-operators
  87  '(("C_i_memq" . "C_eqp") ("C_u_i_memq" . "C_eqp") ("C_i_member" . "C_i_equalp")
  88    ("C_i_memv" . "C_i_eqvp") ) )
  89(membership-unfold-limit 20)
  90(define target-include-file "chicken.h")
  91
  92(define valid-compiler-options
  93  '(-help 
  94    h help version verbose explicit-use 
  95    no-trace no-warnings unsafe block 
  96    check-syntax to-stdout no-usual-integrations case-insensitive no-lambda-info 
  97    profile inline keep-shadowed-macros ignore-repository
  98    fixnum-arithmetic disable-interrupts optimize-leaf-routines
  99    compile-syntax tag-pointers accumulate-profile
 100    disable-stack-overflow-checks raw specialize
 101    emit-external-prototypes-first release local inline-global
 102    analyze-only dynamic static
 103    no-argc-checks no-procedure-checks no-parentheses-synonyms
 104    no-procedure-checks-for-toplevel-bindings
 105    no-bound-checks no-procedure-checks-for-usual-bindings no-compiler-syntax
 106    no-parentheses-synonyms no-symbol-escape r5rs-syntax emit-all-import-libraries
 107    strict-types clustering lfa2 debug-info
 108    regenerate-import-libraries setup-mode
 109    module-registration no-module-registration))
 110
 111(define valid-compiler-options-with-argument
 112  '(debug link emit-link-file
 113    output-file include-path heap-size stack-size unit uses module
 114    keyword-style require-extension inline-limit profile-name
 115    prelude postlude prologue epilogue nursery extend feature no-feature
 116    unroll-limit
 117    emit-inline-file consult-inline-file
 118    emit-types-file consult-types-file
 119    emit-import-library))
 120
 121
 122;;; Standard and extended bindings:
 123
 124(set! default-standard-bindings
 125  (map (lambda (x) (symbol-append 'scheme# x))
 126       '(not boolean? apply call-with-current-continuation eq? eqv? equal? pair? cons car cdr caar cadr
 127	     cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar
 128	     cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr set-car! set-cdr!
 129	     null? list list? length zero? * - + / - > < >= <= = current-output-port current-input-port
 130	     write-char newline write display append symbol->string for-each map char? char->integer
 131	     integer->char eof-object? vector-length string-length string-ref string-set! vector-ref
 132	     vector-set! char=? char<? char>? char>=? char<=? gcd lcm reverse symbol? string->symbol
 133	     number? complex? real? integer? rational? odd? even? positive? negative? exact? inexact?
 134	     max min quotient remainder modulo floor ceiling truncate round rationalize
 135	     exact->inexact inexact->exact
 136	     exp log sin expt sqrt cos tan asin acos atan number->string string->number char-ci=?
 137	     char-ci<? char-ci>? char-ci>=? char-ci<=? char-alphabetic? char-whitespace? char-numeric?
 138	     char-lower-case? char-upper-case? char-upcase char-downcase string? string=? string>? string<?
 139	     string>=? string<=? string-ci=? string-ci<? string-ci>? string-ci<=? string-ci>=?
 140	     string-append string->list list->string vector? vector->list list->vector string read
 141	     read-char substring string-fill! vector-copy! vector-fill! make-string make-vector open-input-file
 142	     open-output-file call-with-input-file call-with-output-file close-input-port close-output-port
 143	     values call-with-values vector procedure? memq memv member assq assv assoc list-tail
 144	     list-ref abs char-ready? peek-char list->string string->list
 145	     current-input-port current-output-port
 146	     make-polar make-rectangular real-part imag-part
 147	     load eval interaction-environment null-environment
 148	     scheme-report-environment)))
 149
 150(define-constant +flonum-bindings+
 151  (map (lambda (x) (symbol-append 'chicken.flonum# x))
 152       '(fp/? fp+ fp- fp* fp/ fp> fp< fp= fp>= fp<= fpmin fpmax fpneg fpgcd fp*+
 153	 fpfloor fpceiling fptruncate fpround fpsin fpcos fptan fpasin fpacos
 154	 fpatan fpatan2 fpexp fpexpt fplog fpsqrt fpabs fpinteger?)))
 155
 156(define-constant +fixnum-bindings+
 157  (map (lambda (x) (symbol-append 'chicken.fixnum# x))
 158       '(fx* fx*? fx+ fx+? fx- fx-? fx/ fx/? fx< fx<= fx= fx> fx>= fxand
 159	 fxeven? fxgcd fxior fxlen fxmax fxmin fxmod fxneg fxnot fxodd?
 160	 fxrem fxshl fxshr fxxor)))
 161
 162(define-constant +extended-bindings+
 163  '(chicken.base#bignum? chicken.base#cplxnum? chicken.base#fixnum?
 164    chicken.base#flonum? chicken.base#ratnum?
 165    chicken.base#add1 chicken.base#sub1
 166    chicken.base#nan? chicken.base#finite? chicken.base#infinite?
 167    chicken.base#gensym
 168    chicken.base#void chicken.base#print chicken.base#print*
 169    chicken.base#error chicken.base#call/cc chicken.base#char-name
 170    chicken.base#current-error-port
 171    chicken.base#symbol-append chicken.base#foldl chicken.base#foldr
 172    chicken.base#setter chicken.base#getter-with-setter
 173    chicken.base#equal=? chicken.base#exact-integer?
 174    chicken.base#flush-output
 175
 176    chicken.base#weak-cons chicken.base#weak-pair? chicken.base#bwp-object?
 177
 178    chicken.base#identity chicken.base#o chicken.base#atom?
 179    chicken.base#alist-ref chicken.base#rassoc
 180
 181    chicken.bitwise#integer-length
 182    chicken.bitwise#bitwise-and chicken.bitwise#bitwise-not
 183    chicken.bitwise#bitwise-ior chicken.bitwise#bitwise-xor
 184    chicken.bitwise#arithmetic-shift chicken.bitwise#bit->boolean
 185
 186    chicken.blob#blob-size chicken.blob#blob=?
 187
 188    chicken.keyword#get-keyword
 189
 190    srfi-4#u8vector? srfi-4#s8vector?
 191    srfi-4#u16vector? srfi-4#s16vector?
 192    srfi-4#u32vector? srfi-4#u64vector?
 193    srfi-4#s32vector? srfi-4#s64vector?
 194    srfi-4#f32vector? srfi-4#f64vector?
 195
 196    srfi-4#u8vector-length srfi-4#s8vector-length
 197    srfi-4#u16vector-length srfi-4#s16vector-length
 198    srfi-4#u32vector-length srfi-4#u64vector-length
 199    srfi-4#s32vector-length srfi-4#s64vector-length
 200    srfi-4#f32vector-length srfi-4#f64vector-length
 201    
 202    srfi-4#u8vector-ref srfi-4#s8vector-ref
 203    srfi-4#u16vector-ref srfi-4#s16vector-ref
 204    srfi-4#u32vector-ref srfi-4#u64vector-ref
 205    srfi-4#s32vector-ref srfi-4#s64vector-ref
 206    srfi-4#f32vector-ref srfi-4#f64vector-ref
 207
 208    srfi-4#u8vector-set! srfi-4#s8vector-set!
 209    srfi-4#u16vector-set! srfi-4#s16vector-set!
 210    srfi-4#u32vector-set! srfi-4#u64vector-set!
 211    srfi-4#s32vector-set! srfi-4#s64vector-set!
 212    srfi-4#f32vector-set! srfi-4#f64vector-set!
 213
 214    srfi-4#u8vector->blob/shared srfi-4#s8vector->blob/shared
 215    srfi-4#u16vector->blob/shared srfi-4#s16vector->blob/shared
 216    srfi-4#u32vector->blob/shared srfi-4#s32vector->blob/shared
 217    srfi-4#u64vector->blob/shared srfi-4#s64vector->blob/shared
 218    srfi-4#f32vector->blob/shared srfi-4#f64vector->blob/shared
 219    srfi-4#blob->u8vector/shared srfi-4#blob->s8vector/shared
 220    srfi-4#blob->u16vector/shared srfi-4#blob->s16vector/shared
 221    srfi-4#blob->u32vector/shared srfi-4#blob->s32vector/shared
 222    srfi-4#blob->u64vector/shared srfi-4#blob->s64vector/shared
 223    srfi-4#blob->f32vector/shared srfi-4#blob->f64vector/shared
 224
 225    chicken.memory#u8vector-ref chicken.memory#s8vector-ref
 226    chicken.memory#u16vector-ref chicken.memory#s16vector-ref
 227    chicken.memory#u32vector-ref chicken.memory#s32vector-ref
 228    chicken.memory#u64vector-ref chicken.memory#s64vector-ref
 229    chicken.memory#f32vector-ref chicken.memory#f64vector-ref
 230    chicken.memory#f32vector-set! chicken.memory#f64vector-set!
 231    chicken.memory#u8vector-set! chicken.memory#s8vector-set!
 232    chicken.memory#u16vector-set! chicken.memory#s16vector-set!
 233    chicken.memory#u32vector-set! chicken.memory#s32vector-set!
 234    chicken.memory#u64vector-set! chicken.memory#s64vector-set!
 235
 236    chicken.memory.representation#number-of-slots
 237    chicken.memory.representation#make-record-instance
 238    chicken.memory.representation#block-ref
 239    chicken.memory.representation#block-set!
 240
 241    chicken.locative#locative-ref chicken.locative#locative-set!
 242    chicken.locative#locative->object chicken.locative#locative?
 243    chicken.locative#locative-index
 244
 245    chicken.memory#pointer+ chicken.memory#pointer=?
 246    chicken.memory#address->pointer chicken.memory#pointer->address
 247    chicken.memory#pointer->object chicken.memory#object->pointer
 248    chicken.memory#pointer-u8-ref chicken.memory#pointer-s8-ref
 249    chicken.memory#pointer-u16-ref chicken.memory#pointer-s16-ref
 250    chicken.memory#pointer-u32-ref chicken.memory#pointer-s32-ref
 251    chicken.memory#pointer-f32-ref chicken.memory#pointer-f64-ref
 252    chicken.memory#pointer-u8-set! chicken.memory#pointer-s8-set!
 253    chicken.memory#pointer-u16-set! chicken.memory#pointer-s16-set!
 254    chicken.memory#pointer-u32-set! chicken.memory#pointer-s32-set!
 255    chicken.memory#pointer-f32-set! chicken.memory#pointer-f64-set!
 256
 257    chicken.string#substring-index chicken.string#substring-index-ci
 258    chicken.string#substring=? chicken.string#substring-ci=?
 259
 260    chicken.io#read-string
 261
 262    chicken.format#format
 263    chicken.format#printf chicken.format#sprintf chicken.format#fprintf))
 264
 265(set! default-extended-bindings
 266  (append +fixnum-bindings+ +flonum-bindings+ +extended-bindings+))
 267
 268(set! internal-bindings
 269  '(##sys#slot ##sys#setslot ##sys#block-ref ##sys#block-set! ##sys#/-2
 270    ##sys#call-with-current-continuation ##sys#size ##sys#byte ##sys#setbyte
 271    ##sys#pointer? ##sys#generic-structure? ##sys#structure? ##sys#check-structure
 272    ##sys#check-number ##sys#check-list ##sys#check-pair ##sys#check-string
 273    ##sys#check-symbol ##sys#check-boolean ##sys#check-locative
 274    ##sys#check-port ##sys#check-input-port ##sys#check-output-port
 275    ##sys#check-open-port
 276    ##sys#check-char ##sys#check-vector ##sys#check-byte-vector ##sys#list ##sys#cons
 277    ##sys#call-with-values ##sys#flonum-in-fixnum-range? 
 278    ##sys#immediate? ##sys#context-switch
 279    ##sys#make-structure ##sys#apply ##sys#apply-values
 280    chicken.continuation#continuation-graft
 281    ##sys#bytevector? ##sys#make-vector ##sys#setter ##sys#car ##sys#cdr ##sys#pair?
 282    ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? ##sys#get-keyword
 283    ##sys#foreign-char-argument ##sys#foreign-fixnum-argument ##sys#foreign-flonum-argument
 284    ##sys#foreign-block-argument ##sys#foreign-struct-wrapper-argument
 285    ##sys#foreign-string-argument ##sys#foreign-pointer-argument ##sys#void
 286    ##sys#foreign-ranged-integer-argument ##sys#foreign-unsigned-ranged-integer-argument
 287    ##sys#peek-fixnum ##sys#setislot ##sys#poke-integer ##sys#permanent? ##sys#values ##sys#poke-double
 288    ##sys#intern-symbol ##sys#null-pointer? ##sys#peek-byte
 289    ##sys#file-exists? ##sys#substring-index ##sys#substring-index-ci ##sys#lcm ##sys#gcd))
 290
 291(for-each
 292 (cut mark-variable <> '##compiler#pure '#t)
 293 '(##sys#slot ##sys#block-ref ##sys#size ##sys#byte
 294    ##sys#pointer? ##sys#generic-structure? ##sys#immediate?
 295    ##sys#bytevector? ##sys#pair? ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? 
 296    ##sys#get-keyword			; ok it isn't, but this is only used for ext. llists
 297    ##sys#void ##sys#permanent?))
 298
 299
 300;;; Rewriting-definitions for this platform:
 301
 302(let ()
 303  ;; (add1 <x>) -> (##core#inline "C_fixnum_increase" <x>)     [fixnum-mode]
 304  ;; (add1 <x>) -> (##core#inline "C_u_fixnum_increase" <x>)   [fixnum-mode + unsafe]
 305  ;; (add1 <x>) -> (##core#inline_allocate ("C_s_a_i_plus" 36) <x> 1) 
 306  ;; (sub1 <x>) -> (##core#inline "C_fixnum_decrease" <x>)     [fixnum-mode]
 307  ;; (sub1 <x>) -> (##core#inline "C_u_fixnum_decrease" <x>)   [fixnum-mode + unsafe]
 308  ;; (sub1 <x>) -> (##core#inline_allocate ("C_s_a_i_minus" 36) <x> 1) 
 309  (define ((op1 fiop ufiop aiop) db classargs cont callargs)
 310    (and (= (length callargs) 1)
 311	 (make-node
 312	  '##core#call (list #t)
 313	  (list 
 314	   cont
 315	   (if (eq? 'fixnum number-type)
 316	       (make-node '##core#inline (list (if unsafe ufiop fiop)) callargs)
 317	       (make-node
 318		'##core#inline_allocate (list aiop 36)
 319		(list (car callargs) (qnode 1))))))))
 320  (rewrite 'chicken.base#add1 8 (op1 "C_fixnum_increase" "C_u_fixnum_increase" "C_s_a_i_plus"))
 321  (rewrite 'chicken.base#sub1 8 (op1 "C_fixnum_decrease" "C_u_fixnum_decrease" "C_s_a_i_minus")))
 322
 323(let ()
 324  (define (eqv?-id db classargs cont callargs)
 325    ;; (eqv? <var> <var>) -> (quote #t)          [two identical objects]
 326    ;; (eqv? ...) -> (##core#inline "C_eqp" ...)
 327    ;; [one argument is a constant and either immediate or not a number]
 328    (and (= (length callargs) 2)
 329	 (let ((arg1 (first callargs))
 330	       (arg2 (second callargs)) )
 331	   (or (and (eq? '##core#variable (node-class arg1))
 332		    (eq? '##core#variable (node-class arg2))
 333		    (equal? (node-parameters arg1) (node-parameters arg2))
 334		    (make-node '##core#call (list #t) (list cont (qnode #t))) )
 335	       (and (or (and (eq? 'quote (node-class arg1))
 336			     (let ((p1 (first (node-parameters arg1))))
 337			       (or (immediate? p1) (not (number? p1)))) )
 338			(and (eq? 'quote (node-class arg2))
 339			     (let ((p2 (first (node-parameters arg2))))
 340			       (or (immediate? p2) (not (number? p2)))) ) )
 341		    (make-node
 342		     '##core#call (list #t) 
 343		     (list cont (make-node '##core#inline '("C_eqp") callargs)) ) ) ) ) ) )
 344  (rewrite 'scheme#eqv? 8 eqv?-id)
 345  (rewrite '##sys#eqv? 8 eqv?-id))
 346
 347(rewrite
 348 'scheme#equal? 8
 349 (lambda (db classargs cont callargs)
 350   ;; (equal? <var> <var>) -> (quote #t)
 351   ;; (equal? ...) -> (##core#inline "C_eqp" ...) [one argument is a constant and immediate or a symbol]
 352   ;; (equal? ...) -> (##core#inline "C_i_equalp" ...)
 353   (and (= (length callargs) 2)
 354	(let ([arg1 (first callargs)]
 355	      [arg2 (second callargs)] )
 356	  (or (and (eq? '##core#variable (node-class arg1))
 357		   (eq? '##core#variable (node-class arg2))
 358		   (equal? (node-parameters arg1) (node-parameters arg2))
 359		   (make-node '##core#call (list #t) (list cont (qnode #t))) )
 360	      (and (or (and (eq? 'quote (node-class arg1))
 361			    (let ([f (first (node-parameters arg1))])
 362			      (or (immediate? f) (symbol? f)) ) )
 363		       (and (eq? 'quote (node-class arg2))
 364			    (let ([f (first (node-parameters arg2))])
 365			      (or (immediate? f) (symbol? f)) ) ) )
 366		   (make-node
 367		    '##core#call (list #t) 
 368		    (list cont (make-node '##core#inline '("C_eqp") callargs)) ) )
 369	      (make-node
 370	       '##core#call (list #t) 
 371	       (list cont (make-node '##core#inline '("C_i_equalp") callargs)) ) ) ) ) ) )
 372
 373(let ()
 374  (define (rewrite-apply db classargs cont callargs)
 375    ;; (apply <fn> <x1> ... '(<y1> ...)) -> (<fn> <x1> ... '<y1> ...)
 376    ;; (apply ...) -> ((##core#proc "C_apply") ...)
 377    ;; (apply values <lst>) -> ((##core#proc "C_apply_values") lst)
 378    ;; (apply ##sys#values <lst>) -> ((##core#proc "C_apply_values") lst)
 379    (and (pair? callargs)
 380	 (let ([lastarg (last callargs)]
 381	       [proc (car callargs)] )
 382	   (if (eq? 'quote (node-class lastarg))
 383	       (make-node
 384		'##core#call (list #f)
 385		(cons* (first callargs)
 386		       cont 
 387		       (append (cdr (butlast callargs)) (map qnode (first (node-parameters lastarg)))) ) )
 388	       (or (and (eq? '##core#variable (node-class proc))
 389			(= 2 (length callargs))
 390			(let ([name (car (node-parameters proc))])
 391			  (and (memq name '(values ##sys#values))
 392			       (intrinsic? name)
 393			       (make-node
 394				'##core#call (list #t)
 395				(list (make-node '##core#proc '("C_apply_values" #t) '())
 396				      cont
 397				      (cadr callargs) ) ) ) ) ) 
 398		   (make-node
 399		    '##core#call (list #t)
 400		    (cons* (make-node '##core#proc '("C_apply" #t) '())
 401			   cont callargs) ) ) ) ) ) )
 402  (rewrite 'scheme#apply 8 rewrite-apply)
 403  (rewrite '##sys#apply 8 rewrite-apply) )
 404
 405(let ()
 406  (define (rewrite-c..r op iop1 iop2)
 407    (rewrite
 408     op 8
 409     (lambda (db classargs cont callargs)
 410       ;; (<op> <x>) -> (##core#inline <iop1> <x>) [safe]
 411       ;; (<op> <x>) -> (##core#inline <iop2> <x>) [unsafe]
 412       (and (= (length callargs) 1)
 413	    (call-with-current-continuation
 414	     (lambda (return)
 415	       (let ((arg (first callargs)))
 416		 (make-node
 417		  '##core#call (list #t)
 418		  (list
 419		   cont
 420		   (cond [(and unsafe iop2) (make-node '##core#inline (list iop2) callargs)]
 421			 [iop1 (make-node '##core#inline (list iop1) callargs)]
 422			 [else (return #f)] ) ) ) ) ) ) ) ) ) )
 423
 424  (rewrite-c..r 'scheme#car "C_i_car" "C_u_i_car")
 425  (rewrite-c..r '##sys#car "C_i_car" "C_u_i_car")
 426  (rewrite-c..r '##sys#cdr "C_i_cdr" "C_u_i_cdr")
 427  (rewrite-c..r 'scheme#cadr "C_i_cadr" "C_u_i_cadr")
 428  (rewrite-c..r 'scheme#caddr "C_i_caddr" "C_u_i_caddr")
 429  (rewrite-c..r 'scheme#cadddr "C_i_cadddr" "C_u_i_cadddr") )
 430
 431(let ((rvalues
 432       (lambda (db classargs cont callargs)
 433	 ;; (values <x>) -> <x>
 434	 (and (= (length callargs) 1)
 435	      (make-node '##core#call (list #t) (cons cont callargs) ) ) ) ) )
 436  (rewrite 'scheme#values 8 rvalues)
 437  (rewrite '##sys#values 8 rvalues) )
 438
 439(let ()
 440  (define (rewrite-c-w-v db classargs cont callargs)
 441   ;; (call-with-values <var1> <var2>) -> (let ((k (lambda (r) [<var2> <k0> r]))) [<var1> k])
 442   ;; - if <var2> is a known lambda of a single argument
 443   (and (= 2 (length callargs))
 444	(let ((arg1 (car callargs))
 445	      (arg2 (cadr callargs)) )
 446	  (and (eq? '##core#variable (node-class arg1))	; probably not needed
 447	       (eq? '##core#variable (node-class arg2))
 448	       (and-let* ((sym (car (node-parameters arg2)))
 449			  (val (db-get db sym 'value)) )
 450		 (and (eq? '##core#lambda (node-class val))
 451		      (let ((llist (third (node-parameters val))))
 452			(and (list? llist)
 453			     (= 2 (length llist))
 454			     (let ((tmp (gensym))
 455				   (tmpk (gensym 'r)) )
 456			       (debugging 'o "removing single-valued `call-with-values'" (node-parameters val))
 457			       (make-node
 458				'let (list tmp)
 459				(list (make-node
 460				       '##core#lambda
 461				       (list (gensym 'f_) #f (list tmpk) 0)
 462				       (list (make-node
 463					      '##core#call (list #t)
 464					      (list arg2 cont (varnode tmpk)) ) ) ) 
 465				      (make-node
 466				       '##core#call (list #t)
 467				       (list arg1 (varnode tmp)) ) ) ) ) ) ) ) ) ) ) ) )
 468  (rewrite 'scheme#call-with-values 8 rewrite-c-w-v)
 469  (rewrite '##sys#call-with-values 8 rewrite-c-w-v) )
 470
 471(rewrite 'scheme#values 13 #f "C_values" #t)
 472(rewrite '##sys#values 13 #f "C_values" #t)
 473(rewrite 'scheme#call-with-values 13 2 "C_u_call_with_values" #f)
 474(rewrite 'scheme#call-with-values 13 2 "C_call_with_values" #t)
 475(rewrite '##sys#call-with-values 13 2 "C_u_call_with_values" #f)
 476(rewrite '##sys#call-with-values 13 2 "C_call_with_values" #t)
 477(rewrite 'chicken.continuation#continuation-graft 13 2 "C_continuation_graft" #t)
 478
 479(rewrite 'scheme#caar 2 1 "C_u_i_caar" #f)
 480(rewrite 'scheme#cdar 2 1 "C_u_i_cdar" #f)
 481(rewrite 'scheme#cddr 2 1 "C_u_i_cddr" #f)
 482(rewrite 'scheme#caaar 2 1 "C_u_i_caaar" #f)
 483(rewrite 'scheme#cadar 2 1 "C_u_i_cadar" #f)
 484(rewrite 'scheme#caddr 2 1 "C_u_i_caddr" #f)
 485(rewrite 'scheme#cdaar 2 1 "C_u_i_cdaar" #f)
 486(rewrite 'scheme#cdadr 2 1 "C_u_i_cdadr" #f)
 487(rewrite 'scheme#cddar 2 1 "C_u_i_cddar" #f)
 488(rewrite 'scheme#cdddr 2 1 "C_u_i_cdddr" #f)
 489(rewrite 'scheme#caaaar 2 1 "C_u_i_caaaar" #f)
 490(rewrite 'scheme#caadar 2 1 "C_u_i_caadar" #f)
 491(rewrite 'scheme#caaddr 2 1 "C_u_i_caaddr" #f)
 492(rewrite 'scheme#cadaar 2 1 "C_u_i_cadaar" #f)
 493(rewrite 'scheme#cadadr 2 1 "C_u_i_cadadr" #f)
 494(rewrite 'scheme#caddar 2 1 "C_u_i_caddar" #f)
 495(rewrite 'scheme#cadddr 2 1 "C_u_i_cadddr" #f)
 496(rewrite 'scheme#cdaaar 2 1 "C_u_i_cdaaar" #f)
 497(rewrite 'scheme#cdaadr 2 1 "C_u_i_cdaadr" #f)
 498(rewrite 'scheme#cdadar 2 1 "C_u_i_cdadar" #f)
 499(rewrite 'scheme#cdaddr 2 1 "C_u_i_cdaddr" #f)
 500(rewrite 'scheme#cddaar 2 1 "C_u_i_cddaar" #f)
 501(rewrite 'scheme#cddadr 2 1 "C_u_i_cddadr" #f)
 502(rewrite 'scheme#cdddar 2 1 "C_u_i_cdddar" #f)
 503(rewrite 'scheme#cddddr 2 1 "C_u_i_cddddr" #f)
 504
 505(rewrite 'scheme#caar 2 1 "C_i_caar" #t)
 506(rewrite 'scheme#cdar 2 1 "C_i_cdar" #t)
 507(rewrite 'scheme#cddr 2 1 "C_i_cddr" #t)
 508(rewrite 'scheme#cdddr 2 1 "C_i_cdddr" #t)
 509(rewrite 'scheme#cddddr 2 1 "C_i_cddddr" #t)
 510
 511(rewrite 'scheme#cdr 2 1 "C_u_i_cdr" #f)
 512(rewrite 'scheme#cdr 2 1 "C_i_cdr" #t)
 513
 514(rewrite 'scheme#eq? 1 2 "C_eqp")
 515(rewrite '##sys#eq? 1 2 "C_eqp")
 516(rewrite 'scheme#eqv? 1 2 "C_i_eqvp")
 517(rewrite '##sys#eqv? 1 2 "C_i_eqvp")
 518
 519(rewrite 'scheme#list-ref 2 2 "C_u_i_list_ref" #f)
 520(rewrite 'scheme#list-ref 2 2 "C_i_list_ref" #t)
 521(rewrite 'scheme#null? 2 1 "C_i_nullp" #t)
 522(rewrite '##sys#null? 2 1 "C_i_nullp" #t)
 523(rewrite 'scheme#length 2 1 "C_i_length" #t)
 524(rewrite 'scheme#not 2 1 "C_i_not"#t )
 525(rewrite 'scheme#char? 2 1 "C_charp" #t)
 526(rewrite 'scheme#string? 2 1 "C_i_stringp" #t)
 527(rewrite 'chicken.locative#locative? 2 1 "C_i_locativep" #t)
 528(rewrite 'scheme#symbol? 2 1 "C_i_symbolp" #t)
 529(rewrite 'scheme#vector? 2 1 "C_i_vectorp" #t)
 530(rewrite '##sys#vector? 2 1 "C_i_vectorp" #t)
 531(rewrite '##sys#srfi-4-vector? 2 1 "C_i_srfi_4_vectorp" #t)
 532(rewrite 'srfi-4#u8vector? 2 1 "C_i_u8vectorp" #t)
 533(rewrite 'srfi-4#s8vector? 2 1 "C_i_s8vectorp" #t)
 534(rewrite 'srfi-4#u16vector? 2 1 "C_i_u16vectorp" #t)
 535(rewrite 'srfi-4#s16vector? 2 1 "C_i_s16vectorp" #t)
 536(rewrite 'srfi-4#u32vector? 2 1 "C_i_u32vectorp" #t)
 537(rewrite 'srfi-4#s32vector? 2 1 "C_i_s32vectorp" #t)
 538(rewrite 'srfi-4#u64vector? 2 1 "C_i_u64vectorp" #t)
 539(rewrite 'srfi-4#s64vector? 2 1 "C_i_s64vectorp" #t)
 540(rewrite 'srfi-4#f32vector? 2 1 "C_i_f32vectorp" #t)
 541(rewrite 'srfi-4#f64vector? 2 1 "C_i_f64vectorp" #t)
 542(rewrite 'scheme#pair? 2 1 "C_i_pairp" #t)
 543(rewrite '##sys#pair? 2 1 "C_i_pairp" #t)
 544(rewrite 'chicken.base#weak-pair? 2 1 "C_i_weak_pairp" #t)
 545(rewrite 'scheme#procedure? 2 1 "C_i_closurep" #t)
 546(rewrite 'chicken.base#port? 2 1 "C_i_portp" #t)
 547(rewrite 'scheme#boolean? 2 1 "C_booleanp" #t)
 548(rewrite 'scheme#number? 2 1 "C_i_numberp" #t)
 549(rewrite 'scheme#complex? 2 1 "C_i_numberp" #t)
 550(rewrite 'scheme#rational? 2 1 "C_i_rationalp" #t)
 551(rewrite 'scheme#real? 2 1 "C_i_realp" #t)
 552(rewrite 'scheme#integer? 2 1 "C_i_integerp" #t)
 553(rewrite 'chicken.base#exact-integer? 2 1 "C_i_exact_integerp" #t)
 554(rewrite 'chicken.base#flonum? 2 1 "C_i_flonump" #t)
 555(rewrite 'chicken.base#fixnum? 2 1 "C_fixnump" #t)
 556(rewrite 'chicken.base#bignum? 2 1 "C_i_bignump" #t)
 557(rewrite 'chicken.base#cplxnum? 2 1 "C_i_cplxnump" #t)
 558(rewrite 'chicken.base#ratnum? 2 1 "C_i_ratnump" #t)
 559(rewrite 'chicken.base#nan? 2 1 "C_i_nanp" #f)
 560(rewrite 'chicken.base#finite? 2 1 "C_i_finitep" #f)
 561(rewrite 'chicken.base#infinite? 2 1 "C_i_infinitep" #f)
 562(rewrite 'chicken.flonum#fpinteger? 2 1 "C_u_i_fpintegerp" #f)
 563(rewrite '##sys#pointer? 2 1 "C_anypointerp" #t)
 564(rewrite 'pointer? 2 1 "C_i_safe_pointerp" #t)
 565(rewrite '##sys#generic-structure? 2 1 "C_structurep" #t)
 566(rewrite 'scheme#exact? 2 1 "C_i_exactp" #t)
 567(rewrite 'scheme#exact? 2 1 "C_u_i_exactp" #f)
 568(rewrite 'scheme#inexact? 2 1 "C_i_inexactp" #t)
 569(rewrite 'scheme#inexact? 2 1 "C_u_i_inexactp" #f)
 570(rewrite 'scheme#list? 2 1 "C_i_listp" #t)
 571(rewrite 'scheme#eof-object? 2 1 "C_eofp" #t)
 572(rewrite 'chicken.base#bwp-object? 2 1 "C_bwpp" #t)
 573(rewrite 'scheme#string-ref 2 2 "C_subchar" #f)
 574(rewrite 'scheme#string-ref 2 2 "C_i_string_ref" #t)
 575(rewrite 'scheme#string-set! 2 3 "C_setsubchar" #f)
 576(rewrite 'scheme#string-set! 2 3 "C_i_string_set" #t)
 577(rewrite 'scheme#vector-ref 2 2 "C_slot" #f)
 578(rewrite 'scheme#vector-ref 2 2 "C_i_vector_ref" #t)
 579(rewrite 'scheme#char=? 2 2 "C_u_i_char_equalp" #f)
 580(rewrite 'scheme#char=? 2 2 "C_i_char_equalp" #t)
 581(rewrite 'scheme#char>? 2 2 "C_u_i_char_greaterp" #f)
 582(rewrite 'scheme#char>? 2 2 "C_i_char_greaterp" #t)
 583(rewrite 'scheme#char<? 2 2 "C_u_i_char_lessp" #f)
 584(rewrite 'scheme#char<? 2 2 "C_i_char_lessp" #t)
 585(rewrite 'scheme#char>=? 2 2 "C_u_i_char_greater_or_equal_p" #f)
 586(rewrite 'scheme#char>=? 2 2 "C_i_char_greater_or_equal_p" #t)
 587(rewrite 'scheme#char<=? 2 2 "C_u_i_char_less_or_equal_p" #f)
 588(rewrite 'scheme#char<=? 2 2 "C_i_char_less_or_equal_p" #t)
 589(rewrite '##sys#slot 2 2 "C_slot" #t)		; consider as safe, the primitive is unsafe anyway.
 590(rewrite '##sys#block-ref 2 2 "C_i_block_ref" #t) ;XXX must be safe for pattern matcher (anymore?)
 591(rewrite '##sys#size 2 1 "C_block_size" #t)
 592(rewrite 'chicken.fixnum#fxnot 2 1 "C_fixnum_not" #t)
 593(rewrite 'chicken.fixnum#fx* 2 2 "C_fixnum_times" #t)
 594(rewrite 'chicken.fixnum#fx+? 2 2 "C_i_o_fixnum_plus" #t)
 595(rewrite 'chicken.fixnum#fx-? 2 2 "C_i_o_fixnum_difference" #t)
 596(rewrite 'chicken.fixnum#fx*? 2 2 "C_i_o_fixnum_times" #t)
 597(rewrite 'chicken.fixnum#fx/? 2 2 "C_i_o_fixnum_quotient" #t)
 598(rewrite 'chicken.fixnum#fx= 2 2 "C_eqp" #t)
 599(rewrite 'chicken.fixnum#fx> 2 2 "C_fixnum_greaterp" #t)
 600(rewrite 'chicken.fixnum#fx< 2 2 "C_fixnum_lessp" #t)
 601(rewrite 'chicken.fixnum#fx>= 2 2 "C_fixnum_greater_or_equal_p" #t)
 602(rewrite 'chicken.fixnum#fx<= 2 2 "C_fixnum_less_or_equal_p" #t)
 603(rewrite 'chicken.flonum#fp= 2 2 "C_flonum_equalp" #f)
 604(rewrite 'chicken.flonum#fp> 2 2 "C_flonum_greaterp" #f)
 605(rewrite 'chicken.flonum#fp< 2 2 "C_flonum_lessp" #f)
 606(rewrite 'chicken.flonum#fp>= 2 2 "C_flonum_greater_or_equal_p" #f)
 607(rewrite 'chicken.flonum#fp<= 2 2 "C_flonum_less_or_equal_p" #f)
 608(rewrite 'chicken.fixnum#fxmax 2 2 "C_i_fixnum_max" #t)
 609(rewrite 'chicken.fixnum#fxmin 2 2 "C_i_fixnum_min" #t)
 610(rewrite 'chicken.flonum#fpmax 2 2 "C_i_flonum_max" #f)
 611(rewrite 'chicken.flonum#fpmin 2 2 "C_i_flonum_min" #f)
 612(rewrite 'chicken.fixnum#fxgcd 2 2 "C_i_fixnum_gcd" #t)
 613(rewrite 'chicken.fixnum#fxlen 2 1 "C_i_fixnum_length" #t)
 614(rewrite 'scheme#char-numeric? 2 1 "C_u_i_char_numericp" #t)
 615(rewrite 'scheme#char-alphabetic? 2 1 "C_u_i_char_alphabeticp" #t)
 616(rewrite 'scheme#char-whitespace? 2 1 "C_u_i_char_whitespacep" #t)
 617(rewrite 'scheme#char-upper-case? 2 1 "C_u_i_char_upper_casep" #t)
 618(rewrite 'scheme#char-lower-case? 2 1 "C_u_i_char_lower_casep" #t)
 619(rewrite 'scheme#char-upcase 2 1 "C_u_i_char_upcase" #t)
 620(rewrite 'scheme#char-downcase 2 1 "C_u_i_char_downcase" #t)
 621(rewrite 'scheme#list-tail 2 2 "C_i_list_tail" #t)
 622(rewrite '##sys#structure? 2 2 "C_i_structurep" #t)
 623(rewrite '##sys#bytevector? 2 2 "C_bytevectorp" #t)
 624(rewrite 'chicken.memory.representation#block-ref 2 2 "C_slot" #f)	; ok to be unsafe, lolevel is anyway
 625(rewrite 'chicken.memory.representation#number-of-slots 2 1 "C_block_size" #f)
 626
 627(rewrite 'scheme#assv 14 'fixnum 2 "C_i_assq" "C_u_i_assq")
 628(rewrite 'scheme#assv 2 2 "C_i_assv" #t)
 629(rewrite 'scheme#memv 14 'fixnum 2 "C_i_memq" "C_u_i_memq")
 630(rewrite 'scheme#memv 2 2 "C_i_memv" #t)
 631(rewrite 'scheme#assq 17 2 "C_i_assq" "C_u_i_assq")
 632(rewrite 'scheme#memq 17 2 "C_i_memq" "C_u_i_memq")
 633(rewrite 'scheme#assoc 2 2 "C_i_assoc" #t)
 634(rewrite 'scheme#member 2 2 "C_i_member" #t)
 635
 636(rewrite 'scheme#set-car! 4 '##sys#setslot 0)
 637(rewrite 'scheme#set-cdr! 4 '##sys#setslot 1)
 638(rewrite 'scheme#set-car! 17 2 "C_i_set_car" "C_u_i_set_car")
 639(rewrite 'scheme#set-cdr! 17 2 "C_i_set_cdr" "C_u_i_set_cdr")
 640
 641(rewrite 'scheme#abs 14 'fixnum 1 "C_fixnum_abs" "C_fixnum_abs")
 642
 643(rewrite 'chicken.bitwise#bitwise-and 19)
 644(rewrite 'chicken.bitwise#bitwise-xor 19)
 645(rewrite 'chicken.bitwise#bitwise-ior 19)
 646
 647(rewrite 'chicken.bitwise#bitwise-and 21 -1 "C_fixnum_and" "C_u_fixnum_and" "C_s_a_i_bitwise_and" 5)
 648(rewrite 'chicken.bitwise#bitwise-xor 21 0 "C_fixnum_xor" "C_fixnum_xor" "C_s_a_i_bitwise_xor" 5)
 649(rewrite 'chicken.bitwise#bitwise-ior 21 0 "C_fixnum_or" "C_u_fixnum_or" "C_s_a_i_bitwise_ior" 5)
 650
 651(rewrite 'chicken.bitwise#bitwise-not 22 1 "C_s_a_i_bitwise_not" #t 5 "C_fixnum_not")
 652
 653(rewrite 'chicken.flonum#fp+ 16 2 "C_a_i_flonum_plus" #f words-per-flonum)
 654(rewrite 'chicken.flonum#fp- 16 2 "C_a_i_flonum_difference" #f words-per-flonum)
 655(rewrite 'chicken.flonum#fp* 16 2 "C_a_i_flonum_times" #f words-per-flonum)
 656(rewrite 'chicken.flonum#fp/ 16 2 "C_a_i_flonum_quotient" #f words-per-flonum)
 657(rewrite 'chicken.flonum#fp/? 16 2 "C_a_i_flonum_quotient_checked" #f words-per-flonum)
 658(rewrite 'chicken.flonum#fpneg 16 1 "C_a_i_flonum_negate" #f words-per-flonum)
 659(rewrite 'chicken.flonum#fpgcd 16 2 "C_a_i_flonum_gcd" #f words-per-flonum)
 660(rewrite 'chicken.flonum#fp*+ 16 3 "C_a_i_flonum_multiply_add" #f words-per-flonum)
 661
 662(rewrite 'scheme#zero? 5 "C_eqp" 0 'fixnum)
 663(rewrite 'scheme#zero? 2 1 "C_u_i_zerop2" #f)
 664(rewrite 'scheme#zero? 2 1 "C_i_zerop" #t)
 665(rewrite 'scheme#positive? 5 "C_fixnum_greaterp" 0 'fixnum)
 666(rewrite 'scheme#positive? 5 "C_flonum_greaterp" 0 'flonum)
 667(rewrite 'scheme#positive? 2 1 "C_i_positivep" #t)
 668(rewrite 'scheme#negative? 5 "C_fixnum_lessp" 0 'fixnum)
 669(rewrite 'scheme#negative? 5 "C_flonum_lessp" 0 'flonum)
 670(rewrite 'scheme#negative? 2 1 "C_i_negativep" #t)
 671
 672(rewrite 'scheme#vector-length 6 "C_fix" "C_header_size" #f)
 673(rewrite 'scheme#string-length 6 "C_fix" "C_header_size" #f)
 674(rewrite 'scheme#char->integer 6 "C_fix" "C_character_code" #t)
 675(rewrite 'scheme#integer->char 6 "C_make_character" "C_unfix" #t)
 676
 677(rewrite 'scheme#vector-length 2 1 "C_i_vector_length" #t)
 678(rewrite '##sys#vector-length 2 1 "C_i_vector_length" #t)
 679(rewrite 'scheme#string-length 2 1 "C_i_string_length" #t)
 680
 681(rewrite '##sys#check-fixnum 2 1 "C_i_check_fixnum" #t)
 682(rewrite '##sys#check-number 2 1 "C_i_check_number" #t)
 683(rewrite '##sys#check-list 2 1 "C_i_check_list" #t)
 684(rewrite '##sys#check-pair 2 1 "C_i_check_pair" #t)
 685(rewrite '##sys#check-boolean 2 1 "C_i_check_boolean" #t)
 686(rewrite '##sys#check-locative 2 1 "C_i_check_locative" #t)
 687(rewrite '##sys#check-symbol 2 1 "C_i_check_symbol" #t)
 688(rewrite '##sys#check-string 2 1 "C_i_check_string" #t)
 689(rewrite '##sys#check-byte-vector 2 1 "C_i_check_bytevector" #t)
 690(rewrite '##sys#check-vector 2 1 "C_i_check_vector" #t)
 691(rewrite '##sys#check-structure 2 2 "C_i_check_structure" #t)
 692(rewrite '##sys#check-char 2 1 "C_i_check_char" #t)
 693(rewrite '##sys#check-fixnum 2 2 "C_i_check_fixnum_2" #t)
 694(rewrite '##sys#check-number 2 2 "C_i_check_number_2" #t)
 695(rewrite '##sys#check-list 2 2 "C_i_check_list_2" #t)
 696(rewrite '##sys#check-pair 2 2 "C_i_check_pair_2" #t)
 697(rewrite '##sys#check-boolean 2 2 "C_i_check_boolean_2" #t)
 698(rewrite '##sys#check-locative 2 2 "C_i_check_locative_2" #t)
 699(rewrite '##sys#check-symbol 2 2 "C_i_check_symbol_2" #t)
 700(rewrite '##sys#check-string 2 2 "C_i_check_string_2" #t)
 701(rewrite '##sys#check-byte-vector 2 2 "C_i_check_bytevector_2" #t)
 702(rewrite '##sys#check-vector 2 2 "C_i_check_vector_2" #t)
 703(rewrite '##sys#check-structure 2 3 "C_i_check_structure_2" #t)
 704(rewrite '##sys#check-char 2 2 "C_i_check_char_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#ensure-heap-reserve 13 1 "C_ensure_heap_reserve" #t)
 918(rewrite 'chicken.platform#return-to-host 13 0 "C_return_to_host" #t)
 919(rewrite '##sys#context-switch 13 1 "C_context_switch" #t)
 920(rewrite '##sys#intern-symbol 13 1 "C_string_to_symbol" #t)
 921(rewrite '##sys#make-symbol 13 1 "C_make_symbol" #t)
 922
 923(rewrite 'scheme#even? 14 'fixnum 1 "C_i_fixnumevenp" "C_i_fixnumevenp")
 924(rewrite 'scheme#odd? 14 'fixnum 1 "C_i_fixnumoddp" "C_i_fixnumoddp")
 925(rewrite 'scheme#remainder 14 'fixnum 2 "C_fixnum_modulo" "C_fixnum_modulo")
 926
 927(rewrite 'scheme#even? 17 1 "C_i_evenp")
 928(rewrite 'scheme#odd? 17 1 "C_i_oddp")
 929
 930(rewrite 'chicken.fixnum#fxodd? 2 1 "C_i_fixnumoddp" #t)
 931(rewrite 'chicken.fixnum#fxeven? 2 1 "C_i_fixnumevenp" #t)
 932
 933(rewrite 'scheme#floor 15 'flonum 'fixnum 'chicken.flonum#fpfloor #f)
 934(rewrite 'scheme#ceiling 15 'flonum 'fixnum 'chicken.flonum#fpceiling #f)
 935(rewrite 'scheme#truncate 15 'flonum 'fixnum 'chicken.flonum#fptruncate #f)
 936
 937(rewrite 'chicken.flonum#fpsin 16 1 "C_a_i_flonum_sin" #f words-per-flonum)
 938(rewrite 'chicken.flonum#fpcos 16 1 "C_a_i_flonum_cos" #f words-per-flonum)
 939(rewrite 'chicken.flonum#fptan 16 1 "C_a_i_flonum_tan" #f words-per-flonum)
 940(rewrite 'chicken.flonum#fpasin 16 1 "C_a_i_flonum_asin" #f words-per-flonum)
 941(rewrite 'chicken.flonum#fpacos 16 1 "C_a_i_flonum_acos" #f words-per-flonum)
 942(rewrite 'chicken.flonum#fpatan 16 1 "C_a_i_flonum_atan" #f words-per-flonum)
 943(rewrite 'chicken.flonum#fpatan2 16 2 "C_a_i_flonum_atan2" #f words-per-flonum)
 944(rewrite 'chicken.flonum#fpexp 16 1 "C_a_i_flonum_exp" #f words-per-flonum)
 945(rewrite 'chicken.flonum#fpexpt 16 2 "C_a_i_flonum_expt" #f words-per-flonum)
 946(rewrite 'chicken.flonum#fplog 16 1 "C_a_i_flonum_log" #f words-per-flonum)
 947(rewrite 'chicken.flonum#fpsqrt 16 1 "C_a_i_flonum_sqrt" #f words-per-flonum)
 948(rewrite 'chicken.flonum#fpabs 16 1 "C_a_i_flonum_abs" #f words-per-flonum)
 949(rewrite 'chicken.flonum#fptruncate 16 1 "C_a_i_flonum_truncate" #f words-per-flonum)
 950(rewrite 'chicken.flonum#fpround 16 1 "C_a_i_flonum_round" #f words-per-flonum)
 951(rewrite 'chicken.flonum#fpceiling 16 1 "C_a_i_flonum_ceiling" #f words-per-flonum)
 952(rewrite 'chicken.flonum#fpround 16 1 "C_a_i_flonum_floor" #f words-per-flonum)
 953
 954(rewrite 'scheme#cons 16 2 "C_a_i_cons" #t 3)
 955(rewrite '##sys#cons 16 2 "C_a_i_cons" #t 3)
 956(rewrite 'chicken.base#weak-cons 16 2 "C_a_i_weak_cons" #t 3)
 957(rewrite 'scheme#list 16 #f "C_a_i_list" #t '(0 3) #t)
 958(rewrite '##sys#list 16 #f "C_a_i_list" #t '(0 3))
 959(rewrite 'scheme#vector 16 #f "C_a_i_vector" #t #t #t)
 960(rewrite '##sys#vector 16 #f "C_a_i_vector" #t #t)
 961(rewrite '##sys#make-structure 16 #f "C_a_i_record" #t #t #t)
 962(rewrite 'scheme#string 16 #f "C_a_i_string" #t #t) ; the last #t is actually too much, but we don't care
 963(rewrite 'chicken.memory#address->pointer 16 1 "C_a_i_address_to_pointer" #f 2)
 964(rewrite 'chicken.memory#pointer->address 16 1 "C_a_i_pointer_to_address" #f words-per-flonum)
 965(rewrite 'chicken.memory#pointer+ 16 2 "C_a_u_i_pointer_inc" #f 2)
 966(rewrite 'chicken.locative#locative-ref 16 1 "C_a_i_locative_ref" #t 6)
 967
 968(rewrite 'chicken.memory#pointer-u8-ref 2 1 "C_u_i_pointer_u8_ref" #f)
 969(rewrite 'chicken.memory#pointer-s8-ref 2 1 "C_u_i_pointer_s8_ref" #f)
 970(rewrite 'chicken.memory#pointer-u16-ref 2 1 "C_u_i_pointer_u16_ref" #f)
 971(rewrite 'chicken.memory#pointer-s16-ref 2 1 "C_u_i_pointer_s16_ref" #f)
 972(rewrite 'chicken.memory#pointer-u8-set! 2 2 "C_u_i_pointer_u8_set" #f)
 973(rewrite 'chicken.memory#pointer-s8-set! 2 2 "C_u_i_pointer_s8_set" #f)
 974(rewrite 'chicken.memory#pointer-u16-set! 2 2 "C_u_i_pointer_u16_set" #f)
 975(rewrite 'chicken.memory#pointer-s16-set! 2 2 "C_u_i_pointer_s16_set" #f)
 976(rewrite 'chicken.memory#pointer-u32-set! 2 2 "C_u_i_pointer_u32_set" #f)
 977(rewrite 'chicken.memory#pointer-s32-set! 2 2 "C_u_i_pointer_s32_set" #f)
 978(rewrite 'chicken.memory#pointer-f32-set! 2 2 "C_u_i_pointer_f32_set" #f)
 979(rewrite 'chicken.memory#pointer-f64-set! 2 2 "C_u_i_pointer_f64_set" #f)
 980
 981;; on 32-bit platforms, 32-bit integers do not always fit in a word,
 982;; bignum1 and bignum wrapper (5 words) may be used instead
 983(rewrite 'chicken.memory#pointer-u32-ref 16 1 "C_a_u_i_pointer_u32_ref" #f min-words-per-bignum)
 984(rewrite 'chicken.memory#pointer-s32-ref 16 1 "C_a_u_i_pointer_s32_ref" #f min-words-per-bignum)
 985
 986(rewrite 'chicken.memory#pointer-f32-ref 16 1 "C_a_u_i_pointer_f32_ref" #f words-per-flonum)
 987(rewrite 'chicken.memory#pointer-f64-ref 16 1 "C_a_u_i_pointer_f64_ref" #f words-per-flonum)
 988
 989(rewrite
 990 '##sys#setslot 8
 991 (lambda (db classargs cont callargs)
 992   ;; (##sys#setslot <x> <y> <immediate>) -> (##core#inline "C_i_set_i_slot" <x> <y> <i>)
 993   ;; (##sys#setslot <x> <y> <z>) -> (##core#inline "C_i_setslot" <x> <y> <z>)
 994   (and (= (length callargs) 3)
 995	(make-node 
 996	 '##core#call (list #t)
 997	 (list cont
 998	       (make-node
 999		'##core#inline
 1000		(let ([val (third callargs)])
1001		  (if (and (eq? 'quote (node-class val))
1002			   (immediate? (first (node-parameters val))) ) 
1003		      '("C_i_set_i_slot")
1004		      '("C_i_setslot") ) )
1005		callargs) ) ) ) ) )
1006
1007(rewrite 'chicken.fixnum#fx+ 17 2 "C_fixnum_plus" "C_u_fixnum_plus")
1008(rewrite 'chicken.fixnum#fx- 17 2 "C_fixnum_difference" "C_u_fixnum_difference")
1009(rewrite 'chicken.fixnum#fxshl 17 2 "C_fixnum_shift_left")
1010(rewrite 'chicken.fixnum#fxshr 17 2 "C_fixnum_shift_right")
1011(rewrite 'chicken.fixnum#fxneg 17 1 "C_fixnum_negate" "C_u_fixnum_negate")
1012(rewrite 'chicken.fixnum#fxxor 17 2 "C_fixnum_xor" "C_fixnum_xor")
1013(rewrite 'chicken.fixnum#fxand 17 2 "C_fixnum_and" "C_u_fixnum_and")
1014(rewrite 'chicken.fixnum#fxior 17 2 "C_fixnum_or" "C_u_fixnum_or")
1015(rewrite 'chicken.fixnum#fx/ 17 2 "C_fixnum_divide" "C_u_fixnum_divide")
1016(rewrite 'chicken.fixnum#fxmod 17 2 "C_fixnum_modulo" "C_u_fixnum_modulo")
1017(rewrite 'chicken.fixnum#fxrem 17 2 "C_i_fixnum_remainder_checked")
1018
1019(rewrite
1020 'chicken.bitwise#arithmetic-shift 8
1021 (lambda (db classargs cont callargs)
1022   ;; (arithmetic-shift <x> <-int>)
1023   ;;           -> (##core#inline "C_fixnum_shift_right" <x> -<int>)
1024   ;; (arithmetic-shift <x> <+int>)
1025   ;;           -> (##core#inline "C_fixnum_shift_left" <x> <int>)
1026   ;; _ -> (##core#inline "C_i_fixnum_arithmetic_shift" <x> <y>)
1027   ;;
1028   ;; not in fixnum-mode:
1029   ;; _ -> (##core#inline_allocate ("C_s_a_i_arithmetic_shift" 6) <x> <y>)
1030   (and (= 2 (length callargs))
1031	(let ((val (second callargs)))
1032	  (make-node
1033	   '##core#call (list #t)
1034	   (list cont
1035		 (or (and-let* (((eq? 'quote (node-class val)))
1036				((eq? number-type 'fixnum))
1037				(n (first (node-parameters val)))
1038				((and (fixnum? n) (not (big-fixnum? n)))) )
1039		       (if (negative? n)
1040			   (make-node
1041			    '##core#inline '("C_fixnum_shift_right")
1042			    (list (first callargs) (qnode (- n))) )
1043			   (make-node
1044			    '##core#inline '("C_fixnum_shift_left")
1045			    (list (first callargs) val) ) ) )
1046		     (if (eq? number-type 'fixnum)
1047			 (make-node '##core#inline
1048				    '("C_i_fixnum_arithmetic_shift") callargs)
1049			 (make-node '##core#inline_allocate
1050				    (list "C_s_a_i_arithmetic_shift" 5)
1051				    callargs) ) ) ) ) ) ) ) )
1052
1053(rewrite '##sys#byte 17 2 "C_subbyte")
1054(rewrite '##sys#setbyte 17 3 "C_setbyte")
1055(rewrite '##sys#peek-fixnum 17 2 "C_peek_fixnum")
1056(rewrite '##sys#peek-byte 17 2 "C_peek_byte")
1057(rewrite 'chicken.memory#pointer->object 17 2 "C_pointer_to_object")
1058(rewrite '##sys#setislot 17 3 "C_i_set_i_slot")
1059(rewrite '##sys#poke-integer 17 3 "C_poke_integer")
1060(rewrite '##sys#poke-double 17 3 "C_poke_double")
1061(rewrite 'scheme#string=? 17 2 "C_i_string_equal_p" "C_u_i_string_equal_p")
1062(rewrite 'scheme#string-ci=? 17 2 "C_i_string_ci_equal_p")
1063(rewrite '##sys#permanent? 17 1 "C_permanentp")
1064(rewrite '##sys#null-pointer? 17 1 "C_null_pointerp" "C_null_pointerp")
1065(rewrite '##sys#immediate? 17 1 "C_immp")
1066(rewrite 'chicken.locative#locative->object 17 1 "C_i_locative_to_object")
1067(rewrite 'chicken.locative#locative->object 17 1 "C_i_locative_to_object")
1068(rewrite 'chicken.locative#locative-index 17 1 "C_i_locative_index")
1069(rewrite 'chicken.locative#locative-set! 17 2 "C_i_locative_set")
1070(rewrite '##sys#foreign-fixnum-argument 17 1 "C_i_foreign_fixnum_argumentp")
1071(rewrite '##sys#foreign-char-argument 17 1 "C_i_foreign_char_argumentp")
1072(rewrite '##sys#foreign-flonum-argument 17 1 "C_i_foreign_flonum_argumentp")
1073(rewrite '##sys#foreign-block-argument 17 1 "C_i_foreign_block_argumentp")
1074(rewrite '##sys#foreign-struct-wrapper-argument 17 2 "C_i_foreign_struct_wrapper_argumentp")
1075(rewrite '##sys#foreign-string-argument 17 1 "C_i_foreign_string_argumentp")
1076(rewrite '##sys#foreign-pointer-argument 17 1 "C_i_foreign_pointer_argumentp")
1077(rewrite '##sys#foreign-ranged-integer-argument 17 2 "C_i_foreign_ranged_integer_argumentp")
1078(rewrite '##sys#foreign-unsigned-ranged-integer-argument 17 2 "C_i_foreign_unsigned_ranged_integer_argumentp")
1079
1080(rewrite 'chicken.blob#blob-size 2 1 "C_block_size" #f)
1081
1082;; TODO: Move this stuff to types.db
1083(rewrite 'srfi-4#u8vector-ref 2 2 "C_u_i_u8vector_ref" #f)
1084(rewrite 'srfi-4#u8vector-ref 2 2 "C_i_u8vector_ref" #t)
1085(rewrite 'srfi-4#s8vector-ref 2 2 "C_u_i_s8vector_ref" #f)
1086(rewrite 'srfi-4#s8vector-ref 2 2 "C_i_s8vector_ref" #t)
1087(rewrite 'srfi-4#u16vector-ref 2 2 "C_u_i_u16vector_ref" #f)
1088(rewrite 'srfi-4#u16vector-ref 2 2 "C_i_u16vector_ref" #t)
1089(rewrite 'srfi-4#s16vector-ref 2 2 "C_u_i_s16vector_ref" #f)
1090(rewrite 'srfi-4#s16vector-ref 2 2 "C_i_s16vector_ref" #t)
1091
1092(rewrite 'srfi-4#u32vector-ref 16 2 "C_a_i_u32vector_ref" #t min-words-per-bignum)
1093(rewrite 'srfi-4#s32vector-ref 16 2 "C_a_i_s32vector_ref" #t min-words-per-bignum)
1094
1095(rewrite 'srfi-4#f32vector-ref 16 2 "C_a_u_i_f32vector_ref" #f words-per-flonum)
1096(rewrite 'srfi-4#f32vector-ref 16 2 "C_a_i_f32vector_ref" #t words-per-flonum)
1097(rewrite 'srfi-4#f64vector-ref 16 2 "C_a_u_i_f64vector_ref" #f words-per-flonum)
1098(rewrite 'srfi-4#f64vector-ref 16 2 "C_a_i_f64vector_ref" #t words-per-flonum)
1099
1100(rewrite 'srfi-4#u8vector-set! 2 3 "C_u_i_u8vector_set" #f)
1101(rewrite 'srfi-4#u8vector-set! 2 3 "C_i_u8vector_set" #t)
1102(rewrite 'srfi-4#s8vector-set! 2 3 "C_u_i_s8vector_set" #f)
1103(rewrite 'srfi-4#s8vector-set! 2 3 "C_i_s8vector_set" #t)
1104(rewrite 'srfi-4#u16vector-set! 2 3 "C_u_i_u16vector_set" #f)
1105(rewrite 'srfi-4#u16vector-set! 2 3 "C_i_u16vector_set" #t)
1106(rewrite 'srfi-4#s16vector-set! 2 3 "C_u_i_s16vector_set" #f)
1107(rewrite 'srfi-4#s16vector-set! 2 3 "C_i_s16vector_set" #t)
1108(rewrite 'srfi-4#u32vector-set! 2 3 "C_u_i_u32vector_set" #f)
1109(rewrite 'srfi-4#u32vector-set! 2 3 "C_i_u32vector_set" #t)
1110(rewrite 'srfi-4#s32vector-set! 2 3 "C_u_i_s32vector_set" #f)
1111(rewrite 'srfi-4#s32vector-set! 2 3 "C_i_s32vector_set" #t)
1112(rewrite 'srfi-4#u64vector-set! 2 3 "C_u_i_u64vector_set" #f)
1113(rewrite 'srfi-4#u64vector-set! 2 3 "C_i_u64vector_set" #t)
1114(rewrite 'srfi-4#s64vector-set! 2 3 "C_u_i_s64vector_set" #f)
1115(rewrite 'srfi-4#s64vector-set! 2 3 "C_i_s64vector_set" #t)
1116(rewrite 'srfi-4#f32vector-set! 2 3 "C_u_i_f32vector_set" #f)
1117(rewrite 'srfi-4#f32vector-set! 2 3 "C_i_f32vector_set" #t)
1118(rewrite 'srfi-4#f64vector-set! 2 3 "C_u_i_f64vector_set" #f)
1119(rewrite 'srfi-4#f64vector-set! 2 3 "C_i_f64vector_set" #t)
1120
1121(rewrite 'srfi-4#u8vector-length 2 1 "C_u_i_u8vector_length" #f)
1122(rewrite 'srfi-4#u8vector-length 2 1 "C_i_u8vector_length" #t)
1123(rewrite 'srfi-4#s8vector-length 2 1 "C_u_i_s8vector_length" #f)
1124(rewrite 'srfi-4#s8vector-length 2 1 "C_i_s8vector_length" #t)
1125(rewrite 'srfi-4#u16vector-length 2 1 "C_u_i_u16vector_length" #f)
1126(rewrite 'srfi-4#u16vector-length 2 1 "C_i_u16vector_length" #t)
1127(rewrite 'srfi-4#s16vector-length 2 1 "C_u_i_s16vector_length" #f)
1128(rewrite 'srfi-4#s16vector-length 2 1 "C_i_s16vector_length" #t)
1129(rewrite 'srfi-4#u32vector-length 2 1 "C_u_i_u32vector_length" #f)
1130(rewrite 'srfi-4#u32vector-length 2 1 "C_i_u32vector_length" #t)
1131(rewrite 'srfi-4#s32vector-length 2 1 "C_u_i_s32vector_length" #f)
1132(rewrite 'srfi-4#s32vector-length 2 1 "C_i_s32vector_length" #t)
1133(rewrite 'srfi-4#u64vector-length 2 1 "C_u_i_u64vector_length" #f)
1134(rewrite 'srfi-4#u64vector-length 2 1 "C_i_u64vector_length" #t)
1135(rewrite 'srfi-4#s64vector-length 2 1 "C_u_i_s64vector_length" #f)
1136(rewrite 'srfi-4#s64vector-length 2 1 "C_i_s64vector_length" #t)
1137(rewrite 'srfi-4#f32vector-length 2 1 "C_u_i_f32vector_length" #f)
1138(rewrite 'srfi-4#f32vector-length 2 1 "C_i_f32vector_length" #t)
1139(rewrite 'srfi-4#f64vector-length 2 1 "C_u_i_f64vector_length" #f)
1140(rewrite 'srfi-4#f64vector-length 2 1 "C_i_f64vector_length" #t)
1141
1142(rewrite 'chicken.base#atom? 17 1 "C_i_not_pair_p")
1143
1144(rewrite 'srfi-4#u8vector->blob/shared 7 1 "C_slot" 1 #f)
1145(rewrite 'srfi-4#s8vector->blob/shared 7 1 "C_slot" 1 #f)
1146(rewrite 'srfi-4#u16vector->blob/shared 7 1 "C_slot" 1 #f)
1147(rewrite 'srfi-4#s16vector->blob/shared 7 1 "C_slot" 1 #f)
1148(rewrite 'srfi-4#u32vector->blob/shared 7 1 "C_slot" 1 #f)
1149(rewrite 'srfi-4#s32vector->blob/shared 7 1 "C_slot" 1 #f)
1150(rewrite 'srfi-4#u64vector->blob/shared 7 1 "C_slot" 1 #f)
1151(rewrite 'srfi-4#s64vector->blob/shared 7 1 "C_slot" 1 #f)
1152(rewrite 'srfi-4#f32vector->blob/shared 7 1 "C_slot" 1 #f)
1153(rewrite 'srfi-4#f64vector->blob/shared 7 1 "C_slot" 1 #f)
1154
1155(let ()
1156  (define (rewrite-make-vector db classargs cont callargs)
1157    ;; (make-vector '<n> [<x>]) -> (let ((<tmp> <x>)) (##core#inline_allocate ("C_a_i_vector" <n>+1) '<n> <tmp>))
1158    ;; - <n> should be less or equal to 32.
1159    (let ([argc (length callargs)])
1160      (and (pair? callargs)
1161	   (let ([n (first callargs)])
1162	     (and (eq? 'quote (node-class n))
1163		  (let ([tmp (gensym)]
1164			[c (first (node-parameters n))] )
1165		    (and (fixnum? c)
1166			 (<= 0 c 32)
1167			 (let ([val (if (pair? (cdr callargs))
1168					(second callargs)
1169					(make-node '##core#undefined '() '()) ) ] )
1170			   (make-node
1171			    'let
1172			    (list tmp)
1173			    (list val
1174				  (make-node
1175				   '##core#call (list #t)
1176				   (list cont
1177					 (make-node
1178					  '##core#inline_allocate 
1179					  (list "C_a_i_vector" (add1 c))
1180					  (list-tabulate c (lambda (i) (varnode tmp)) ) ) ) ) ) ) ) ) ) ) ) ) ) )
1181  (rewrite 'scheme#make-vector 8 rewrite-make-vector)
1182  (rewrite '##sys#make-vector 8 rewrite-make-vector) )
1183
1184(let ()
1185  (define (rewrite-call/cc db classargs cont callargs)
1186    ;; (call/cc <var>), <var> = (lambda (kont k) ... k is never used ...) -> (<var> #f)
1187    (and (= 1 (length callargs))
1188	 (let ((val (first callargs)))
1189	   (and (eq? '##core#variable (node-class val))
1190		(and-let* ((proc (db-get db (first (node-parameters val)) 'value))
1191			   ((eq? '##core#lambda (node-class proc))) )
1192		  (let ((llist (third (node-parameters proc))))
1193		    (##sys#decompose-lambda-list 
1194		     llist
1195		     (lambda (vars argc rest)
1196		       (and (= argc 2)
1197			    (let ((var (or rest (second llist))))
1198			      (and (not (db-get db var 'references))
1199				   (not (db-get db var 'assigned)) 
1200				   (not (db-get db var 'inline-transient))
1201				   (make-node
1202				    '##core#call (list #t)
1203				    (list val cont (qnode #f)) ) ) ) ) ) ) ) ) ) ) ) )
1204  (rewrite 'scheme#call-with-current-continuation 8 rewrite-call/cc)
1205  (rewrite 'chicken.base#call/cc 8 rewrite-call/cc))
1206
1207(define setter-map
1208  '((scheme#car . scheme#set-car!)
1209    (scheme#cdr . scheme#set-cdr!)
1210    (scheme#string-ref . scheme#string-set!)
1211    (scheme#vector-ref . scheme#vector-set!)
1212    (srfi-4#u8vector-ref . srfi-4#u8vector-set!)
1213    (srfi-4#s8vector-ref . srfi-4#s8vector-set!)
1214    (srfi-4#u16vector-ref . srfi-4#u16vector-set!)
1215    (srfi-4#s16vector-ref . srfi-4#s16vector-set!)
1216    (srfi-4#u32vector-ref . srfi-4#u32vector-set!)
1217    (srfi-4#s32vector-ref . srfi-4#s32vector-set!)
1218    (srfi-4#u64vector-ref . srfi-4#u64vector-set!)
1219    (srfi-4#s64vector-ref . srfi-4#s64vector-set!)
1220    (srfi-4#f32vector-ref . srfi-4#f32vector-set!)
1221    (srfi-4#f64vector-ref . srfi-4#f64vector-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)
Trap