diff --git a/racket/src/cify/inline.rkt b/racket/src/cify/inline.rkt index 520808173b..e1784ced4b 100644 --- a/racket/src/cify/inline.rkt +++ b/racket/src/cify/inline.rkt @@ -28,6 +28,10 @@ [(string-ref unsafe-string-ref) (and (= n 2) can-gc? 'c_string_ref)] [(bytes-ref unsafe-bytes-ref) (and (= n 2) 'c_bytes_ref)] [(fx+ unsafe-fx+) (and (= n 2) 'c_int_add)] + [(fx- unsafe-fx-) (and (= n 2) 'c_int_sub)] + [(fx* unsafe-fx*) (and (= n 2) 'c_int_mult)] + [(fxrshift unsafe-fxrshift) (and (= n 2) 'c_int_rshift)] + [(fxand unsafe-fxand) (and (= n 2) 'c_int_and)] [(add1) (and (= n 1) can-gc? 'c_number_add1)] [(sub1) (and (= n 1) can-gc? 'c_number_sub1)] [(hash-ref) (cond @@ -106,10 +110,15 @@ [`(char=? ,e1 ,e2) (simple "c_scheme_char_eq(~a)" e1 e2)] [`(char-whitespace? ,e) (simple "c_scheme_char_whitespacep(~a)" e)] [`(unsafe-fx< ,e1 ,e2) (simple "c_int_lt(~a)" e1 e2)] + [`(fx< ,e1 ,e2) (simple "c_int_lt(~a)" e1 e2)] [`(unsafe-fx> ,e1 ,e2) (simple "c_int_gt(~a)" e1 e2)] + [`(fx> ,e1 ,e2) (simple "c_int_gt(~a)" e1 e2)] [`(unsafe-fx>= ,e1 ,e2) (simple "!c_int_lt(~a)" e1 e2)] + [`(fx>= ,e1 ,e2) (simple "!c_int_lt(~a)" e1 e2)] [`(unsafe-fx<= ,e1 ,e2) (simple "!c_int_gt(~a)" e1 e2)] + [`(fx<= ,e1 ,e2) (simple "!c_int_gt(~a)" e1 e2)] [`(unsafe-fx= ,e1 ,e2) (simple "c_same_obj(~a)" e1 e2)] + [`(fx= ,e1 ,e2) (simple "c_same_obj(~a)" e1 e2)] [`(= ,e1 ,e2) (simple #:can-gc? #t "c_number_eq(~a)" e1 e2)] [`(< ,e1 ,e2) (simple #:can-gc? #t "c_number_lt(~a)" e1 e2)] [`(> ,e1 ,e2) (simple #:can-gc? #t "c_number_gt(~a)" e1 e2)] diff --git a/racket/src/racket/src/startup-glue.inc b/racket/src/racket/src/startup-glue.inc index a4f5bafd81..57743e1820 100644 --- a/racket/src/racket/src/startup-glue.inc +++ b/racket/src/racket/src/startup-glue.inc @@ -328,6 +328,28 @@ static MZ_INLINE Scheme_Object *c_int_add(Scheme_Object *a, Scheme_Object *b) return scheme_make_integer(SCHEME_INT_VAL(a) + SCHEME_INT_VAL(b)); } +static MZ_INLINE Scheme_Object *c_int_sub(Scheme_Object *a, Scheme_Object *b) +{ + return scheme_make_integer(SCHEME_INT_VAL(a) - SCHEME_INT_VAL(b)); +} + +#if 0 +static MZ_INLINE Scheme_Object *c_int_mult(Scheme_Object *a, Scheme_Object *b) +{ + return scheme_make_integer(SCHEME_INT_VAL(a) * SCHEME_INT_VAL(b)); +} +#endif + +static MZ_INLINE Scheme_Object *c_int_and(Scheme_Object *a, Scheme_Object *b) +{ + return scheme_make_integer(SCHEME_INT_VAL(a) & SCHEME_INT_VAL(b)); +} + +static MZ_INLINE Scheme_Object *c_int_rshift(Scheme_Object *a, Scheme_Object *b) +{ + return scheme_make_integer(SCHEME_INT_VAL(a) >> SCHEME_INT_VAL(b)); +} + /* Can GC if not in fixnum range */ static Scheme_Object *c_number_add1(Scheme_Object *a) { diff --git a/racket/src/schemify/schemify.rkt b/racket/src/schemify/schemify.rkt index 4da38cbe6a..f6f2526698 100644 --- a/racket/src/schemify/schemify.rkt +++ b/racket/src/schemify/schemify.rkt @@ -534,7 +534,12 @@ inline-fuel `(let-values ,(reverse binds) . ,bodys)))] [(null? args) #f] - [(not (wrap-pair? formal-args)) #f] + [(not (wrap-pair? formal-args)) + (loop '() '() (cons (list (list formal-args) + (if (wrap-null? args) + ''() + (cons 'list args))) + binds))] [else (loop (wrap-cdr formal-args) (wrap-cdr args)