~ chicken-core (chicken-5) c8fce88bd33f406b10fdb1f6783cce36ded456d8
commit c8fce88bd33f406b10fdb1f6783cce36ded456d8 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Wed Sep 8 06:11:35 2010 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Sep 8 06:11:35 2010 -0400 new declaration unsafe-specialized-arithmetic and unboxing changes diff --git a/batch-driver.scm b/batch-driver.scm index 040c6cf3..65923f92 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -602,7 +602,7 @@ (> (- (cputime) start-time) funny-message-timeout)) (display "(don't worry - still compiling...)\n") ) (print-node "closure-converted" '|9| node2) - (when (and unbox unsafe) + (when (and unbox (or unsafe unchecked-specialized-arithmetic)) (debugging 'p "performing unboxing") (begin-time) (perform-unboxing! node2) diff --git a/c-platform.scm b/c-platform.scm index 7c4fe8dc..147a536a 100644 --- a/c-platform.scm +++ b/c-platform.scm @@ -604,7 +604,7 @@ (rewrite 'flonum? 2 1 "C_i_flonump" #t) (rewrite 'fixnum? 2 1 "C_fixnump" #t) (rewrite 'finite? 2 1 "C_i_finitep" #f) -(rewrite 'fpinteger? 2 1 "C_u_i_fpintegerp" #f) +(rewrite 'fpinteger? 2 1 "C_u_i_fpintegerp" 'specialized) (rewrite '##sys#pointer? 2 1 "C_anypointerp" #t) (rewrite 'pointer? 2 1 "C_i_safe_pointerp" #t) (rewrite '##sys#generic-structure? 2 1 "C_structurep" #t) @@ -638,15 +638,15 @@ (rewrite 'fx< 2 2 "C_fixnum_lessp" #t) (rewrite 'fx>= 2 2 "C_fixnum_greater_or_equal_p" #t) (rewrite 'fx<= 2 2 "C_fixnum_less_or_equal_p" #t) -(rewrite 'fp= 2 2 "C_flonum_equalp" #f) -(rewrite 'fp> 2 2 "C_flonum_greaterp" #f) -(rewrite 'fp< 2 2 "C_flonum_lessp" #f) -(rewrite 'fp>= 2 2 "C_flonum_greater_or_equal_p" #f) -(rewrite 'fp<= 2 2 "C_flonum_less_or_equal_p" #f) +(rewrite 'fp= 2 2 "C_flonum_equalp" 'specialized) +(rewrite 'fp> 2 2 "C_flonum_greaterp" 'specialized) +(rewrite 'fp< 2 2 "C_flonum_lessp" 'specialized) +(rewrite 'fp>= 2 2 "C_flonum_greater_or_equal_p" 'specialized) +(rewrite 'fp<= 2 2 "C_flonum_less_or_equal_p" 'specialized) (rewrite 'fxmax 2 2 "C_i_fixnum_max" #t) (rewrite 'fxmin 2 2 "C_i_fixnum_min" #t) -(rewrite 'fpmax 2 2 "C_i_flonum_max" #f) -(rewrite 'fpmin 2 2 "C_i_flonum_min" #f) +(rewrite 'fpmax 2 2 "C_i_flonum_max" 'specialized) +(rewrite 'fpmin 2 2 "C_i_flonum_min" 'specialized) (rewrite 'char-numeric? 2 1 "C_u_i_char_numericp" #t) (rewrite 'char-alphabetic? 2 1 "C_u_i_char_alphabeticp" #t) (rewrite 'char-whitespace? 2 1 "C_u_i_char_whitespacep" #t) @@ -683,11 +683,11 @@ (rewrite 'bitwise-not 22 1 "C_a_i_bitwise_not" #t words-per-flonum "C_fixnum_not") -(rewrite 'fp+ 16 2 "C_a_i_flonum_plus" #t words-per-flonum) -(rewrite 'fp- 16 2 "C_a_i_flonum_difference" #t words-per-flonum) -(rewrite 'fp* 16 2 "C_a_i_flonum_times" #t words-per-flonum) -(rewrite 'fp/ 16 2 "C_a_i_flonum_quotient" #t words-per-flonum) -(rewrite 'fpneg 16 1 "C_a_i_flonum_negate" #t words-per-flonum) +(rewrite 'fp+ 16 2 "C_a_i_flonum_plus" 'specialized words-per-flonum) +(rewrite 'fp- 16 2 "C_a_i_flonum_difference" 'specialized words-per-flonum) +(rewrite 'fp* 16 2 "C_a_i_flonum_times" 'specialized words-per-flonum) +(rewrite 'fp/ 16 2 "C_a_i_flonum_quotient" 'specialized words-per-flonum) +(rewrite 'fpneg 16 1 "C_a_i_flonum_negate" 'specialized words-per-flonum) (rewrite 'exp 16 1 "C_a_i_exp" #t words-per-flonum) (rewrite 'sin 16 1 "C_a_i_sin" #t words-per-flonum) @@ -824,22 +824,22 @@ (rewrite 'truncate 15 'flonum 'fixnum 'fptruncate #f) (rewrite 'round 15 'flonum 'fixnum 'fpround #f) -(rewrite 'fpsin 16 1 "C_a_i_flonum_sin" #f words-per-flonum) -(rewrite 'fpcos 16 1 "C_a_i_flonum_cos" #f words-per-flonum) -(rewrite 'fptan 16 1 "C_a_i_flonum_tan" #f words-per-flonum) -(rewrite 'fpasin 16 1 "C_a_i_flonum_asin" #f words-per-flonum) -(rewrite 'fpacos 16 1 "C_a_i_flonum_acos" #f words-per-flonum) -(rewrite 'fpatan 16 1 "C_a_i_flonum_atan" #f words-per-flonum) -(rewrite 'fpatan2 16 2 "C_a_i_flonum_atan2" #f words-per-flonum) -(rewrite 'fpexp 16 1 "C_a_i_flonum_exp" #f words-per-flonum) -(rewrite 'fpexpt 16 2 "C_a_i_flonum_expt" #f words-per-flonum) -(rewrite 'fplog 16 1 "C_a_i_flonum_log" #f words-per-flonum) -(rewrite 'fpsqrt 16 1 "C_a_i_flonum_sqrt" #f words-per-flonum) -(rewrite 'fpabs 16 1 "C_a_i_flonum_abs" #f words-per-flonum) -(rewrite 'fptruncate 16 1 "C_a_i_flonum_truncate" #f words-per-flonum) -(rewrite 'fpround 16 1 "C_a_i_flonum_truncate" #f words-per-flonum) -(rewrite 'fpceiling 16 1 "C_a_i_flonum_truncate" #f words-per-flonum) -(rewrite 'fpround 16 1 "C_a_i_flonum_truncate" #f words-per-flonum) +(rewrite 'fpsin 16 1 "C_a_i_flonum_sin" 'specialized words-per-flonum) +(rewrite 'fpcos 16 1 "C_a_i_flonum_cos" 'specialized words-per-flonum) +(rewrite 'fptan 16 1 "C_a_i_flonum_tan" 'specialized words-per-flonum) +(rewrite 'fpasin 16 1 "C_a_i_flonum_asin" 'specialized words-per-flonum) +(rewrite 'fpacos 16 1 "C_a_i_flonum_acos" 'specialized words-per-flonum) +(rewrite 'fpatan 16 1 "C_a_i_flonum_atan" 'specialized words-per-flonum) +(rewrite 'fpatan2 16 2 "C_a_i_flonum_atan2" 'specialized words-per-flonum) +(rewrite 'fpexp 16 1 "C_a_i_flonum_exp" 'specialized words-per-flonum) +(rewrite 'fpexpt 16 2 "C_a_i_flonum_expt" 'specialized words-per-flonum) +(rewrite 'fplog 16 1 "C_a_i_flonum_log" 'specialized words-per-flonum) +(rewrite 'fpsqrt 16 1 "C_a_i_flonum_sqrt" 'specialized words-per-flonum) +(rewrite 'fpabs 16 1 "C_a_i_flonum_abs" 'specialized words-per-flonum) +(rewrite 'fptruncate 16 1 "C_a_i_flonum_truncate" 'specialized words-per-flonum) +(rewrite 'fpround 16 1 "C_a_i_flonum_truncate" 'specialized words-per-flonum) +(rewrite 'fpceiling 16 1 "C_a_i_flonum_truncate" 'specialized words-per-flonum) +(rewrite 'fpround 16 1 "C_a_i_flonum_truncate" 'specialized words-per-flonum) (rewrite 'cons 16 2 "C_a_i_cons" #t 3) (rewrite '##sys#cons 16 2 "C_a_i_cons" #t 3) diff --git a/compiler-namespace.scm b/compiler-namespace.scm index 91c1ecff..b3328011 100644 --- a/compiler-namespace.scm +++ b/compiler-namespace.scm @@ -277,6 +277,7 @@ toplevel-scope transform-direct-lambdas! tree-copy + unchecked-specialized-arithmetic undefine-shadowed-macros unique-id unit-name diff --git a/compiler.scm b/compiler.scm index ef70a0db..07a2617e 100644 --- a/compiler.scm +++ b/compiler.scm @@ -72,7 +72,7 @@ ; (unsafe) ; (unused <symbol> ...) ; (uses {<unitname>}) -; (scrutinize) +; (unsafe-specialized-arithmetic) ; ; <type> = fixnum | generic @@ -336,6 +336,7 @@ (define do-scrutinize #f) (define enable-inline-files #f) (define compiler-syntax-enabled #t) +(define unchecked-specialized-arithmetic #f) ;;; These are here so that the backend can access them: @@ -1467,8 +1468,8 @@ (else (warning "illegal `type' declaration item" spec)))) (globalize-all (cdr spec)))) - ((scrutinize) - (set! do-scrutinize #t)) + ((unsafe-specialized-arithmetic) + (set! unchecked-specialized-arithmetic #t)) (else (warning "illegal declaration specifier" spec)) ) '(##core#undefined) ) ) ) diff --git a/manual/Declarations b/manual/Declarations index 621de369..cc172cde 100644 --- a/manual/Declarations +++ b/manual/Declarations @@ -263,13 +263,6 @@ that any calls to these variables can always be assumed to be calls to proper procedures. -=== scrutinize - - [declaration specifier] (scrutinize) - -Enables scrutiny. This is equivalent to passing the {{-scrutinize}} option to the compiler. - - === standard-bindings [declaration specifier] (standard-bindings SYMBOL ...) diff --git a/optimizer.scm b/optimizer.scm index 0b225971..3d6830e2 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -845,6 +845,7 @@ ;; (<op> ...) -> (##core#inline <iop> ...) ((2) ; classargs = (<argc> <iop> <safe>) + ;; - <safe> by be 'specialized (see rule #16 below) (and inline-substitutions-enabled (= (length callargs) (first classargs)) (intrinsic? name) @@ -1042,14 +1043,20 @@ ;; number of arguments plus 1. ;; - if <counted> is given and true and <argc> is between 1-8, append "<count>" ;; to the name of the inline routine. + ;; - if <safe> is 'specialized and `unsafe-specialized-arithmetic' is declared, + ;; then assume it is safe (let ((argc (first classargs)) (rargc (length callargs)) + (safe (third classargs)) (w (fourth classargs)) (counted (and (pair? (cddddr classargs)) (fifth classargs)))) (and inline-substitutions-enabled (or (not argc) (= rargc argc)) (intrinsic? name) - (or (third classargs) unsafe) + (or unsafe + (if (eq? safe 'specialized) + unchecked-specialized-arithmetic + safe)) (make-node '##core#call '(#t) (list cont diff --git a/unboxing.scm b/unboxing.scm index 9e4d1dd2..cd5c7370 100644 --- a/unboxing.scm +++ b/unboxing.scm @@ -283,7 +283,12 @@ a)) ((##core#inline ##core#inline_allocate) - (let* ((rw (##sys#get (symbolify (first params)) '##compiler#unboxed-op)) + (let* ((rw1 (##sys#get (symbolify (first params)) '##compiler#unboxed-op)) + (rw (and rw1 + (or unsafe + (and (fourth rw1) + unchecked-specialized-arithmetic)) + rw1)) (args (map (cut walk <> #f rw pass2?) subs))) (cond ((not rw) #f) ((or (not pass2?) @@ -376,7 +381,7 @@ (walk-lambda #f '() node) (when (and any-rewrites - (debugging 'x #;'o "unboxed rewrites:")) ;XXX + (debugging 'o "unboxed rewrites:")) (##sys#hash-table-for-each (lambda (k v) (printf " ~a\t~a~%" k v) ) @@ -386,19 +391,31 @@ (syntax-rules () ((_ (name atypes rtype alt) ...) (begin - (register-unboxed-op 'name 'atypes 'rtype 'alt) ...)))) + (register-unboxed-op 'name 'atypes 'rtype 'alt #f) ...)))) -(define (register-unboxed-op name atypes rtype alt) - (##sys#put! (symbolify name) '##compiler#unboxed-op (list alt atypes rtype))) +(define-syntax define-unboxed-arithmetic-ops + (syntax-rules () + ((_ (name atypes rtype alt) ...) + (begin + (register-unboxed-op 'name 'atypes 'rtype 'alt #t) ...)))) + +(define (register-unboxed-op name atypes rtype alt arithmetic) + (##sys#put! (symbolify name) '##compiler#unboxed-op (list alt atypes rtype arithmetic))) ;; unboxed rewrites -(define-unboxed-ops +(define-unboxed-arithmetic-ops (C_a_i_flonum_plus (flonum flonum) flonum "C_ub_i_flonum_plus") (C_a_i_flonum_difference (flonum flonum) flonum "C_ub_i_flonum_difference") (C_a_i_flonum_times (flonum flonum) flonum "C_ub_i_flonum_times") (C_a_i_flonum_quotient (flonum flonum) flonum "C_ub_i_flonum_quotient") + (C_u_i_fpintegerp (flonum) bool "C_ub_i_fpintegerp") + (C_flonum_equalp (flonum flonum) bool "C_ub_i_flonum_equalp") + (C_flonum_greaterp (flonum flonum) bool "C_ub_i_flonum_greaterp") + (C_flonum_lessp (flonum flonum) bool "C_ub_i_flonum_lessp") + (C_flonum_greater_or_equal_p (flonum flonum) bool "C_ub_i_flonum_greater_or_equal_p") + (C_flonum_less_or_equal_p (flonum flonum) bool "C_ub_i_flonum_less_or_equal_p") (C_a_i_flonum_sin (flonum) flonum "C_sin") (C_a_i_flonum_cos (flonum) flonum "C_cos") (C_a_i_flonum_tan (flonum) flonum "C_tab") @@ -414,17 +431,13 @@ (C_a_i_flonum_truncate (flonum) flonum "C_trunc") (C_a_i_flonum_ceiling (flonum) flonum "C_ceil") (C_a_i_flonum_floor (flonum) flonum "C_floor") - (C_a_i_flonum_round (flonum) flonum "C_round") + (C_a_i_flonum_round (flonum) flonum "C_round")) + +(define-unboxed-ops (C_u_i_f32vector_set (* fixnum flonum) fixnum "C_ub_i_f32vector_set") (C_u_i_f64vector_set (* fixnum flonum) fixnum "C_ub_i_f64vector_set") (C_a_i_f32vector_ref (* fixnum) flonum "C_ub_i_f32vector_ref") (C_a_i_f64vector_ref (* fixnum) flonum "C_ub_i_f64vector_ref") - (C_u_i_fpintegerp (flonum) bool "C_ub_i_fpintegerp") - (C_flonum_equalp (flonum flonum) bool "C_ub_i_flonum_equalp") - (C_flonum_greaterp (flonum flonum) bool "C_ub_i_flonum_greaterp") - (C_flonum_lessp (flonum flonum) bool "C_ub_i_flonum_lessp") - (C_flonum_greater_or_equal_p (flonum flonum) bool "C_ub_i_flonum_greater_or_equal_p") - (C_flonum_less_or_equal_p (flonum flonum) bool "C_ub_i_flonum_less_or_equal_p") (C_a_u_i_pointer_inc (pointer fixnum) pointer "C_ub_i_pointer_inc") (C_pointer_eqp (pointer pointer) bool "C_ub_i_pointer_eqp") (C_u_i_pointer_u8_ref (pointer) fixnum "C_ub_i_pointer_u8_ref") @@ -443,5 +456,4 @@ (C_u_i_pointer_s32_set (pointer fixnum) fixnum "C_ub_i_pointer_s32_ref") (C_u_i_pointer_f32_set (pointer flonum) flonum "C_ub_i_pointer_f32_ref") (C_u_i_pointer_f64_set (pointer flonum) flonum "C_ub_i_pointer_f64_ref") - (C_null_pointerp (pointer) bool "C_ub_i_null_pointerp") - ) + (C_null_pointerp (pointer) bool "C_ub_i_null_pointerp"))Trap