diff --git a/lib/_gambit#.scm b/lib/_gambit#.scm
index 1235eaf..de90826 100644
--- a/lib/_gambit#.scm
+++ b/lib/_gambit#.scm
@@ -998,6 +998,13 @@
 
 ;;;----------------------------------------------------------------------------
 
+;; Global tweaking knobs:
+
+(##define-macro (macro-not-interrupts-enabled-for-speed)
+   '(##declare (not interrupts-enabled)))
+
+;;;----------------------------------------------------------------------------
+
 (##include "~~/lib/_kernel#.scm")
 (##include "~~/lib/_thread#.scm")
 (##include "~~/lib/_system#.scm")
diff --git a/lib/_std.scm b/lib/_std.scm
index b8af44b..0cd3d9c 100644
--- a/lib/_std.scm
+++ b/lib/_std.scm
@@ -348,6 +348,7 @@
                dst-vect))))
 
        (define-prim (,##subvect-fill! vect start end fill)
+	 (macro-not-interrupts-enabled-for-speed)
          (let loop ((i (##fixnum.- end 1)))
            (if (##fixnum.< i start)
              (##void)
@@ -1380,6 +1381,7 @@ end-of-code
       (##char-downcase c))))
 
 (define-prim (##string=? str1 str2)
+  (macro-not-interrupts-enabled-for-speed)
   (or (##eq? str1 str2)
       (let ((len1 (##string-length str1)))
         (if (##eq? len1 (##string-length str2))
@@ -1400,6 +1402,7 @@ end-of-code
   macro-check-string)
 
 (define-prim (##string<? str1 str2)
+  (macro-not-interrupts-enabled-for-speed)
   (and (##not (##eq? str1 str2))
        (let ((len1 (##string-length str1))
              (len2 (##string-length str2)))
@@ -1442,6 +1445,7 @@ end-of-code
   macro-check-string)
 
 (define-prim (##string-ci=? str1 str2)
+  (macro-not-interrupts-enabled-for-speed)
   (or (##eq? str1 str2)
       (let ((len1 (##string-length str1)))
         (if (##eq? len1 (##string-length str2))
@@ -1463,6 +1467,7 @@ end-of-code
   macro-check-string)
 
 (define-prim (##string-ci<? str1 str2)
+  (macro-not-interrupts-enabled-for-speed)
   (and (##not (##eq? str1 str2))
        (let ((len1 (##string-length str1))
              (len2 (##string-length str2)))
diff --git a/lib/_system.scm b/lib/_system.scm
index c6a3d08..606114e 100644
--- a/lib/_system.scm
+++ b/lib/_system.scm
@@ -199,6 +199,7 @@
 (define-prim (##bvector-equal? obj1 obj2)
 
   (define (equal obj1 obj2 len)
+    (macro-not-interrupts-enabled-for-speed)
     (let loop ((i (##fixnum.- len 1)))
       (or (##fixnum.< i 0)
           (and (##fixnum.= (##u16vector-ref obj1 i)
@@ -365,17 +366,20 @@
   (macro-force-vars (obj)
     (##eq?-hash obj)))
 
+
+(define-macro (combine a b)
+  `(let ((a ,a)
+	 (b ,b))
+     (##fixnum.bitwise-and
+      (##fixnum.* (##fixnum.+ a (##fixnum.arithmetic-shift-left b 1))
+		  331804471)
+      (macro-max-fixnum32))))
+
 (define-prim (##eqv?-hash obj)
 
   ;; for all obj2 we must have that (##eqv? obj obj2) implies that
   ;; (= (##eqv?-hash obj) (##eqv?-hash obj2))
 
-  (define (combine a b)
-    (##fixnum.bitwise-and
-     (##fixnum.* (##fixnum.+ a (##fixnum.arithmetic-shift-left b 1))
-                 331804471)
-     (macro-max-fixnum32)))
-
   (define (hash obj)
     (macro-number-dispatch obj
       (##eq?-hash obj) ;; obj = not a number
@@ -401,15 +405,10 @@
   ;; for all obj2 we must have that (##equal? obj obj2) implies that
   ;; (= (##equal?-hash obj) (##equal?-hash obj2))
 
-  (define (combine a b)
-    (##fixnum.bitwise-and
-     (##fixnum.* (##fixnum.+ a (##fixnum.arithmetic-shift-left b 1))
-                 331804471)
-     (macro-max-fixnum32)))
-
   (define (bvector-hash obj)
 
     (define (u16vect-hash i h)
+      (macro-not-interrupts-enabled-for-speed)
       (if (##fixnum.< i 0)
         h
         (u16vect-hash (##fixnum.- i 1)
@@ -514,6 +513,8 @@
   ;; for all str2 we must have that (##string=? str str2) implies that
   ;; (= (##string=?-hash str) (##string=?-hash str2))
 
+  (macro-not-interrupts-enabled-for-speed)
+
   (let ((len (##string-length str)))
     (let loop ((h 0) (i 0))
       (if (##fixnum.< i len)
@@ -536,6 +537,8 @@
   ;; for all str2 we must have that (##string-ci=? str str2) implies that
   ;; (= (##string-ci=?-hash str) (##string-ci=?-hash str2))
 
+  (macro-not-interrupts-enabled-for-speed)
+
   (let ((len (##string-length str)))
     (let loop ((h 0) (i 0))
       (if (##fixnum.< i len)
@@ -1513,12 +1516,6 @@
 
 (define-prim (##table-equal?-hash table)
 
-  (define (combine a b)
-    (##fixnum.bitwise-and
-     (##fixnum.* (##fixnum.+ a (##fixnum.arithmetic-shift-left b 1))
-                 331804471)
-     (macro-max-fixnum32)))
-
   (##table-foldl
    (lambda (a b) ;; must be associative and commutative
      (##fixnum.bitwise-xor a b))
