diff --git a/Data/Glome/Vec.hs b/Data/Glome/Vec.hs
--- a/Data/Glome/Vec.hs
+++ b/Data/Glome/Vec.hs
@@ -108,6 +108,10 @@
 data Ray = Ray {origin, dir :: !Vec} deriving Show
 --data Plane = Plane {norm :: !Vec, offset :: !Flt} deriving Show
 
+ray_ub :: Ray -> (# Flt, Flt, Flt, Flt, Flt, Flt #)
+ray_ub (Ray (Vec !ox !oy !oz) (Vec !dx !dy !dz)) = (# ox, oy, oz, dx, dy, dz #)
+
+
 -- | Vec constructor.
 vec :: Flt -> Flt -> Flt -> Vec
 vec !x !y !z = (Vec x y z)
@@ -717,22 +721,48 @@
 -- we hit.  Otherwise, we miss. (It's up to the 
 -- caller to figure that out.)
 
+{-
 bbclip :: Ray -> Bbox -> Interval
 bbclip (Ray (Vec ox oy oz) (Vec dx dy dz)) 
        (Bbox (Vec p1x p1y p1z) (Vec p2x p2y p2z)) =
- let dxrcp = 1/dx
-     dyrcp = 1/dy
-     dzrcp = 1/dz
-     Interval inx outx = if dx > 0 
-                         then Interval ((p1x-ox)*dxrcp) ((p2x-ox)*dxrcp)
-                         else Interval ((p2x-ox)*dxrcp) ((p1x-ox)*dxrcp)
-     Interval iny outy = if dy > 0
-                         then Interval ((p1y-oy)*dyrcp) ((p2y-oy)*dyrcp)
-                         else Interval ((p2y-oy)*dyrcp) ((p1y-oy)*dyrcp)
-     Interval inz outz = if dz > 0
-                         then Interval ((p1z-oz)*dzrcp) ((p2z-oz)*dzrcp)
-                         else Interval ((p2z-oz)*dzrcp) ((p1z-oz)*dzrcp)
+ let !dxrcp = 1/dx
+     !dyrcp = 1/dy
+     !dzrcp = 1/dz
+     Interval !inx !outx = if dx > 0 
+                           then Interval ((p1x-ox)*dxrcp) ((p2x-ox)*dxrcp)
+                           else Interval ((p2x-ox)*dxrcp) ((p1x-ox)*dxrcp)
+     Interval !iny !outy = if dy > 0
+                           then Interval ((p1y-oy)*dyrcp) ((p2y-oy)*dyrcp)
+                           else Interval ((p2y-oy)*dyrcp) ((p1y-oy)*dyrcp)
+     Interval !inz !outz = if dz > 0
+                           then Interval ((p1z-oz)*dzrcp) ((p2z-oz)*dzrcp)
+                           else Interval ((p2z-oz)*dzrcp) ((p1z-oz)*dzrcp)
  in
    Interval (fmax3 inx iny inz) (fmin3 outx outy outz)
+-}
 
+bbclip_ub :: Ray -> Bbox -> (# Flt, Flt #)
+bbclip_ub (Ray (Vec !ox !oy !oz) (Vec !dx !dy !dz)) 
+          (Bbox (Vec !p1x !p1y !p1z) (Vec !p2x !p2y !p2z)) =
+ let !dxrcp = 1/dx
+     !dyrcp = 1/dy
+     !dzrcp = 1/dz
+     (# !inx, !outx #) =
+       if dx > 0 
+       then (# (p1x-ox)*dxrcp, (p2x-ox)*dxrcp #)
+       else (# (p2x-ox)*dxrcp, (p1x-ox)*dxrcp #)
+     (# !iny, !outy #) =
+       if dy > 0
+       then (# (p1y-oy)*dyrcp, (p2y-oy)*dyrcp #)
+       else (# (p2y-oy)*dyrcp, (p1y-oy)*dyrcp #)
+     (# !inz, !outz #) =
+       if dz > 0
+       then (# (p1z-oz)*dzrcp, (p2z-oz)*dzrcp #)
+       else (# (p2z-oz)*dzrcp, (p1z-oz)*dzrcp #)
+ in
+   (# fmax3 inx iny inz, fmin3 outx outy outz #)
 
+bbclip :: Ray -> Bbox -> Interval
+bbclip ray bbox =
+  let (# near, far #) = bbclip_ub ray bbox
+  in Interval near far
diff --git a/GlomeVec.cabal b/GlomeVec.cabal
--- a/GlomeVec.cabal
+++ b/GlomeVec.cabal
@@ -1,20 +1,24 @@
 Name:                GlomeVec
-Version:             0.1.2
+Version:             0.2
 Synopsis:            Simple 3D vector library
 Description:         A simple library for dealing with 3D vectors, suitable for graphics projects.  A small texture library with Perlin noise is included as well.
 License:             GPL
 License-file:        LICENSE
 Author:              Jim Snow
 Maintainer:          Jim Snow <jsnow@cs.pdx.edu>
-Copyright:           Copyright 2008,2009 Jim Snow
+Copyright:           Copyright 2008,2009,2014 Jim Snow
 Homepage:            http://www.haskell.org/haskellwiki/Glome
 Stability:           experimental
 Category:            graphics
 build-type:          Simple
-Cabal-Version: >= 1.2
+Cabal-Version: >= 1.2.3
 extra-source-files:
   README.txt
 library
+  ghc-options: -fllvm -O2 -funbox-strict-fields
+  extensions: UnboxedTuples
+  ghc-prof-options: -prof -auto-all
+
   exposed-modules:   Data.Glome.Vec
                      Data.Glome.Texture
-  Build-Depends:     base >= 3 && < 4, array
+  Build-Depends:     base >= 4 && < 5, array
