 	  ;;
 	  ('while pred & body)	(let [retry-label (gensym),
 				      end-label (gensym)]
-				  `(~retry-label
+				  `((:VM_IVAL ~(make-nil))
+                                    ~retry-label
+                                    (:VM_PUSH)
 				    ~@(compile-pass1 pred)
 				    (:VM_BIFN ~end-label)
+                                    (:VM_POP)
 				    ~@(apply concat (map compile-pass1 body))
 				    (:VM_JMP ~retry-label)
-				    ~end-label))
+				    ~end-label
+                                    (:VM_POP)))
 	  ;;
 	  ('dotimes (var num) & body)
 	  (let [end-label (gensym),

	      (:VM_IVAL ~(make-num num))
	      (:VM_LE)
	      (:VM_BIF ~end-label)
	      (:VM_JMP ~retry-label)
	      ~end-label
	      (:VM_UNBIND 1)))
	  ;;
	  _	(compile-funcall (first exp) (rest exp)))

	      (:VM_BIND ~(make-sym var))
	      ~retry-label
	      ~@(apply concat (map compile-pass1 body))
              (:VM_PUSH)
	      (:VM_VREF ~(make-sym var))
	      (:VM_PUSH)
	      (:VM_IVAL ~(make-num 1))
